339 lines
7.4 KiB
C++
339 lines
7.4 KiB
C++
/*++
|
|
|
|
Copyright (c) 1997 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
props.h
|
|
|
|
Abstract:
|
|
|
|
This module contains the definition of the property search class
|
|
|
|
Author:
|
|
|
|
Keith Lau (keithlau@microsoft.com)
|
|
|
|
Revision History:
|
|
|
|
keithlau 07/05/97 created
|
|
|
|
--*/
|
|
|
|
#ifndef _PROPS_H_
|
|
#define _PROPS_H_
|
|
|
|
// Define a generic accessor function to access properties
|
|
typedef HRESULT (*GET_ACCESSOR_FUNCTION)( LPSTR pszName,
|
|
LPVOID pContext,
|
|
LPVOID pCacheData,
|
|
LPVOID pvBuffer,
|
|
LPDWORD pdwBufferLen);
|
|
|
|
typedef HRESULT (*SET_ACCESSOR_FUNCTION)( LPSTR pszName,
|
|
LPVOID pCacheData,
|
|
LPVOID pvBuffer,
|
|
DWORD dwBufferLen,
|
|
DWORD ptPropertyType);
|
|
|
|
typedef HRESULT (*COMMIT_ACCESSOR_FUNCTION)(LPSTR pszName,
|
|
LPVOID pContext,
|
|
LPVOID pCacheData);
|
|
|
|
typedef HRESULT (*INVALIDATE_ACCESSOR_FUNCTION)(LPSTR pszName,
|
|
LPVOID pCacheData,
|
|
DWORD ptPropertyType);
|
|
|
|
// Define the property item structure. We can hash this if
|
|
// we want in the future
|
|
typedef struct _PROPERTY_ITEM
|
|
{
|
|
LPSTR pszName;
|
|
DWORD ptBaseType;
|
|
DWORD fAccess;
|
|
DWORD dwIndex;
|
|
GET_ACCESSOR_FUNCTION pfnGetAccessor;
|
|
SET_ACCESSOR_FUNCTION pfnSetAccessor;
|
|
COMMIT_ACCESSOR_FUNCTION pfnCommitAccessor;
|
|
INVALIDATE_ACCESSOR_FUNCTION pfnInvalidateAccessor;
|
|
|
|
} PROPERTY_ITEM, *LPPROPERTY_ITEM;
|
|
|
|
typedef struct _PROPERTY_DATA
|
|
{
|
|
LPVOID pContext;
|
|
LPVOID pCacheData;
|
|
|
|
} PROPERTY_DATA, *LPPROPERTY_DATA;
|
|
|
|
// Define a property context
|
|
typedef struct _PROP_CTXT
|
|
{
|
|
LPPROPERTY_ITEM pItem;
|
|
BOOL fIsWideStr;
|
|
LPSTR pszDefaultPropertyName;
|
|
|
|
} PROP_CTXT, *LPPROP_CTXT;
|
|
|
|
// Define a generic structure to define a set of properties
|
|
typedef struct _PTABLE
|
|
{
|
|
LPPROPERTY_ITEM pProperties; // Actual property table
|
|
LPPROPERTY_DATA pPropertyData; // Prop data
|
|
DWORD dwProperties; // Count
|
|
BOOL fIsSorted; // Sorted prop table?
|
|
|
|
} PTABLE, *LPPTABLE;
|
|
|
|
// =================================================================
|
|
// Generic cache class
|
|
//
|
|
class CGenericCache
|
|
{
|
|
public:
|
|
CGenericCache(LPVOID pvDefaultContext) {}
|
|
~CGenericCache() {}
|
|
virtual LPPROPERTY_DATA GetCacheBlock() = 0;
|
|
};
|
|
|
|
// =================================================================
|
|
// Generic property table
|
|
//
|
|
class CGenericPTable
|
|
{
|
|
public:
|
|
CGenericPTable(CGenericCache *pCache) {}
|
|
~CGenericPTable() {}
|
|
virtual LPPTABLE GetPTable() = 0;
|
|
};
|
|
|
|
// =================================================================
|
|
// Definition of an in-house string structure
|
|
//
|
|
typedef struct _STRING_ATTR
|
|
{
|
|
LPSTR pszValue;
|
|
DWORD dwMaxLen;
|
|
|
|
} STRING_ATTR, *LPSTRING_ATTR;
|
|
|
|
// Enumerated types representing type of access on property
|
|
typedef enum _PROPERTY_ACCESS
|
|
{
|
|
PA_READ = 1,
|
|
PA_WRITE = 2,
|
|
PA_READ_WRITE = 3
|
|
|
|
} _PROPERTY_ACCESS;
|
|
|
|
// Enumerated types representing property types
|
|
typedef enum _PROPERTY_TYPES
|
|
{
|
|
PT_NONE = 0,
|
|
PT_STRING,
|
|
PT_DWORD,
|
|
PT_INTERFACE,
|
|
PT_DEFAULT,
|
|
PT_MAXPT
|
|
|
|
} PROPERTY_TYPES;
|
|
|
|
|
|
// =================================================================
|
|
// Definition of an in-house string class, this is used for caching
|
|
//
|
|
class CPropertyValueString
|
|
{
|
|
public:
|
|
CPropertyValueString()
|
|
{
|
|
m_pszValue = NULL;
|
|
m_dwLength = 0;
|
|
m_dwMaxLen = 0;
|
|
m_fChanged = FALSE;
|
|
}
|
|
~CPropertyValueString()
|
|
{
|
|
if (m_pszValue)
|
|
LocalFree(m_pszValue);
|
|
m_pszValue = NULL;
|
|
}
|
|
|
|
// Overload the assignment to abstract the implementation
|
|
const CPropertyValueString& operator=(LPSTR szValue);
|
|
|
|
// Users can call copy if they desire to
|
|
BOOL Copy(LPSTR pszSrc, DWORD dwLength /* Optional */);
|
|
|
|
void Invalidate()
|
|
{
|
|
if (m_pszValue)
|
|
LocalFree(m_pszValue);
|
|
m_pszValue = NULL;
|
|
m_fChanged = FALSE;
|
|
}
|
|
|
|
// We make these directly accessible
|
|
LPSTR m_pszValue;
|
|
DWORD m_dwLength;
|
|
DWORD m_dwMaxLen;
|
|
BOOL m_fChanged;
|
|
};
|
|
|
|
// =================================================================
|
|
// Definition of an in-house DWORD class, this is used for caching
|
|
//
|
|
class CPropertyValueDWORD
|
|
{
|
|
public:
|
|
CPropertyValueDWORD()
|
|
{
|
|
m_dwValue = 0;
|
|
m_fInit = FALSE;
|
|
m_fChanged = TRUE;
|
|
m_punkScratch = NULL;
|
|
}
|
|
|
|
~CPropertyValueDWORD()
|
|
{
|
|
if (m_fInit && m_punkScratch)
|
|
m_punkScratch->Release();
|
|
m_punkScratch = NULL;
|
|
}
|
|
|
|
// Overload the assignment to abstract the implementation
|
|
const CPropertyValueDWORD& operator=(DWORD dwValue)
|
|
{
|
|
m_dwValue = dwValue;
|
|
m_fInit = TRUE;
|
|
m_fChanged = TRUE;
|
|
return(*this);
|
|
}
|
|
|
|
void Invalidate()
|
|
{
|
|
if (m_fInit && m_punkScratch)
|
|
m_punkScratch->Release();
|
|
m_punkScratch = NULL;
|
|
m_fInit = FALSE;
|
|
m_fChanged = FALSE;
|
|
}
|
|
|
|
// We make these directly accessible
|
|
DWORD m_dwValue;
|
|
BOOL m_fInit;
|
|
BOOL m_fChanged;
|
|
IUnknown *m_punkScratch; // HACK: for interfaces only
|
|
};
|
|
|
|
// Size of default scratch buffer
|
|
#define DEFAULT_SCRATCH_BUFFER_SIZE 1024
|
|
|
|
// =================================================================
|
|
// class for searching properties
|
|
//
|
|
class CPropertyTable
|
|
{
|
|
public:
|
|
|
|
CPropertyTable()
|
|
{
|
|
// Set up the default scratch pad
|
|
m_szBuffer = m_rgcBuffer;
|
|
m_cBuffer = DEFAULT_SCRATCH_BUFFER_SIZE;
|
|
}
|
|
|
|
BOOL Init(LPPROPERTY_ITEM pProperties,
|
|
LPPROPERTY_DATA pData,
|
|
DWORD dwcProperties,
|
|
LPVOID pvDefaultContext,
|
|
BOOL fIsSorted = FALSE)
|
|
{
|
|
m_pProperties = pProperties;
|
|
m_pData = pData;
|
|
m_dwProperties = dwcProperties;
|
|
m_fIsSorted = fIsSorted;
|
|
|
|
// Set up default context for properties
|
|
for (DWORD i = 0; i < dwcProperties; i++)
|
|
m_pData[i].pContext = pvDefaultContext;
|
|
|
|
return(TRUE);
|
|
}
|
|
|
|
~CPropertyTable()
|
|
{
|
|
// Wipe out members
|
|
m_pProperties = NULL;
|
|
m_dwProperties = 0;
|
|
|
|
// Free the scratch buffer, if not equal to default
|
|
if (m_szBuffer != m_rgcBuffer)
|
|
{
|
|
LocalFree((HLOCAL)m_szBuffer);
|
|
}
|
|
}
|
|
|
|
// Method to get the property type given the property name
|
|
HRESULT GetPropertyType(LPCSTR szPropertyName,
|
|
LPDWORD pptPropertyType,
|
|
LPPROP_CTXT pPropertyContext);
|
|
|
|
HRESULT GetPropertyType(LPCWSTR wszPropertyName,
|
|
LPDWORD pptPropertyType,
|
|
LPPROP_CTXT pPropertyContext);
|
|
|
|
// Method to retrieve the associated property item
|
|
HRESULT GetProperty(LPPROP_CTXT pPropertyContext,
|
|
LPVOID pvBuffer,
|
|
LPDWORD pdwBufferLen);
|
|
|
|
// Method to set the associated property item
|
|
HRESULT SetProperty(LPCSTR szPropertyName,
|
|
LPVOID pvBuffer,
|
|
DWORD dwBufferLen,
|
|
DWORD ptPropertyType);
|
|
|
|
HRESULT SetProperty(LPCWSTR wszPropertyName,
|
|
LPVOID pvBuffer,
|
|
DWORD dwBufferLen,
|
|
DWORD ptPropertyType);
|
|
|
|
// Method to commit all changes. This must be called or
|
|
// all the changes will be lost
|
|
HRESULT CommitChanges();
|
|
|
|
// Method to rollback changes to the initial state or the
|
|
// state after the last commit, whichever is more recent
|
|
HRESULT Invalidate();
|
|
|
|
private:
|
|
|
|
// Method to obtain a scratch buffer of the desired size,
|
|
// will allocate new one if insufficient. Size in bytes.
|
|
LPVOID GetScratchBuffer(DWORD dwSizeDesired);
|
|
|
|
// Method to search the property table and return the associated
|
|
// property item, if found
|
|
LPPROPERTY_ITEM SearchForProperty(LPCSTR szPropertyName);
|
|
|
|
// Pointer to property table and count of items
|
|
LPPROPERTY_ITEM m_pProperties;
|
|
LPPROPERTY_DATA m_pData;
|
|
DWORD m_dwProperties;
|
|
|
|
// TRUE if the table of properties is sorted, will use
|
|
// binary search if so. Otherwise, a linear scan is performed
|
|
BOOL m_fIsSorted;
|
|
|
|
// Default scratch buffer, used for wide string to LPSTR
|
|
// conversion
|
|
CHAR m_rgcBuffer[DEFAULT_SCRATCH_BUFFER_SIZE];
|
|
|
|
// Pointer to current scratch buffer, will be freed by
|
|
// destructor if not equal to m_rgcBuffer
|
|
LPSTR m_szBuffer;
|
|
DWORD m_cBuffer;
|
|
};
|
|
|
|
#endif |