Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

551 lines
19 KiB

  1. ///////////////////////////////////////////////////////////////////////////
  2. //
  3. // Copyright(C) 1997-1998 Microsoft Corporation all rights reserved.
  4. //
  5. // Module: sdoschema.h
  6. //
  7. // Project: Everest
  8. //
  9. // Description: SDO Schema Class Declaration
  10. //
  11. // Author: TLP 9/1/98
  12. //
  13. ///////////////////////////////////////////////////////////////////////////
  14. #ifndef _INC_SDO_SCHEMA_H_
  15. #define _INC_SDO_SCHEMA_H_
  16. #include <ias.h>
  17. #include <sdoiaspriv.h>
  18. #include <comdef.h> // COM definitions - Needed for IEnumVARIANT
  19. #include "sdohelperfuncs.h"
  20. #include "sdo.h"
  21. #include "resource.h" // main symbols
  22. #include "StdString.h"
  23. #include <vector>
  24. using namespace std;
  25. //////////////////////////////////////////////////////////////////////
  26. // SDO Schema Data Types
  27. //////////////////////////////////////////////////////////////////////
  28. //////////////////////////////////////////////////////////////////////
  29. typedef struct _SCHEMA_PROPERTY_INFO
  30. {
  31. LPCWSTR lpszName;
  32. LPCWSTR Id;
  33. LONG Syntax;
  34. LONG Alias;
  35. DWORD Flags;
  36. DWORD MinLength;
  37. DWORD MaxLength;
  38. LPCWSTR lpszDisplayName;
  39. } SCHEMA_PROPERTY_INFO, *PSCHEMA_PROPERTY_INFO;
  40. //////////////////////////////////////////////////////////////////////
  41. typedef LPCWSTR *PCLASSPROPERTIES;
  42. typedef struct _SCHEMA_CLASS_INFO
  43. {
  44. LPCWSTR lpszClassId;
  45. PCLASSPROPERTIES pRequiredProperties;
  46. PCLASSPROPERTIES pOptionalProperties;
  47. } SCHEMA_CLASS_INFO, *PSCHEMA_CLASS_INFO;
  48. //////////////////////////////////////////////////////////////////////
  49. #define BEGIN_SCHEMA_PROPERTY_MAP(x) \
  50. static SCHEMA_PROPERTY_INFO x[] = {
  51. //////////////////////////////////////////////////////////////////////
  52. #define DEFINE_SCHEMA_PROPERTY(name, id, syntax, alias, flags, minLength, maxLength, displayName) \
  53. { \
  54. name, \
  55. id, \
  56. syntax, \
  57. alias, \
  58. flags, \
  59. minLength, \
  60. maxLength, \
  61. displayName \
  62. },
  63. //////////////////////////////////////////////////////////////////////
  64. #define END_SCHEMA_PROPERTY_MAP \
  65. { \
  66. NULL, \
  67. NULL, \
  68. 0, \
  69. PROPERTY_SDO_RESERVED, \
  70. 0, \
  71. 0, \
  72. 0, \
  73. NULL \
  74. } };
  75. //////////////////////////////////////////////////////////////////////
  76. #define BEGIN_SCHEMA_CLASS_MAP(x) \
  77. static SCHEMA_CLASS_INFO x[] = {
  78. //////////////////////////////////////////////////////////////////////
  79. #define DEFINE_SCHEMA_CLASS(id, required, optional) \
  80. { \
  81. id, \
  82. required, \
  83. optional \
  84. },
  85. //////////////////////////////////////////////////////////////////////
  86. #define END_SCHEMA_CLASS_MAP \
  87. { \
  88. NULL, \
  89. NULL, \
  90. NULL \
  91. } };
  92. //////////////////////////////////////////////////////////////////////
  93. typedef enum _SCHEMA_OBJECT_STATE
  94. {
  95. SCHEMA_OBJECT_SHUTDOWN,
  96. SCHEMA_OBJECT_UNINITIALIZED,
  97. SCHEMA_OBJECT_INITIALIZED
  98. } SCHEMA_OBJECT_STATE;
  99. //////////////////////////////////////////
  100. class CSdoSchema; // Forward declaration
  101. //////////////////////////////////////////
  102. /////////////////////////////////////////////////////////////////////////////
  103. // CSdoSchemaClass Declaration
  104. /////////////////////////////////////////////////////////////////////////////
  105. #define SDO_SCHEMA_CLASS_ID L"ClassId"
  106. #define SDO_SCHEMA_CLASS_BASE_CLASSES L"BaseClasses"
  107. #define SDO_SCHEMA_CLASS_REQUIRED_PROPERTIES L"RequiredProperties"
  108. #define SDO_SCHEMA_CLASS_OPTIONAL_PROPERTIES L"OptionalProperties"
  109. ////////////////////////////////////////////////////////////////////////////
  110. class ATL_NO_VTABLE CSdoSchemaClass :
  111. public CComObjectRootEx<CComMultiThreadModel>,
  112. public IDispatchImpl<ISdoClassInfo, &IID_ISdoClassInfo, &LIBID_SDOIASLibPrivate>
  113. {
  114. friend CSdoSchema;
  115. public:
  116. CSdoSchemaClass();
  117. virtual ~CSdoSchemaClass();
  118. // ATL Interface Map
  119. BEGIN_COM_MAP(CSdoSchemaClass)
  120. COM_INTERFACE_ENTRY(IDispatch)
  121. COM_INTERFACE_ENTRY(ISdoClassInfo)
  122. END_COM_MAP()
  123. ////////////////////////
  124. // ISdoClassInfo Methods
  125. //////////////////////////////////////////////////////////////////////////////
  126. STDMETHOD(get_Id)(
  127. /*[out]*/ BSTR* Id
  128. );
  129. //////////////////////////////////////////////////////////////////////////////
  130. STDMETHOD(GetProperty)(
  131. /*[in]*/ LONG alias,
  132. /*[out]*/ IUnknown** ppPropertyInfo
  133. );
  134. //////////////////////////////////////////////////////////////////////////////
  135. STDMETHOD(get_RequiredPropertyCount)(
  136. /*[out]*/ LONG* count
  137. );
  138. //////////////////////////////////////////////////////////////////////////////
  139. STDMETHOD(get_RequiredProperties)(
  140. /*[out]*/ IUnknown** ppUnknown
  141. );
  142. //////////////////////////////////////////////////////////////////////////////
  143. STDMETHOD(get_OptionalPropertyCount)(
  144. /*[out]*/ LONG* count
  145. );
  146. //////////////////////////////////////////////////////////////////////////////
  147. STDMETHOD(get_OptionalProperties)(
  148. /*[out]*/ IUnknown** ppUnknown
  149. );
  150. private:
  151. CSdoSchemaClass(const CSdoSchemaClass&);
  152. CSdoSchemaClass& operator = (CSdoSchemaClass&);
  153. /////////////////////////////////////////////////////////////////////////////
  154. HRESULT InitNew(
  155. /*[in]*/ IDataStoreObject* pDSClass,
  156. /*[in]*/ ISdoSchema* pSchema
  157. );
  158. /////////////////////////////////////////////////////////////////////////////
  159. HRESULT Initialize(
  160. /*[in]*/ ISdoSchema* pSchema
  161. );
  162. /////////////////////////////////////////////////////////////////////////////
  163. HRESULT Initialize(
  164. /*[in]*/ PSCHEMA_CLASS_INFO pClassInfo,
  165. /*[in]*/ ISdoSchema* pSchema
  166. );
  167. /////////////////////////////////////////////////////////////////////////////
  168. HRESULT AddProperty(
  169. /*[in]*/ CLASSPROPERTYSET ePropertySet,
  170. /*[in]*/ ISdoPropertyInfo* pPropertyInfo
  171. );
  172. /////////////////////////////////////////////////////////////////////////////
  173. HRESULT AddBaseClassProperties(
  174. /*[in]*/ ISdoClassInfo* pSdoClassInfo
  175. );
  176. /////////////////////////////////////////////////////////////////////////////
  177. HRESULT ReadClassProperties(
  178. /*[in]*/ IDataStoreObject* pDSClass
  179. );
  180. //////////////////////////////////////////////////////////////////////////////
  181. void FreeProperties(void);
  182. typedef map<LONG, ISdoPropertyInfo*> ClassPropertyMap;
  183. typedef ClassPropertyMap::iterator ClassPropertyMapIterator;
  184. enum { VARIANT_BASES = 0, VARIANT_REQUIRED, VARIANT_OPTIONAL, VARIANT_MAX };
  185. SCHEMA_OBJECT_STATE m_state;
  186. StdWString m_id;
  187. _variant_t m_variants[VARIANT_MAX];
  188. ClassPropertyMap m_requiredProperties;
  189. ClassPropertyMap m_optionalProperties;
  190. }; // End of class cSdoSchemaClass
  191. typedef CComObjectNoLock<CSdoSchemaClass> SDO_CLASS_OBJ;
  192. typedef CComObjectNoLock<CSdoSchemaClass>* PSDO_CLASS_OBJ;
  193. /////////////////////////////////////////////////////////////////////////////
  194. // CSdoSchemaProperty Declaration
  195. /////////////////////////////////////////////////////////////////////////////
  196. #define SDO_SCHEMA_PROPERTY_NAME SDO_STOCK_PROPERTY_NAME
  197. #define SDO_SCHEMA_PROPERTY_ID L"PropertyId"
  198. #define SDO_SCHEMA_PROPERTY_TYPE L"Syntax"
  199. #define SDO_SCHEMA_PROPERTY_ALIAS L"Alias"
  200. #define SDO_SCHEMA_PROPERTY_FLAGS L"Flags"
  201. #define SDO_SCHEMA_PROPERTY_DISPLAYNAME L"DisplayName"
  202. #define SDO_SCHEMA_PROPERTY_MINVAL L"MinValue"
  203. #define SDO_SCHEMA_PROPERTY_MAXVAL L"MaxValue"
  204. #define SDO_SCHEMA_PROPERTY_MINLENGTH L"MinLength"
  205. #define SDO_SCHEMA_PROPERTY_MAXLENGTH L"MaxLength"
  206. #define SDO_SCHEMA_PROPERTY_DEFAULTVAL L"DefaultValue"
  207. #define SDO_SCHEMA_PROPERTY_FORMAT L"Format"
  208. class ATL_NO_VTABLE CSdoSchemaProperty :
  209. public CComObjectRootEx<CComMultiThreadModel>,
  210. public IDispatchImpl<ISdoPropertyInfo, &IID_ISdoPropertyInfo, &LIBID_SDOIASLibPrivate>
  211. {
  212. friend CSdoSchema;
  213. public:
  214. CSdoSchemaProperty();
  215. virtual ~CSdoSchemaProperty();
  216. // ATL Interface Map
  217. BEGIN_COM_MAP(CSdoSchemaProperty)
  218. COM_INTERFACE_ENTRY(IDispatch)
  219. COM_INTERFACE_ENTRY(ISdoPropertyInfo)
  220. END_COM_MAP()
  221. // ISdoPropertyInfo Methods
  222. //////////////////////////////////////////////////////////////////////////////
  223. STDMETHOD(get_Name)(
  224. /*[out]*/ BSTR* Name
  225. );
  226. //////////////////////////////////////////////////////////////////////////////
  227. STDMETHOD(get_Id)(
  228. /*[out]*/ BSTR* Id
  229. );
  230. //////////////////////////////////////////////////////////////////////////////
  231. STDMETHOD(get_Type)(
  232. /*[out]*/ LONG* type
  233. );
  234. //////////////////////////////////////////////////////////////////////////////
  235. STDMETHOD(get_Alias)(
  236. /*[out]*/ LONG* alias
  237. );
  238. //////////////////////////////////////////////////////////////////////////////
  239. STDMETHOD(get_Flags)(
  240. /*[out]*/ LONG* flags
  241. );
  242. //////////////////////////////////////////////////////////////////////////////
  243. STDMETHOD(get_DisplayName)(
  244. /*[out]*/ BSTR* displayName
  245. );
  246. //////////////////////////////////////////////////////////////////////////////
  247. STDMETHOD(HasMinLength)(
  248. /*[out]*/ VARIANT_BOOL* pBool
  249. );
  250. //////////////////////////////////////////////////////////////////////////////
  251. STDMETHOD(get_MinLength)(
  252. /*[out]*/ LONG* length
  253. );
  254. //////////////////////////////////////////////////////////////////////////////
  255. STDMETHOD(HasMaxLength)(
  256. /*[out]*/ VARIANT_BOOL* pBool
  257. );
  258. //////////////////////////////////////////////////////////////////////////////
  259. STDMETHOD(get_MaxLength)(
  260. /*[out]*/ LONG* length
  261. );
  262. //////////////////////////////////////////////////////////////////////////////
  263. STDMETHOD(HasMinValue)(
  264. /*[out]*/ VARIANT_BOOL* pBool
  265. );
  266. //////////////////////////////////////////////////////////////////////////////
  267. STDMETHOD(get_MinValue)(
  268. /*[out]*/ VARIANT* value
  269. );
  270. //////////////////////////////////////////////////////////////////////////////
  271. STDMETHOD(HasMaxValue)(
  272. /*[out]*/ VARIANT_BOOL* pBool
  273. );
  274. //////////////////////////////////////////////////////////////////////////////
  275. STDMETHOD(get_MaxValue)(
  276. /*[out]*/ VARIANT* value
  277. );
  278. //////////////////////////////////////////////////////////////////////////////
  279. STDMETHOD(HasDefaultValue)(
  280. /*[out]*/ VARIANT_BOOL* pBool
  281. );
  282. //////////////////////////////////////////////////////////////////////////////
  283. STDMETHOD(get_DefaultValue)(
  284. /*[out]*/ VARIANT* value
  285. );
  286. //////////////////////////////////////////////////////////////////////////////
  287. STDMETHOD(HasFormat)(
  288. /*[out]*/ VARIANT_BOOL* pBool
  289. );
  290. //////////////////////////////////////////////////////////////////////////////
  291. STDMETHOD(get_Format)(
  292. /*[out]*/ BSTR* displayName
  293. );
  294. //////////////////////////////////////////////////////////////////////////////
  295. STDMETHOD(IsRequired)(
  296. /*[out]*/ VARIANT_BOOL* pBool
  297. );
  298. //////////////////////////////////////////////////////////////////////////////
  299. STDMETHOD(IsReadOnly)(
  300. /*[out]*/ VARIANT_BOOL* pBool
  301. );
  302. //////////////////////////////////////////////////////////////////////////////
  303. STDMETHOD(IsMultiValued)(
  304. /*[out]*/ VARIANT_BOOL* pBool
  305. );
  306. //////////////////////////////////////////////////////////////////////////////
  307. STDMETHOD(IsCollection)(
  308. /*[out]*/ VARIANT_BOOL* pBool
  309. );
  310. private:
  311. CSdoSchemaProperty(const CSdoSchemaProperty&);
  312. CSdoSchemaProperty& operator = (CSdoSchemaProperty&);
  313. //////////////////////////////////////////////////////////////////////////////
  314. HRESULT Initialize(
  315. /*[in]*/ IDataStoreObject* pDSObject
  316. );
  317. //////////////////////////////////////////////////////////////////////////////
  318. HRESULT Initialize(
  319. /*[in]*/ PSCHEMA_PROPERTY_INFO pPropertyInfo
  320. );
  321. //////////////////////////////////////////////////////////////////////////////
  322. SCHEMA_OBJECT_STATE m_state;
  323. StdWString m_name;
  324. StdWString m_id;
  325. StdWString m_displayName;
  326. StdWString m_format;
  327. LONG m_type;
  328. LONG m_alias;
  329. DWORD m_flags;
  330. DWORD m_minLength;
  331. DWORD m_maxLength;
  332. _variant_t m_minValue;
  333. _variant_t m_maxValue;
  334. _variant_t m_defaultValue;
  335. }; // End of class CSdoSchemaProperty
  336. typedef CComObjectNoLock<CSdoSchemaProperty> SDO_PROPERTY_OBJ;
  337. typedef CComObjectNoLock<CSdoSchemaProperty>* PSDO_PROPERTY_OBJ;
  338. /////////////////////////////////////////////////////////////////////////////
  339. // CSdoSchema Declaration
  340. /////////////////////////////////////////////////////////////////////////////
  341. #define SDO_SCHEMA_ROOT_OBJECT L"SDO Schema"
  342. #define SDO_SCHEMA_PROPERTIES_CONTAINER L"SDO Schema Properties"
  343. #define SDO_SCHEMA_CLASSES_CONTAINER L"SDO Schema Classes"
  344. class ATL_NO_VTABLE CSdoSchema :
  345. public CComObjectRootEx<CComMultiThreadModel>,
  346. public IDispatchImpl<ISdoSchema, &IID_ISdoSchema, &LIBID_SDOIASLibPrivate>
  347. {
  348. friend HRESULT MakeSDOSchema(
  349. /*[in]*/ IDataStoreContainer* pDSRootContainer,
  350. /*[out*/ ISdoSchema** ppSdoSchema
  351. );
  352. public:
  353. CSdoSchema();
  354. ~CSdoSchema(); // Don't plan to derive from this class...
  355. // ATL Interface Map
  356. BEGIN_COM_MAP(CSdoSchema)
  357. COM_INTERFACE_ENTRY(IDispatch)
  358. COM_INTERFACE_ENTRY(ISdoSchema)
  359. END_COM_MAP()
  360. /////////////////////////////////////////////////////////////////////////////
  361. HRESULT Initialize(
  362. /*[in]*/ IDataStoreObject* pSchemaDataStore
  363. );
  364. ///////////////////////////
  365. // ISdoPropertyInfo Methods
  366. /////////////////////////////////////////////////////////////////////////////
  367. STDMETHOD(GetVersion)(
  368. /*[in]*/ BSTR* version
  369. );
  370. /////////////////////////////////////////////////////////////////////////////
  371. STDMETHOD(GetClass)(
  372. /*[in]*/ BSTR classId,
  373. /*[out]*/ IUnknown** sdoClassInfo
  374. );
  375. /////////////////////////////////////////////////////////////////////////////
  376. STDMETHOD(GetProperty)(
  377. /*[in]*/ BSTR propertyId,
  378. /*[out]*/ IUnknown** sdoPropertyInfo
  379. );
  380. private:
  381. CSdoSchema(const CSdoSchema&); // No copy
  382. CSdoSchema& operator = (CSdoSchema&); // No assignment
  383. /////////////////////////////////////////////////////////////////////////////
  384. SCHEMA_OBJECT_STATE GetState() const
  385. { return m_state; }
  386. /////////////////////////////////////////////////////////////////////////////
  387. HRESULT AddProperty(
  388. /*[in]*/ PSDO_PROPERTY_OBJ pPropertyObj
  389. );
  390. /////////////////////////////////////////////////////////////////////////////
  391. HRESULT AddClass(
  392. /*[in]*/ PSDO_CLASS_OBJ pClassObj
  393. );
  394. /////////////////////////////////////////////////////////////////////////////
  395. HRESULT InitializeClasses(void);
  396. /////////////////////////////////////////////////////////////////////////////
  397. void DestroyProperties(void);
  398. /////////////////////////////////////////////////////////////////////////////
  399. void DestroyClasses(void);
  400. /////////////////////////////////////////////////////////////////////////////
  401. HRESULT BuildInternalProperties(void);
  402. /////////////////////////////////////////////////////////////////////////////
  403. HRESULT BuildInternalClasses(void);
  404. /////////////////////////////////////////////////////////////////////////////
  405. HRESULT BuildSchemaProperties(
  406. /*[in]*/ IDataStoreObject* pSchema
  407. );
  408. /////////////////////////////////////////////////////////////////////////////
  409. HRESULT BuildSchemaClasses(
  410. /*[in]*/ IDataStoreObject* pSchema
  411. );
  412. typedef map<StdWString, ISdoClassInfo*> ClassMap;
  413. typedef ClassMap::iterator ClassMapIterator;
  414. typedef map<StdWString, ISdoPropertyInfo*> PropertyMap;
  415. typedef PropertyMap::iterator PropertyMapIterator;
  416. SCHEMA_OBJECT_STATE m_state;
  417. bool m_fInternalObjsInitialized;
  418. bool m_fSchemaObjsInitialized;
  419. CRITICAL_SECTION m_critSec;
  420. StdWString m_version;
  421. ClassMap m_classMap;
  422. PropertyMap m_propertyMap;
  423. }; // End of class CSdoSchema
  424. typedef CComObjectNoLock<CSdoSchema> SDO_SCHEMA_OBJ;
  425. typedef CComObjectNoLock<CSdoSchema>* PSDO_SCHEMA_OBJ;
  426. #endif // _INC_SDO_SCHEMA_H_