XPSOF.H
/* 
 -  X P S O F . H 
 - 
 *  Purpose: 
 *      Wraps the StreamOnFile object to add buffering of the stream. 
 *      The wrappered version uses an in-memory buffer, or cache, to  
 *      reduce the number of actual Reads and Writes to the underlying  
 *      stream.  The goal is, obviously, to improve performance.   
 * 
 *  Copyright 1992-1995, Microsoft Corporation.  All Rights Reserved. 
 */ 
 
 
#define XPSOF_BUFF_MAX      ((ULONG) 1024) 
 
#define XPSOF_READ          ((ULONG) 0x00000001) 
#define XPSOF_WRITE         ((ULONG) 0x00000002) 
#define XPSOF_READWRITE     ((ULONG) 0x00000003) 
 
/* Creates the wrapped SOF object */ 
 
STDMETHODIMP HrWrapStreamOnFile( 
    LPALLOCATEBUFFER    lpAllocBuffer, 
    LPFREEBUFFER        lpFreeBuffer, 
    ULONG               ulFlags, 
    LPSTREAM            lpStream, 
    LPSTREAM *          lppWrappedStream); 
 
 
/* IStream Interface */ 
 
#define MAPI_ISTREAM_METHODS(IPURE)                                     \ 
    MAPIMETHOD(Read)                                                    \ 
        (THIS_  VOID HUGEP *                lpv,                        \ 
                ULONG                       cb,                         \ 
                ULONG FAR *                 lpcbRead) IPURE;            \ 
    MAPIMETHOD(Write)                                                   \ 
        (THIS_  VOID const HUGEP *          lpv,                        \ 
                ULONG                       cb,                         \ 
                ULONG FAR *                 lpcbWritten) IPURE;         \ 
    MAPIMETHOD(Seek)                                                    \ 
        (THIS_  LARGE_INTEGER               libMove,                    \ 
                DWORD                       dwOrigin,                   \ 
                ULARGE_INTEGER FAR *        lplibNewPosition) IPURE;    \ 
    MAPIMETHOD(SetSize)                                                 \ 
        (THIS_  ULARGE_INTEGER              libNewSize) IPURE;          \ 
    MAPIMETHOD(CopyTo)                                                  \ 
        (THIS_  IStream FAR *               lpstm,                      \ 
                ULARGE_INTEGER              cb,                         \ 
                ULARGE_INTEGER FAR *        lpcbRead,                   \ 
                ULARGE_INTEGER FAR *        lpcbWritten) IPURE;         \ 
    MAPIMETHOD(Commit)                                                  \ 
        (THIS_  DWORD                       dwCommitFlags) IPURE;       \ 
    MAPIMETHOD(Revert)                                                  \ 
        (THIS)                              IPURE;                      \ 
    MAPIMETHOD(LockRegion)                                              \ 
        (THIS_  ULARGE_INTEGER              libOffset,                  \ 
                ULARGE_INTEGER              cb,                         \ 
                DWORD                       dwLockType) IPURE;          \ 
    MAPIMETHOD(UnlockRegion)                                            \ 
        (THIS_  ULARGE_INTEGER              ulibOffset,                 \ 
                ULARGE_INTEGER              cb,                         \ 
                DWORD                       dwLockType) IPURE;          \ 
    MAPIMETHOD(Stat)                                                    \ 
        (THIS_  STATSTG FAR *               lpstatstg,                  \ 
                DWORD                       dwStatFlag) IPURE;          \ 
    MAPIMETHOD(Clone)                                                   \ 
        (THIS_  IStream FAR * FAR *         lppstm) IPURE;              \ 
 
 
/* Interface declaration */ 
 
#undef  INTERFACE 
#define INTERFACE struct _XPSOF 
#undef  MAPIMETHOD_ 
#define MAPIMETHOD_(type, method)   MAPIMETHOD_DECLARE(type, method, XPSOF_) 
        MAPI_IUNKNOWN_METHODS(IMPL) 
        MAPI_ISTREAM_METHODS(IMPL) 
#undef  MAPIMETHOD_ 
#define MAPIMETHOD_(type, method)   MAPIMETHOD_TYPEDEF(type, method, XPSOF_) 
        MAPI_IUNKNOWN_METHODS(IMPL) 
        MAPI_ISTREAM_METHODS(IMPL) 
#undef  MAPIMETHOD_ 
#define MAPIMETHOD_(type, method)   STDMETHOD_(type, method) 
 
DECLARE_MAPI_INTERFACE(XPSOF_) 
{ 
    MAPI_IUNKNOWN_METHODS(IMPL) 
    MAPI_ISTREAM_METHODS(IMPL) 
}; 
 
typedef struct _XPSOF 
{ 
    XPSOF_Vtbl *        lpVtbl; 
    LONG                lcInit; 
    ULONG               ulFlags; 
    LPSTREAM            lpstrm; 
    LPVOID              lpvBuff; 
    ULONG               libBuff; 
    ULONG               cbBuffMac; 
    BOOL                fDirty; 
    LPFREEBUFFER        FreeBuffer; 
 
} XPSOF, FAR * LPXPSOF;