windows-nt/Source/XPSP1/NT/net/ias/sdo/sdoias/sdoschema.h
2020-09-26 16:20:57 +08:00

551 lines
16 KiB
C++

///////////////////////////////////////////////////////////////////////////
//
// Copyright(C) 1997-1998 Microsoft Corporation all rights reserved.
//
// Module: sdoschema.h
//
// Project: Everest
//
// Description: SDO Schema Class Declaration
//
// Author: TLP 9/1/98
//
///////////////////////////////////////////////////////////////////////////
#ifndef _INC_SDO_SCHEMA_H_
#define _INC_SDO_SCHEMA_H_
#include <ias.h>
#include <sdoiaspriv.h>
#include <comdef.h> // COM definitions - Needed for IEnumVARIANT
#include "sdohelperfuncs.h"
#include "sdo.h"
#include "resource.h" // main symbols
#include <vector>
#include <string>
using namespace std;
//////////////////////////////////////////////////////////////////////
// SDO Schema Data Types
//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
typedef struct _SCHEMA_PROPERTY_INFO
{
LPCWSTR lpszName;
LPCWSTR Id;
LONG Syntax;
LONG Alias;
DWORD Flags;
DWORD MinLength;
DWORD MaxLength;
LPCWSTR lpszDisplayName;
} SCHEMA_PROPERTY_INFO, *PSCHEMA_PROPERTY_INFO;
//////////////////////////////////////////////////////////////////////
typedef LPCWSTR *PCLASSPROPERTIES;
typedef struct _SCHEMA_CLASS_INFO
{
LPCWSTR lpszClassId;
PCLASSPROPERTIES pRequiredProperties;
PCLASSPROPERTIES pOptionalProperties;
} SCHEMA_CLASS_INFO, *PSCHEMA_CLASS_INFO;
//////////////////////////////////////////////////////////////////////
#define BEGIN_SCHEMA_PROPERTY_MAP(x) \
static SCHEMA_PROPERTY_INFO x[] = {
//////////////////////////////////////////////////////////////////////
#define DEFINE_SCHEMA_PROPERTY(name, id, syntax, alias, flags, minLength, maxLength, displayName) \
{ \
name, \
id, \
syntax, \
alias, \
flags, \
minLength, \
maxLength, \
displayName \
},
//////////////////////////////////////////////////////////////////////
#define END_SCHEMA_PROPERTY_MAP \
{ \
NULL, \
NULL, \
0, \
PROPERTY_SDO_RESERVED, \
0, \
0, \
0, \
NULL \
} };
//////////////////////////////////////////////////////////////////////
#define BEGIN_SCHEMA_CLASS_MAP(x) \
static SCHEMA_CLASS_INFO x[] = {
//////////////////////////////////////////////////////////////////////
#define DEFINE_SCHEMA_CLASS(id, required, optional) \
{ \
id, \
required, \
optional \
},
//////////////////////////////////////////////////////////////////////
#define END_SCHEMA_CLASS_MAP \
{ \
NULL, \
NULL, \
NULL \
} };
//////////////////////////////////////////////////////////////////////
typedef enum _SCHEMA_OBJECT_STATE
{
SCHEMA_OBJECT_SHUTDOWN,
SCHEMA_OBJECT_UNINITIALIZED,
SCHEMA_OBJECT_INITIALIZED
} SCHEMA_OBJECT_STATE;
//////////////////////////////////////////
class CSdoSchema; // Forward declaration
//////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
// CSdoSchemaClass Declaration
/////////////////////////////////////////////////////////////////////////////
#define SDO_SCHEMA_CLASS_ID L"ClassId"
#define SDO_SCHEMA_CLASS_BASE_CLASSES L"BaseClasses"
#define SDO_SCHEMA_CLASS_REQUIRED_PROPERTIES L"RequiredProperties"
#define SDO_SCHEMA_CLASS_OPTIONAL_PROPERTIES L"OptionalProperties"
////////////////////////////////////////////////////////////////////////////
class ATL_NO_VTABLE CSdoSchemaClass :
public CComObjectRootEx<CComMultiThreadModel>,
public IDispatchImpl<ISdoClassInfo, &IID_ISdoClassInfo, &LIBID_SDOIASLibPrivate>
{
friend CSdoSchema;
public:
CSdoSchemaClass();
virtual ~CSdoSchemaClass();
// ATL Interface Map
BEGIN_COM_MAP(CSdoSchemaClass)
COM_INTERFACE_ENTRY(IDispatch)
COM_INTERFACE_ENTRY(ISdoClassInfo)
END_COM_MAP()
////////////////////////
// ISdoClassInfo Methods
//////////////////////////////////////////////////////////////////////////////
STDMETHOD(get_Id)(
/*[out]*/ BSTR* Id
);
//////////////////////////////////////////////////////////////////////////////
STDMETHOD(GetProperty)(
/*[in]*/ LONG alias,
/*[out]*/ IUnknown** ppPropertyInfo
);
//////////////////////////////////////////////////////////////////////////////
STDMETHOD(get_RequiredPropertyCount)(
/*[out]*/ LONG* count
);
//////////////////////////////////////////////////////////////////////////////
STDMETHOD(get_RequiredProperties)(
/*[out]*/ IUnknown** ppUnknown
);
//////////////////////////////////////////////////////////////////////////////
STDMETHOD(get_OptionalPropertyCount)(
/*[out]*/ LONG* count
);
//////////////////////////////////////////////////////////////////////////////
STDMETHOD(get_OptionalProperties)(
/*[out]*/ IUnknown** ppUnknown
);
private:
CSdoSchemaClass(const CSdoSchemaClass&);
CSdoSchemaClass& operator = (CSdoSchemaClass&);
/////////////////////////////////////////////////////////////////////////////
HRESULT InitNew(
/*[in]*/ IDataStoreObject* pDSClass,
/*[in]*/ ISdoSchema* pSchema
);
/////////////////////////////////////////////////////////////////////////////
HRESULT Initialize(
/*[in]*/ ISdoSchema* pSchema
);
/////////////////////////////////////////////////////////////////////////////
HRESULT Initialize(
/*[in]*/ PSCHEMA_CLASS_INFO pClassInfo,
/*[in]*/ ISdoSchema* pSchema
);
/////////////////////////////////////////////////////////////////////////////
HRESULT AddProperty(
/*[in]*/ CLASSPROPERTYSET ePropertySet,
/*[in]*/ ISdoPropertyInfo* pPropertyInfo
);
/////////////////////////////////////////////////////////////////////////////
HRESULT AddBaseClassProperties(
/*[in]*/ ISdoClassInfo* pSdoClassInfo
);
/////////////////////////////////////////////////////////////////////////////
HRESULT ReadClassProperties(
/*[in]*/ IDataStoreObject* pDSClass
);
//////////////////////////////////////////////////////////////////////////////
void FreeProperties(void);
typedef map<LONG, ISdoPropertyInfo*> ClassPropertyMap;
typedef ClassPropertyMap::iterator ClassPropertyMapIterator;
enum { VARIANT_BASES = 0, VARIANT_REQUIRED, VARIANT_OPTIONAL, VARIANT_MAX };
SCHEMA_OBJECT_STATE m_state;
wstring m_id;
_variant_t m_variants[VARIANT_MAX];
ClassPropertyMap m_requiredProperties;
ClassPropertyMap m_optionalProperties;
}; // End of class cSdoSchemaClass
typedef CComObjectNoLock<CSdoSchemaClass> SDO_CLASS_OBJ;
typedef CComObjectNoLock<CSdoSchemaClass>* PSDO_CLASS_OBJ;
/////////////////////////////////////////////////////////////////////////////
// CSdoSchemaProperty Declaration
/////////////////////////////////////////////////////////////////////////////
#define SDO_SCHEMA_PROPERTY_NAME SDO_STOCK_PROPERTY_NAME
#define SDO_SCHEMA_PROPERTY_ID L"PropertyId"
#define SDO_SCHEMA_PROPERTY_TYPE L"Syntax"
#define SDO_SCHEMA_PROPERTY_ALIAS L"Alias"
#define SDO_SCHEMA_PROPERTY_FLAGS L"Flags"
#define SDO_SCHEMA_PROPERTY_DISPLAYNAME L"DisplayName"
#define SDO_SCHEMA_PROPERTY_MINVAL L"MinValue"
#define SDO_SCHEMA_PROPERTY_MAXVAL L"MaxValue"
#define SDO_SCHEMA_PROPERTY_MINLENGTH L"MinLength"
#define SDO_SCHEMA_PROPERTY_MAXLENGTH L"MaxLength"
#define SDO_SCHEMA_PROPERTY_DEFAULTVAL L"DefaultValue"
#define SDO_SCHEMA_PROPERTY_FORMAT L"Format"
class ATL_NO_VTABLE CSdoSchemaProperty :
public CComObjectRootEx<CComMultiThreadModel>,
public IDispatchImpl<ISdoPropertyInfo, &IID_ISdoPropertyInfo, &LIBID_SDOIASLibPrivate>
{
friend CSdoSchema;
public:
CSdoSchemaProperty();
virtual ~CSdoSchemaProperty();
// ATL Interface Map
BEGIN_COM_MAP(CSdoSchemaProperty)
COM_INTERFACE_ENTRY(IDispatch)
COM_INTERFACE_ENTRY(ISdoPropertyInfo)
END_COM_MAP()
// ISdoPropertyInfo Methods
//////////////////////////////////////////////////////////////////////////////
STDMETHOD(get_Name)(
/*[out]*/ BSTR* Name
);
//////////////////////////////////////////////////////////////////////////////
STDMETHOD(get_Id)(
/*[out]*/ BSTR* Id
);
//////////////////////////////////////////////////////////////////////////////
STDMETHOD(get_Type)(
/*[out]*/ LONG* type
);
//////////////////////////////////////////////////////////////////////////////
STDMETHOD(get_Alias)(
/*[out]*/ LONG* alias
);
//////////////////////////////////////////////////////////////////////////////
STDMETHOD(get_Flags)(
/*[out]*/ LONG* flags
);
//////////////////////////////////////////////////////////////////////////////
STDMETHOD(get_DisplayName)(
/*[out]*/ BSTR* displayName
);
//////////////////////////////////////////////////////////////////////////////
STDMETHOD(HasMinLength)(
/*[out]*/ VARIANT_BOOL* pBool
);
//////////////////////////////////////////////////////////////////////////////
STDMETHOD(get_MinLength)(
/*[out]*/ LONG* length
);
//////////////////////////////////////////////////////////////////////////////
STDMETHOD(HasMaxLength)(
/*[out]*/ VARIANT_BOOL* pBool
);
//////////////////////////////////////////////////////////////////////////////
STDMETHOD(get_MaxLength)(
/*[out]*/ LONG* length
);
//////////////////////////////////////////////////////////////////////////////
STDMETHOD(HasMinValue)(
/*[out]*/ VARIANT_BOOL* pBool
);
//////////////////////////////////////////////////////////////////////////////
STDMETHOD(get_MinValue)(
/*[out]*/ VARIANT* value
);
//////////////////////////////////////////////////////////////////////////////
STDMETHOD(HasMaxValue)(
/*[out]*/ VARIANT_BOOL* pBool
);
//////////////////////////////////////////////////////////////////////////////
STDMETHOD(get_MaxValue)(
/*[out]*/ VARIANT* value
);
//////////////////////////////////////////////////////////////////////////////
STDMETHOD(HasDefaultValue)(
/*[out]*/ VARIANT_BOOL* pBool
);
//////////////////////////////////////////////////////////////////////////////
STDMETHOD(get_DefaultValue)(
/*[out]*/ VARIANT* value
);
//////////////////////////////////////////////////////////////////////////////
STDMETHOD(HasFormat)(
/*[out]*/ VARIANT_BOOL* pBool
);
//////////////////////////////////////////////////////////////////////////////
STDMETHOD(get_Format)(
/*[out]*/ BSTR* displayName
);
//////////////////////////////////////////////////////////////////////////////
STDMETHOD(IsRequired)(
/*[out]*/ VARIANT_BOOL* pBool
);
//////////////////////////////////////////////////////////////////////////////
STDMETHOD(IsReadOnly)(
/*[out]*/ VARIANT_BOOL* pBool
);
//////////////////////////////////////////////////////////////////////////////
STDMETHOD(IsMultiValued)(
/*[out]*/ VARIANT_BOOL* pBool
);
//////////////////////////////////////////////////////////////////////////////
STDMETHOD(IsCollection)(
/*[out]*/ VARIANT_BOOL* pBool
);
private:
CSdoSchemaProperty(const CSdoSchemaProperty&);
CSdoSchemaProperty& operator = (CSdoSchemaProperty&);
//////////////////////////////////////////////////////////////////////////////
HRESULT Initialize(
/*[in]*/ IDataStoreObject* pDSObject
);
//////////////////////////////////////////////////////////////////////////////
HRESULT Initialize(
/*[in]*/ PSCHEMA_PROPERTY_INFO pPropertyInfo
);
//////////////////////////////////////////////////////////////////////////////
SCHEMA_OBJECT_STATE m_state;
wstring m_name;
wstring m_id;
wstring m_displayName;
wstring m_format;
LONG m_type;
LONG m_alias;
DWORD m_flags;
DWORD m_minLength;
DWORD m_maxLength;
_variant_t m_minValue;
_variant_t m_maxValue;
_variant_t m_defaultValue;
}; // End of class CSdoSchemaProperty
typedef CComObjectNoLock<CSdoSchemaProperty> SDO_PROPERTY_OBJ;
typedef CComObjectNoLock<CSdoSchemaProperty>* PSDO_PROPERTY_OBJ;
/////////////////////////////////////////////////////////////////////////////
// CSdoSchema Declaration
/////////////////////////////////////////////////////////////////////////////
#define SDO_SCHEMA_ROOT_OBJECT L"SDO Schema"
#define SDO_SCHEMA_PROPERTIES_CONTAINER L"SDO Schema Properties"
#define SDO_SCHEMA_CLASSES_CONTAINER L"SDO Schema Classes"
class ATL_NO_VTABLE CSdoSchema :
public CComObjectRootEx<CComMultiThreadModel>,
public IDispatchImpl<ISdoSchema, &IID_ISdoSchema, &LIBID_SDOIASLibPrivate>
{
friend HRESULT MakeSDOSchema(
/*[in]*/ IDataStoreContainer* pDSRootContainer,
/*[out*/ ISdoSchema** ppSdoSchema
);
public:
CSdoSchema();
~CSdoSchema(); // Don't plan to derive from this class...
// ATL Interface Map
BEGIN_COM_MAP(CSdoSchema)
COM_INTERFACE_ENTRY(IDispatch)
COM_INTERFACE_ENTRY(ISdoSchema)
END_COM_MAP()
/////////////////////////////////////////////////////////////////////////////
HRESULT Initialize(
/*[in]*/ IDataStoreObject* pSchemaDataStore
);
///////////////////////////
// ISdoPropertyInfo Methods
/////////////////////////////////////////////////////////////////////////////
STDMETHOD(GetVersion)(
/*[in]*/ BSTR* version
);
/////////////////////////////////////////////////////////////////////////////
STDMETHOD(GetClass)(
/*[in]*/ BSTR classId,
/*[out]*/ IUnknown** sdoClassInfo
);
/////////////////////////////////////////////////////////////////////////////
STDMETHOD(GetProperty)(
/*[in]*/ BSTR propertyId,
/*[out]*/ IUnknown** sdoPropertyInfo
);
private:
CSdoSchema(const CSdoSchema&); // No copy
CSdoSchema& operator = (CSdoSchema&); // No assignment
/////////////////////////////////////////////////////////////////////////////
SCHEMA_OBJECT_STATE GetState() const
{ return m_state; }
/////////////////////////////////////////////////////////////////////////////
HRESULT AddProperty(
/*[in]*/ PSDO_PROPERTY_OBJ pPropertyObj
);
/////////////////////////////////////////////////////////////////////////////
HRESULT AddClass(
/*[in]*/ PSDO_CLASS_OBJ pClassObj
);
/////////////////////////////////////////////////////////////////////////////
HRESULT InitializeClasses(void);
/////////////////////////////////////////////////////////////////////////////
void DestroyProperties(void);
/////////////////////////////////////////////////////////////////////////////
void DestroyClasses(void);
/////////////////////////////////////////////////////////////////////////////
HRESULT BuildInternalProperties(void);
/////////////////////////////////////////////////////////////////////////////
HRESULT BuildInternalClasses(void);
/////////////////////////////////////////////////////////////////////////////
HRESULT BuildSchemaProperties(
/*[in]*/ IDataStoreObject* pSchema
);
/////////////////////////////////////////////////////////////////////////////
HRESULT BuildSchemaClasses(
/*[in]*/ IDataStoreObject* pSchema
);
typedef map<wstring, ISdoClassInfo*> ClassMap;
typedef ClassMap::iterator ClassMapIterator;
typedef map<wstring, ISdoPropertyInfo*> PropertyMap;
typedef PropertyMap::iterator PropertyMapIterator;
SCHEMA_OBJECT_STATE m_state;
bool m_fInternalObjsInitialized;
bool m_fSchemaObjsInitialized;
CRITICAL_SECTION m_critSec;
wstring m_version;
ClassMap m_classMap;
PropertyMap m_propertyMap;
}; // End of class CSdoSchema
typedef CComObjectNoLock<CSdoSchema> SDO_SCHEMA_OBJ;
typedef CComObjectNoLock<CSdoSchema>* PSDO_SCHEMA_OBJ;
#endif // _INC_SDO_SCHEMA_H_