README.TXT
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.