/*** Autogenerated by WIDL 8.5 from include/fsrmquota.idl - Do not edit ***/

#ifdef _WIN32
#ifndef __REQUIRED_RPCNDR_H_VERSION__
#define __REQUIRED_RPCNDR_H_VERSION__ 475
#endif
#include <rpc.h>
#include <rpcndr.h>
#endif

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

#ifndef __fsrmquota_h__
#define __fsrmquota_h__

#ifndef __WIDL_INLINE
#if defined(__cplusplus) || defined(_MSC_VER)
#define __WIDL_INLINE inline
#elif defined(__GNUC__)
#define __WIDL_INLINE __inline__
#endif
#endif

/* Forward declarations */

#ifndef __IFsrmQuotaManager_FWD_DEFINED__
#define __IFsrmQuotaManager_FWD_DEFINED__
typedef interface IFsrmQuotaManager IFsrmQuotaManager;
#ifdef __cplusplus
interface IFsrmQuotaManager;
#endif /* __cplusplus */
#endif

#ifndef __IFsrmQuotaTemplateManager_FWD_DEFINED__
#define __IFsrmQuotaTemplateManager_FWD_DEFINED__
typedef interface IFsrmQuotaTemplateManager IFsrmQuotaTemplateManager;
#ifdef __cplusplus
interface IFsrmQuotaTemplateManager;
#endif /* __cplusplus */
#endif

#ifndef __IFsrmQuotaBase_FWD_DEFINED__
#define __IFsrmQuotaBase_FWD_DEFINED__
typedef interface IFsrmQuotaBase IFsrmQuotaBase;
#ifdef __cplusplus
interface IFsrmQuotaBase;
#endif /* __cplusplus */
#endif

#ifndef __IFsrmQuotaObject_FWD_DEFINED__
#define __IFsrmQuotaObject_FWD_DEFINED__
typedef interface IFsrmQuotaObject IFsrmQuotaObject;
#ifdef __cplusplus
interface IFsrmQuotaObject;
#endif /* __cplusplus */
#endif

#ifndef __IFsrmQuotaTemplate_FWD_DEFINED__
#define __IFsrmQuotaTemplate_FWD_DEFINED__
typedef interface IFsrmQuotaTemplate IFsrmQuotaTemplate;
#ifdef __cplusplus
interface IFsrmQuotaTemplate;
#endif /* __cplusplus */
#endif

#ifndef __IFsrmQuota_FWD_DEFINED__
#define __IFsrmQuota_FWD_DEFINED__
typedef interface IFsrmQuota IFsrmQuota;
#ifdef __cplusplus
interface IFsrmQuota;
#endif /* __cplusplus */
#endif

#ifndef __IFsrmAutoApplyQuota_FWD_DEFINED__
#define __IFsrmAutoApplyQuota_FWD_DEFINED__
typedef interface IFsrmAutoApplyQuota IFsrmAutoApplyQuota;
#ifdef __cplusplus
interface IFsrmAutoApplyQuota;
#endif /* __cplusplus */
#endif

#ifndef __IFsrmQuotaManagerEx_FWD_DEFINED__
#define __IFsrmQuotaManagerEx_FWD_DEFINED__
typedef interface IFsrmQuotaManagerEx IFsrmQuotaManagerEx;
#ifdef __cplusplus
interface IFsrmQuotaManagerEx;
#endif /* __cplusplus */
#endif

#ifndef __IFsrmQuotaTemplateImported_FWD_DEFINED__
#define __IFsrmQuotaTemplateImported_FWD_DEFINED__
typedef interface IFsrmQuotaTemplateImported IFsrmQuotaTemplateImported;
#ifdef __cplusplus
interface IFsrmQuotaTemplateImported;
#endif /* __cplusplus */
#endif

/* Headers for imported files */

#include <oaidl.h>
#include <fsrmenums.h>
#include <fsrm.h>

#ifdef __cplusplus
extern "C" {
#endif

#include <winapifamily.h>

#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
#ifndef __IFsrmAutoApplyQuota_FWD_DEFINED__
#define __IFsrmAutoApplyQuota_FWD_DEFINED__
typedef interface IFsrmAutoApplyQuota IFsrmAutoApplyQuota;
#ifdef __cplusplus
interface IFsrmAutoApplyQuota;
#endif /* __cplusplus */
#endif

#ifndef __IFsrmQuota_FWD_DEFINED__
#define __IFsrmQuota_FWD_DEFINED__
typedef interface IFsrmQuota IFsrmQuota;
#ifdef __cplusplus
interface IFsrmQuota;
#endif /* __cplusplus */
#endif

#ifndef __IFsrmQuotaBase_FWD_DEFINED__
#define __IFsrmQuotaBase_FWD_DEFINED__
typedef interface IFsrmQuotaBase IFsrmQuotaBase;
#ifdef __cplusplus
interface IFsrmQuotaBase;
#endif /* __cplusplus */
#endif

#ifndef __IFsrmQuotaObject_FWD_DEFINED__
#define __IFsrmQuotaObject_FWD_DEFINED__
typedef interface IFsrmQuotaObject IFsrmQuotaObject;
#ifdef __cplusplus
interface IFsrmQuotaObject;
#endif /* __cplusplus */
#endif

#ifndef __IFsrmQuotaManager_FWD_DEFINED__
#define __IFsrmQuotaManager_FWD_DEFINED__
typedef interface IFsrmQuotaManager IFsrmQuotaManager;
#ifdef __cplusplus
interface IFsrmQuotaManager;
#endif /* __cplusplus */
#endif

#ifndef __IFsrmQuotaTemplate_FWD_DEFINED__
#define __IFsrmQuotaTemplate_FWD_DEFINED__
typedef interface IFsrmQuotaTemplate IFsrmQuotaTemplate;
#ifdef __cplusplus
interface IFsrmQuotaTemplate;
#endif /* __cplusplus */
#endif

#ifndef __IFsrmQuotaTemplateImported_FWD_DEFINED__
#define __IFsrmQuotaTemplateImported_FWD_DEFINED__
typedef interface IFsrmQuotaTemplateImported IFsrmQuotaTemplateImported;
#ifdef __cplusplus
interface IFsrmQuotaTemplateImported;
#endif /* __cplusplus */
#endif

#ifndef __IFsrmQuotaTemplateManager_FWD_DEFINED__
#define __IFsrmQuotaTemplateManager_FWD_DEFINED__
typedef interface IFsrmQuotaTemplateManager IFsrmQuotaTemplateManager;
#ifdef __cplusplus
interface IFsrmQuotaTemplateManager;
#endif /* __cplusplus */
#endif

typedef LONG FSRM_QUOTA_THRESHOLD;
#define FSRM_DISPID_QUOTA_BASE (FSRM_DISPID_FEATURE_QUOTA | 0x100000)

#define FSRM_DISPID_QUOTA_OBJECT (FSRM_DISPID_QUOTA_BASE | 0x10000)

#define FSRM_DISPID_QUOTA (FSRM_DISPID_QUOTA_OBJECT | 0x1000)

#define FSRM_DISPID_AUTOAPPLYQUOTA (FSRM_DISPID_QUOTA_OBJECT | 0x2000)

#define FSRM_DISPID_QUOTA_TEMPLATE (FSRM_DISPID_QUOTA_BASE | 0x20000)

#define FSRM_DISPID_QUOTA_TEMPLATE_IMPORTED (FSRM_DISPID_QUOTA_TEMPLATE | 0x1000)

#define FSRM_DISPID_QUOTA_MANAGER (FSRM_DISPID_FEATURE_QUOTA | 0x200000)

#define FSRM_DISPID_QUOTA_TEMPLATE_MANAGER (FSRM_DISPID_FEATURE_QUOTA | 0x300000)

#define FSRM_DISPID_QUOTA_MANAGER_EX (FSRM_DISPID_FEATURE_QUOTA | 0x400000)

#define FsrmMaxNumberThresholds (16)

#define FsrmMinThresholdValue (1)

#define FsrmMaxThresholdValue (250)

#define FsrmMinQuotaLimit (1024)

#define FsrmMaxExcludeFolders (32)

/*****************************************************************************
 * IFsrmQuotaManager interface
 */
#ifndef __IFsrmQuotaManager_INTERFACE_DEFINED__
#define __IFsrmQuotaManager_INTERFACE_DEFINED__

DEFINE_GUID(IID_IFsrmQuotaManager, 0x8bb68c7d, 0x19d8, 0x4ffb, 0x80,0x9e, 0xbe,0x4f,0xc1,0x73,0x40,0x14);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("8bb68c7d-19d8-4ffb-809e-be4fc1734014")
IFsrmQuotaManager : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_ActionVariables(
        SAFEARRAY **variables) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ActionVariableDescriptions(
        SAFEARRAY **descriptions) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateQuota(
        BSTR path,
        IFsrmQuota **quota) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateAutoApplyQuota(
        BSTR quotaTemplateName,
        BSTR path,
        IFsrmAutoApplyQuota **quota) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetQuota(
        BSTR path,
        IFsrmQuota **quota) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetAutoApplyQuota(
        BSTR path,
        IFsrmAutoApplyQuota **quota) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetRestrictiveQuota(
        BSTR path,
        IFsrmQuota **quota) = 0;

    virtual HRESULT STDMETHODCALLTYPE EnumQuotas(
        BSTR path,
        FsrmEnumOptions options,
        IFsrmCommittableCollection **quotas) = 0;

    virtual HRESULT STDMETHODCALLTYPE EnumAutoApplyQuotas(
        BSTR path,
        FsrmEnumOptions options,
        IFsrmCommittableCollection **quotas) = 0;

    virtual HRESULT STDMETHODCALLTYPE EnumEffectiveQuotas(
        BSTR path,
        FsrmEnumOptions options,
        IFsrmCommittableCollection **quotas) = 0;

    virtual HRESULT STDMETHODCALLTYPE Scan(
        BSTR strPath) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateQuotaCollection(
        IFsrmCommittableCollection **collection) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IFsrmQuotaManager, 0x8bb68c7d, 0x19d8, 0x4ffb, 0x80,0x9e, 0xbe,0x4f,0xc1,0x73,0x40,0x14)
#endif
#else
typedef struct IFsrmQuotaManagerVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IFsrmQuotaManager *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IFsrmQuotaManager *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IFsrmQuotaManager *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IFsrmQuotaManager *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IFsrmQuotaManager methods ***/
    HRESULT (STDMETHODCALLTYPE *get_ActionVariables)(
        IFsrmQuotaManager *This,
        SAFEARRAY **variables);

    HRESULT (STDMETHODCALLTYPE *get_ActionVariableDescriptions)(
        IFsrmQuotaManager *This,
        SAFEARRAY **descriptions);

    HRESULT (STDMETHODCALLTYPE *CreateQuota)(
        IFsrmQuotaManager *This,
        BSTR path,
        IFsrmQuota **quota);

    HRESULT (STDMETHODCALLTYPE *CreateAutoApplyQuota)(
        IFsrmQuotaManager *This,
        BSTR quotaTemplateName,
        BSTR path,
        IFsrmAutoApplyQuota **quota);

    HRESULT (STDMETHODCALLTYPE *GetQuota)(
        IFsrmQuotaManager *This,
        BSTR path,
        IFsrmQuota **quota);

    HRESULT (STDMETHODCALLTYPE *GetAutoApplyQuota)(
        IFsrmQuotaManager *This,
        BSTR path,
        IFsrmAutoApplyQuota **quota);

    HRESULT (STDMETHODCALLTYPE *GetRestrictiveQuota)(
        IFsrmQuotaManager *This,
        BSTR path,
        IFsrmQuota **quota);

    HRESULT (STDMETHODCALLTYPE *EnumQuotas)(
        IFsrmQuotaManager *This,
        BSTR path,
        FsrmEnumOptions options,
        IFsrmCommittableCollection **quotas);

    HRESULT (STDMETHODCALLTYPE *EnumAutoApplyQuotas)(
        IFsrmQuotaManager *This,
        BSTR path,
        FsrmEnumOptions options,
        IFsrmCommittableCollection **quotas);

    HRESULT (STDMETHODCALLTYPE *EnumEffectiveQuotas)(
        IFsrmQuotaManager *This,
        BSTR path,
        FsrmEnumOptions options,
        IFsrmCommittableCollection **quotas);

    HRESULT (STDMETHODCALLTYPE *Scan)(
        IFsrmQuotaManager *This,
        BSTR strPath);

    HRESULT (STDMETHODCALLTYPE *CreateQuotaCollection)(
        IFsrmQuotaManager *This,
        IFsrmCommittableCollection **collection);

    END_INTERFACE
} IFsrmQuotaManagerVtbl;

interface IFsrmQuotaManager {
    CONST_VTBL IFsrmQuotaManagerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IFsrmQuotaManager_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IFsrmQuotaManager_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IFsrmQuotaManager_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IFsrmQuotaManager_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IFsrmQuotaManager_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IFsrmQuotaManager_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IFsrmQuotaManager_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IFsrmQuotaManager methods ***/
#define IFsrmQuotaManager_get_ActionVariables(This,variables) (This)->lpVtbl->get_ActionVariables(This,variables)
#define IFsrmQuotaManager_get_ActionVariableDescriptions(This,descriptions) (This)->lpVtbl->get_ActionVariableDescriptions(This,descriptions)
#define IFsrmQuotaManager_CreateQuota(This,path,quota) (This)->lpVtbl->CreateQuota(This,path,quota)
#define IFsrmQuotaManager_CreateAutoApplyQuota(This,quotaTemplateName,path,quota) (This)->lpVtbl->CreateAutoApplyQuota(This,quotaTemplateName,path,quota)
#define IFsrmQuotaManager_GetQuota(This,path,quota) (This)->lpVtbl->GetQuota(This,path,quota)
#define IFsrmQuotaManager_GetAutoApplyQuota(This,path,quota) (This)->lpVtbl->GetAutoApplyQuota(This,path,quota)
#define IFsrmQuotaManager_GetRestrictiveQuota(This,path,quota) (This)->lpVtbl->GetRestrictiveQuota(This,path,quota)
#define IFsrmQuotaManager_EnumQuotas(This,path,options,quotas) (This)->lpVtbl->EnumQuotas(This,path,options,quotas)
#define IFsrmQuotaManager_EnumAutoApplyQuotas(This,path,options,quotas) (This)->lpVtbl->EnumAutoApplyQuotas(This,path,options,quotas)
#define IFsrmQuotaManager_EnumEffectiveQuotas(This,path,options,quotas) (This)->lpVtbl->EnumEffectiveQuotas(This,path,options,quotas)
#define IFsrmQuotaManager_Scan(This,strPath) (This)->lpVtbl->Scan(This,strPath)
#define IFsrmQuotaManager_CreateQuotaCollection(This,collection) (This)->lpVtbl->CreateQuotaCollection(This,collection)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IFsrmQuotaManager_QueryInterface(IFsrmQuotaManager* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IFsrmQuotaManager_AddRef(IFsrmQuotaManager* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IFsrmQuotaManager_Release(IFsrmQuotaManager* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IFsrmQuotaManager_GetTypeInfoCount(IFsrmQuotaManager* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IFsrmQuotaManager_GetTypeInfo(IFsrmQuotaManager* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT IFsrmQuotaManager_GetIDsOfNames(IFsrmQuotaManager* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static __WIDL_INLINE HRESULT IFsrmQuotaManager_Invoke(IFsrmQuotaManager* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IFsrmQuotaManager methods ***/
static __WIDL_INLINE HRESULT IFsrmQuotaManager_get_ActionVariables(IFsrmQuotaManager* This,SAFEARRAY **variables) {
    return This->lpVtbl->get_ActionVariables(This,variables);
}
static __WIDL_INLINE HRESULT IFsrmQuotaManager_get_ActionVariableDescriptions(IFsrmQuotaManager* This,SAFEARRAY **descriptions) {
    return This->lpVtbl->get_ActionVariableDescriptions(This,descriptions);
}
static __WIDL_INLINE HRESULT IFsrmQuotaManager_CreateQuota(IFsrmQuotaManager* This,BSTR path,IFsrmQuota **quota) {
    return This->lpVtbl->CreateQuota(This,path,quota);
}
static __WIDL_INLINE HRESULT IFsrmQuotaManager_CreateAutoApplyQuota(IFsrmQuotaManager* This,BSTR quotaTemplateName,BSTR path,IFsrmAutoApplyQuota **quota) {
    return This->lpVtbl->CreateAutoApplyQuota(This,quotaTemplateName,path,quota);
}
static __WIDL_INLINE HRESULT IFsrmQuotaManager_GetQuota(IFsrmQuotaManager* This,BSTR path,IFsrmQuota **quota) {
    return This->lpVtbl->GetQuota(This,path,quota);
}
static __WIDL_INLINE HRESULT IFsrmQuotaManager_GetAutoApplyQuota(IFsrmQuotaManager* This,BSTR path,IFsrmAutoApplyQuota **quota) {
    return This->lpVtbl->GetAutoApplyQuota(This,path,quota);
}
static __WIDL_INLINE HRESULT IFsrmQuotaManager_GetRestrictiveQuota(IFsrmQuotaManager* This,BSTR path,IFsrmQuota **quota) {
    return This->lpVtbl->GetRestrictiveQuota(This,path,quota);
}
static __WIDL_INLINE HRESULT IFsrmQuotaManager_EnumQuotas(IFsrmQuotaManager* This,BSTR path,FsrmEnumOptions options,IFsrmCommittableCollection **quotas) {
    return This->lpVtbl->EnumQuotas(This,path,options,quotas);
}
static __WIDL_INLINE HRESULT IFsrmQuotaManager_EnumAutoApplyQuotas(IFsrmQuotaManager* This,BSTR path,FsrmEnumOptions options,IFsrmCommittableCollection **quotas) {
    return This->lpVtbl->EnumAutoApplyQuotas(This,path,options,quotas);
}
static __WIDL_INLINE HRESULT IFsrmQuotaManager_EnumEffectiveQuotas(IFsrmQuotaManager* This,BSTR path,FsrmEnumOptions options,IFsrmCommittableCollection **quotas) {
    return This->lpVtbl->EnumEffectiveQuotas(This,path,options,quotas);
}
static __WIDL_INLINE HRESULT IFsrmQuotaManager_Scan(IFsrmQuotaManager* This,BSTR strPath) {
    return This->lpVtbl->Scan(This,strPath);
}
static __WIDL_INLINE HRESULT IFsrmQuotaManager_CreateQuotaCollection(IFsrmQuotaManager* This,IFsrmCommittableCollection **collection) {
    return This->lpVtbl->CreateQuotaCollection(This,collection);
}
#endif
#endif

#endif


#endif  /* __IFsrmQuotaManager_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IFsrmQuotaTemplateManager interface
 */
#ifndef __IFsrmQuotaTemplateManager_INTERFACE_DEFINED__
#define __IFsrmQuotaTemplateManager_INTERFACE_DEFINED__

DEFINE_GUID(IID_IFsrmQuotaTemplateManager, 0x4173ac41, 0x172d, 0x4d52, 0x96,0x3c, 0xfd,0xc7,0xe4,0x15,0xf7,0x17);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("4173ac41-172d-4d52-963c-fdc7e415f717")
IFsrmQuotaTemplateManager : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE CreateTemplate(
        IFsrmQuotaTemplate **quotaTemplate) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetTemplate(
        BSTR name,
        IFsrmQuotaTemplate **quotaTemplate) = 0;

    virtual HRESULT STDMETHODCALLTYPE EnumTemplates(
        FsrmEnumOptions options,
        IFsrmCommittableCollection **quotaTemplates) = 0;

    virtual HRESULT STDMETHODCALLTYPE ExportTemplates(
        VARIANT *quotaTemplateNamesArray,
        BSTR *serializedQuotaTemplates) = 0;

    virtual HRESULT STDMETHODCALLTYPE ImportTemplates(
        BSTR serializedQuotaTemplates,
        VARIANT *quotaTemplateNamesArray,
        IFsrmCommittableCollection **quotaTemplates) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IFsrmQuotaTemplateManager, 0x4173ac41, 0x172d, 0x4d52, 0x96,0x3c, 0xfd,0xc7,0xe4,0x15,0xf7,0x17)
#endif
#else
typedef struct IFsrmQuotaTemplateManagerVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IFsrmQuotaTemplateManager *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IFsrmQuotaTemplateManager *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IFsrmQuotaTemplateManager *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IFsrmQuotaTemplateManager *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IFsrmQuotaTemplateManager methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateTemplate)(
        IFsrmQuotaTemplateManager *This,
        IFsrmQuotaTemplate **quotaTemplate);

    HRESULT (STDMETHODCALLTYPE *GetTemplate)(
        IFsrmQuotaTemplateManager *This,
        BSTR name,
        IFsrmQuotaTemplate **quotaTemplate);

    HRESULT (STDMETHODCALLTYPE *EnumTemplates)(
        IFsrmQuotaTemplateManager *This,
        FsrmEnumOptions options,
        IFsrmCommittableCollection **quotaTemplates);

    HRESULT (STDMETHODCALLTYPE *ExportTemplates)(
        IFsrmQuotaTemplateManager *This,
        VARIANT *quotaTemplateNamesArray,
        BSTR *serializedQuotaTemplates);

    HRESULT (STDMETHODCALLTYPE *ImportTemplates)(
        IFsrmQuotaTemplateManager *This,
        BSTR serializedQuotaTemplates,
        VARIANT *quotaTemplateNamesArray,
        IFsrmCommittableCollection **quotaTemplates);

    END_INTERFACE
} IFsrmQuotaTemplateManagerVtbl;

interface IFsrmQuotaTemplateManager {
    CONST_VTBL IFsrmQuotaTemplateManagerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IFsrmQuotaTemplateManager_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IFsrmQuotaTemplateManager_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IFsrmQuotaTemplateManager_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IFsrmQuotaTemplateManager_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IFsrmQuotaTemplateManager_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IFsrmQuotaTemplateManager_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IFsrmQuotaTemplateManager_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IFsrmQuotaTemplateManager methods ***/
#define IFsrmQuotaTemplateManager_CreateTemplate(This,quotaTemplate) (This)->lpVtbl->CreateTemplate(This,quotaTemplate)
#define IFsrmQuotaTemplateManager_GetTemplate(This,name,quotaTemplate) (This)->lpVtbl->GetTemplate(This,name,quotaTemplate)
#define IFsrmQuotaTemplateManager_EnumTemplates(This,options,quotaTemplates) (This)->lpVtbl->EnumTemplates(This,options,quotaTemplates)
#define IFsrmQuotaTemplateManager_ExportTemplates(This,quotaTemplateNamesArray,serializedQuotaTemplates) (This)->lpVtbl->ExportTemplates(This,quotaTemplateNamesArray,serializedQuotaTemplates)
#define IFsrmQuotaTemplateManager_ImportTemplates(This,serializedQuotaTemplates,quotaTemplateNamesArray,quotaTemplates) (This)->lpVtbl->ImportTemplates(This,serializedQuotaTemplates,quotaTemplateNamesArray,quotaTemplates)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IFsrmQuotaTemplateManager_QueryInterface(IFsrmQuotaTemplateManager* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IFsrmQuotaTemplateManager_AddRef(IFsrmQuotaTemplateManager* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IFsrmQuotaTemplateManager_Release(IFsrmQuotaTemplateManager* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IFsrmQuotaTemplateManager_GetTypeInfoCount(IFsrmQuotaTemplateManager* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IFsrmQuotaTemplateManager_GetTypeInfo(IFsrmQuotaTemplateManager* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT IFsrmQuotaTemplateManager_GetIDsOfNames(IFsrmQuotaTemplateManager* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static __WIDL_INLINE HRESULT IFsrmQuotaTemplateManager_Invoke(IFsrmQuotaTemplateManager* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IFsrmQuotaTemplateManager methods ***/
static __WIDL_INLINE HRESULT IFsrmQuotaTemplateManager_CreateTemplate(IFsrmQuotaTemplateManager* This,IFsrmQuotaTemplate **quotaTemplate) {
    return This->lpVtbl->CreateTemplate(This,quotaTemplate);
}
static __WIDL_INLINE HRESULT IFsrmQuotaTemplateManager_GetTemplate(IFsrmQuotaTemplateManager* This,BSTR name,IFsrmQuotaTemplate **quotaTemplate) {
    return This->lpVtbl->GetTemplate(This,name,quotaTemplate);
}
static __WIDL_INLINE HRESULT IFsrmQuotaTemplateManager_EnumTemplates(IFsrmQuotaTemplateManager* This,FsrmEnumOptions options,IFsrmCommittableCollection **quotaTemplates) {
    return This->lpVtbl->EnumTemplates(This,options,quotaTemplates);
}
static __WIDL_INLINE HRESULT IFsrmQuotaTemplateManager_ExportTemplates(IFsrmQuotaTemplateManager* This,VARIANT *quotaTemplateNamesArray,BSTR *serializedQuotaTemplates) {
    return This->lpVtbl->ExportTemplates(This,quotaTemplateNamesArray,serializedQuotaTemplates);
}
static __WIDL_INLINE HRESULT IFsrmQuotaTemplateManager_ImportTemplates(IFsrmQuotaTemplateManager* This,BSTR serializedQuotaTemplates,VARIANT *quotaTemplateNamesArray,IFsrmCommittableCollection **quotaTemplates) {
    return This->lpVtbl->ImportTemplates(This,serializedQuotaTemplates,quotaTemplateNamesArray,quotaTemplates);
}
#endif
#endif

#endif


#endif  /* __IFsrmQuotaTemplateManager_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IFsrmQuotaBase interface
 */
#ifndef __IFsrmQuotaBase_INTERFACE_DEFINED__
#define __IFsrmQuotaBase_INTERFACE_DEFINED__

DEFINE_GUID(IID_IFsrmQuotaBase, 0x1568a795, 0x3924, 0x4118, 0xb7,0x4b, 0x68,0xd8,0xf0,0xfa,0x5d,0xaf);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("1568a795-3924-4118-b74b-68d8f0fa5daf")
IFsrmQuotaBase : public IFsrmObject
{
    virtual HRESULT STDMETHODCALLTYPE get_QuotaLimit(
        VARIANT *quotaLimit) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_QuotaLimit(
        VARIANT quotaLimit) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_QuotaFlags(
        LONG *quotaFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_QuotaFlags(
        LONG quotaFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Thresholds(
        SAFEARRAY **thresholds) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddThreshold(
        FSRM_QUOTA_THRESHOLD threshold) = 0;

    virtual HRESULT STDMETHODCALLTYPE DeleteThreshold(
        FSRM_QUOTA_THRESHOLD threshold) = 0;

    virtual HRESULT STDMETHODCALLTYPE ModifyThreshold(
        FSRM_QUOTA_THRESHOLD threshold,
        FSRM_QUOTA_THRESHOLD newThreshold) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateThresholdAction(
        FSRM_QUOTA_THRESHOLD threshold,
        FsrmActionType actionType,
        IFsrmAction **action) = 0;

    virtual HRESULT STDMETHODCALLTYPE EnumThresholdActions(
        FSRM_QUOTA_THRESHOLD threshold,
        IFsrmCollection **actions) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IFsrmQuotaBase, 0x1568a795, 0x3924, 0x4118, 0xb7,0x4b, 0x68,0xd8,0xf0,0xfa,0x5d,0xaf)
#endif
#else
typedef struct IFsrmQuotaBaseVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IFsrmQuotaBase *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IFsrmQuotaBase *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IFsrmQuotaBase *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IFsrmQuotaBase *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IFsrmObject methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Id)(
        IFsrmQuotaBase *This,
        FSRM_OBJECT_ID *id);

    HRESULT (STDMETHODCALLTYPE *get_Description)(
        IFsrmQuotaBase *This,
        BSTR *description);

    HRESULT (STDMETHODCALLTYPE *put_Description)(
        IFsrmQuotaBase *This,
        BSTR description);

    HRESULT (STDMETHODCALLTYPE *Delete)(
        IFsrmQuotaBase *This);

    HRESULT (STDMETHODCALLTYPE *Commit)(
        IFsrmQuotaBase *This);

    /*** IFsrmQuotaBase methods ***/
    HRESULT (STDMETHODCALLTYPE *get_QuotaLimit)(
        IFsrmQuotaBase *This,
        VARIANT *quotaLimit);

    HRESULT (STDMETHODCALLTYPE *put_QuotaLimit)(
        IFsrmQuotaBase *This,
        VARIANT quotaLimit);

    HRESULT (STDMETHODCALLTYPE *get_QuotaFlags)(
        IFsrmQuotaBase *This,
        LONG *quotaFlags);

    HRESULT (STDMETHODCALLTYPE *put_QuotaFlags)(
        IFsrmQuotaBase *This,
        LONG quotaFlags);

    HRESULT (STDMETHODCALLTYPE *get_Thresholds)(
        IFsrmQuotaBase *This,
        SAFEARRAY **thresholds);

    HRESULT (STDMETHODCALLTYPE *AddThreshold)(
        IFsrmQuotaBase *This,
        FSRM_QUOTA_THRESHOLD threshold);

    HRESULT (STDMETHODCALLTYPE *DeleteThreshold)(
        IFsrmQuotaBase *This,
        FSRM_QUOTA_THRESHOLD threshold);

    HRESULT (STDMETHODCALLTYPE *ModifyThreshold)(
        IFsrmQuotaBase *This,
        FSRM_QUOTA_THRESHOLD threshold,
        FSRM_QUOTA_THRESHOLD newThreshold);

    HRESULT (STDMETHODCALLTYPE *CreateThresholdAction)(
        IFsrmQuotaBase *This,
        FSRM_QUOTA_THRESHOLD threshold,
        FsrmActionType actionType,
        IFsrmAction **action);

    HRESULT (STDMETHODCALLTYPE *EnumThresholdActions)(
        IFsrmQuotaBase *This,
        FSRM_QUOTA_THRESHOLD threshold,
        IFsrmCollection **actions);

    END_INTERFACE
} IFsrmQuotaBaseVtbl;

interface IFsrmQuotaBase {
    CONST_VTBL IFsrmQuotaBaseVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IFsrmQuotaBase_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IFsrmQuotaBase_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IFsrmQuotaBase_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IFsrmQuotaBase_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IFsrmQuotaBase_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IFsrmQuotaBase_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IFsrmQuotaBase_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IFsrmObject methods ***/
#define IFsrmQuotaBase_get_Id(This,id) (This)->lpVtbl->get_Id(This,id)
#define IFsrmQuotaBase_get_Description(This,description) (This)->lpVtbl->get_Description(This,description)
#define IFsrmQuotaBase_put_Description(This,description) (This)->lpVtbl->put_Description(This,description)
#define IFsrmQuotaBase_Delete(This) (This)->lpVtbl->Delete(This)
#define IFsrmQuotaBase_Commit(This) (This)->lpVtbl->Commit(This)
/*** IFsrmQuotaBase methods ***/
#define IFsrmQuotaBase_get_QuotaLimit(This,quotaLimit) (This)->lpVtbl->get_QuotaLimit(This,quotaLimit)
#define IFsrmQuotaBase_put_QuotaLimit(This,quotaLimit) (This)->lpVtbl->put_QuotaLimit(This,quotaLimit)
#define IFsrmQuotaBase_get_QuotaFlags(This,quotaFlags) (This)->lpVtbl->get_QuotaFlags(This,quotaFlags)
#define IFsrmQuotaBase_put_QuotaFlags(This,quotaFlags) (This)->lpVtbl->put_QuotaFlags(This,quotaFlags)
#define IFsrmQuotaBase_get_Thresholds(This,thresholds) (This)->lpVtbl->get_Thresholds(This,thresholds)
#define IFsrmQuotaBase_AddThreshold(This,threshold) (This)->lpVtbl->AddThreshold(This,threshold)
#define IFsrmQuotaBase_DeleteThreshold(This,threshold) (This)->lpVtbl->DeleteThreshold(This,threshold)
#define IFsrmQuotaBase_ModifyThreshold(This,threshold,newThreshold) (This)->lpVtbl->ModifyThreshold(This,threshold,newThreshold)
#define IFsrmQuotaBase_CreateThresholdAction(This,threshold,actionType,action) (This)->lpVtbl->CreateThresholdAction(This,threshold,actionType,action)
#define IFsrmQuotaBase_EnumThresholdActions(This,threshold,actions) (This)->lpVtbl->EnumThresholdActions(This,threshold,actions)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IFsrmQuotaBase_QueryInterface(IFsrmQuotaBase* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IFsrmQuotaBase_AddRef(IFsrmQuotaBase* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IFsrmQuotaBase_Release(IFsrmQuotaBase* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IFsrmQuotaBase_GetTypeInfoCount(IFsrmQuotaBase* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IFsrmQuotaBase_GetTypeInfo(IFsrmQuotaBase* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT IFsrmQuotaBase_GetIDsOfNames(IFsrmQuotaBase* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static __WIDL_INLINE HRESULT IFsrmQuotaBase_Invoke(IFsrmQuotaBase* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IFsrmObject methods ***/
static __WIDL_INLINE HRESULT IFsrmQuotaBase_get_Id(IFsrmQuotaBase* This,FSRM_OBJECT_ID *id) {
    return This->lpVtbl->get_Id(This,id);
}
static __WIDL_INLINE HRESULT IFsrmQuotaBase_get_Description(IFsrmQuotaBase* This,BSTR *description) {
    return This->lpVtbl->get_Description(This,description);
}
static __WIDL_INLINE HRESULT IFsrmQuotaBase_put_Description(IFsrmQuotaBase* This,BSTR description) {
    return This->lpVtbl->put_Description(This,description);
}
static __WIDL_INLINE HRESULT IFsrmQuotaBase_Delete(IFsrmQuotaBase* This) {
    return This->lpVtbl->Delete(This);
}
static __WIDL_INLINE HRESULT IFsrmQuotaBase_Commit(IFsrmQuotaBase* This) {
    return This->lpVtbl->Commit(This);
}
/*** IFsrmQuotaBase methods ***/
static __WIDL_INLINE HRESULT IFsrmQuotaBase_get_QuotaLimit(IFsrmQuotaBase* This,VARIANT *quotaLimit) {
    return This->lpVtbl->get_QuotaLimit(This,quotaLimit);
}
static __WIDL_INLINE HRESULT IFsrmQuotaBase_put_QuotaLimit(IFsrmQuotaBase* This,VARIANT quotaLimit) {
    return This->lpVtbl->put_QuotaLimit(This,quotaLimit);
}
static __WIDL_INLINE HRESULT IFsrmQuotaBase_get_QuotaFlags(IFsrmQuotaBase* This,LONG *quotaFlags) {
    return This->lpVtbl->get_QuotaFlags(This,quotaFlags);
}
static __WIDL_INLINE HRESULT IFsrmQuotaBase_put_QuotaFlags(IFsrmQuotaBase* This,LONG quotaFlags) {
    return This->lpVtbl->put_QuotaFlags(This,quotaFlags);
}
static __WIDL_INLINE HRESULT IFsrmQuotaBase_get_Thresholds(IFsrmQuotaBase* This,SAFEARRAY **thresholds) {
    return This->lpVtbl->get_Thresholds(This,thresholds);
}
static __WIDL_INLINE HRESULT IFsrmQuotaBase_AddThreshold(IFsrmQuotaBase* This,FSRM_QUOTA_THRESHOLD threshold) {
    return This->lpVtbl->AddThreshold(This,threshold);
}
static __WIDL_INLINE HRESULT IFsrmQuotaBase_DeleteThreshold(IFsrmQuotaBase* This,FSRM_QUOTA_THRESHOLD threshold) {
    return This->lpVtbl->DeleteThreshold(This,threshold);
}
static __WIDL_INLINE HRESULT IFsrmQuotaBase_ModifyThreshold(IFsrmQuotaBase* This,FSRM_QUOTA_THRESHOLD threshold,FSRM_QUOTA_THRESHOLD newThreshold) {
    return This->lpVtbl->ModifyThreshold(This,threshold,newThreshold);
}
static __WIDL_INLINE HRESULT IFsrmQuotaBase_CreateThresholdAction(IFsrmQuotaBase* This,FSRM_QUOTA_THRESHOLD threshold,FsrmActionType actionType,IFsrmAction **action) {
    return This->lpVtbl->CreateThresholdAction(This,threshold,actionType,action);
}
static __WIDL_INLINE HRESULT IFsrmQuotaBase_EnumThresholdActions(IFsrmQuotaBase* This,FSRM_QUOTA_THRESHOLD threshold,IFsrmCollection **actions) {
    return This->lpVtbl->EnumThresholdActions(This,threshold,actions);
}
#endif
#endif

#endif


#endif  /* __IFsrmQuotaBase_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IFsrmQuotaObject interface
 */
#ifndef __IFsrmQuotaObject_INTERFACE_DEFINED__
#define __IFsrmQuotaObject_INTERFACE_DEFINED__

DEFINE_GUID(IID_IFsrmQuotaObject, 0x42dc3511, 0x61d5, 0x48ae, 0xb6,0xdc, 0x59,0xfc,0x00,0xc0,0xa8,0xd6);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("42dc3511-61d5-48ae-b6dc-59fc00c0a8d6")
IFsrmQuotaObject : public IFsrmQuotaBase
{
    virtual HRESULT STDMETHODCALLTYPE get_Path(
        BSTR *path) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_UserSid(
        BSTR *userSid) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_UserAccount(
        BSTR *userAccount) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_SourceTemplateName(
        BSTR *quotaTemplateName) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_MatchesSourceTemplate(
        VARIANT_BOOL *matches) = 0;

    virtual HRESULT STDMETHODCALLTYPE ApplyTemplate(
        BSTR quotaTemplateName) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IFsrmQuotaObject, 0x42dc3511, 0x61d5, 0x48ae, 0xb6,0xdc, 0x59,0xfc,0x00,0xc0,0xa8,0xd6)
#endif
#else
typedef struct IFsrmQuotaObjectVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IFsrmQuotaObject *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IFsrmQuotaObject *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IFsrmQuotaObject *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IFsrmQuotaObject *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IFsrmObject methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Id)(
        IFsrmQuotaObject *This,
        FSRM_OBJECT_ID *id);

    HRESULT (STDMETHODCALLTYPE *get_Description)(
        IFsrmQuotaObject *This,
        BSTR *description);

    HRESULT (STDMETHODCALLTYPE *put_Description)(
        IFsrmQuotaObject *This,
        BSTR description);

    HRESULT (STDMETHODCALLTYPE *Delete)(
        IFsrmQuotaObject *This);

    HRESULT (STDMETHODCALLTYPE *Commit)(
        IFsrmQuotaObject *This);

    /*** IFsrmQuotaBase methods ***/
    HRESULT (STDMETHODCALLTYPE *get_QuotaLimit)(
        IFsrmQuotaObject *This,
        VARIANT *quotaLimit);

    HRESULT (STDMETHODCALLTYPE *put_QuotaLimit)(
        IFsrmQuotaObject *This,
        VARIANT quotaLimit);

    HRESULT (STDMETHODCALLTYPE *get_QuotaFlags)(
        IFsrmQuotaObject *This,
        LONG *quotaFlags);

    HRESULT (STDMETHODCALLTYPE *put_QuotaFlags)(
        IFsrmQuotaObject *This,
        LONG quotaFlags);

    HRESULT (STDMETHODCALLTYPE *get_Thresholds)(
        IFsrmQuotaObject *This,
        SAFEARRAY **thresholds);

    HRESULT (STDMETHODCALLTYPE *AddThreshold)(
        IFsrmQuotaObject *This,
        FSRM_QUOTA_THRESHOLD threshold);

    HRESULT (STDMETHODCALLTYPE *DeleteThreshold)(
        IFsrmQuotaObject *This,
        FSRM_QUOTA_THRESHOLD threshold);

    HRESULT (STDMETHODCALLTYPE *ModifyThreshold)(
        IFsrmQuotaObject *This,
        FSRM_QUOTA_THRESHOLD threshold,
        FSRM_QUOTA_THRESHOLD newThreshold);

    HRESULT (STDMETHODCALLTYPE *CreateThresholdAction)(
        IFsrmQuotaObject *This,
        FSRM_QUOTA_THRESHOLD threshold,
        FsrmActionType actionType,
        IFsrmAction **action);

    HRESULT (STDMETHODCALLTYPE *EnumThresholdActions)(
        IFsrmQuotaObject *This,
        FSRM_QUOTA_THRESHOLD threshold,
        IFsrmCollection **actions);

    /*** IFsrmQuotaObject methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Path)(
        IFsrmQuotaObject *This,
        BSTR *path);

    HRESULT (STDMETHODCALLTYPE *get_UserSid)(
        IFsrmQuotaObject *This,
        BSTR *userSid);

    HRESULT (STDMETHODCALLTYPE *get_UserAccount)(
        IFsrmQuotaObject *This,
        BSTR *userAccount);

    HRESULT (STDMETHODCALLTYPE *get_SourceTemplateName)(
        IFsrmQuotaObject *This,
        BSTR *quotaTemplateName);

    HRESULT (STDMETHODCALLTYPE *get_MatchesSourceTemplate)(
        IFsrmQuotaObject *This,
        VARIANT_BOOL *matches);

    HRESULT (STDMETHODCALLTYPE *ApplyTemplate)(
        IFsrmQuotaObject *This,
        BSTR quotaTemplateName);

    END_INTERFACE
} IFsrmQuotaObjectVtbl;

interface IFsrmQuotaObject {
    CONST_VTBL IFsrmQuotaObjectVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IFsrmQuotaObject_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IFsrmQuotaObject_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IFsrmQuotaObject_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IFsrmQuotaObject_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IFsrmQuotaObject_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IFsrmQuotaObject_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IFsrmQuotaObject_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IFsrmObject methods ***/
#define IFsrmQuotaObject_get_Id(This,id) (This)->lpVtbl->get_Id(This,id)
#define IFsrmQuotaObject_get_Description(This,description) (This)->lpVtbl->get_Description(This,description)
#define IFsrmQuotaObject_put_Description(This,description) (This)->lpVtbl->put_Description(This,description)
#define IFsrmQuotaObject_Delete(This) (This)->lpVtbl->Delete(This)
#define IFsrmQuotaObject_Commit(This) (This)->lpVtbl->Commit(This)
/*** IFsrmQuotaBase methods ***/
#define IFsrmQuotaObject_get_QuotaLimit(This,quotaLimit) (This)->lpVtbl->get_QuotaLimit(This,quotaLimit)
#define IFsrmQuotaObject_put_QuotaLimit(This,quotaLimit) (This)->lpVtbl->put_QuotaLimit(This,quotaLimit)
#define IFsrmQuotaObject_get_QuotaFlags(This,quotaFlags) (This)->lpVtbl->get_QuotaFlags(This,quotaFlags)
#define IFsrmQuotaObject_put_QuotaFlags(This,quotaFlags) (This)->lpVtbl->put_QuotaFlags(This,quotaFlags)
#define IFsrmQuotaObject_get_Thresholds(This,thresholds) (This)->lpVtbl->get_Thresholds(This,thresholds)
#define IFsrmQuotaObject_AddThreshold(This,threshold) (This)->lpVtbl->AddThreshold(This,threshold)
#define IFsrmQuotaObject_DeleteThreshold(This,threshold) (This)->lpVtbl->DeleteThreshold(This,threshold)
#define IFsrmQuotaObject_ModifyThreshold(This,threshold,newThreshold) (This)->lpVtbl->ModifyThreshold(This,threshold,newThreshold)
#define IFsrmQuotaObject_CreateThresholdAction(This,threshold,actionType,action) (This)->lpVtbl->CreateThresholdAction(This,threshold,actionType,action)
#define IFsrmQuotaObject_EnumThresholdActions(This,threshold,actions) (This)->lpVtbl->EnumThresholdActions(This,threshold,actions)
/*** IFsrmQuotaObject methods ***/
#define IFsrmQuotaObject_get_Path(This,path) (This)->lpVtbl->get_Path(This,path)
#define IFsrmQuotaObject_get_UserSid(This,userSid) (This)->lpVtbl->get_UserSid(This,userSid)
#define IFsrmQuotaObject_get_UserAccount(This,userAccount) (This)->lpVtbl->get_UserAccount(This,userAccount)
#define IFsrmQuotaObject_get_SourceTemplateName(This,quotaTemplateName) (This)->lpVtbl->get_SourceTemplateName(This,quotaTemplateName)
#define IFsrmQuotaObject_get_MatchesSourceTemplate(This,matches) (This)->lpVtbl->get_MatchesSourceTemplate(This,matches)
#define IFsrmQuotaObject_ApplyTemplate(This,quotaTemplateName) (This)->lpVtbl->ApplyTemplate(This,quotaTemplateName)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IFsrmQuotaObject_QueryInterface(IFsrmQuotaObject* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IFsrmQuotaObject_AddRef(IFsrmQuotaObject* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IFsrmQuotaObject_Release(IFsrmQuotaObject* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IFsrmQuotaObject_GetTypeInfoCount(IFsrmQuotaObject* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IFsrmQuotaObject_GetTypeInfo(IFsrmQuotaObject* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT IFsrmQuotaObject_GetIDsOfNames(IFsrmQuotaObject* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static __WIDL_INLINE HRESULT IFsrmQuotaObject_Invoke(IFsrmQuotaObject* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IFsrmObject methods ***/
static __WIDL_INLINE HRESULT IFsrmQuotaObject_get_Id(IFsrmQuotaObject* This,FSRM_OBJECT_ID *id) {
    return This->lpVtbl->get_Id(This,id);
}
static __WIDL_INLINE HRESULT IFsrmQuotaObject_get_Description(IFsrmQuotaObject* This,BSTR *description) {
    return This->lpVtbl->get_Description(This,description);
}
static __WIDL_INLINE HRESULT IFsrmQuotaObject_put_Description(IFsrmQuotaObject* This,BSTR description) {
    return This->lpVtbl->put_Description(This,description);
}
static __WIDL_INLINE HRESULT IFsrmQuotaObject_Delete(IFsrmQuotaObject* This) {
    return This->lpVtbl->Delete(This);
}
static __WIDL_INLINE HRESULT IFsrmQuotaObject_Commit(IFsrmQuotaObject* This) {
    return This->lpVtbl->Commit(This);
}
/*** IFsrmQuotaBase methods ***/
static __WIDL_INLINE HRESULT IFsrmQuotaObject_get_QuotaLimit(IFsrmQuotaObject* This,VARIANT *quotaLimit) {
    return This->lpVtbl->get_QuotaLimit(This,quotaLimit);
}
static __WIDL_INLINE HRESULT IFsrmQuotaObject_put_QuotaLimit(IFsrmQuotaObject* This,VARIANT quotaLimit) {
    return This->lpVtbl->put_QuotaLimit(This,quotaLimit);
}
static __WIDL_INLINE HRESULT IFsrmQuotaObject_get_QuotaFlags(IFsrmQuotaObject* This,LONG *quotaFlags) {
    return This->lpVtbl->get_QuotaFlags(This,quotaFlags);
}
static __WIDL_INLINE HRESULT IFsrmQuotaObject_put_QuotaFlags(IFsrmQuotaObject* This,LONG quotaFlags) {
    return This->lpVtbl->put_QuotaFlags(This,quotaFlags);
}
static __WIDL_INLINE HRESULT IFsrmQuotaObject_get_Thresholds(IFsrmQuotaObject* This,SAFEARRAY **thresholds) {
    return This->lpVtbl->get_Thresholds(This,thresholds);
}
static __WIDL_INLINE HRESULT IFsrmQuotaObject_AddThreshold(IFsrmQuotaObject* This,FSRM_QUOTA_THRESHOLD threshold) {
    return This->lpVtbl->AddThreshold(This,threshold);
}
static __WIDL_INLINE HRESULT IFsrmQuotaObject_DeleteThreshold(IFsrmQuotaObject* This,FSRM_QUOTA_THRESHOLD threshold) {
    return This->lpVtbl->DeleteThreshold(This,threshold);
}
static __WIDL_INLINE HRESULT IFsrmQuotaObject_ModifyThreshold(IFsrmQuotaObject* This,FSRM_QUOTA_THRESHOLD threshold,FSRM_QUOTA_THRESHOLD newThreshold) {
    return This->lpVtbl->ModifyThreshold(This,threshold,newThreshold);
}
static __WIDL_INLINE HRESULT IFsrmQuotaObject_CreateThresholdAction(IFsrmQuotaObject* This,FSRM_QUOTA_THRESHOLD threshold,FsrmActionType actionType,IFsrmAction **action) {
    return This->lpVtbl->CreateThresholdAction(This,threshold,actionType,action);
}
static __WIDL_INLINE HRESULT IFsrmQuotaObject_EnumThresholdActions(IFsrmQuotaObject* This,FSRM_QUOTA_THRESHOLD threshold,IFsrmCollection **actions) {
    return This->lpVtbl->EnumThresholdActions(This,threshold,actions);
}
/*** IFsrmQuotaObject methods ***/
static __WIDL_INLINE HRESULT IFsrmQuotaObject_get_Path(IFsrmQuotaObject* This,BSTR *path) {
    return This->lpVtbl->get_Path(This,path);
}
static __WIDL_INLINE HRESULT IFsrmQuotaObject_get_UserSid(IFsrmQuotaObject* This,BSTR *userSid) {
    return This->lpVtbl->get_UserSid(This,userSid);
}
static __WIDL_INLINE HRESULT IFsrmQuotaObject_get_UserAccount(IFsrmQuotaObject* This,BSTR *userAccount) {
    return This->lpVtbl->get_UserAccount(This,userAccount);
}
static __WIDL_INLINE HRESULT IFsrmQuotaObject_get_SourceTemplateName(IFsrmQuotaObject* This,BSTR *quotaTemplateName) {
    return This->lpVtbl->get_SourceTemplateName(This,quotaTemplateName);
}
static __WIDL_INLINE HRESULT IFsrmQuotaObject_get_MatchesSourceTemplate(IFsrmQuotaObject* This,VARIANT_BOOL *matches) {
    return This->lpVtbl->get_MatchesSourceTemplate(This,matches);
}
static __WIDL_INLINE HRESULT IFsrmQuotaObject_ApplyTemplate(IFsrmQuotaObject* This,BSTR quotaTemplateName) {
    return This->lpVtbl->ApplyTemplate(This,quotaTemplateName);
}
#endif
#endif

#endif


#endif  /* __IFsrmQuotaObject_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IFsrmQuotaTemplate interface
 */
#ifndef __IFsrmQuotaTemplate_INTERFACE_DEFINED__
#define __IFsrmQuotaTemplate_INTERFACE_DEFINED__

DEFINE_GUID(IID_IFsrmQuotaTemplate, 0xa2efab31, 0x295e, 0x46bb, 0xb9,0x76, 0xe8,0x6d,0x58,0xb5,0x2e,0x8b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("a2efab31-295e-46bb-b976-e86d58b52e8b")
IFsrmQuotaTemplate : public IFsrmQuotaBase
{
    virtual HRESULT STDMETHODCALLTYPE get_Name(
        BSTR *name) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Name(
        BSTR name) = 0;

    virtual HRESULT STDMETHODCALLTYPE CopyTemplate(
        BSTR quotaTemplateName) = 0;

    virtual HRESULT STDMETHODCALLTYPE CommitAndUpdateDerived(
        FsrmCommitOptions commitOptions,
        FsrmTemplateApplyOptions applyOptions,
        IFsrmDerivedObjectsResult **derivedObjectsResult) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IFsrmQuotaTemplate, 0xa2efab31, 0x295e, 0x46bb, 0xb9,0x76, 0xe8,0x6d,0x58,0xb5,0x2e,0x8b)
#endif
#else
typedef struct IFsrmQuotaTemplateVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IFsrmQuotaTemplate *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IFsrmQuotaTemplate *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IFsrmQuotaTemplate *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IFsrmQuotaTemplate *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IFsrmObject methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Id)(
        IFsrmQuotaTemplate *This,
        FSRM_OBJECT_ID *id);

    HRESULT (STDMETHODCALLTYPE *get_Description)(
        IFsrmQuotaTemplate *This,
        BSTR *description);

    HRESULT (STDMETHODCALLTYPE *put_Description)(
        IFsrmQuotaTemplate *This,
        BSTR description);

    HRESULT (STDMETHODCALLTYPE *Delete)(
        IFsrmQuotaTemplate *This);

    HRESULT (STDMETHODCALLTYPE *Commit)(
        IFsrmQuotaTemplate *This);

    /*** IFsrmQuotaBase methods ***/
    HRESULT (STDMETHODCALLTYPE *get_QuotaLimit)(
        IFsrmQuotaTemplate *This,
        VARIANT *quotaLimit);

    HRESULT (STDMETHODCALLTYPE *put_QuotaLimit)(
        IFsrmQuotaTemplate *This,
        VARIANT quotaLimit);

    HRESULT (STDMETHODCALLTYPE *get_QuotaFlags)(
        IFsrmQuotaTemplate *This,
        LONG *quotaFlags);

    HRESULT (STDMETHODCALLTYPE *put_QuotaFlags)(
        IFsrmQuotaTemplate *This,
        LONG quotaFlags);

    HRESULT (STDMETHODCALLTYPE *get_Thresholds)(
        IFsrmQuotaTemplate *This,
        SAFEARRAY **thresholds);

    HRESULT (STDMETHODCALLTYPE *AddThreshold)(
        IFsrmQuotaTemplate *This,
        FSRM_QUOTA_THRESHOLD threshold);

    HRESULT (STDMETHODCALLTYPE *DeleteThreshold)(
        IFsrmQuotaTemplate *This,
        FSRM_QUOTA_THRESHOLD threshold);

    HRESULT (STDMETHODCALLTYPE *ModifyThreshold)(
        IFsrmQuotaTemplate *This,
        FSRM_QUOTA_THRESHOLD threshold,
        FSRM_QUOTA_THRESHOLD newThreshold);

    HRESULT (STDMETHODCALLTYPE *CreateThresholdAction)(
        IFsrmQuotaTemplate *This,
        FSRM_QUOTA_THRESHOLD threshold,
        FsrmActionType actionType,
        IFsrmAction **action);

    HRESULT (STDMETHODCALLTYPE *EnumThresholdActions)(
        IFsrmQuotaTemplate *This,
        FSRM_QUOTA_THRESHOLD threshold,
        IFsrmCollection **actions);

    /*** IFsrmQuotaTemplate methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Name)(
        IFsrmQuotaTemplate *This,
        BSTR *name);

    HRESULT (STDMETHODCALLTYPE *put_Name)(
        IFsrmQuotaTemplate *This,
        BSTR name);

    HRESULT (STDMETHODCALLTYPE *CopyTemplate)(
        IFsrmQuotaTemplate *This,
        BSTR quotaTemplateName);

    HRESULT (STDMETHODCALLTYPE *CommitAndUpdateDerived)(
        IFsrmQuotaTemplate *This,
        FsrmCommitOptions commitOptions,
        FsrmTemplateApplyOptions applyOptions,
        IFsrmDerivedObjectsResult **derivedObjectsResult);

    END_INTERFACE
} IFsrmQuotaTemplateVtbl;

interface IFsrmQuotaTemplate {
    CONST_VTBL IFsrmQuotaTemplateVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IFsrmQuotaTemplate_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IFsrmQuotaTemplate_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IFsrmQuotaTemplate_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IFsrmQuotaTemplate_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IFsrmQuotaTemplate_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IFsrmQuotaTemplate_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IFsrmQuotaTemplate_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IFsrmObject methods ***/
#define IFsrmQuotaTemplate_get_Id(This,id) (This)->lpVtbl->get_Id(This,id)
#define IFsrmQuotaTemplate_get_Description(This,description) (This)->lpVtbl->get_Description(This,description)
#define IFsrmQuotaTemplate_put_Description(This,description) (This)->lpVtbl->put_Description(This,description)
#define IFsrmQuotaTemplate_Delete(This) (This)->lpVtbl->Delete(This)
#define IFsrmQuotaTemplate_Commit(This) (This)->lpVtbl->Commit(This)
/*** IFsrmQuotaBase methods ***/
#define IFsrmQuotaTemplate_get_QuotaLimit(This,quotaLimit) (This)->lpVtbl->get_QuotaLimit(This,quotaLimit)
#define IFsrmQuotaTemplate_put_QuotaLimit(This,quotaLimit) (This)->lpVtbl->put_QuotaLimit(This,quotaLimit)
#define IFsrmQuotaTemplate_get_QuotaFlags(This,quotaFlags) (This)->lpVtbl->get_QuotaFlags(This,quotaFlags)
#define IFsrmQuotaTemplate_put_QuotaFlags(This,quotaFlags) (This)->lpVtbl->put_QuotaFlags(This,quotaFlags)
#define IFsrmQuotaTemplate_get_Thresholds(This,thresholds) (This)->lpVtbl->get_Thresholds(This,thresholds)
#define IFsrmQuotaTemplate_AddThreshold(This,threshold) (This)->lpVtbl->AddThreshold(This,threshold)
#define IFsrmQuotaTemplate_DeleteThreshold(This,threshold) (This)->lpVtbl->DeleteThreshold(This,threshold)
#define IFsrmQuotaTemplate_ModifyThreshold(This,threshold,newThreshold) (This)->lpVtbl->ModifyThreshold(This,threshold,newThreshold)
#define IFsrmQuotaTemplate_CreateThresholdAction(This,threshold,actionType,action) (This)->lpVtbl->CreateThresholdAction(This,threshold,actionType,action)
#define IFsrmQuotaTemplate_EnumThresholdActions(This,threshold,actions) (This)->lpVtbl->EnumThresholdActions(This,threshold,actions)
/*** IFsrmQuotaTemplate methods ***/
#define IFsrmQuotaTemplate_get_Name(This,name) (This)->lpVtbl->get_Name(This,name)
#define IFsrmQuotaTemplate_put_Name(This,name) (This)->lpVtbl->put_Name(This,name)
#define IFsrmQuotaTemplate_CopyTemplate(This,quotaTemplateName) (This)->lpVtbl->CopyTemplate(This,quotaTemplateName)
#define IFsrmQuotaTemplate_CommitAndUpdateDerived(This,commitOptions,applyOptions,derivedObjectsResult) (This)->lpVtbl->CommitAndUpdateDerived(This,commitOptions,applyOptions,derivedObjectsResult)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IFsrmQuotaTemplate_QueryInterface(IFsrmQuotaTemplate* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IFsrmQuotaTemplate_AddRef(IFsrmQuotaTemplate* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IFsrmQuotaTemplate_Release(IFsrmQuotaTemplate* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IFsrmQuotaTemplate_GetTypeInfoCount(IFsrmQuotaTemplate* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IFsrmQuotaTemplate_GetTypeInfo(IFsrmQuotaTemplate* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT IFsrmQuotaTemplate_GetIDsOfNames(IFsrmQuotaTemplate* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static __WIDL_INLINE HRESULT IFsrmQuotaTemplate_Invoke(IFsrmQuotaTemplate* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IFsrmObject methods ***/
static __WIDL_INLINE HRESULT IFsrmQuotaTemplate_get_Id(IFsrmQuotaTemplate* This,FSRM_OBJECT_ID *id) {
    return This->lpVtbl->get_Id(This,id);
}
static __WIDL_INLINE HRESULT IFsrmQuotaTemplate_get_Description(IFsrmQuotaTemplate* This,BSTR *description) {
    return This->lpVtbl->get_Description(This,description);
}
static __WIDL_INLINE HRESULT IFsrmQuotaTemplate_put_Description(IFsrmQuotaTemplate* This,BSTR description) {
    return This->lpVtbl->put_Description(This,description);
}
static __WIDL_INLINE HRESULT IFsrmQuotaTemplate_Delete(IFsrmQuotaTemplate* This) {
    return This->lpVtbl->Delete(This);
}
static __WIDL_INLINE HRESULT IFsrmQuotaTemplate_Commit(IFsrmQuotaTemplate* This) {
    return This->lpVtbl->Commit(This);
}
/*** IFsrmQuotaBase methods ***/
static __WIDL_INLINE HRESULT IFsrmQuotaTemplate_get_QuotaLimit(IFsrmQuotaTemplate* This,VARIANT *quotaLimit) {
    return This->lpVtbl->get_QuotaLimit(This,quotaLimit);
}
static __WIDL_INLINE HRESULT IFsrmQuotaTemplate_put_QuotaLimit(IFsrmQuotaTemplate* This,VARIANT quotaLimit) {
    return This->lpVtbl->put_QuotaLimit(This,quotaLimit);
}
static __WIDL_INLINE HRESULT IFsrmQuotaTemplate_get_QuotaFlags(IFsrmQuotaTemplate* This,LONG *quotaFlags) {
    return This->lpVtbl->get_QuotaFlags(This,quotaFlags);
}
static __WIDL_INLINE HRESULT IFsrmQuotaTemplate_put_QuotaFlags(IFsrmQuotaTemplate* This,LONG quotaFlags) {
    return This->lpVtbl->put_QuotaFlags(This,quotaFlags);
}
static __WIDL_INLINE HRESULT IFsrmQuotaTemplate_get_Thresholds(IFsrmQuotaTemplate* This,SAFEARRAY **thresholds) {
    return This->lpVtbl->get_Thresholds(This,thresholds);
}
static __WIDL_INLINE HRESULT IFsrmQuotaTemplate_AddThreshold(IFsrmQuotaTemplate* This,FSRM_QUOTA_THRESHOLD threshold) {
    return This->lpVtbl->AddThreshold(This,threshold);
}
static __WIDL_INLINE HRESULT IFsrmQuotaTemplate_DeleteThreshold(IFsrmQuotaTemplate* This,FSRM_QUOTA_THRESHOLD threshold) {
    return This->lpVtbl->DeleteThreshold(This,threshold);
}
static __WIDL_INLINE HRESULT IFsrmQuotaTemplate_ModifyThreshold(IFsrmQuotaTemplate* This,FSRM_QUOTA_THRESHOLD threshold,FSRM_QUOTA_THRESHOLD newThreshold) {
    return This->lpVtbl->ModifyThreshold(This,threshold,newThreshold);
}
static __WIDL_INLINE HRESULT IFsrmQuotaTemplate_CreateThresholdAction(IFsrmQuotaTemplate* This,FSRM_QUOTA_THRESHOLD threshold,FsrmActionType actionType,IFsrmAction **action) {
    return This->lpVtbl->CreateThresholdAction(This,threshold,actionType,action);
}
static __WIDL_INLINE HRESULT IFsrmQuotaTemplate_EnumThresholdActions(IFsrmQuotaTemplate* This,FSRM_QUOTA_THRESHOLD threshold,IFsrmCollection **actions) {
    return This->lpVtbl->EnumThresholdActions(This,threshold,actions);
}
/*** IFsrmQuotaTemplate methods ***/
static __WIDL_INLINE HRESULT IFsrmQuotaTemplate_get_Name(IFsrmQuotaTemplate* This,BSTR *name) {
    return This->lpVtbl->get_Name(This,name);
}
static __WIDL_INLINE HRESULT IFsrmQuotaTemplate_put_Name(IFsrmQuotaTemplate* This,BSTR name) {
    return This->lpVtbl->put_Name(This,name);
}
static __WIDL_INLINE HRESULT IFsrmQuotaTemplate_CopyTemplate(IFsrmQuotaTemplate* This,BSTR quotaTemplateName) {
    return This->lpVtbl->CopyTemplate(This,quotaTemplateName);
}
static __WIDL_INLINE HRESULT IFsrmQuotaTemplate_CommitAndUpdateDerived(IFsrmQuotaTemplate* This,FsrmCommitOptions commitOptions,FsrmTemplateApplyOptions applyOptions,IFsrmDerivedObjectsResult **derivedObjectsResult) {
    return This->lpVtbl->CommitAndUpdateDerived(This,commitOptions,applyOptions,derivedObjectsResult);
}
#endif
#endif

#endif


#endif  /* __IFsrmQuotaTemplate_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IFsrmQuota interface
 */
#ifndef __IFsrmQuota_INTERFACE_DEFINED__
#define __IFsrmQuota_INTERFACE_DEFINED__

DEFINE_GUID(IID_IFsrmQuota, 0x377f739d, 0x9647, 0x4b8e, 0x97,0xd2, 0x5f,0xfc,0xe6,0xd7,0x59,0xcd);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("377f739d-9647-4b8e-97d2-5ffce6d759cd")
IFsrmQuota : public IFsrmQuotaObject
{
    virtual HRESULT STDMETHODCALLTYPE get_QuotaUsed(
        VARIANT *used) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_QuotaPeakUsage(
        VARIANT *peakUsage) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_QuotaPeakUsageTime(
        DATE *peakUsageDateTime) = 0;

    virtual HRESULT STDMETHODCALLTYPE ResetPeakUsage(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE RefreshUsageProperties(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IFsrmQuota, 0x377f739d, 0x9647, 0x4b8e, 0x97,0xd2, 0x5f,0xfc,0xe6,0xd7,0x59,0xcd)
#endif
#else
typedef struct IFsrmQuotaVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IFsrmQuota *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IFsrmQuota *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IFsrmQuota *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IFsrmQuota *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IFsrmObject methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Id)(
        IFsrmQuota *This,
        FSRM_OBJECT_ID *id);

    HRESULT (STDMETHODCALLTYPE *get_Description)(
        IFsrmQuota *This,
        BSTR *description);

    HRESULT (STDMETHODCALLTYPE *put_Description)(
        IFsrmQuota *This,
        BSTR description);

    HRESULT (STDMETHODCALLTYPE *Delete)(
        IFsrmQuota *This);

    HRESULT (STDMETHODCALLTYPE *Commit)(
        IFsrmQuota *This);

    /*** IFsrmQuotaBase methods ***/
    HRESULT (STDMETHODCALLTYPE *get_QuotaLimit)(
        IFsrmQuota *This,
        VARIANT *quotaLimit);

    HRESULT (STDMETHODCALLTYPE *put_QuotaLimit)(
        IFsrmQuota *This,
        VARIANT quotaLimit);

    HRESULT (STDMETHODCALLTYPE *get_QuotaFlags)(
        IFsrmQuota *This,
        LONG *quotaFlags);

    HRESULT (STDMETHODCALLTYPE *put_QuotaFlags)(
        IFsrmQuota *This,
        LONG quotaFlags);

    HRESULT (STDMETHODCALLTYPE *get_Thresholds)(
        IFsrmQuota *This,
        SAFEARRAY **thresholds);

    HRESULT (STDMETHODCALLTYPE *AddThreshold)(
        IFsrmQuota *This,
        FSRM_QUOTA_THRESHOLD threshold);

    HRESULT (STDMETHODCALLTYPE *DeleteThreshold)(
        IFsrmQuota *This,
        FSRM_QUOTA_THRESHOLD threshold);

    HRESULT (STDMETHODCALLTYPE *ModifyThreshold)(
        IFsrmQuota *This,
        FSRM_QUOTA_THRESHOLD threshold,
        FSRM_QUOTA_THRESHOLD newThreshold);

    HRESULT (STDMETHODCALLTYPE *CreateThresholdAction)(
        IFsrmQuota *This,
        FSRM_QUOTA_THRESHOLD threshold,
        FsrmActionType actionType,
        IFsrmAction **action);

    HRESULT (STDMETHODCALLTYPE *EnumThresholdActions)(
        IFsrmQuota *This,
        FSRM_QUOTA_THRESHOLD threshold,
        IFsrmCollection **actions);

    /*** IFsrmQuotaObject methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Path)(
        IFsrmQuota *This,
        BSTR *path);

    HRESULT (STDMETHODCALLTYPE *get_UserSid)(
        IFsrmQuota *This,
        BSTR *userSid);

    HRESULT (STDMETHODCALLTYPE *get_UserAccount)(
        IFsrmQuota *This,
        BSTR *userAccount);

    HRESULT (STDMETHODCALLTYPE *get_SourceTemplateName)(
        IFsrmQuota *This,
        BSTR *quotaTemplateName);

    HRESULT (STDMETHODCALLTYPE *get_MatchesSourceTemplate)(
        IFsrmQuota *This,
        VARIANT_BOOL *matches);

    HRESULT (STDMETHODCALLTYPE *ApplyTemplate)(
        IFsrmQuota *This,
        BSTR quotaTemplateName);

    /*** IFsrmQuota methods ***/
    HRESULT (STDMETHODCALLTYPE *get_QuotaUsed)(
        IFsrmQuota *This,
        VARIANT *used);

    HRESULT (STDMETHODCALLTYPE *get_QuotaPeakUsage)(
        IFsrmQuota *This,
        VARIANT *peakUsage);

    HRESULT (STDMETHODCALLTYPE *get_QuotaPeakUsageTime)(
        IFsrmQuota *This,
        DATE *peakUsageDateTime);

    HRESULT (STDMETHODCALLTYPE *ResetPeakUsage)(
        IFsrmQuota *This);

    HRESULT (STDMETHODCALLTYPE *RefreshUsageProperties)(
        IFsrmQuota *This);

    END_INTERFACE
} IFsrmQuotaVtbl;

interface IFsrmQuota {
    CONST_VTBL IFsrmQuotaVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IFsrmQuota_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IFsrmQuota_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IFsrmQuota_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IFsrmQuota_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IFsrmQuota_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IFsrmQuota_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IFsrmQuota_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IFsrmObject methods ***/
#define IFsrmQuota_get_Id(This,id) (This)->lpVtbl->get_Id(This,id)
#define IFsrmQuota_get_Description(This,description) (This)->lpVtbl->get_Description(This,description)
#define IFsrmQuota_put_Description(This,description) (This)->lpVtbl->put_Description(This,description)
#define IFsrmQuota_Delete(This) (This)->lpVtbl->Delete(This)
#define IFsrmQuota_Commit(This) (This)->lpVtbl->Commit(This)
/*** IFsrmQuotaBase methods ***/
#define IFsrmQuota_get_QuotaLimit(This,quotaLimit) (This)->lpVtbl->get_QuotaLimit(This,quotaLimit)
#define IFsrmQuota_put_QuotaLimit(This,quotaLimit) (This)->lpVtbl->put_QuotaLimit(This,quotaLimit)
#define IFsrmQuota_get_QuotaFlags(This,quotaFlags) (This)->lpVtbl->get_QuotaFlags(This,quotaFlags)
#define IFsrmQuota_put_QuotaFlags(This,quotaFlags) (This)->lpVtbl->put_QuotaFlags(This,quotaFlags)
#define IFsrmQuota_get_Thresholds(This,thresholds) (This)->lpVtbl->get_Thresholds(This,thresholds)
#define IFsrmQuota_AddThreshold(This,threshold) (This)->lpVtbl->AddThreshold(This,threshold)
#define IFsrmQuota_DeleteThreshold(This,threshold) (This)->lpVtbl->DeleteThreshold(This,threshold)
#define IFsrmQuota_ModifyThreshold(This,threshold,newThreshold) (This)->lpVtbl->ModifyThreshold(This,threshold,newThreshold)
#define IFsrmQuota_CreateThresholdAction(This,threshold,actionType,action) (This)->lpVtbl->CreateThresholdAction(This,threshold,actionType,action)
#define IFsrmQuota_EnumThresholdActions(This,threshold,actions) (This)->lpVtbl->EnumThresholdActions(This,threshold,actions)
/*** IFsrmQuotaObject methods ***/
#define IFsrmQuota_get_Path(This,path) (This)->lpVtbl->get_Path(This,path)
#define IFsrmQuota_get_UserSid(This,userSid) (This)->lpVtbl->get_UserSid(This,userSid)
#define IFsrmQuota_get_UserAccount(This,userAccount) (This)->lpVtbl->get_UserAccount(This,userAccount)
#define IFsrmQuota_get_SourceTemplateName(This,quotaTemplateName) (This)->lpVtbl->get_SourceTemplateName(This,quotaTemplateName)
#define IFsrmQuota_get_MatchesSourceTemplate(This,matches) (This)->lpVtbl->get_MatchesSourceTemplate(This,matches)
#define IFsrmQuota_ApplyTemplate(This,quotaTemplateName) (This)->lpVtbl->ApplyTemplate(This,quotaTemplateName)
/*** IFsrmQuota methods ***/
#define IFsrmQuota_get_QuotaUsed(This,used) (This)->lpVtbl->get_QuotaUsed(This,used)
#define IFsrmQuota_get_QuotaPeakUsage(This,peakUsage) (This)->lpVtbl->get_QuotaPeakUsage(This,peakUsage)
#define IFsrmQuota_get_QuotaPeakUsageTime(This,peakUsageDateTime) (This)->lpVtbl->get_QuotaPeakUsageTime(This,peakUsageDateTime)
#define IFsrmQuota_ResetPeakUsage(This) (This)->lpVtbl->ResetPeakUsage(This)
#define IFsrmQuota_RefreshUsageProperties(This) (This)->lpVtbl->RefreshUsageProperties(This)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IFsrmQuota_QueryInterface(IFsrmQuota* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IFsrmQuota_AddRef(IFsrmQuota* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IFsrmQuota_Release(IFsrmQuota* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IFsrmQuota_GetTypeInfoCount(IFsrmQuota* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IFsrmQuota_GetTypeInfo(IFsrmQuota* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT IFsrmQuota_GetIDsOfNames(IFsrmQuota* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static __WIDL_INLINE HRESULT IFsrmQuota_Invoke(IFsrmQuota* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IFsrmObject methods ***/
static __WIDL_INLINE HRESULT IFsrmQuota_get_Id(IFsrmQuota* This,FSRM_OBJECT_ID *id) {
    return This->lpVtbl->get_Id(This,id);
}
static __WIDL_INLINE HRESULT IFsrmQuota_get_Description(IFsrmQuota* This,BSTR *description) {
    return This->lpVtbl->get_Description(This,description);
}
static __WIDL_INLINE HRESULT IFsrmQuota_put_Description(IFsrmQuota* This,BSTR description) {
    return This->lpVtbl->put_Description(This,description);
}
static __WIDL_INLINE HRESULT IFsrmQuota_Delete(IFsrmQuota* This) {
    return This->lpVtbl->Delete(This);
}
static __WIDL_INLINE HRESULT IFsrmQuota_Commit(IFsrmQuota* This) {
    return This->lpVtbl->Commit(This);
}
/*** IFsrmQuotaBase methods ***/
static __WIDL_INLINE HRESULT IFsrmQuota_get_QuotaLimit(IFsrmQuota* This,VARIANT *quotaLimit) {
    return This->lpVtbl->get_QuotaLimit(This,quotaLimit);
}
static __WIDL_INLINE HRESULT IFsrmQuota_put_QuotaLimit(IFsrmQuota* This,VARIANT quotaLimit) {
    return This->lpVtbl->put_QuotaLimit(This,quotaLimit);
}
static __WIDL_INLINE HRESULT IFsrmQuota_get_QuotaFlags(IFsrmQuota* This,LONG *quotaFlags) {
    return This->lpVtbl->get_QuotaFlags(This,quotaFlags);
}
static __WIDL_INLINE HRESULT IFsrmQuota_put_QuotaFlags(IFsrmQuota* This,LONG quotaFlags) {
    return This->lpVtbl->put_QuotaFlags(This,quotaFlags);
}
static __WIDL_INLINE HRESULT IFsrmQuota_get_Thresholds(IFsrmQuota* This,SAFEARRAY **thresholds) {
    return This->lpVtbl->get_Thresholds(This,thresholds);
}
static __WIDL_INLINE HRESULT IFsrmQuota_AddThreshold(IFsrmQuota* This,FSRM_QUOTA_THRESHOLD threshold) {
    return This->lpVtbl->AddThreshold(This,threshold);
}
static __WIDL_INLINE HRESULT IFsrmQuota_DeleteThreshold(IFsrmQuota* This,FSRM_QUOTA_THRESHOLD threshold) {
    return This->lpVtbl->DeleteThreshold(This,threshold);
}
static __WIDL_INLINE HRESULT IFsrmQuota_ModifyThreshold(IFsrmQuota* This,FSRM_QUOTA_THRESHOLD threshold,FSRM_QUOTA_THRESHOLD newThreshold) {
    return This->lpVtbl->ModifyThreshold(This,threshold,newThreshold);
}
static __WIDL_INLINE HRESULT IFsrmQuota_CreateThresholdAction(IFsrmQuota* This,FSRM_QUOTA_THRESHOLD threshold,FsrmActionType actionType,IFsrmAction **action) {
    return This->lpVtbl->CreateThresholdAction(This,threshold,actionType,action);
}
static __WIDL_INLINE HRESULT IFsrmQuota_EnumThresholdActions(IFsrmQuota* This,FSRM_QUOTA_THRESHOLD threshold,IFsrmCollection **actions) {
    return This->lpVtbl->EnumThresholdActions(This,threshold,actions);
}
/*** IFsrmQuotaObject methods ***/
static __WIDL_INLINE HRESULT IFsrmQuota_get_Path(IFsrmQuota* This,BSTR *path) {
    return This->lpVtbl->get_Path(This,path);
}
static __WIDL_INLINE HRESULT IFsrmQuota_get_UserSid(IFsrmQuota* This,BSTR *userSid) {
    return This->lpVtbl->get_UserSid(This,userSid);
}
static __WIDL_INLINE HRESULT IFsrmQuota_get_UserAccount(IFsrmQuota* This,BSTR *userAccount) {
    return This->lpVtbl->get_UserAccount(This,userAccount);
}
static __WIDL_INLINE HRESULT IFsrmQuota_get_SourceTemplateName(IFsrmQuota* This,BSTR *quotaTemplateName) {
    return This->lpVtbl->get_SourceTemplateName(This,quotaTemplateName);
}
static __WIDL_INLINE HRESULT IFsrmQuota_get_MatchesSourceTemplate(IFsrmQuota* This,VARIANT_BOOL *matches) {
    return This->lpVtbl->get_MatchesSourceTemplate(This,matches);
}
static __WIDL_INLINE HRESULT IFsrmQuota_ApplyTemplate(IFsrmQuota* This,BSTR quotaTemplateName) {
    return This->lpVtbl->ApplyTemplate(This,quotaTemplateName);
}
/*** IFsrmQuota methods ***/
static __WIDL_INLINE HRESULT IFsrmQuota_get_QuotaUsed(IFsrmQuota* This,VARIANT *used) {
    return This->lpVtbl->get_QuotaUsed(This,used);
}
static __WIDL_INLINE HRESULT IFsrmQuota_get_QuotaPeakUsage(IFsrmQuota* This,VARIANT *peakUsage) {
    return This->lpVtbl->get_QuotaPeakUsage(This,peakUsage);
}
static __WIDL_INLINE HRESULT IFsrmQuota_get_QuotaPeakUsageTime(IFsrmQuota* This,DATE *peakUsageDateTime) {
    return This->lpVtbl->get_QuotaPeakUsageTime(This,peakUsageDateTime);
}
static __WIDL_INLINE HRESULT IFsrmQuota_ResetPeakUsage(IFsrmQuota* This) {
    return This->lpVtbl->ResetPeakUsage(This);
}
static __WIDL_INLINE HRESULT IFsrmQuota_RefreshUsageProperties(IFsrmQuota* This) {
    return This->lpVtbl->RefreshUsageProperties(This);
}
#endif
#endif

#endif


#endif  /* __IFsrmQuota_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IFsrmAutoApplyQuota interface
 */
#ifndef __IFsrmAutoApplyQuota_INTERFACE_DEFINED__
#define __IFsrmAutoApplyQuota_INTERFACE_DEFINED__

DEFINE_GUID(IID_IFsrmAutoApplyQuota, 0xf82e5729, 0x6aba, 0x4740, 0xbf,0xc7, 0xc7,0xf5,0x8f,0x75,0xfb,0x7b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("f82e5729-6aba-4740-bfc7-c7f58f75fb7b")
IFsrmAutoApplyQuota : public IFsrmQuotaObject
{
    virtual HRESULT STDMETHODCALLTYPE get_ExcludeFolders(
        SAFEARRAY **folders) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ExcludeFolders(
        SAFEARRAY *folders) = 0;

    virtual HRESULT STDMETHODCALLTYPE CommitAndUpdateDerived(
        FsrmCommitOptions commitOptions,
        FsrmTemplateApplyOptions applyOptions,
        IFsrmDerivedObjectsResult **derivedObjectsResult) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IFsrmAutoApplyQuota, 0xf82e5729, 0x6aba, 0x4740, 0xbf,0xc7, 0xc7,0xf5,0x8f,0x75,0xfb,0x7b)
#endif
#else
typedef struct IFsrmAutoApplyQuotaVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IFsrmAutoApplyQuota *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IFsrmAutoApplyQuota *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IFsrmAutoApplyQuota *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IFsrmAutoApplyQuota *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IFsrmObject methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Id)(
        IFsrmAutoApplyQuota *This,
        FSRM_OBJECT_ID *id);

    HRESULT (STDMETHODCALLTYPE *get_Description)(
        IFsrmAutoApplyQuota *This,
        BSTR *description);

    HRESULT (STDMETHODCALLTYPE *put_Description)(
        IFsrmAutoApplyQuota *This,
        BSTR description);

    HRESULT (STDMETHODCALLTYPE *Delete)(
        IFsrmAutoApplyQuota *This);

    HRESULT (STDMETHODCALLTYPE *Commit)(
        IFsrmAutoApplyQuota *This);

    /*** IFsrmQuotaBase methods ***/
    HRESULT (STDMETHODCALLTYPE *get_QuotaLimit)(
        IFsrmAutoApplyQuota *This,
        VARIANT *quotaLimit);

    HRESULT (STDMETHODCALLTYPE *put_QuotaLimit)(
        IFsrmAutoApplyQuota *This,
        VARIANT quotaLimit);

    HRESULT (STDMETHODCALLTYPE *get_QuotaFlags)(
        IFsrmAutoApplyQuota *This,
        LONG *quotaFlags);

    HRESULT (STDMETHODCALLTYPE *put_QuotaFlags)(
        IFsrmAutoApplyQuota *This,
        LONG quotaFlags);

    HRESULT (STDMETHODCALLTYPE *get_Thresholds)(
        IFsrmAutoApplyQuota *This,
        SAFEARRAY **thresholds);

    HRESULT (STDMETHODCALLTYPE *AddThreshold)(
        IFsrmAutoApplyQuota *This,
        FSRM_QUOTA_THRESHOLD threshold);

    HRESULT (STDMETHODCALLTYPE *DeleteThreshold)(
        IFsrmAutoApplyQuota *This,
        FSRM_QUOTA_THRESHOLD threshold);

    HRESULT (STDMETHODCALLTYPE *ModifyThreshold)(
        IFsrmAutoApplyQuota *This,
        FSRM_QUOTA_THRESHOLD threshold,
        FSRM_QUOTA_THRESHOLD newThreshold);

    HRESULT (STDMETHODCALLTYPE *CreateThresholdAction)(
        IFsrmAutoApplyQuota *This,
        FSRM_QUOTA_THRESHOLD threshold,
        FsrmActionType actionType,
        IFsrmAction **action);

    HRESULT (STDMETHODCALLTYPE *EnumThresholdActions)(
        IFsrmAutoApplyQuota *This,
        FSRM_QUOTA_THRESHOLD threshold,
        IFsrmCollection **actions);

    /*** IFsrmQuotaObject methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Path)(
        IFsrmAutoApplyQuota *This,
        BSTR *path);

    HRESULT (STDMETHODCALLTYPE *get_UserSid)(
        IFsrmAutoApplyQuota *This,
        BSTR *userSid);

    HRESULT (STDMETHODCALLTYPE *get_UserAccount)(
        IFsrmAutoApplyQuota *This,
        BSTR *userAccount);

    HRESULT (STDMETHODCALLTYPE *get_SourceTemplateName)(
        IFsrmAutoApplyQuota *This,
        BSTR *quotaTemplateName);

    HRESULT (STDMETHODCALLTYPE *get_MatchesSourceTemplate)(
        IFsrmAutoApplyQuota *This,
        VARIANT_BOOL *matches);

    HRESULT (STDMETHODCALLTYPE *ApplyTemplate)(
        IFsrmAutoApplyQuota *This,
        BSTR quotaTemplateName);

    /*** IFsrmAutoApplyQuota methods ***/
    HRESULT (STDMETHODCALLTYPE *get_ExcludeFolders)(
        IFsrmAutoApplyQuota *This,
        SAFEARRAY **folders);

    HRESULT (STDMETHODCALLTYPE *put_ExcludeFolders)(
        IFsrmAutoApplyQuota *This,
        SAFEARRAY *folders);

    HRESULT (STDMETHODCALLTYPE *CommitAndUpdateDerived)(
        IFsrmAutoApplyQuota *This,
        FsrmCommitOptions commitOptions,
        FsrmTemplateApplyOptions applyOptions,
        IFsrmDerivedObjectsResult **derivedObjectsResult);

    END_INTERFACE
} IFsrmAutoApplyQuotaVtbl;

interface IFsrmAutoApplyQuota {
    CONST_VTBL IFsrmAutoApplyQuotaVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IFsrmAutoApplyQuota_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IFsrmAutoApplyQuota_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IFsrmAutoApplyQuota_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IFsrmAutoApplyQuota_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IFsrmAutoApplyQuota_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IFsrmAutoApplyQuota_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IFsrmAutoApplyQuota_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IFsrmObject methods ***/
#define IFsrmAutoApplyQuota_get_Id(This,id) (This)->lpVtbl->get_Id(This,id)
#define IFsrmAutoApplyQuota_get_Description(This,description) (This)->lpVtbl->get_Description(This,description)
#define IFsrmAutoApplyQuota_put_Description(This,description) (This)->lpVtbl->put_Description(This,description)
#define IFsrmAutoApplyQuota_Delete(This) (This)->lpVtbl->Delete(This)
#define IFsrmAutoApplyQuota_Commit(This) (This)->lpVtbl->Commit(This)
/*** IFsrmQuotaBase methods ***/
#define IFsrmAutoApplyQuota_get_QuotaLimit(This,quotaLimit) (This)->lpVtbl->get_QuotaLimit(This,quotaLimit)
#define IFsrmAutoApplyQuota_put_QuotaLimit(This,quotaLimit) (This)->lpVtbl->put_QuotaLimit(This,quotaLimit)
#define IFsrmAutoApplyQuota_get_QuotaFlags(This,quotaFlags) (This)->lpVtbl->get_QuotaFlags(This,quotaFlags)
#define IFsrmAutoApplyQuota_put_QuotaFlags(This,quotaFlags) (This)->lpVtbl->put_QuotaFlags(This,quotaFlags)
#define IFsrmAutoApplyQuota_get_Thresholds(This,thresholds) (This)->lpVtbl->get_Thresholds(This,thresholds)
#define IFsrmAutoApplyQuota_AddThreshold(This,threshold) (This)->lpVtbl->AddThreshold(This,threshold)
#define IFsrmAutoApplyQuota_DeleteThreshold(This,threshold) (This)->lpVtbl->DeleteThreshold(This,threshold)
#define IFsrmAutoApplyQuota_ModifyThreshold(This,threshold,newThreshold) (This)->lpVtbl->ModifyThreshold(This,threshold,newThreshold)
#define IFsrmAutoApplyQuota_CreateThresholdAction(This,threshold,actionType,action) (This)->lpVtbl->CreateThresholdAction(This,threshold,actionType,action)
#define IFsrmAutoApplyQuota_EnumThresholdActions(This,threshold,actions) (This)->lpVtbl->EnumThresholdActions(This,threshold,actions)
/*** IFsrmQuotaObject methods ***/
#define IFsrmAutoApplyQuota_get_Path(This,path) (This)->lpVtbl->get_Path(This,path)
#define IFsrmAutoApplyQuota_get_UserSid(This,userSid) (This)->lpVtbl->get_UserSid(This,userSid)
#define IFsrmAutoApplyQuota_get_UserAccount(This,userAccount) (This)->lpVtbl->get_UserAccount(This,userAccount)
#define IFsrmAutoApplyQuota_get_SourceTemplateName(This,quotaTemplateName) (This)->lpVtbl->get_SourceTemplateName(This,quotaTemplateName)
#define IFsrmAutoApplyQuota_get_MatchesSourceTemplate(This,matches) (This)->lpVtbl->get_MatchesSourceTemplate(This,matches)
#define IFsrmAutoApplyQuota_ApplyTemplate(This,quotaTemplateName) (This)->lpVtbl->ApplyTemplate(This,quotaTemplateName)
/*** IFsrmAutoApplyQuota methods ***/
#define IFsrmAutoApplyQuota_get_ExcludeFolders(This,folders) (This)->lpVtbl->get_ExcludeFolders(This,folders)
#define IFsrmAutoApplyQuota_put_ExcludeFolders(This,folders) (This)->lpVtbl->put_ExcludeFolders(This,folders)
#define IFsrmAutoApplyQuota_CommitAndUpdateDerived(This,commitOptions,applyOptions,derivedObjectsResult) (This)->lpVtbl->CommitAndUpdateDerived(This,commitOptions,applyOptions,derivedObjectsResult)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IFsrmAutoApplyQuota_QueryInterface(IFsrmAutoApplyQuota* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IFsrmAutoApplyQuota_AddRef(IFsrmAutoApplyQuota* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IFsrmAutoApplyQuota_Release(IFsrmAutoApplyQuota* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IFsrmAutoApplyQuota_GetTypeInfoCount(IFsrmAutoApplyQuota* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IFsrmAutoApplyQuota_GetTypeInfo(IFsrmAutoApplyQuota* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT IFsrmAutoApplyQuota_GetIDsOfNames(IFsrmAutoApplyQuota* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static __WIDL_INLINE HRESULT IFsrmAutoApplyQuota_Invoke(IFsrmAutoApplyQuota* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IFsrmObject methods ***/
static __WIDL_INLINE HRESULT IFsrmAutoApplyQuota_get_Id(IFsrmAutoApplyQuota* This,FSRM_OBJECT_ID *id) {
    return This->lpVtbl->get_Id(This,id);
}
static __WIDL_INLINE HRESULT IFsrmAutoApplyQuota_get_Description(IFsrmAutoApplyQuota* This,BSTR *description) {
    return This->lpVtbl->get_Description(This,description);
}
static __WIDL_INLINE HRESULT IFsrmAutoApplyQuota_put_Description(IFsrmAutoApplyQuota* This,BSTR description) {
    return This->lpVtbl->put_Description(This,description);
}
static __WIDL_INLINE HRESULT IFsrmAutoApplyQuota_Delete(IFsrmAutoApplyQuota* This) {
    return This->lpVtbl->Delete(This);
}
static __WIDL_INLINE HRESULT IFsrmAutoApplyQuota_Commit(IFsrmAutoApplyQuota* This) {
    return This->lpVtbl->Commit(This);
}
/*** IFsrmQuotaBase methods ***/
static __WIDL_INLINE HRESULT IFsrmAutoApplyQuota_get_QuotaLimit(IFsrmAutoApplyQuota* This,VARIANT *quotaLimit) {
    return This->lpVtbl->get_QuotaLimit(This,quotaLimit);
}
static __WIDL_INLINE HRESULT IFsrmAutoApplyQuota_put_QuotaLimit(IFsrmAutoApplyQuota* This,VARIANT quotaLimit) {
    return This->lpVtbl->put_QuotaLimit(This,quotaLimit);
}
static __WIDL_INLINE HRESULT IFsrmAutoApplyQuota_get_QuotaFlags(IFsrmAutoApplyQuota* This,LONG *quotaFlags) {
    return This->lpVtbl->get_QuotaFlags(This,quotaFlags);
}
static __WIDL_INLINE HRESULT IFsrmAutoApplyQuota_put_QuotaFlags(IFsrmAutoApplyQuota* This,LONG quotaFlags) {
    return This->lpVtbl->put_QuotaFlags(This,quotaFlags);
}
static __WIDL_INLINE HRESULT IFsrmAutoApplyQuota_get_Thresholds(IFsrmAutoApplyQuota* This,SAFEARRAY **thresholds) {
    return This->lpVtbl->get_Thresholds(This,thresholds);
}
static __WIDL_INLINE HRESULT IFsrmAutoApplyQuota_AddThreshold(IFsrmAutoApplyQuota* This,FSRM_QUOTA_THRESHOLD threshold) {
    return This->lpVtbl->AddThreshold(This,threshold);
}
static __WIDL_INLINE HRESULT IFsrmAutoApplyQuota_DeleteThreshold(IFsrmAutoApplyQuota* This,FSRM_QUOTA_THRESHOLD threshold) {
    return This->lpVtbl->DeleteThreshold(This,threshold);
}
static __WIDL_INLINE HRESULT IFsrmAutoApplyQuota_ModifyThreshold(IFsrmAutoApplyQuota* This,FSRM_QUOTA_THRESHOLD threshold,FSRM_QUOTA_THRESHOLD newThreshold) {
    return This->lpVtbl->ModifyThreshold(This,threshold,newThreshold);
}
static __WIDL_INLINE HRESULT IFsrmAutoApplyQuota_CreateThresholdAction(IFsrmAutoApplyQuota* This,FSRM_QUOTA_THRESHOLD threshold,FsrmActionType actionType,IFsrmAction **action) {
    return This->lpVtbl->CreateThresholdAction(This,threshold,actionType,action);
}
static __WIDL_INLINE HRESULT IFsrmAutoApplyQuota_EnumThresholdActions(IFsrmAutoApplyQuota* This,FSRM_QUOTA_THRESHOLD threshold,IFsrmCollection **actions) {
    return This->lpVtbl->EnumThresholdActions(This,threshold,actions);
}
/*** IFsrmQuotaObject methods ***/
static __WIDL_INLINE HRESULT IFsrmAutoApplyQuota_get_Path(IFsrmAutoApplyQuota* This,BSTR *path) {
    return This->lpVtbl->get_Path(This,path);
}
static __WIDL_INLINE HRESULT IFsrmAutoApplyQuota_get_UserSid(IFsrmAutoApplyQuota* This,BSTR *userSid) {
    return This->lpVtbl->get_UserSid(This,userSid);
}
static __WIDL_INLINE HRESULT IFsrmAutoApplyQuota_get_UserAccount(IFsrmAutoApplyQuota* This,BSTR *userAccount) {
    return This->lpVtbl->get_UserAccount(This,userAccount);
}
static __WIDL_INLINE HRESULT IFsrmAutoApplyQuota_get_SourceTemplateName(IFsrmAutoApplyQuota* This,BSTR *quotaTemplateName) {
    return This->lpVtbl->get_SourceTemplateName(This,quotaTemplateName);
}
static __WIDL_INLINE HRESULT IFsrmAutoApplyQuota_get_MatchesSourceTemplate(IFsrmAutoApplyQuota* This,VARIANT_BOOL *matches) {
    return This->lpVtbl->get_MatchesSourceTemplate(This,matches);
}
static __WIDL_INLINE HRESULT IFsrmAutoApplyQuota_ApplyTemplate(IFsrmAutoApplyQuota* This,BSTR quotaTemplateName) {
    return This->lpVtbl->ApplyTemplate(This,quotaTemplateName);
}
/*** IFsrmAutoApplyQuota methods ***/
static __WIDL_INLINE HRESULT IFsrmAutoApplyQuota_get_ExcludeFolders(IFsrmAutoApplyQuota* This,SAFEARRAY **folders) {
    return This->lpVtbl->get_ExcludeFolders(This,folders);
}
static __WIDL_INLINE HRESULT IFsrmAutoApplyQuota_put_ExcludeFolders(IFsrmAutoApplyQuota* This,SAFEARRAY *folders) {
    return This->lpVtbl->put_ExcludeFolders(This,folders);
}
static __WIDL_INLINE HRESULT IFsrmAutoApplyQuota_CommitAndUpdateDerived(IFsrmAutoApplyQuota* This,FsrmCommitOptions commitOptions,FsrmTemplateApplyOptions applyOptions,IFsrmDerivedObjectsResult **derivedObjectsResult) {
    return This->lpVtbl->CommitAndUpdateDerived(This,commitOptions,applyOptions,derivedObjectsResult);
}
#endif
#endif

#endif


#endif  /* __IFsrmAutoApplyQuota_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IFsrmQuotaManagerEx interface
 */
#ifndef __IFsrmQuotaManagerEx_INTERFACE_DEFINED__
#define __IFsrmQuotaManagerEx_INTERFACE_DEFINED__

DEFINE_GUID(IID_IFsrmQuotaManagerEx, 0x4846cb01, 0xd430, 0x494f, 0xab,0xb4, 0xb1,0x05,0x49,0x99,0xfb,0x09);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("4846cb01-d430-494f-abb4-b1054999fb09")
IFsrmQuotaManagerEx : public IFsrmQuotaManager
{
    virtual HRESULT STDMETHODCALLTYPE IsAffectedByQuota(
        BSTR path,
        FsrmEnumOptions options,
        VARIANT_BOOL *affected) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IFsrmQuotaManagerEx, 0x4846cb01, 0xd430, 0x494f, 0xab,0xb4, 0xb1,0x05,0x49,0x99,0xfb,0x09)
#endif
#else
typedef struct IFsrmQuotaManagerExVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IFsrmQuotaManagerEx *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IFsrmQuotaManagerEx *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IFsrmQuotaManagerEx *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IFsrmQuotaManagerEx *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IFsrmQuotaManager methods ***/
    HRESULT (STDMETHODCALLTYPE *get_ActionVariables)(
        IFsrmQuotaManagerEx *This,
        SAFEARRAY **variables);

    HRESULT (STDMETHODCALLTYPE *get_ActionVariableDescriptions)(
        IFsrmQuotaManagerEx *This,
        SAFEARRAY **descriptions);

    HRESULT (STDMETHODCALLTYPE *CreateQuota)(
        IFsrmQuotaManagerEx *This,
        BSTR path,
        IFsrmQuota **quota);

    HRESULT (STDMETHODCALLTYPE *CreateAutoApplyQuota)(
        IFsrmQuotaManagerEx *This,
        BSTR quotaTemplateName,
        BSTR path,
        IFsrmAutoApplyQuota **quota);

    HRESULT (STDMETHODCALLTYPE *GetQuota)(
        IFsrmQuotaManagerEx *This,
        BSTR path,
        IFsrmQuota **quota);

    HRESULT (STDMETHODCALLTYPE *GetAutoApplyQuota)(
        IFsrmQuotaManagerEx *This,
        BSTR path,
        IFsrmAutoApplyQuota **quota);

    HRESULT (STDMETHODCALLTYPE *GetRestrictiveQuota)(
        IFsrmQuotaManagerEx *This,
        BSTR path,
        IFsrmQuota **quota);

    HRESULT (STDMETHODCALLTYPE *EnumQuotas)(
        IFsrmQuotaManagerEx *This,
        BSTR path,
        FsrmEnumOptions options,
        IFsrmCommittableCollection **quotas);

    HRESULT (STDMETHODCALLTYPE *EnumAutoApplyQuotas)(
        IFsrmQuotaManagerEx *This,
        BSTR path,
        FsrmEnumOptions options,
        IFsrmCommittableCollection **quotas);

    HRESULT (STDMETHODCALLTYPE *EnumEffectiveQuotas)(
        IFsrmQuotaManagerEx *This,
        BSTR path,
        FsrmEnumOptions options,
        IFsrmCommittableCollection **quotas);

    HRESULT (STDMETHODCALLTYPE *Scan)(
        IFsrmQuotaManagerEx *This,
        BSTR strPath);

    HRESULT (STDMETHODCALLTYPE *CreateQuotaCollection)(
        IFsrmQuotaManagerEx *This,
        IFsrmCommittableCollection **collection);

    /*** IFsrmQuotaManagerEx methods ***/
    HRESULT (STDMETHODCALLTYPE *IsAffectedByQuota)(
        IFsrmQuotaManagerEx *This,
        BSTR path,
        FsrmEnumOptions options,
        VARIANT_BOOL *affected);

    END_INTERFACE
} IFsrmQuotaManagerExVtbl;

interface IFsrmQuotaManagerEx {
    CONST_VTBL IFsrmQuotaManagerExVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IFsrmQuotaManagerEx_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IFsrmQuotaManagerEx_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IFsrmQuotaManagerEx_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IFsrmQuotaManagerEx_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IFsrmQuotaManagerEx_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IFsrmQuotaManagerEx_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IFsrmQuotaManagerEx_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IFsrmQuotaManager methods ***/
#define IFsrmQuotaManagerEx_get_ActionVariables(This,variables) (This)->lpVtbl->get_ActionVariables(This,variables)
#define IFsrmQuotaManagerEx_get_ActionVariableDescriptions(This,descriptions) (This)->lpVtbl->get_ActionVariableDescriptions(This,descriptions)
#define IFsrmQuotaManagerEx_CreateQuota(This,path,quota) (This)->lpVtbl->CreateQuota(This,path,quota)
#define IFsrmQuotaManagerEx_CreateAutoApplyQuota(This,quotaTemplateName,path,quota) (This)->lpVtbl->CreateAutoApplyQuota(This,quotaTemplateName,path,quota)
#define IFsrmQuotaManagerEx_GetQuota(This,path,quota) (This)->lpVtbl->GetQuota(This,path,quota)
#define IFsrmQuotaManagerEx_GetAutoApplyQuota(This,path,quota) (This)->lpVtbl->GetAutoApplyQuota(This,path,quota)
#define IFsrmQuotaManagerEx_GetRestrictiveQuota(This,path,quota) (This)->lpVtbl->GetRestrictiveQuota(This,path,quota)
#define IFsrmQuotaManagerEx_EnumQuotas(This,path,options,quotas) (This)->lpVtbl->EnumQuotas(This,path,options,quotas)
#define IFsrmQuotaManagerEx_EnumAutoApplyQuotas(This,path,options,quotas) (This)->lpVtbl->EnumAutoApplyQuotas(This,path,options,quotas)
#define IFsrmQuotaManagerEx_EnumEffectiveQuotas(This,path,options,quotas) (This)->lpVtbl->EnumEffectiveQuotas(This,path,options,quotas)
#define IFsrmQuotaManagerEx_Scan(This,strPath) (This)->lpVtbl->Scan(This,strPath)
#define IFsrmQuotaManagerEx_CreateQuotaCollection(This,collection) (This)->lpVtbl->CreateQuotaCollection(This,collection)
/*** IFsrmQuotaManagerEx methods ***/
#define IFsrmQuotaManagerEx_IsAffectedByQuota(This,path,options,affected) (This)->lpVtbl->IsAffectedByQuota(This,path,options,affected)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IFsrmQuotaManagerEx_QueryInterface(IFsrmQuotaManagerEx* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IFsrmQuotaManagerEx_AddRef(IFsrmQuotaManagerEx* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IFsrmQuotaManagerEx_Release(IFsrmQuotaManagerEx* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IFsrmQuotaManagerEx_GetTypeInfoCount(IFsrmQuotaManagerEx* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IFsrmQuotaManagerEx_GetTypeInfo(IFsrmQuotaManagerEx* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT IFsrmQuotaManagerEx_GetIDsOfNames(IFsrmQuotaManagerEx* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static __WIDL_INLINE HRESULT IFsrmQuotaManagerEx_Invoke(IFsrmQuotaManagerEx* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IFsrmQuotaManager methods ***/
static __WIDL_INLINE HRESULT IFsrmQuotaManagerEx_get_ActionVariables(IFsrmQuotaManagerEx* This,SAFEARRAY **variables) {
    return This->lpVtbl->get_ActionVariables(This,variables);
}
static __WIDL_INLINE HRESULT IFsrmQuotaManagerEx_get_ActionVariableDescriptions(IFsrmQuotaManagerEx* This,SAFEARRAY **descriptions) {
    return This->lpVtbl->get_ActionVariableDescriptions(This,descriptions);
}
static __WIDL_INLINE HRESULT IFsrmQuotaManagerEx_CreateQuota(IFsrmQuotaManagerEx* This,BSTR path,IFsrmQuota **quota) {
    return This->lpVtbl->CreateQuota(This,path,quota);
}
static __WIDL_INLINE HRESULT IFsrmQuotaManagerEx_CreateAutoApplyQuota(IFsrmQuotaManagerEx* This,BSTR quotaTemplateName,BSTR path,IFsrmAutoApplyQuota **quota) {
    return This->lpVtbl->CreateAutoApplyQuota(This,quotaTemplateName,path,quota);
}
static __WIDL_INLINE HRESULT IFsrmQuotaManagerEx_GetQuota(IFsrmQuotaManagerEx* This,BSTR path,IFsrmQuota **quota) {
    return This->lpVtbl->GetQuota(This,path,quota);
}
static __WIDL_INLINE HRESULT IFsrmQuotaManagerEx_GetAutoApplyQuota(IFsrmQuotaManagerEx* This,BSTR path,IFsrmAutoApplyQuota **quota) {
    return This->lpVtbl->GetAutoApplyQuota(This,path,quota);
}
static __WIDL_INLINE HRESULT IFsrmQuotaManagerEx_GetRestrictiveQuota(IFsrmQuotaManagerEx* This,BSTR path,IFsrmQuota **quota) {
    return This->lpVtbl->GetRestrictiveQuota(This,path,quota);
}
static __WIDL_INLINE HRESULT IFsrmQuotaManagerEx_EnumQuotas(IFsrmQuotaManagerEx* This,BSTR path,FsrmEnumOptions options,IFsrmCommittableCollection **quotas) {
    return This->lpVtbl->EnumQuotas(This,path,options,quotas);
}
static __WIDL_INLINE HRESULT IFsrmQuotaManagerEx_EnumAutoApplyQuotas(IFsrmQuotaManagerEx* This,BSTR path,FsrmEnumOptions options,IFsrmCommittableCollection **quotas) {
    return This->lpVtbl->EnumAutoApplyQuotas(This,path,options,quotas);
}
static __WIDL_INLINE HRESULT IFsrmQuotaManagerEx_EnumEffectiveQuotas(IFsrmQuotaManagerEx* This,BSTR path,FsrmEnumOptions options,IFsrmCommittableCollection **quotas) {
    return This->lpVtbl->EnumEffectiveQuotas(This,path,options,quotas);
}
static __WIDL_INLINE HRESULT IFsrmQuotaManagerEx_Scan(IFsrmQuotaManagerEx* This,BSTR strPath) {
    return This->lpVtbl->Scan(This,strPath);
}
static __WIDL_INLINE HRESULT IFsrmQuotaManagerEx_CreateQuotaCollection(IFsrmQuotaManagerEx* This,IFsrmCommittableCollection **collection) {
    return This->lpVtbl->CreateQuotaCollection(This,collection);
}
/*** IFsrmQuotaManagerEx methods ***/
static __WIDL_INLINE HRESULT IFsrmQuotaManagerEx_IsAffectedByQuota(IFsrmQuotaManagerEx* This,BSTR path,FsrmEnumOptions options,VARIANT_BOOL *affected) {
    return This->lpVtbl->IsAffectedByQuota(This,path,options,affected);
}
#endif
#endif

#endif


#endif  /* __IFsrmQuotaManagerEx_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IFsrmQuotaTemplateImported interface
 */
#ifndef __IFsrmQuotaTemplateImported_INTERFACE_DEFINED__
#define __IFsrmQuotaTemplateImported_INTERFACE_DEFINED__

DEFINE_GUID(IID_IFsrmQuotaTemplateImported, 0x9a2bf113, 0xa329, 0x44cc, 0x80,0x9a, 0x5c,0x00,0xfc,0xe8,0xda,0x40);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("9a2bf113-a329-44cc-809a-5c00fce8da40")
IFsrmQuotaTemplateImported : public IFsrmQuotaTemplate
{
    virtual HRESULT STDMETHODCALLTYPE get_OverwriteOnCommit(
        VARIANT_BOOL *overwrite) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_OverwriteOnCommit(
        VARIANT_BOOL overwrite) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IFsrmQuotaTemplateImported, 0x9a2bf113, 0xa329, 0x44cc, 0x80,0x9a, 0x5c,0x00,0xfc,0xe8,0xda,0x40)
#endif
#else
typedef struct IFsrmQuotaTemplateImportedVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IFsrmQuotaTemplateImported *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IFsrmQuotaTemplateImported *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IFsrmQuotaTemplateImported *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IFsrmQuotaTemplateImported *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IFsrmObject methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Id)(
        IFsrmQuotaTemplateImported *This,
        FSRM_OBJECT_ID *id);

    HRESULT (STDMETHODCALLTYPE *get_Description)(
        IFsrmQuotaTemplateImported *This,
        BSTR *description);

    HRESULT (STDMETHODCALLTYPE *put_Description)(
        IFsrmQuotaTemplateImported *This,
        BSTR description);

    HRESULT (STDMETHODCALLTYPE *Delete)(
        IFsrmQuotaTemplateImported *This);

    HRESULT (STDMETHODCALLTYPE *Commit)(
        IFsrmQuotaTemplateImported *This);

    /*** IFsrmQuotaBase methods ***/
    HRESULT (STDMETHODCALLTYPE *get_QuotaLimit)(
        IFsrmQuotaTemplateImported *This,
        VARIANT *quotaLimit);

    HRESULT (STDMETHODCALLTYPE *put_QuotaLimit)(
        IFsrmQuotaTemplateImported *This,
        VARIANT quotaLimit);

    HRESULT (STDMETHODCALLTYPE *get_QuotaFlags)(
        IFsrmQuotaTemplateImported *This,
        LONG *quotaFlags);

    HRESULT (STDMETHODCALLTYPE *put_QuotaFlags)(
        IFsrmQuotaTemplateImported *This,
        LONG quotaFlags);

    HRESULT (STDMETHODCALLTYPE *get_Thresholds)(
        IFsrmQuotaTemplateImported *This,
        SAFEARRAY **thresholds);

    HRESULT (STDMETHODCALLTYPE *AddThreshold)(
        IFsrmQuotaTemplateImported *This,
        FSRM_QUOTA_THRESHOLD threshold);

    HRESULT (STDMETHODCALLTYPE *DeleteThreshold)(
        IFsrmQuotaTemplateImported *This,
        FSRM_QUOTA_THRESHOLD threshold);

    HRESULT (STDMETHODCALLTYPE *ModifyThreshold)(
        IFsrmQuotaTemplateImported *This,
        FSRM_QUOTA_THRESHOLD threshold,
        FSRM_QUOTA_THRESHOLD newThreshold);

    HRESULT (STDMETHODCALLTYPE *CreateThresholdAction)(
        IFsrmQuotaTemplateImported *This,
        FSRM_QUOTA_THRESHOLD threshold,
        FsrmActionType actionType,
        IFsrmAction **action);

    HRESULT (STDMETHODCALLTYPE *EnumThresholdActions)(
        IFsrmQuotaTemplateImported *This,
        FSRM_QUOTA_THRESHOLD threshold,
        IFsrmCollection **actions);

    /*** IFsrmQuotaTemplate methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Name)(
        IFsrmQuotaTemplateImported *This,
        BSTR *name);

    HRESULT (STDMETHODCALLTYPE *put_Name)(
        IFsrmQuotaTemplateImported *This,
        BSTR name);

    HRESULT (STDMETHODCALLTYPE *CopyTemplate)(
        IFsrmQuotaTemplateImported *This,
        BSTR quotaTemplateName);

    HRESULT (STDMETHODCALLTYPE *CommitAndUpdateDerived)(
        IFsrmQuotaTemplateImported *This,
        FsrmCommitOptions commitOptions,
        FsrmTemplateApplyOptions applyOptions,
        IFsrmDerivedObjectsResult **derivedObjectsResult);

    /*** IFsrmQuotaTemplateImported methods ***/
    HRESULT (STDMETHODCALLTYPE *get_OverwriteOnCommit)(
        IFsrmQuotaTemplateImported *This,
        VARIANT_BOOL *overwrite);

    HRESULT (STDMETHODCALLTYPE *put_OverwriteOnCommit)(
        IFsrmQuotaTemplateImported *This,
        VARIANT_BOOL overwrite);

    END_INTERFACE
} IFsrmQuotaTemplateImportedVtbl;

interface IFsrmQuotaTemplateImported {
    CONST_VTBL IFsrmQuotaTemplateImportedVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IFsrmQuotaTemplateImported_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IFsrmQuotaTemplateImported_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IFsrmQuotaTemplateImported_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IFsrmQuotaTemplateImported_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IFsrmQuotaTemplateImported_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IFsrmQuotaTemplateImported_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IFsrmQuotaTemplateImported_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IFsrmObject methods ***/
#define IFsrmQuotaTemplateImported_get_Id(This,id) (This)->lpVtbl->get_Id(This,id)
#define IFsrmQuotaTemplateImported_get_Description(This,description) (This)->lpVtbl->get_Description(This,description)
#define IFsrmQuotaTemplateImported_put_Description(This,description) (This)->lpVtbl->put_Description(This,description)
#define IFsrmQuotaTemplateImported_Delete(This) (This)->lpVtbl->Delete(This)
#define IFsrmQuotaTemplateImported_Commit(This) (This)->lpVtbl->Commit(This)
/*** IFsrmQuotaBase methods ***/
#define IFsrmQuotaTemplateImported_get_QuotaLimit(This,quotaLimit) (This)->lpVtbl->get_QuotaLimit(This,quotaLimit)
#define IFsrmQuotaTemplateImported_put_QuotaLimit(This,quotaLimit) (This)->lpVtbl->put_QuotaLimit(This,quotaLimit)
#define IFsrmQuotaTemplateImported_get_QuotaFlags(This,quotaFlags) (This)->lpVtbl->get_QuotaFlags(This,quotaFlags)
#define IFsrmQuotaTemplateImported_put_QuotaFlags(This,quotaFlags) (This)->lpVtbl->put_QuotaFlags(This,quotaFlags)
#define IFsrmQuotaTemplateImported_get_Thresholds(This,thresholds) (This)->lpVtbl->get_Thresholds(This,thresholds)
#define IFsrmQuotaTemplateImported_AddThreshold(This,threshold) (This)->lpVtbl->AddThreshold(This,threshold)
#define IFsrmQuotaTemplateImported_DeleteThreshold(This,threshold) (This)->lpVtbl->DeleteThreshold(This,threshold)
#define IFsrmQuotaTemplateImported_ModifyThreshold(This,threshold,newThreshold) (This)->lpVtbl->ModifyThreshold(This,threshold,newThreshold)
#define IFsrmQuotaTemplateImported_CreateThresholdAction(This,threshold,actionType,action) (This)->lpVtbl->CreateThresholdAction(This,threshold,actionType,action)
#define IFsrmQuotaTemplateImported_EnumThresholdActions(This,threshold,actions) (This)->lpVtbl->EnumThresholdActions(This,threshold,actions)
/*** IFsrmQuotaTemplate methods ***/
#define IFsrmQuotaTemplateImported_get_Name(This,name) (This)->lpVtbl->get_Name(This,name)
#define IFsrmQuotaTemplateImported_put_Name(This,name) (This)->lpVtbl->put_Name(This,name)
#define IFsrmQuotaTemplateImported_CopyTemplate(This,quotaTemplateName) (This)->lpVtbl->CopyTemplate(This,quotaTemplateName)
#define IFsrmQuotaTemplateImported_CommitAndUpdateDerived(This,commitOptions,applyOptions,derivedObjectsResult) (This)->lpVtbl->CommitAndUpdateDerived(This,commitOptions,applyOptions,derivedObjectsResult)
/*** IFsrmQuotaTemplateImported methods ***/
#define IFsrmQuotaTemplateImported_get_OverwriteOnCommit(This,overwrite) (This)->lpVtbl->get_OverwriteOnCommit(This,overwrite)
#define IFsrmQuotaTemplateImported_put_OverwriteOnCommit(This,overwrite) (This)->lpVtbl->put_OverwriteOnCommit(This,overwrite)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IFsrmQuotaTemplateImported_QueryInterface(IFsrmQuotaTemplateImported* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IFsrmQuotaTemplateImported_AddRef(IFsrmQuotaTemplateImported* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IFsrmQuotaTemplateImported_Release(IFsrmQuotaTemplateImported* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IFsrmQuotaTemplateImported_GetTypeInfoCount(IFsrmQuotaTemplateImported* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IFsrmQuotaTemplateImported_GetTypeInfo(IFsrmQuotaTemplateImported* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT IFsrmQuotaTemplateImported_GetIDsOfNames(IFsrmQuotaTemplateImported* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static __WIDL_INLINE HRESULT IFsrmQuotaTemplateImported_Invoke(IFsrmQuotaTemplateImported* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IFsrmObject methods ***/
static __WIDL_INLINE HRESULT IFsrmQuotaTemplateImported_get_Id(IFsrmQuotaTemplateImported* This,FSRM_OBJECT_ID *id) {
    return This->lpVtbl->get_Id(This,id);
}
static __WIDL_INLINE HRESULT IFsrmQuotaTemplateImported_get_Description(IFsrmQuotaTemplateImported* This,BSTR *description) {
    return This->lpVtbl->get_Description(This,description);
}
static __WIDL_INLINE HRESULT IFsrmQuotaTemplateImported_put_Description(IFsrmQuotaTemplateImported* This,BSTR description) {
    return This->lpVtbl->put_Description(This,description);
}
static __WIDL_INLINE HRESULT IFsrmQuotaTemplateImported_Delete(IFsrmQuotaTemplateImported* This) {
    return This->lpVtbl->Delete(This);
}
static __WIDL_INLINE HRESULT IFsrmQuotaTemplateImported_Commit(IFsrmQuotaTemplateImported* This) {
    return This->lpVtbl->Commit(This);
}
/*** IFsrmQuotaBase methods ***/
static __WIDL_INLINE HRESULT IFsrmQuotaTemplateImported_get_QuotaLimit(IFsrmQuotaTemplateImported* This,VARIANT *quotaLimit) {
    return This->lpVtbl->get_QuotaLimit(This,quotaLimit);
}
static __WIDL_INLINE HRESULT IFsrmQuotaTemplateImported_put_QuotaLimit(IFsrmQuotaTemplateImported* This,VARIANT quotaLimit) {
    return This->lpVtbl->put_QuotaLimit(This,quotaLimit);
}
static __WIDL_INLINE HRESULT IFsrmQuotaTemplateImported_get_QuotaFlags(IFsrmQuotaTemplateImported* This,LONG *quotaFlags) {
    return This->lpVtbl->get_QuotaFlags(This,quotaFlags);
}
static __WIDL_INLINE HRESULT IFsrmQuotaTemplateImported_put_QuotaFlags(IFsrmQuotaTemplateImported* This,LONG quotaFlags) {
    return This->lpVtbl->put_QuotaFlags(This,quotaFlags);
}
static __WIDL_INLINE HRESULT IFsrmQuotaTemplateImported_get_Thresholds(IFsrmQuotaTemplateImported* This,SAFEARRAY **thresholds) {
    return This->lpVtbl->get_Thresholds(This,thresholds);
}
static __WIDL_INLINE HRESULT IFsrmQuotaTemplateImported_AddThreshold(IFsrmQuotaTemplateImported* This,FSRM_QUOTA_THRESHOLD threshold) {
    return This->lpVtbl->AddThreshold(This,threshold);
}
static __WIDL_INLINE HRESULT IFsrmQuotaTemplateImported_DeleteThreshold(IFsrmQuotaTemplateImported* This,FSRM_QUOTA_THRESHOLD threshold) {
    return This->lpVtbl->DeleteThreshold(This,threshold);
}
static __WIDL_INLINE HRESULT IFsrmQuotaTemplateImported_ModifyThreshold(IFsrmQuotaTemplateImported* This,FSRM_QUOTA_THRESHOLD threshold,FSRM_QUOTA_THRESHOLD newThreshold) {
    return This->lpVtbl->ModifyThreshold(This,threshold,newThreshold);
}
static __WIDL_INLINE HRESULT IFsrmQuotaTemplateImported_CreateThresholdAction(IFsrmQuotaTemplateImported* This,FSRM_QUOTA_THRESHOLD threshold,FsrmActionType actionType,IFsrmAction **action) {
    return This->lpVtbl->CreateThresholdAction(This,threshold,actionType,action);
}
static __WIDL_INLINE HRESULT IFsrmQuotaTemplateImported_EnumThresholdActions(IFsrmQuotaTemplateImported* This,FSRM_QUOTA_THRESHOLD threshold,IFsrmCollection **actions) {
    return This->lpVtbl->EnumThresholdActions(This,threshold,actions);
}
/*** IFsrmQuotaTemplate methods ***/
static __WIDL_INLINE HRESULT IFsrmQuotaTemplateImported_get_Name(IFsrmQuotaTemplateImported* This,BSTR *name) {
    return This->lpVtbl->get_Name(This,name);
}
static __WIDL_INLINE HRESULT IFsrmQuotaTemplateImported_put_Name(IFsrmQuotaTemplateImported* This,BSTR name) {
    return This->lpVtbl->put_Name(This,name);
}
static __WIDL_INLINE HRESULT IFsrmQuotaTemplateImported_CopyTemplate(IFsrmQuotaTemplateImported* This,BSTR quotaTemplateName) {
    return This->lpVtbl->CopyTemplate(This,quotaTemplateName);
}
static __WIDL_INLINE HRESULT IFsrmQuotaTemplateImported_CommitAndUpdateDerived(IFsrmQuotaTemplateImported* This,FsrmCommitOptions commitOptions,FsrmTemplateApplyOptions applyOptions,IFsrmDerivedObjectsResult **derivedObjectsResult) {
    return This->lpVtbl->CommitAndUpdateDerived(This,commitOptions,applyOptions,derivedObjectsResult);
}
/*** IFsrmQuotaTemplateImported methods ***/
static __WIDL_INLINE HRESULT IFsrmQuotaTemplateImported_get_OverwriteOnCommit(IFsrmQuotaTemplateImported* This,VARIANT_BOOL *overwrite) {
    return This->lpVtbl->get_OverwriteOnCommit(This,overwrite);
}
static __WIDL_INLINE HRESULT IFsrmQuotaTemplateImported_put_OverwriteOnCommit(IFsrmQuotaTemplateImported* This,VARIANT_BOOL overwrite) {
    return This->lpVtbl->put_OverwriteOnCommit(This,overwrite);
}
#endif
#endif

#endif


#endif  /* __IFsrmQuotaTemplateImported_INTERFACE_DEFINED__ */

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

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 *);
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 *);

/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __fsrmquota_h__ */
