README.TXT
Sample: container browser 
========================= 
 
This program implements a browser for SMS objects, it illustrates 
possible uses of the following SMS APIs: 
    SmsEnumContainers 
    SmsEnumFilters 
    SmsDataSourceConnect 
    SmsDataSourceDisconnect 
    SmsOpenContainer 
    SmsPopulate 
    SmsCloseContainer 
    SmsGetNextFolder 
    SmsCloseFolder 
    SmsRewind 
    SmsGetFolderID 
    SmsGetFolderType 
    SmsGetScalarCount 
    SmsGetFolderCount 
    SmsEnumFolderTypes 
    SmsGetNextScalar 
    SmsCreateFilter 
    SmsAddToken 
    SmsGetAllFilters. 
    SmsGetFilterType 
    SmsGetToken 
    SmsGetTokenCount 
    SmsCloseFilter 
 
Using the EnumContainers and EnumFilters APIs the program discovers 
what containers and filters have been registered with the API engine. 
The resulting strings are used to populate the containers and 
filters listboxes. 
 
After establishing a connection to the appropriate datasource, the user 
selects a container to examine. When the "Done" button, in the select 
container section of the dialogue, is pressed the "Select" and "Done" 
buttons in the Filters section are enabled. At this point the user 
should select and configure filters (explanations further down). 
Multiple filters may be selected for the container. Pressing the "Done" 
button in this section enables the "View container" button at the 
lower part of the dialogue. 
 
The "View container" button brings up the "The container" dialogue. 
This dialogue displays the container type (eg "Package container"), the 
number of folders contained in the container, and a list of these 
folders. The user then selects a folder and views it ("View folder" 
button). The "Done" button dismisses this dialogue and returns to the 
main doalogue. In this case all the user can do is terminate the 
browser, or restart by pressing the "Connect" button. 
 
Viewing folders: 
View a folder from the container display brings up a dialogue titled 
"View of folder: <the folder's name>". This dialogue has two sections, 
folder details, and a sub-folders listbox. The folder details section 
displays the folder's ID, type, count of scalars in the folder, count 
of sub-folders in the folder, and the number of sub-folder types that 
the folder can contain. Refer to the smsapi.h header file, or supplied 
help file, for the precise meaning and use of sub-folder type count. 
If there are any scalars in the folder the "View scalars" button will 
be enabled. Pressing this brings up a dialogue displaying the scalars and 
and their values. 
The sub-folder list displays the names of any sub-folders. Again, if 
there are any sub-folders the "View sub-folder" button will be enabled. 
Pressing this will cause the dialogue contents to be replaced with the 
details of the selected folder. 
 
Configuring filters: 
There are currently 8 filters available: 
    site, machine, group, job, architecure, package, attribute, and 
        sitelimit. 
After selecting a filter the user must configure it in order for it to 
be applied to the container, this is done in the "Configure filter" 
dialogue. 
Filters are composed of one or more tokens, the dialogue allows the 
setting of tokens into the specified filter. 
There are, currently, two forms of APIs for inserting tokens into 
filters, Add{And|Or}Token3 and Add{And|Or}Token4. The former version is 
used by all filters with the exception of Machine filters. 
If the dialogue detects that it is processing a Machine filter, then an 
additional edit control is enabled. For all other filters it is disabled. 
Machine filters need to be able to specify a group class, an attribute 
name, an operator, and a value. Other filters do not need the group 
class field. 
The usage of the three common fields differs considerably among filters, 
indeed, some filters do not even need all three parameters to be filled 
in. 
 
    Site filter 
    ----------- 
Possible values for the name field are: RootSite, and SiteByCode. 
They inform the container what site folders it should contain. 
If no site filter is applied then the site container will contain 
one folder for each site in the datasource. 
If RootSite is specified, then no other parameters are needed, and the 
container will only contain a folder for the root site. 
If SiteByCode is specified, then the Value field must contain the three 
letter site code for the requested site. Mixing of a RootSite with 
SiteByCode tokens makes no sense. (You have asked for only the root site 
and then additional sites.) In this case the RootSite token will take 
precedence and the other tokens will be discarded. 
It is possible, and perfectly sensible, to set multiple SiteByCode 
tokens. In this case the container will be populated with one folder for 
each of the requested sites. However, in this case the tokens must be 
ORed into the filter. To say that you want the boolean product of site 
ABC and site DEF makes no sense since no site can possibly have to 
site codes. 
 
 
    Group filter 
    ----------- 
This filter allows you to select the groupclasses that will be included 
for any machines that you wish to browse. As such it is only relevant 
for a container that includes machines within its hierarchy, eg site 
container, machine container. 
Configure this filter as follows: 
 
Name field: must say "GroupClass" 
GroupClass field: a valid groupclass name such as 
        "MICROSOFT|IDENTIFICATION|1.0". 
Operator combobox: select the "is" operator. It's the only one allowed. 
 
It is possible to OR multiple tokens together. For instance, selecting 
(OR) a token for MICROSOFT|IDENTIFICATION|1.0 group, select (OR) a 
token for MICROSOFT|NETCARD|1.0 group. When viewing the parent machine 
folder there will be two sub-folders, one for each of these groups. 
Note: some groupclasses have multiple instances, eg MICROSOFT|ENVIRONMENT|1.0. 
In this case there will be as many machine group sub-folders as there 
are instances of this group. 
As in site filters, ANDing tokens together makes no sense. 
 
 
    Job filter 
    ----------- 
Three options exist for filtering jobs: by job ID, by job type, and 
by job status. In all three cases the name and value fields are used. 
The operation field, currently, is not. 
To set tokens, enter one of the strings "JobType", "JobID", or "JobStatus" 
in the name field. 
For JobType tokens the value should be one of the following (again as 
a literal string): 
    "Install"           - for workstation install jobs. 
    "Server"            - for server share jobs. 
    "Remove package"    - for remove package jobs. 
    "System"            - for NAD transfer, site, and minijobs. 
 
For retrieving jobs by their ID, you should type "JobID" in the name 
field, and the (eight character) job name in the value field. 
 
For retrieving jobs by their status, type "JobStatus" in the name field. 
The value field should contain one of the following string values: 
    "Pending" 
    "Active" 
    "Cancelled" 
    "Complete" 
    "Failed" 
    "Active failed" 
 
Job tokens can be combined together inside a filter. For instance, the 
tokens: JobType = Install OR JobID = "ABC00123" will result in the 
retrieval of all workstation install jobs, and the job with the name 
"ABC00123". 
 
 
    Architecture filter 
    ------------------- 
This uses one parameter, the value field. Additional documentation 
will describe what values are allowed. For instance, "Personal Computer" 
will result in machines of the Personal Computer architectures being 
selected. "SMSEvent" will result in SMS event MIFs being selected. 
 
 
    Package filter 
    -------------- 
Currently, there is only one type of token for package filters, this 
is the Type token. The type field should say "PackageType". The value field 
is one of the following literal strings: 
    "Workstation" 
    "Server" 
    "Inventory" 
These can be combined by ORing them into a filter, in which case 
you could retrieve, say, Workstation and Sharing packages. 
If no package filter is applied, then the system defaults to returning 
all packages that are in the datasource. 
 
 
    Attribute filter 
    ---------------- 
An attribute filter acts in the same way as an SMS query format. It 
is used when enumerating/selecting machines and defines what machine 
attributes should be accepted by the container. This has a significant 
performance gain over using group filters. 
For instance, if the user only wants to see the Name, SMSLocation, 
and NetCardID from a machine's Identification group, then an 
attribute filter containing tokens for each of these attributes will 
result in a much faster folder selection than specifying a group 
filter for then Identification group. Additionally, only the information 
requested will be returned. 
 
The name field should contain the groupclass (eg MICROSOFT|IDENTIFICATION|1.0). 
The value field should contain the name of the attribute (eg "Name"). 
The operator is not currently used. 
 
NOTE: attribute filters specifying attributes that exist in multiple 
instance groups (eg the Environment group) will produce indeterminate 
results. They should not be used in this case. 
 
 
        Machine filter 
        -------------- 
A machine filter is the API equivalent of an SMS query. To configure this 
type of filter you must provide the following: 
 
Architecture field: this must contain an architecture that is known to 
    SMS, exam,ples are: "Personal Computer", "SMSEvent", "UserGroups". 
    Consult the SMS documentation for full details about architectures. 
    GroupClass field: a valid groupclass name such as 
        "MICROSOFT|IDENTIFICATION|1.0". 
Attribute name field: the name of an attribute that exists within the 
    specified groupclass. For example "SystemRole". 
Value: the value for the attribute. 
Operator combobox: this is a dropdown listbox that contains operators that 
    define the relationship between the attribute and the value. 
    For example, "SystemRole" "is" "Server". In this case "is" denotes the 
    string equality operator. 
 
This filter can be applied to site, machine, and machine group containers. 
 
For more details refer to your SMS documentation on SMS queries. 
 
 
        Sitelimit filter 
        ---------------- 
This filter can only be applied to a machine container. Using it you 
can specify that you only want machines from a specific site and, 
optionally, a specified domain to be included within the container. 
Configure this filter as follows: 
 
Site code field: the three letter site code 
[optional] Domain: the name of the domain