// Storage.h -- Definition of class CStorage #ifndef __STORAGE_H__ #define __STORAGE_H__ class CStorage : public CITUnknown { public: static HRESULT __stdcall OpenStorage(IUnknown *pUnkOuter, IITFileSystem *pITFS, PathInfo *pPathInfo, DWORD grfMode, IStorageITEx **ppStg ); static BOOL ValidStreamName(const WCHAR *pwcsName); ~CStorage(void); class CImpIStorage : public IIT_IStorageITEx { public: CImpIStorage(CStorage *pBackObj, IUnknown *punkOuter); ~CImpIStorage(void); static IStorage *FindStorage(const WCHAR * pwszFileName, DWORD grfMode); HRESULT __stdcall InitOpenStorage(IITFileSystem *pITFS, PathInfo *pPathInfo, DWORD grfMode); // IUnknown methods: STDMETHODIMP_(ULONG) Release(void); // IStorage methods: HRESULT __stdcall CreateStream( /* [string][in] */ const OLECHAR __RPC_FAR *pwcsName, /* [in] */ DWORD grfMode, /* [in] */ DWORD reserved1, /* [in] */ DWORD reserved2, /* [out] */ IStream __RPC_FAR *__RPC_FAR *ppstm); HRESULT __stdcall CreateStreamITEx( /* [string][in] */ const OLECHAR __RPC_FAR *pwcsName, /* [string][in] */ const WCHAR *pwcsDataSpaceName, /* [in] */ DWORD grfMode, /* [in] */ DWORD reserved1, /* [in] */ DWORD reserved2, /* [out] */ IStreamITEx __RPC_FAR *__RPC_FAR *ppstm); /* [local] */ HRESULT __stdcall OpenStream( /* [string][in] */ const OLECHAR __RPC_FAR *pwcsName, /* [unique][in] */ void __RPC_FAR *reserved1, /* [in] */ DWORD grfMode, /* [in] */ DWORD reserved2, /* [out] */ IStream __RPC_FAR *__RPC_FAR *ppstm); /* [local] */ HRESULT __stdcall OpenStreamITEx( /* [string][in] */ const OLECHAR __RPC_FAR *pwcsName, /* [unique][in] */ void __RPC_FAR *reserved1, /* [in] */ DWORD grfMode, /* [in] */ DWORD reserved2, /* [out] */ IStreamITEx __RPC_FAR *__RPC_FAR *ppstm); HRESULT __stdcall CreateStorage( /* [string][in] */ const OLECHAR __RPC_FAR *pwcsName, /* [in] */ DWORD grfMode, /* [in] */ DWORD dwStgFmt, /* [in] */ DWORD reserved2, /* [out] */ IStorage __RPC_FAR *__RPC_FAR *ppstg); HRESULT __stdcall OpenStorage( /* [string][unique][in] */ const OLECHAR __RPC_FAR *pwcsName, /* [unique][in] */ IStorage __RPC_FAR *pstgPriority, /* [in] */ DWORD grfMode, /* [unique][in] */ SNB snbExclude, /* [in] */ DWORD reserved, /* [out] */ IStorage __RPC_FAR *__RPC_FAR *ppstg); HRESULT __stdcall CopyTo( /* [in] */ DWORD ciidExclude, /* [size_is][unique][in] */ const IID __RPC_FAR *rgiidExclude, /* [unique][in] */ SNB snbExclude, /* [unique][in] */ IStorage __RPC_FAR *pstgDest); HRESULT __stdcall MoveElementTo( /* [string][in] */ const OLECHAR __RPC_FAR *pwcsName, /* [unique][in] */ IStorage __RPC_FAR *pstgDest, /* [string][in] */ const OLECHAR __RPC_FAR *pwcsNewName, /* [in] */ DWORD grfFlags); HRESULT __stdcall Commit( /* [in] */ DWORD grfCommitFlags); HRESULT __stdcall Revert( void); /* [local] */ HRESULT __stdcall EnumElements( /* [in] */ DWORD reserved1, /* [size_is][unique][in] */ void __RPC_FAR *reserved2, /* [in] */ DWORD reserved3, /* [out] */ IEnumSTATSTG __RPC_FAR *__RPC_FAR *ppenum); HRESULT __stdcall DestroyElement( /* [string][in] */ const OLECHAR __RPC_FAR *pwcsName); HRESULT __stdcall RenameElement( /* [string][in] */ const OLECHAR __RPC_FAR *pwcsOldName, /* [string][in] */ const OLECHAR __RPC_FAR *pwcsNewName); HRESULT __stdcall SetElementTimes( /* [string][in] */ const OLECHAR __RPC_FAR *pwcsName, /* [in] */ const FILETIME __RPC_FAR *pctime, /* [in] */ const FILETIME __RPC_FAR *patime, /* [in] */ const FILETIME __RPC_FAR *pmtime); HRESULT __stdcall SetClass( /* [in] */ REFCLSID clsid); HRESULT __stdcall SetStateBits( /* [in] */ DWORD grfStateBits, /* [in] */ DWORD grfMask); HRESULT __stdcall Stat( /* [out] */ STATSTG __RPC_FAR *pstatstg, /* [in] */ DWORD grfStatFlag); // IStorageITEx methods HRESULT STDMETHODCALLTYPE GetCheckSum(ULARGE_INTEGER *puli); HRESULT STDMETHODCALLTYPE CreateStream (const WCHAR * pwcsName, const WCHAR *pwcsDataSpaceName, DWORD grfMode, DWORD reserved1, DWORD reserved2, IStreamITEx ** ppstm ); HRESULT STDMETHODCALLTYPE OpenStream (const WCHAR * pwcsName, void * reserved1, DWORD grfMode, DWORD reserved2, IStreamITEx ** ppstm ); private: enum { MAX_KEY = MAX_UTF8_PATH + 5 }; // Extra bytes for leading pack-32 // name length value. IITFileSystem *m_pITFS; // File system which contains this storage PathInfo m_PathInfo; // Path for this storage together with location info DWORD m_grfMode; // Access permissions for this storage. BOOL m_fWritable; // Can we write to this file system? DEBUGDEF(static LONG s_cInCriticalSection) }; private: CStorage(IUnknown *pUnkOuter); CImpIStorage m_ImpIStorage; }; extern GUID aIID_CStorage[]; extern UINT cInterfaces_CStorage; inline CStorage::CStorage(IUnknown *pUnkOuter) : m_ImpIStorage(this, pUnkOuter), CITUnknown(aIID_CStorage, cInterfaces_CStorage, (IUnknown *) &m_ImpIStorage) { } inline CStorage::~CStorage(void) { } typedef CStorage *PCStorage; class CFSStorage : public CITUnknown { public: static HRESULT __stdcall CreateStorage (IUnknown *pUnkOuter, const WCHAR *pwcsPath, DWORD grfMode, IStorage **ppStg ); static HRESULT __stdcall OpenStorage (IUnknown *pUnkOuter, const WCHAR *pwcsPath, DWORD grfMode, IStorage **ppStg ); ~CFSStorage(void); class CImpIFSStorage : public IIT_IStorage { public: CImpIFSStorage(CFSStorage *pBackObj, IUnknown *punkOuter); ~CImpIFSStorage(void); static IStorage *FindStorage(const WCHAR * pwszFileName, DWORD grfMode); HRESULT __stdcall InitCreateStorage(const WCHAR *pwcsPath, DWORD grfMode); HRESULT __stdcall InitOpenStorage (const WCHAR *pwcsPath, DWORD grfMode); // IUnknown methods: STDMETHODIMP_(ULONG) Release(void); // IStorage methods: HRESULT __stdcall CreateStream( /* [string][in] */ const OLECHAR __RPC_FAR *pwcsName, /* [in] */ DWORD grfMode, /* [in] */ DWORD reserved1, /* [in] */ DWORD reserved2, /* [out] */ IStream __RPC_FAR *__RPC_FAR *ppstm); /* [local] */ HRESULT __stdcall OpenStream( /* [string][in] */ const OLECHAR __RPC_FAR *pwcsName, /* [unique][in] */ void __RPC_FAR *reserved1, /* [in] */ DWORD grfMode, /* [in] */ DWORD reserved2, /* [out] */ IStream __RPC_FAR *__RPC_FAR *ppstm); HRESULT __stdcall CreateStorage( /* [string][in] */ const OLECHAR __RPC_FAR *pwcsName, /* [in] */ DWORD grfMode, /* [in] */ DWORD dwStgFmt, /* [in] */ DWORD reserved2, /* [out] */ IStorage __RPC_FAR *__RPC_FAR *ppstg); HRESULT __stdcall OpenStorage( /* [string][unique][in] */ const OLECHAR __RPC_FAR *pwcsName, /* [unique][in] */ IStorage __RPC_FAR *pstgPriority, /* [in] */ DWORD grfMode, /* [unique][in] */ SNB snbExclude, /* [in] */ DWORD reserved, /* [out] */ IStorage __RPC_FAR *__RPC_FAR *ppstg); HRESULT __stdcall CopyTo( /* [in] */ DWORD ciidExclude, /* [size_is][unique][in] */ const IID __RPC_FAR *rgiidExclude, /* [unique][in] */ SNB snbExclude, /* [unique][in] */ IStorage __RPC_FAR *pstgDest); HRESULT __stdcall MoveElementTo( /* [string][in] */ const OLECHAR __RPC_FAR *pwcsName, /* [unique][in] */ IStorage __RPC_FAR *pstgDest, /* [string][in] */ const OLECHAR __RPC_FAR *pwcsNewName, /* [in] */ DWORD grfFlags); HRESULT __stdcall Commit( /* [in] */ DWORD grfCommitFlags); HRESULT __stdcall Revert( void); /* [local] */ HRESULT __stdcall EnumElements( /* [in] */ DWORD reserved1, /* [size_is][unique][in] */ void __RPC_FAR *reserved2, /* [in] */ DWORD reserved3, /* [out] */ IEnumSTATSTG __RPC_FAR *__RPC_FAR *ppenum); HRESULT __stdcall DestroyElement( /* [string][in] */ const OLECHAR __RPC_FAR *pwcsName); HRESULT __stdcall RenameElement( /* [string][in] */ const OLECHAR __RPC_FAR *pwcsOldName, /* [string][in] */ const OLECHAR __RPC_FAR *pwcsNewName); HRESULT __stdcall SetElementTimes( /* [string][in] */ const OLECHAR __RPC_FAR *pwcsName, /* [in] */ const FILETIME __RPC_FAR *pctime, /* [in] */ const FILETIME __RPC_FAR *patime, /* [in] */ const FILETIME __RPC_FAR *pmtime); HRESULT __stdcall SetClass( /* [in] */ REFCLSID clsid); HRESULT __stdcall SetStateBits( /* [in] */ DWORD grfStateBits, /* [in] */ DWORD grfMask); HRESULT __stdcall Stat( /* [out] */ STATSTG __RPC_FAR *pstatstg, /* [in] */ DWORD grfStatFlag); private: class CFSEnumStorage : public CITUnknown { public: static HRESULT NewEnumStorage (IUnknown *pUnkOuter, CONST WCHAR *pwcsPath, IEnumSTATSTG **ppEnumSTATSTG ); ~CFSEnumStorage(void); private: CFSEnumStorage(IUnknown *pUnkOuter); class CImpIEnumStorage : public IITEnumSTATSTG { public: CImpIEnumStorage(CFSEnumStorage *pBackObj, IUnknown *punkOuter); ~CImpIEnumStorage(void); HRESULT Initial(CONST WCHAR *pwcsPath); // IEnumSTATSTG methods: /* [local] */ HRESULT __stdcall Next( /* [in] */ ULONG celt, /* [in] */ STATSTG __RPC_FAR *rgelt, /* [out] */ ULONG __RPC_FAR *pceltFetched); HRESULT __stdcall Skip( /* [in] */ ULONG celt); HRESULT __stdcall Reset( void); HRESULT __stdcall Clone( /* [out] */ IEnumSTATSTG __RPC_FAR *__RPC_FAR *ppenum); HRESULT STDMETHODCALLTYPE GetNextEntryInSeq(/* [in] */ULONG celt, /* [out] */ PathInfo *rgelt, /* [out] */ ULONG *pceltFetched); HRESULT STDMETHODCALLTYPE GetFirstEntryInSeq( /* [out] */ PathInfo *rgelt); private: HRESULT STDMETHODCALLTYPE NextEntry(); enum EnumState { Before, During, After }; WCHAR m_awszBasePath[MAX_PATH]; HANDLE m_hEnum; enum EnumState m_State; WIN32_FIND_DATA m_w32fd; }; CImpIEnumStorage m_ImpIEnumStorage; }; WCHAR m_awcsPath[MAX_PATH]; // Path for this storage UINT m_CP; // Default code page DWORD m_grfMode; // Access permissions for this storage. BOOL m_fWritable; // Can we write to this file system? DEBUGDEF(static LONG s_cInCriticalSection) }; private: CFSStorage(IUnknown *pUnkOuter); CImpIFSStorage m_ImpIFSStorage; }; inline CFSStorage::CFSStorage(IUnknown *pUnkOuter) : m_ImpIFSStorage(this, pUnkOuter), CITUnknown(&IID_IStorage, 1, (IUnknown *) &m_ImpIFSStorage) { } inline CFSStorage::~CFSStorage(void) { } inline CFSStorage::CImpIFSStorage::CFSEnumStorage::CFSEnumStorage(IUnknown *pUnkOuter) : m_ImpIEnumStorage(this, pUnkOuter), CITUnknown(&IID_IEnumSTATSTG, 1, &m_ImpIEnumStorage) { } inline CFSStorage::CImpIFSStorage::CFSEnumStorage::~CFSEnumStorage(void) { } HRESULT __stdcall ResolvePath(PWCHAR pwcFullPath, const WCHAR *pwcBasePath, const WCHAR *pwcRelativePath, BOOL fStoragePath ); HRESULT __stdcall BuildMultiBytePath(UINT codepage, PCHAR pszPath, PWCHAR pwcsPath); typedef CFSStorage *PCFSStorage; #endif // __STORAGE_H__