|
|
/*++
Copyright (c) 1998 Microsoft Corporation
Module Name:
cpropbag.h
Abstract:
This module contains the definition of the generic property bag class
Author:
Keith Lau (keithlau@microsoft.com)
Revision History:
keithlau 06/30/98 created jstamerj 12/07/00 Copied source for use in dsnsink
--*/
#ifndef _CPROPBAG_H_
#define _CPROPBAG_H_
#include "filehc.h"
#include "mailmsg.h"
#include "cmmtypes.h"
/***************************************************************************/ // Definitions
//
#define GENERIC_PTABLE_INSTANCE_SIGNATURE_VALID ((DWORD)'PTGv')
/***************************************************************************/ // CMailMsgPropertyBag
//
class CMailMsgPropertyBag : public IMailMsgPropertyBag { public:
CMailMsgPropertyBag() : m_bmBlockManager(NULL), m_ptProperties( PTT_PROPERTY_TABLE, GENERIC_PTABLE_INSTANCE_SIGNATURE_VALID, &m_bmBlockManager, &m_InstanceInfo, CompareProperty, NULL, NULL ) { m_lRefCount = 1;
// Copy the default instance into our instance
MoveMemory( &m_InstanceInfo, &s_DefaultInstanceInfo, sizeof(PROPERTY_TABLE_INSTANCE)); }
HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, LPVOID *ppvObj) { if (riid == IID_IUnknown) *ppvObj = (IUnknown *)(IMailMsgPropertyBag *)this; else if (riid == IID_IMailMsgPropertyBag) *ppvObj = (IMailMsgPropertyBag *)this; else if (riid == IID_IMailMsgRegisterCleanupCallback) *ppvObj = (IMailMsgRegisterCleanupCallback *)this; else return(E_NOINTERFACE); AddRef(); return(S_OK); }
unsigned long STDMETHODCALLTYPE AddRef() { return(InterlockedIncrement(&m_lRefCount)); }
unsigned long STDMETHODCALLTYPE Release() { LONG lTemp = InterlockedDecrement(&m_lRefCount); if (!lTemp) { // Extra releases are bad!
_ASSERT(lTemp); } return(lTemp); }
HRESULT STDMETHODCALLTYPE PutProperty( DWORD dwPropID, DWORD cbLength, LPBYTE pbValue ) { GLOBAL_PROPERTY_ITEM piItem; piItem.idProp = dwPropID; return(m_ptProperties.PutProperty( (LPVOID)&dwPropID, (LPPROPERTY_ITEM)&piItem, cbLength, pbValue)); }
HRESULT STDMETHODCALLTYPE GetProperty( DWORD dwPropID, DWORD cbLength, DWORD *pcbLength, LPBYTE pbValue ) { GLOBAL_PROPERTY_ITEM piItem; return(m_ptProperties.GetPropertyItemAndValue( (LPVOID)&dwPropID, (LPPROPERTY_ITEM)&piItem, cbLength, pcbLength, pbValue)); }
HRESULT STDMETHODCALLTYPE PutStringA( DWORD dwPropID, LPCSTR pszValue ) { return(PutProperty(dwPropID, pszValue?strlen(pszValue)+1:0, (LPBYTE)pszValue)); } HRESULT STDMETHODCALLTYPE GetStringA( DWORD dwPropID, DWORD cchLength, LPSTR pszValue ) { DWORD dwLength; return(GetProperty(dwPropID, cchLength, &dwLength, (LPBYTE)pszValue)); } HRESULT STDMETHODCALLTYPE PutStringW( DWORD dwPropID, LPCWSTR pszValue ) { return(PutProperty(dwPropID, pszValue?(wcslen(pszValue)+1)*sizeof(WCHAR):0, (LPBYTE)pszValue)); } HRESULT STDMETHODCALLTYPE GetStringW( DWORD dwPropID, DWORD cchLength, LPWSTR pszValue ) { DWORD dwLength; return(GetProperty(dwPropID, cchLength*sizeof(WCHAR), &dwLength, (LPBYTE)pszValue)); } HRESULT STDMETHODCALLTYPE PutDWORD( DWORD dwPropID, DWORD dwValue ) { return(PutProperty(dwPropID, sizeof(DWORD), (LPBYTE)&dwValue)); } HRESULT STDMETHODCALLTYPE GetDWORD( DWORD dwPropID, DWORD *pdwValue ) { DWORD dwLength; return(GetProperty(dwPropID, sizeof(DWORD), &dwLength, (LPBYTE)pdwValue)); } HRESULT STDMETHODCALLTYPE PutBool( DWORD dwPropID, DWORD dwValue ) { dwValue = dwValue ? 1 : 0; return(PutProperty(dwPropID, sizeof(DWORD), (LPBYTE)&dwValue)); } HRESULT STDMETHODCALLTYPE GetBool( DWORD dwPropID, DWORD *pdwValue ) { HRESULT hrRes; DWORD dwLength;
hrRes = GetProperty(dwPropID, sizeof(DWORD), &dwLength, (LPBYTE)pdwValue); if (pdwValue) *pdwValue = *pdwValue ? 1 : 0; return (hrRes); }
private:
// The specific compare function for this type of property table
static HRESULT CompareProperty( LPVOID pvPropKey, LPPROPERTY_ITEM pItem );
private:
// Usage count
LONG m_lRefCount;
// Property table instance
PROPERTY_TABLE_INSTANCE m_InstanceInfo; static PROPERTY_TABLE_INSTANCE s_DefaultInstanceInfo;
// IMailMsgProperties is an instance of CPropertyTable
CPropertyTable m_ptProperties;
// An instance of the block memory manager
CBlockManager m_bmBlockManager;
};
// =================================================================
// Compare function
//
inline HRESULT CMailMsgPropertyBag::CompareProperty( LPVOID pvPropKey, LPPROPERTY_ITEM pItem ) { if (*(PROP_ID *)pvPropKey == ((LPGLOBAL_PROPERTY_ITEM)pItem)->idProp) return(S_OK); return(STG_E_UNKNOWN); }
#endif
|