/*** Autogenerated by WIDL 0.1 from itss.idl - Do not edit ***/
#include <rpc.h>
#include <rpcndr.h>

#ifndef __WIDL_ITSS_H
#define __WIDL_ITSS_H
#ifdef __cplusplus
extern "C" {
#endif
#include <oaidl.h>
typedef struct _ITS_Control_Data {
    UINT cdwControlData;
    UINT adwControlData[1];
} ITS_Control_Data, *PITS_Control_Data;

typedef enum ECompactionLev {
    COMPACT_DATA = 0,
    COMPACT_DATA_AND_PATH
} ECompactionLev;

#ifndef __IITStorage_FWD_DEFINED__
#define __IITStorage_FWD_DEFINED__
typedef struct IITStorage IITStorage;
#endif

/*****************************************************************************
 * IITStorage interface
 */
#ifndef __IITStorage_INTERFACE_DEFINED__
#define __IITStorage_INTERFACE_DEFINED__

#if defined(__cplusplus) && !defined(CINTERFACE)
struct IITStorage : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE StgCreateDocfile(
        const WCHAR* pwcsName,
        DWORD grfMode,
        DWORD reserved,
        IStorage** ppstgOpen) = 0;

    virtual HRESULT STDMETHODCALLTYPE StgCreateDocfileOnILockBytes(
        ILockBytes* plkbyt,
        DWORD grfMode,
        DWORD reserved,
        IStorage** ppstgOpen) = 0;

    virtual HRESULT STDMETHODCALLTYPE StgIsStorageFile(
        const WCHAR* pwcsName) = 0;

    virtual HRESULT STDMETHODCALLTYPE StgIsStorageILockBytes(
        ILockBytes* plkbyt) = 0;

    virtual HRESULT STDMETHODCALLTYPE StgOpenStorage(
        const WCHAR* pwcsName,
        IStorage* pstgPriority,
        DWORD grfMode,
        SNB snbExclude,
        DWORD reserved,
        IStorage** ppstgOpen) = 0;

    virtual HRESULT STDMETHODCALLTYPE StgOpenStorageOnILockBytes(
        ILockBytes* plkbyt,
        IStorage* pStgPriority,
        DWORD grfMode,
        SNB snbExclude,
        DWORD reserved,
        IStorage** ppstgOpen) = 0;

    virtual HRESULT STDMETHODCALLTYPE StgSetTimes(
        WCHAR* lpszName,
        FILETIME* pctime,
        FILETIME* patime,
        FILETIME* pmtime) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetControlData(
        PITS_Control_Data pControlData) = 0;

    virtual HRESULT STDMETHODCALLTYPE DefaultControlData(
        PITS_Control_Data* ppControlData) = 0;

    virtual HRESULT STDMETHODCALLTYPE Compact(
        const WCHAR* pwcsName,
        ECompactionLev iLev) = 0;

};
#else
typedef struct IITStorageVtbl IITStorageVtbl;
struct IITStorage {
    const IITStorageVtbl* lpVtbl;
};
struct IITStorageVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IITStorage methods ***/
    HRESULT (STDMETHODCALLTYPE *StgCreateDocfile)(
        IITStorage* This,
        const WCHAR* pwcsName,
        DWORD grfMode,
        DWORD reserved,
        IStorage** ppstgOpen);

    HRESULT (STDMETHODCALLTYPE *StgCreateDocfileOnILockBytes)(
        IITStorage* This,
        ILockBytes* plkbyt,
        DWORD grfMode,
        DWORD reserved,
        IStorage** ppstgOpen);

    HRESULT (STDMETHODCALLTYPE *StgIsStorageFile)(
        IITStorage* This,
        const WCHAR* pwcsName);

    HRESULT (STDMETHODCALLTYPE *StgIsStorageILockBytes)(
        IITStorage* This,
        ILockBytes* plkbyt);

    HRESULT (STDMETHODCALLTYPE *StgOpenStorage)(
        IITStorage* This,
        const WCHAR* pwcsName,
        IStorage* pstgPriority,
        DWORD grfMode,
        SNB snbExclude,
        DWORD reserved,
        IStorage** ppstgOpen);

    HRESULT (STDMETHODCALLTYPE *StgOpenStorageOnILockBytes)(
        IITStorage* This,
        ILockBytes* plkbyt,
        IStorage* pStgPriority,
        DWORD grfMode,
        SNB snbExclude,
        DWORD reserved,
        IStorage** ppstgOpen);

    HRESULT (STDMETHODCALLTYPE *StgSetTimes)(
        IITStorage* This,
        WCHAR* lpszName,
        FILETIME* pctime,
        FILETIME* patime,
        FILETIME* pmtime);

    HRESULT (STDMETHODCALLTYPE *SetControlData)(
        IITStorage* This,
        PITS_Control_Data pControlData);

    HRESULT (STDMETHODCALLTYPE *DefaultControlData)(
        IITStorage* This,
        PITS_Control_Data* ppControlData);

    HRESULT (STDMETHODCALLTYPE *Compact)(
        IITStorage* This,
        const WCHAR* pwcsName,
        ECompactionLev iLev);

    END_INTERFACE
};

#ifdef COBJMACROS
/*** IUnknown methods ***/
#define IITStorage_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
#define IITStorage_AddRef(p) (p)->lpVtbl->AddRef(p)
#define IITStorage_Release(p) (p)->lpVtbl->Release(p)
/*** IITStorage methods ***/
#define IITStorage_StgCreateDocfile(p,a,b,c,d) (p)->lpVtbl->StgCreateDocfile(p,a,b,c,d)
#define IITStorage_StgCreateDocfileOnILockBytes(p,a,b,c,d) (p)->lpVtbl->StgCreateDocfileOnILockBytes(p,a,b,c,d)
#define IITStorage_StgIsStorageFile(p,a) (p)->lpVtbl->StgIsStorageFile(p,a)
#define IITStorage_StgIsStorageILockBytes(p,a) (p)->lpVtbl->StgIsStorageILockBytes(p,a)
#define IITStorage_StgOpenStorage(p,a,b,c,d,e,f) (p)->lpVtbl->StgOpenStorage(p,a,b,c,d,e,f)
#define IITStorage_StgOpenStorageOnILockBytes(p,a,b,c,d,e,f) (p)->lpVtbl->StgOpenStorageOnILockBytes(p,a,b,c,d,e,f)
#define IITStorage_StgSetTimes(p,a,b,c,d) (p)->lpVtbl->StgSetTimes(p,a,b,c,d)
#define IITStorage_SetControlData(p,a) (p)->lpVtbl->SetControlData(p,a)
#define IITStorage_DefaultControlData(p,a) (p)->lpVtbl->DefaultControlData(p,a)
#define IITStorage_Compact(p,a,b) (p)->lpVtbl->Compact(p,a,b)
#endif

#endif

#define IITStorage_METHODS \
    /*** IUnknown methods ***/ \
    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
    STDMETHOD_(ULONG,Release)(THIS) PURE; \
    /*** IITStorage methods ***/ \
    STDMETHOD_(HRESULT,StgCreateDocfile)(THIS_ const WCHAR* pwcsName, DWORD grfMode, DWORD reserved, IStorage** ppstgOpen) PURE; \
    STDMETHOD_(HRESULT,StgCreateDocfileOnILockBytes)(THIS_ ILockBytes* plkbyt, DWORD grfMode, DWORD reserved, IStorage** ppstgOpen) PURE; \
    STDMETHOD_(HRESULT,StgIsStorageFile)(THIS_ const WCHAR* pwcsName) PURE; \
    STDMETHOD_(HRESULT,StgIsStorageILockBytes)(THIS_ ILockBytes* plkbyt) PURE; \
    STDMETHOD_(HRESULT,StgOpenStorage)(THIS_ const WCHAR* pwcsName, IStorage* pstgPriority, DWORD grfMode, SNB snbExclude, DWORD reserved, IStorage** ppstgOpen) PURE; \
    STDMETHOD_(HRESULT,StgOpenStorageOnILockBytes)(THIS_ ILockBytes* plkbyt, IStorage* pStgPriority, DWORD grfMode, SNB snbExclude, DWORD reserved, IStorage** ppstgOpen) PURE; \
    STDMETHOD_(HRESULT,StgSetTimes)(THIS_ WCHAR* lpszName, FILETIME* pctime, FILETIME* patime, FILETIME* pmtime) PURE; \
    STDMETHOD_(HRESULT,SetControlData)(THIS_ PITS_Control_Data pControlData) PURE; \
    STDMETHOD_(HRESULT,DefaultControlData)(THIS_ PITS_Control_Data* ppControlData) PURE; \
    STDMETHOD_(HRESULT,Compact)(THIS_ const WCHAR* pwcsName, ECompactionLev iLev) PURE;

HRESULT CALLBACK IITStorage_StgCreateDocfile_Proxy(
    IITStorage* This,
    const WCHAR* pwcsName,
    DWORD grfMode,
    DWORD reserved,
    IStorage** ppstgOpen);
void __RPC_STUB IITStorage_StgCreateDocfile_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IITStorage_StgCreateDocfileOnILockBytes_Proxy(
    IITStorage* This,
    ILockBytes* plkbyt,
    DWORD grfMode,
    DWORD reserved,
    IStorage** ppstgOpen);
void __RPC_STUB IITStorage_StgCreateDocfileOnILockBytes_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IITStorage_StgIsStorageFile_Proxy(
    IITStorage* This,
    const WCHAR* pwcsName);
void __RPC_STUB IITStorage_StgIsStorageFile_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IITStorage_StgIsStorageILockBytes_Proxy(
    IITStorage* This,
    ILockBytes* plkbyt);
void __RPC_STUB IITStorage_StgIsStorageILockBytes_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IITStorage_StgOpenStorage_Proxy(
    IITStorage* This,
    const WCHAR* pwcsName,
    IStorage* pstgPriority,
    DWORD grfMode,
    SNB snbExclude,
    DWORD reserved,
    IStorage** ppstgOpen);
void __RPC_STUB IITStorage_StgOpenStorage_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IITStorage_StgOpenStorageOnILockBytes_Proxy(
    IITStorage* This,
    ILockBytes* plkbyt,
    IStorage* pStgPriority,
    DWORD grfMode,
    SNB snbExclude,
    DWORD reserved,
    IStorage** ppstgOpen);
void __RPC_STUB IITStorage_StgOpenStorageOnILockBytes_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IITStorage_StgSetTimes_Proxy(
    IITStorage* This,
    WCHAR* lpszName,
    FILETIME* pctime,
    FILETIME* patime,
    FILETIME* pmtime);
void __RPC_STUB IITStorage_StgSetTimes_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IITStorage_SetControlData_Proxy(
    IITStorage* This,
    PITS_Control_Data pControlData);
void __RPC_STUB IITStorage_SetControlData_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IITStorage_DefaultControlData_Proxy(
    IITStorage* This,
    PITS_Control_Data* ppControlData);
void __RPC_STUB IITStorage_DefaultControlData_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IITStorage_Compact_Proxy(
    IITStorage* This,
    const WCHAR* pwcsName,
    ECompactionLev iLev);
void __RPC_STUB IITStorage_Compact_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IITStorage_INTERFACE_DEFINED__ */

DEFINE_GUID(CLSID_ITStorage,0x5d02926a,0x212e,0x11d0,0x9d,0xf9,0x00,0xa0,0xc9,0x22,0xe6,0xec );
DEFINE_GUID(IID_IITStorage, 0x88cc31de, 0x27ab, 0x11d0, 0x9d, 0xf9, 0x0, 0xa0, 0xc9, 0x22, 0xe6, 0xec);
#ifdef __cplusplus
}
#endif
#endif /* __WIDL_ITSS_H */
