|
|
/*++
Copyright (c) 1998 Microsoft Corporation
Module Name:
cmmsprop.h
Abstract:
This module contains the definition of the special property class
Author:
Keith Lau (keithlau@microsoft.com)
Revision History:
keithlau 04/19/98 created
--*/
#ifndef _CMMVPROP_H_
#define _CMMVPROP_H_
#include "propid.h"
// Define a generic accessor function to access special properties
typedef HRESULT (*GET_ACCESSOR_FUNCTION)( PROP_ID idProp, LPVOID pContext, LPVOID pParam, DWORD cbLength, LPDWORD pcbLength, LPBYTE pbBuffer );
typedef HRESULT (*PUT_ACCESSOR_FUNCTION)( PROP_ID idProp, LPVOID pContext, LPVOID pParam, DWORD cbLength, LPBYTE pbBuffer );
// Define the property item structure
//
// Note: In this implementation, all special properties are volatile
// We can do Serialize() and Restore() operations in the future if we want.
//
typedef struct _SPECIAL_PROPERTY_ITEM { PROP_ID idProp; // Property ID of property
DWORD ptBaseType:16; // Lowest 16 bits: property type
DWORD fAccess:15; // Upper 15 bits: access rights
DWORD fVolatile:1; // MSB: TRUE if property is volatile
GET_ACCESSOR_FUNCTION pfnGetAccessor; // Accessor to get property value
PUT_ACCESSOR_FUNCTION pfnPutAccessor; // Accessor to set property value
} SPECIAL_PROPERTY_ITEM, *LPSPECIAL_PROPERTY_ITEM;
// Define a generic structure to define a set of properties
typedef struct _PTABLE { LPSPECIAL_PROPERTY_ITEM pProperties; // Actual property table
DWORD dwProperties; // Count
BOOL fIsSorted; // Prop table sorted by PROP_ID?
} PTABLE, *LPPTABLE;
// Enumerated types representing type of access on property
typedef enum _PROPERTY_ACCESS { PA_NONE = 0, PA_READ = 1, PA_WRITE = 2, PA_READ_WRITE = PA_READ | PA_WRITE, PA_MAXPA
} _PROPERTY_ACCESS;
// Enumerated types representing property types
typedef enum _PROPERTY_DATA_TYPES { PT_NONE = 0, PT_STRING, PT_DWORD, PT_BOOL, PT_INTERFACE, PT_MAXPT
} PROPERTY_DATA_TYPES;
// =================================================================
// class for searching special properties
//
class CSpecialPropertyTable { public:
CSpecialPropertyTable( LPPTABLE pPropertyTable );
~CSpecialPropertyTable();
//
// Synopsis:
// Method to retrieve a special property item, if exists in the
// special property table.
//
// Arguments:
// idProp - Property ID
// pContext - context for accessor function
// ptBaseType - one of the values in PROPERTY_DATA_TYPES. If specified,
// this type will be checked against the base type of the special
// property. A perfect type match would then be required. If this
// is PT_NONE, then a type check is not performed.
// cbLength - length of buffer provided
// pcbLength - returns length of property value
// pbBuffer - buffer to receive property value
// fCheckAccess - [optional] TRUE if the caller wants an access check on
// the property, FALSE (default) skips the check
//
// Return values:
// S_OK - success, the specified property if found and its value returned
// S_FALSE - success, the specified property is not found in the table
// E_INVALIDARG - error, one or more arguments are invalid
// E_ACCESSDENIED - error, desired access to the specified property is
// denied
// TYPE_E_TYPEMISMATCH - error, a specific data type is given, but the
// specified and actual types don't match
// HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER) - error, the specified
// buffer is not large enough to hold the property value.
// *pcbLength should contain the required length in bytes.
// Or any other HRESULT from the get accessor
//
HRESULT GetProperty( PROP_ID idProp, LPVOID pContext, LPVOID pParam, DWORD ptBaseType, DWORD cbLength, DWORD *pcbLength, LPBYTE pbBuffer, BOOL fCheckAccess = FALSE );
//
// Synopsis:
// Method to set a special property item, if exists in the
// special property table.
//
// Arguments:
// idProp - Property ID
// pContext - context for accessor function
// ptBaseType - one of the values in PROPERTY_DATA_TYPES. If specified,
// this type will be checked against the base type of the special
// property. A perfect type match would then be required. If this
// is PT_NONE, then a type check is not performed.
// cbLength - length of buffer provided
// pcbLength - returns length of property value
// pbBuffer - buffer to receive property value
// fCheckAccess - [optional] TRUE if the caller wants an access check on
// the property, FALSE (default) skips the check
//
// Return values:
// S_OK - success, the specified property if found and its value is set
// S_FALSE - success, the specified property is not found in the table
// E_INVALIDARG - error, one or more arguments are invalid
// E_ACCESSDENIED - error, desired access to the specified property is
// denied
// TYPE_E_TYPEMISMATCH - error, a specific data type is given, but the
// specified and actual types don't match
// Or any other HRESULT from the put accessor
//
HRESULT PutProperty( PROP_ID idProp, LPVOID pContext, LPVOID pParam, DWORD ptBaseType, DWORD cbLength, LPBYTE pbBuffer, BOOL fCheckAccess = FALSE );
private: // Method to search the property table and return the associated
// property item, if found
LPSPECIAL_PROPERTY_ITEM SearchForProperty( PROP_ID idProp );
// Pointer to property table and count of items
LPSPECIAL_PROPERTY_ITEM m_pProperties; 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; };
#endif
|