SMS API Example: object enumeration. (enumobj.exe) ================================================== This sample illustrates the use of the SMS object enumeration APIs. The objects involved here are currently Architectures and Platforms, and their descendent objects. The API draws a distinction between 'first-class' and 'secondary objects. A 'first-class' object is one that can be described by SMS without any prior knowledge. The first-class objects that are known to the system is returned by calling SmsEnumObjectTypes. Calling this will currently result in two object-types being returned: Architectures and Platforms. In order to determine what Architectures exist the user then calls SmsEnumObjects, passing "Architectures" as the types of object that we are interested in. What is returned from this call depends on the individual database. The set of architectures will certainly include: Personal Computer SMSEvents SNMP Traps (SMS 1.2 and above) PackageLocation UserGroups etc. These are all secondary objects whose type is "Architecture". It is now possible to determine what objects each of these contain. For instance, every object of type 'Architecture' will contain one or more object of type 'Group', such as "MICROSOFT|IDENTIFICATION|1.0". Note that it is impossible to determine what groups exist without first knowing what architecture the user is interested in. Similarly, while a Group object contains Attribute objects, it is impossible to know what Attributes exist without knowing what group we are talking about. This is why the SmsEnumObjects API has the notion of a predecessor list. The data type used by the API to describe an object that it returns is known as OBJDESCRIPTOR. Looking at the definition for this data type (see smsapi.h) we see that there are the following fields: DWORD objType Type of this object. SMSBUFF szName Object name (eg 'Personal Computer') SMSBUFF szFriendlyName Friendly name. Only used in groups where szName would be, eg, 'MICROSOFT|IDENTIFICATION|1.0', the friendly name would be 'Identification'. BOOL bGotFriendlyName TRUE if we have a friendly name. DWORD dwRelopMin For attributes, indicates range of DWORD dwRelopMax relational operators that can be used for this attribute. BOOL bGotRelops TRUE if we have the relops fields set. The 'objType' parameter is one of the set of OT_ defines (also in smsapi.h). This tells the user what type of object is described by this OBJDESCRIPTOR. 'szName' provides the name for this object (eg 'Personal Computer', 'SMSID'). 'szFriendlyName' if this is not null then it gives a user-friendly name for the object (see above). This is only used in the case of Group objects, but the 'bGotFriendlyName' datum will indicate whether this field is present or not. 'dwRelopMin' and 'dwRelopMax' are used by attributes. They inform the caller what the range of operators are for the attribute in question. 'bGotRelops' is TRUE if these fields are present. The values of these relational operators is from the file qrycodes.h. Note that this example operates in a recursive manner in order to enumerate all objects that are known to the API set. A different use would of the APIs would be something like: given a specific architecture and a specific group, what attributes exist. Code for this would be something like: (where Architecture is Personal Computer, and Group is MICROSOFT| VIDEO|1.0) SMSBUFF aPreds[10]; strcpy( aPreds[0], "Architectures" ); strcpy( aPreds[1], "MICROSOFT|VIDEO|1.0 ); strcpy( aPreds[2], "MICROSOFT|VIDEO|1.0 ); SmsEnumObjects( hConnect, // Handle to datasource connection. pszObj, // Attribute. pPreds, // see above. ctPreds, // 3: Architectures, PC, MS|VIDEO|1.0 Objects, // filled in by API. &ctObjs ); // filled in by API. This would return, in 'Objects', all attributes for the video group.