/*++

Copyright (C) 1997-2001 Microsoft Corporation

Module Name:

    CPROPSET.H

Abstract:

		Purpose: Used by the compound file property set provider.  This code was
		largly taken from some MSVC sample code which was modified
		somewhat in order to support VARIANT type arrays.  In general,
		a CPropSet object contains a list of CPropSection objects 
		which each contain a list of CProp objects.

History:

	a-davj  04-Mar-97   Created.

--*/

typedef struct tagSECTIONHEADER
{
    DWORD       cbSection ;
    DWORD       cProperties ;  // Number of props.
} SECTIONHEADER, *LPSECTIONHEADER ;

typedef struct tagPROPERTYIDOFFSET
{
    DWORD       propertyID;
    DWORD       dwOffset;
} PROPERTYIDOFFSET, *LPPROPERTYIDOFFSET;

typedef struct tagPROPHEADER
{
    WORD        wByteOrder ;    // Always 0xFFFE
    WORD        wFormat ;       // Always 0
    DWORD       dwOSVer ;       // System version
    CLSID       clsID ;         // Application CLSID
    DWORD       cSections ;     // Number of sections (must be at least 1)
} PROPHEADER, *LPPROPHEADER ;

typedef struct tagFORMATIDOFFSET
{
    GUID        formatID;
    DWORD       dwOffset;
} FORMATIDOFFSET, *LPFORMATIDOFFSET;


/////////////////////////////////////////////////////////////////////////////
// CProp

class CProp : public CObject
{
    friend class CPropSet ;
    friend class CPropSection ;

public:
// Construction
    CProp( void ) ;

// Qualifiers
    BOOL    Set( DWORD dwID, const LPVOID pValue, DWORD dwType, DWORD dwSize ) ;
    LPVOID  Get( void ) ;           // Returns pointer to actual value
    DWORD   GetType( void ) ;       // Returns property type
    DWORD   GetID( void ) ;

// Operations
    BOOL    WriteToStream( IStream* pIStream ) ;
    BOOL    ReadFromStream( IStream* pIStream, DWORD dwSize ) ;

private:
    DWORD       m_dwPropID ;
    DWORD       m_dwType ;
    LPVOID      m_pValue ;
    DWORD       m_dwSize;

    LPVOID  AllocValue(ULONG cb);
    void    FreeValue();

public:
    ~CProp() ;
} ;


/////////////////////////////////////////////////////////////////////////////
// CPropSection

class CPropSection : public CObject
{
    friend class CPropSet ;
    friend class CProp ;

public:
// Construction
    CPropSection( void ) ;
    CPropSection( CLSID FormatID ) ;
// Qualifiers

    void    SetFormatID( CLSID FormatID ) ;

    void    RemoveAll() ;

    CProp* GetProperty( DWORD dwPropID ) ;
    void AddProperty( CProp* pProp ) ;

    DWORD   GetSize( void ) ;
    DWORD   GetCount( void ) ;
    CObList* GetList( void ) ;

    BOOL    SetSectionName( LPCTSTR pszName );
    LPCTSTR GetSectionName( void );

// Operations
    BOOL    WriteToStream( IStream* pIStream ) ;
    BOOL    ReadFromStream( IStream* pIStream, LARGE_INTEGER liPropSet ) ;

private:
// Implementation
    CLSID           m_FormatID ;
    SECTIONHEADER   m_SH ;
    // List of properties (CProp)
    CObList         m_PropList ;
    // Dictionary of property names
    CMapStringToPtr m_NameDict ;
    CString         m_strSectionName;

public:
    ~CPropSection();
} ;


/////////////////////////////////////////////////////////////////////////////
// CPropSet

class CPropSet : public CObject
{
    friend class CPropSection ;
    friend class CProp ;

public:
// Construction
    CPropSet( void ) ;

// Qualifiers
    void    RemoveAll( ) ;

    CProp* GetProperty( CLSID FormatID, DWORD dwPropID ) ;
    void AddProperty( CLSID FormatID, CProp* pProp ) ;
    CPropSection* GetSection( CLSID FormatID ) ;
    CPropSection* AddSection( CLSID FormatID ) ;
    void AddSection( CPropSection* psect ) ;

    WORD    GetByteOrder( void ) ;
    WORD    GetFormatVersion( void ) ;
    void    SetFormatVersion( WORD wFmtVersion ) ;
    DWORD   GetOSVersion( void ) ;
    void    SetOSVersion( DWORD dwOSVer ) ;
    CLSID   GetClassID( void ) ;
    void    SetClassID( CLSID clsid ) ;
    DWORD   GetCount( void ) ;
    CObList* GetList( void ) ;

// Operations
    BOOL    WriteToStream( IStream* pIStream ) ;
    BOOL    ReadFromStream( IStream* pIStream ) ;

// Implementation
private:
    PROPHEADER      m_PH ;
    CObList         m_SectionList ;

public:
    ~CPropSet();
} ;


/////////////////////////////////////////////////////////////////////////////
// CBuff

class CBuff : public CObject
{
public:
// Construction
    CBuff( void ) ;
    ~CBuff() ;

// Qualifiers
    void Add(void *, DWORD dwAddSize);
    void * Get(void){return pBuff;};
    DWORD GetSize(void){return dwSize;};
    DWORD bOK(void){return !bAllocError;};
    void RoundOff(void);
private:

    void * pBuff;
    DWORD dwSize;
    BOOL bAllocError;
public:
} ;