This repository has been archived on 2024-12-16. You can view files and clone it, but cannot push or open issues or pull requests.
CodeBlocksPortable/Borland/BCC55/Include/smsapi.h

1774 lines
71 KiB
C

// **************************************************************************
//
// File: SMSAPI.H
//
// Copyright (c) 1994, 1995 Microsoft Corp.
//
// This is the header file for the SMS API.
//
// This file contains all data definitions, manifests, return codes and
// API declarations that constitute the API set.
//
//
// **************************************************************************
// **************************************************************************
//
// The SMS API set provides a set of interfaces to enable querying and,
// in some cases creation and deletion, of data from an SMS database.
//
// SMS contains numerous objects to which an ISV needs access. These objects
// are (not in any particular order): packages, jobs, workstation command
// lines, program items, sites, domains, machines, machine groups.
//
// The SMS API is built using a technology known as the objectity technique.
// This technique expresses all objects in terms of containers, folders,
// and scalars. All SMS objects are thus expressed in these terms.
// The advantage of this is that we have a standard interface to all
// objects. That is, the API does not distinguish between, say, a job and
// a machine.
//
// The starting point is the container. There are certain types of container
// defined (container types below). A container is opened and then
// populated. The act of populating a container causes it to be filled with
// folders of defned types. A folder can contain sub-folders and scalars.
// Scalars are akin to leaf nodes in a hierarchy graph. The contain a
// name, type, and value.
//
// Much of the power to the objectity technique is provided by filters.
// These are objects which specify selection criteria. Filters are applied
// by the user at the container level, at which point the implementation of
// the API will assume ownership of the filter. It is guaranteed that only
// folders matching the filters will be included in the container hierarchy.
//
// Every folder can contain a set of scalars. Not all folders do, for
// example a machine folder does not. In some cases a folder contains a
// defined set of scalars, in other cases the scalar set can only be
// determined at run time. In cases where the scalar set is predetermined
// it will be documented in supporting documentation.
//
// The APIs behave in a uniform manner.
// 1. They all return a status code (SMS_STATUS).
// 2. Where a value needs to be returned, it is done via a reference
// parameter.
//
// An API is provided to determine the API version. Any problems involving
// the SMS API should include the information provided by this API.
//
// The first step in using the APIs to to establish a connection to a
// datasource. Currently the only datasource supported in SQL, but the
// API is designed in such a way that additional datasources can be
// added. Two APIs are provided for dealing with datasources:
// DataSourceConnect and DataSourceDisonnect. The connect API returns a
// connection handle, this is used in subsequent calls to open containers.
//
// Apart from these APIs, the rest of the API set is divided into four
// groups:
// 1. Container APIs.
// 2. Folder APIs.
// 3. Scalar APIs.
// 4. Filter APIs.
//
// 1. Container APIs.
// These allow a container to be opened, a filter to be applied to a
// container, a container to be populated with folders, a folder to be
// retrieved, and the container to be closed. An API also exists to
// return the number of folders currently contained in a container.
//
// 2. Folder APIs.
// These allow a for retrieval of various types of information about a
// folder (its ID or name, its type, the number of sub-folders, the number
// of scalars). Retrieval of sub-folders within a folder in both a
// sequential fashion and by name. Retrieval of scalars (sequential and by
// name. And closure of the folder.
// An API exists to allow folder creation. However, this is implementation
// dependant. That is, most folders do not permit creation, some (eg
// ceratin types of jobs) do.
//
// 3. Scalar APIs.
// There is a bit of overlap between this and the previous group. Although
// scalar retrieval is included in the Folder API group, it can also be
// considered a scalar API.
// An API is provided to set/update the value of a scalar. This can
// currently only be done in a folder that is being newly created.
//
// 4. Filter APIs.
// APIs for opening and closing a filter, and adding tokens into a filter.
// Filters are composed of one or more tokens of the same type. Some filters
// permit grouping of tokens within the filter (ie machine filter). This
// allows for complex boolean expressions.
// Tokens differ between different filters, but have a common interface.
// Tokens are contructed via the SmsAddToken API.
//
// 5. Filter container APIs
// Certain filters can be persistent, that is they are saved in the database
// and can be reloaded by separate processes. These filters can be created
// either the APIs, or via the SMS Admin.
// These APIs enable the retrieval of these filters from the datasource
// and the commital of new filters into the datasource.
// Currently machine filters are the only filters capable of exhibiting
// persistence.
//
// **************************************************************************
#ifndef _SMSAPI_H_
#pragma option push -b -a8 -pc -A- /*P_O_Push*/
#define _SMSAPI_H_
// ====================================================================
//
// Includes
//
// ====================================================================
#include <qrycodes.h> // The query codes for Machine queries.
#include <smsinfo.h> // Manifests related to scalar settings.
#include <objectty.h> // Objectity engine.
#ifdef __cplusplus
extern "C" {
#endif
// ====================================================================
//
// Datasource definition information.
//
// ====================================================================
//
// Supported datasources.
// (NOTE: only sql supported currently).
//
typedef enum { DB_SQL, DB_SQL_CONNECTED, DB_OTHER } DATASOURCE_TYPE;
//
// Prototype for a decryption function. This is the last parameter
// to the SQL_CONNECT_PARAMS structure.
// When a user calls the DataSourceConnect API he can pass in the
// user name and password in encrypted form. If the decryption function
// pointer is non-null the the API will attempt to call this function
// both for the user name and password.
// The decryption function is user-supplied, it is expected to return
// the decrypted data in the first parameter.
//
typedef void (*PDECRYPTFUNC)(char *pszBuffer, char *pszDecryptMe, char *pszKey);
//
// The information block needed for the DataSourceConnect API.
// 1. SQL datasource.
//
typedef struct _SQL_CONNECT_PARAMS {
DATASOURCE_TYPE ds;
char *pszServer; // SQL Server name.
char *pszUserName; // User name (possibly encrypted).
char *pszPasswd; // Password (possibly encrypted).
char *pszDbName; // Database name.
char *pszKey; // Decryption key.
PDECRYPTFUNC pFunc; // Pointer to a decryption function.
} SQL_CONNECT_PARAMS;
//
// 2. RESERVED DO NOT USE
//
typedef struct _SQL_CONNECT_CONNECTED_PARAMS {
DATASOURCE_TYPE ds;
HANDLE hDataSource;
const char *pszAccessType;
} SQL_CONNECT_CONNECTED_PARAMS;
//
// This only has the type field. It is used for extracting the type
// in such a fashion that user code doesn't have to imply any
// particular data source. It has no use other than that.
//
typedef struct _GENERIC {
DATASOURCE_TYPE ds;
} GENERIC;
// We can now define the DATASOURCE. It is a union of the structs above.
typedef union {
GENERIC type;
SQL_CONNECT_PARAMS sqlParams;
SQL_CONNECT_CONNECTED_PARAMS sqlConnectedParams;
} DATASOURCE;
// ====================================================================
//
// Return codes. See also objectty.h.
//
// ====================================================================
typedef DWORD SMS_STATUS; // All APIs return an SMS_STATUS.
#define SMS_OK OTT_OK
#define SMS_MORE_DATA OTT_MORE_DATA
#define SMS_NO_MORE_DATA OTT_NO_MORE_DATA
#define SMS_FOLDER_NO_UPDATE OTT_FOLDER_NO_UPDATE
// Error codes when registering (and accessing) containers and filters
#define SMS_DUPLICATE_CONTAINER_ID OTT_DUPLICATE_CONTAINER_ID
#define SMS_DUPLICATE_FOLDER_ID OTT_DUPLICATE_FOLDER_ID
#define SMS_DUPLICATE_FILTER_ID OTT_DUPLICATE_FILTER_ID
#define SMS_DUPLICATE_FILTER OTT_DUPLICATE_FILTER
#define SMS_SCALAR_NO_UPDATE OTT_SCALAR_NO_UPDATE
#define SMS_SCALAR_WRONG_TYPE OTT_SCALAR_WRONG_TYPE
#define SMS_INVALID_CONTAINER_ID OTT_INVALID_CONTAINER_ID
#define SMS_INVALID_FOLDER_ID OTT_INVALID_FOLDER_ID
#define SMS_INVALID_FILTER_ID OTT_INVALID_FILTER_ID
#define SMS_CONTAINER_NO_UPDATE OTT_CONTAINER_NO_UPDATE
#define SMS_PARAMETER_ERROR OTT_PARAMETER_ERROR
#define SMS_UNSUPPORTED OTT_UNSUPPORTED
// This is returned when a specific object
// (folder or scalar) is requested and not
// found. APIs returning this are GetFolderByID
// and GetScalarByName.
#define SMS_NOT_FOUND OTT_NOT_FOUND
#define SMS_PARENT_NOT_FOUND OTT_PARENT_NOT_FOUND
#define SMS_CANT_DELETE OTT_CANT_DELETE
#define SMS_NEW_FOLDER OTT_NEW_FOLDER
// Error when attempting to multiply
// link a folder.
#define SMS_FOLDER_LINKED OTT_FOLDER_LINKED
// Filter operations.
#define SMS_RANGE_ERROR OTT_RANGE_ERROR
// These are returned when a container
// operation is tried when it shouldn't be.
#define SMS_CONTAINER_NOT_POPULATED OTT_CONTAINER_NOT_POPULATED
#define SMS_CONTAINER_POPULATED OTT_CONTAINER_POPULATED
// Attempt to perform persistent operation
// on a non-persistent filter.
#define SMS_FILTER_NOT_PERSISTENT OTT_FILTER_NOT_PERSISTENT
// Error return if the connection handle
// of a filter doesn't match that of a
// container to which the filter is being
// applied.
#define SMS_INVALID_CONNECTION_HANDLE OTT_INVALID_CONNECTION_HANDLE
#define SMS_INVALID_FILTER_TYPE OTT_INVALID_FILTER_TYPE
// Folder's can't be unlinked if there are multiple handles
// to the same object.
#define SMS_IN_USE_BY_OTHER OTT_IN_USE_BY_OTHER
// User (ie non-engine) codes begin here.
#define SMS_ERROR (OTT_END + 1)
#define SMS_SQL_ERROR (OTT_END + 2)
#define SMS_INVALID_DATASOURCE (OTT_END + 3)
#define SMS_INVALID_HANDLE (OTT_END + 4)
#define SMS_INVALID_FOLDER_TYPE (OTT_END + 6)
#define SMS_CONNECT_FAILED (OTT_END + 7)
#define SMS_NO_CREATE (OTT_END + 8)
#define SMS_FOLDER_NOT_MODIFIED (OTT_END + 9)
#define SMS_INCORRECT_FOLDER_TYPE (OTT_END + 10) // Unused.
#define SMS_INVALID_PARAMETER (OTT_END + 11)
#define SMS_EMPTY (OTT_END + 12)
// Return when commiting a child folder
// and the parent folder must be committed.
#define SMS_PARENT_NEEDS_COMMIT (OTT_END + 13)
#define SMS_PARENT_ALREADY_COMMITTED (OTT_END+ 14)
// Used in asynchronous folder retrieval.
// Indicates that there might be more
// data but it isn't available yet.
#define SMS_NOT_READY (OTT_END + 15)
#define SMS_FILTER_NO_MODIFY (OTT_END + 16)
#define SMS_FOLDER_ALREADY_DELETED (OTT_END + 17)
// Only allow one active connection.
// This is an SMS restriction.
#define SMS_ALREADY_CONNECTED (OTT_END + 18)
// Some failure in committing a folder
#define SMS_COMMIT_FAILED (OTT_END + 19)
// Specific failure in linking a folder
#define SMS_DUPLICATE_FOLDER (OTT_END + 20)
// ====================================================================
//
// Various manifests.
//
// ====================================================================
// The location of the SMS registry root.
#define SMS_REG_ROOT "SOFTWARE\\Microsoft\\SMS\\"
// The max size of character (string) data that we return.
#define SMS_DATA_BUFF_SIZE 255
// 'SMSBUFF' and 'OBJDESCRIPTOR' used in object type enumeration APIs.
// ===================================================================
// A character buffer.
// -------------------
typedef char SMSBUFF[SMS_DATA_BUFF_SIZE+1];
// Describes an object returned from SmsEnumObjects.
// -------------------------------------------------
typedef struct _OBJDESCRIPTOR {
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.
} OBJDESCRIPTOR;
// Object types.
// =============
// This is the value that is inserted by the object
// enumeration APIs into the OBJDESCRIPTOR structure.
// --------------------------------------------------
#define OT_ARCHLIST 1
#define OT_ARCH 2
#define OT_GROUP 3
#define OT_ATTRIBUTE 4
#define OT_PLATFORMS 5
#define OT_PLATFORM_PDF 6
#define OT_PLATFORM_WINST 7
#define OT_PLATFORM_NAD 8
#define OT_UNKNOWN 100
// --------------------------------------------------------------------
// Flags for Populate options.
// --------------------------------------------------------------------
#define POP_SYNC 0x00000000
#define POP_ASYNC 0x00000001
#define POP_EVENT 0x00000010
#define POP_WINDOW 0x00000020
// --------------------------------------------------------------------
// Folder types supported by smsapi (MUST NOT BEGIN AT ZERO).
// --------------------------------------------------------------------
#define F_SITE 1 // Site folder.
#define F_MACHINE 2 // Machine folder.
#define F_GROUP 3 // Subfolder of machine
#define F_DOMAIN 4 // Domain folder, subfolder
// of a site.
// Jobs
#define F_SYSTEMJOB 5 // System (NAD/Site) job folder.
//#define F_MINIJOB 6 // Mini-job folder.
#define F_INSTALLJOB 7 // Job folder (wksta install).
#define F_SRVINSTALLJOB 8 // Job folder (server install).
#define F_REMPKGJOB 9 // Remove package Job folder.
#define F_PACKAGE 10 // Packages.
#define F_WCL 11 // Workstation command lines.
#define F_PROGITEM 12 // Program items.
#define F_INVENTORY 13 // Inventory rules.
#define F_MACHINEGROUP 14 // Machine group
#define F_SITEGROUP 15 // Site group folder
// --------------------------------------------------------------------
// Container types supported by smsapi (MUST NOT BEGIN AT ZERO).
// --------------------------------------------------------------------
#define C_SITE 1 // Site container.
#define C_JOB 2 // Job container.
#define C_MACHINE 3 // Machine container.
#define C_PACKAGE 4 // Package container.
#define C_MACHINEGROUP 5 // Machine group
#define C_SITEGROUP 6 // Site group
// ====================================================================
//
// Filter information.
//
// ====================================================================
// --------------------------------------------------------------------
// Filter types
// --------------------------------------------------------------------
#define SITE_FILTER 1
#define MACHINE_FILTER 2
#define GROUP_FILTER 3
#define JOB_FILTER 4
#define ARCHITECTURE_FILTER 5
#define PACKAGE_FILTER 6
#define ATTRIBUTE_FILTER 7
#define SITELIMIT_FILTER 8
// --------------------------------------------------------------------
// Token types.
// --------------------------------------------------------------------
#define TOKEN_USER 0x8 // 1000 bit 3 always set for user-token
#define TOKEN_OR 0x2 // 0010 bit 1 always set for AND/OR
#define TOKEN_AND 0x3 // 0011 bit 1 always set for AND/OR
#define TOKEN_OPENPAREN 0x4 // 0100 bit 2 always set for PAREN
#define TOKEN_CLOSEPAREN 0x5 // 0101 bit 2 always set for PAREN
#define TOKEN_NOTIN 0x20 //10100 bit 2 set for a PAREN plus bit 4 for an extra indicator.
#define TOKEN_OPERATOR 0x2 // Detects both AND or OR
#define TOKEN_PAREN 0x4 // Detects either open or close paren
// --------------------------------------------------------------------
// Manifests used in filter token APIs.
// --------------------------------------------------------------------
#define AT_START OTT_AT_START // Token will be inserted at start of
// expression.
#define AT_END OTT_AT_END // Token will be appended to end of
// expression.
//
// Flags field in SmsManipulateTokens.
//
#define TOK_GROUP 1
#define TOK_UNGROUP 2
#define TOK_DELETE 3
#define TOK_GROUP_NOT 4
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
/////////// The APIs ////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
// **************************************************************************
//
// This DLL provides a "C" interface for accessing SMS objects.
//
//===========================================================================
//
// SmsAPIVer
//
// This API returns a version string to identify the SMS API version.
//
// Parameters:
// char **ppVersion The version string is returned
// in this pointer.
// The user must not free this memory,
// it is a static buffer inside the API
// dll.
//
// Returns:
// SMS_STATUS Always SMS_OK.
//
//===========================================================================
//
//===========================================================================
// 1. Connection APIs.
//===========================================================================
//
// SmsDataSourceConnect
//
// This API connects to the datasource as specified in the DATASOURCE
// parameter. The API returns a connection handle in the second
// parameter.
// This handle is passed to OpenContainer.
//
// Parameters:
// DATASOURCE *pd Pointer to DATASOURCE structure.
// The user must have already set up
// the appropriate parameters in this
// structure. For SQL this contains
// the server name, user name, password,
// database, public encryption key, and
// a pointer to a decryption function.
// See the description above.
// HANDLE *phConn Handle to a connection. This is
// filled in by the API.
//
// Returns:
// SMS_STATUS Status. Either SMS_OK or one of the
// error codes listed above.
//
//===========================================================================
//
// SmsDataSourceDisconnect
//
// This API releases a datasource connection that was established by
// DataSourceConnect.
//
// Parameters:
// HANDLE hConn Handle to the connection to be closed.
//
// Returns:
// SMS_STATUS Status. Either SMS_OK or one of the
// error codes listed above.
//
//===========================================================================
//
// 2. Engine APIs.
//
// These are straight "pass-through" APIs that just call the engine APIs
// (in objectty.dll) directly. Here for name conformance and so to ensure
// that smsapi.dll will get loaded before the engine.
//
//===========================================================================
//
// SmsEnumContainers
//
// This returns an array of pointers to FOLDER_INFO structures.
// If the pData parameter is NULL the API sets pCount to the number of
// containers registered. Thus, a user can call this API with a NULL
// buffer to get the count, which enables the application to allocate
// sufficient memory. If pData is non-NULL the API will copy up to
// pCount FOLDER_INFO pointers into the data buffer. If that number
// is less than the number of containers the count will be set as
// previously described.
// The data buffer is an array of pointers to FOLDER_INFO structures.
// These point to memory in the engine's address space, it should
// not be deallocated or modified.
//LATER: make this pointer to const.
//
//
// Parameters:
// FOLDER_INFO **pData Pointer to array of FOLDER_INFO structures.
// DWORD *pCount Pointer to count of containers.
//
// Returns:
// SMS_STATUS OTT_OK: success.
// OTT_MORE_DATA: passed buffer not
// big enough. *pCount says how
// many containers registered.
//
// ====================================================================
//
// SmsEnumFilters
//
// This API returns a list of all filters currently registered
// in the filter registry. This list is actually an array of
// FILTER_INFO structs.
//
// The memory for this array must be allocated by the caller.
// To determine the size of the array call this API with NULL as
// the first parameter. This will result in the number of filters
// being returned in pCount.
//
//
// Parameters:
// FILTER_INFO *paFI Pointer to an array of FILTER_INFO
// structures.
// The user is responsible for allocating
// (and deallocating) this memory.
// DWORD *pCount Pointer to count of filters.
//
// Returns:
// SMS_STATUS OTT_OK: success.
// OTT_MORE_DATA: passed buffer not
// big enough. *pCount says how
// many containers registered.
//
// ==========================================================================
//
// SmsEnumFolders
//
// This API returns a list of all folders currently registered
// in the folder registry. This list is actually an array of
// FOLDER_INFO structs.
//
// The memory for this array must be allocated by the caller.
// To determine the size of the array call this API with NULL as
// the first parameter. This will result in the number of filters
// being returned in pCount.
//
//
// Parameters:
// FOLDER_INFO **pData Pointer to an array of FOLDER_INFO structures.
// DWORD *pCount Pointer to count of folders.
//
// Returns:
// SMS_STATUS OTT_OK: success.
// OTT_MORE_DATA: passed buffer not
// big enough. *pCount says how
// many containers registered.
//
// ==========================================================================
//
// SmsDescribeFolder
//
// This API retrieves information about a container/folder and returns
// it in the FOLDER_INFO parameter (see description of FOLDER_INFO).
// Because containers and folders share the same id space for their
// tags, it is necessary for the caller to specify which one they are
// interested in.
// Note that the Enum... APIs return a set of objects, this API returns
// only a single one.
//
//
//
// Parameters:
// BASETYPE tObjectity T_CONTAINER or T_FOLDER
// (do we want a container or folder).
// DWORD dwTag Container/folder type.
// FOLDER_INFO **ppFInfo Store the retrieved FOLDER_INFO here.
//
// Returns:
// SMS_STATUS OTT_OK: success.
// OTT_INVALID_CONTAINER_ID:
// OTT_INVALID_FOLDER_ID:
// The container/folder cannot be
// located in the registry.
//
//===========================================================================
// 3. Container APIs.
//===========================================================================
//
// SmsOpenContainer
//
// Opens a container of the specified type (cType). The container is opened
// but is currently empty. The only operations that can be performed on it
// in this state is SetFilter, Populate, and CloseContainer.
// It is permissible to have multiple containers of the same type opened
// simultaneously.
// Only when a container has been populated does it have information that
// can resonably be examined.
// The container type is one of the C_xxx manifests in the list above.
//
// Parameters:
// DWORD cType Type of the container to open.
// This should be one of thr C_xxx
// manifests above.
// HANDLE hConnect Handle to a connection that has been
// established via SmsDataSourceConnect.
// HANDLE *phContainer Handle to the container, filled in by
// the API.
//
// Returns:
// SMS_STATUS Status. Either SMS_OK or one of the
// error codes listed above.
//
//===========================================================================
//
// SmsSetFilter
//
// This API submitts a filter to the container. The filter consists
// of tokens (possibly grouped) which express conditions for folder
// inclusion within a container.
// Note: when applying multiple filters an implicit AND is performed between
// filters.
//
// Parameters:
// HANDLE hContainer Identifies the container.
// HANDLE hFilter Handle to the filter to assign to
// the container.
//
// Returns:
// SMS_STATUS Status. Either SMS_OK or one of the
// error codes listed above.
//
//===========================================================================
//
// SmsPopulate
//
// This causes the container to be populated with folders according to the
// filters applied to the container.
// It should be noted that not all filters that are applied to a container
// will be activated at this stage. For instance, applying an attribute
// filter to a site container has no effect at this stage. However, the
// filter is held internally within the system and will be applied to the
// appropriate folder. For an attribute filter, its activation in a site
// container would come at the level of a child domain folder. This
// technique is known as percolating filters.
// Containers are the only level at which filters can be applied at the
// API level.
// The dwOpts parameter allows the caller to specify whether the population
// (and the folder retrieval) should be asynchronous or synchronous.
// Synchronous is the default. These options are described earlier (see
// "Populate options").
// This parameter also specifies how the event handle should be set. The
// event handle can be set by the API whenever a folder has been retrieved,
// when all folders have been retrieved, or it can not be used at all (the
// default).
//
// A third parameter is an event handle. According
//
// Parameters:
// HANDLE hContainer Identifies the container.
// DWORD dwOptions Synchronous/asynch, event handle usage.
// NOTIFY *pNotify Contains information about asynchronous
// notification. NULL if synchronous.
// parameter.
// Returns:
// SMS_STATUS Status. Either SMS_OK or one of the
// error codes listed above.
//
//===========================================================================
//
// SmsGetNextFolder
//
// This API retrieves the next folder in a parent container or folder.
//
// Parameters:
// HANDLE hParent Identifies the parent (container or
// folder).
// DWORD fType Which type of sub-folder we want to
// retrieve.
// HANDLE *phFolder Receives a handle to the next
// folder in the parent.
//
// Returns:
// SMS_STATUS Status. Either SMS_OK or one of the
// error codes listed above.
//
//===========================================================================
//
// SmsCloseContainer
//
// Closes a currently open container, and frees resources held be the
// container.
// It is possible to open a container's child folders and then close the
// container. This has no adverse effects on either the folders or on any
// filters that have been applied to the container.
//
// Parameters:
// HANDLE hContainer Identifies the container.
//
// Returns:
// SMS_STATUS Status. Either SMS_OK or one of the
// error codes listed above.
//
//===========================================================================
// 4. Folder APIs.
//===========================================================================
//
// SmsCreateFolder
//
// This API attempts to create a folder (initally empty) of the specified
// type. Folder creation is done in the context of a parent (folder or
// container). Not all containers/folder support folder creation.
// Once created, a folder must have its scalars set by the application.
// Failure to do so will result in the system not accepting the newly
// created folder. See DescribeFolder for information on retrieving details
// about a folder's scalars.
//
// Parameters:
// HANDLE hParent Identifies the parent (can be either
// container or folder).
// DWORD fType The type of folder to create. See
// the list of folders above).
// char *pszFolderID A name to give the folder. Not all
// creatable folders can be named by the
// user. In many cases SMS itself will
// assign the name.
// HANDLE *phFolder Receives a handle to the newly-created
// folder (if successful).
//
// Returns:
// SMS_STATUS Status. Either SMS_OK or one of the
// error codes listed above.
//
//===========================================================================
//
// SmsGetFolderID
//
// This API retrives the ID/name of the folder referenced by the folder handle.
//
// Parameters:
// HANDLE hFolder Which folder object we're talking about.
// char *pszFolderID Pointer to buffer to receive the
// folder's ID. It is the caller's
// responsibility to ensure that this
// buffer is large enough. If in doubt
// use of buffer of size SMS_DATA_BUFF_SIZE.
// This is guaranteed to be sufficient.
//
// Returns:
// SMS_STATUS Status. Either SMS_OK or one of the
// error codes listed above.
//
//===========================================================================
//
// SmsGetFolderType
//
// This API retrieves the folder's type as both an integer value and as
// a character string. For instance invoking this API on a domain folder
// will result in a type string of "Domain folder" and an integer type of
// F_DOMAIN being returned. The caller is responsible for ensuring that
// the character buffer is of sufficient size.
//
// Parameters:
// HANDLE hFolder The folder to query.
// DWORD *pfType Receive's the folder's type (integer).
// char *pszfType Receives folder's type (as a string).
//
// Returns:
// SMS_STATUS Status. Either SMS_OK or one of the
// error codes listed above.
//
//===========================================================================
//
// SmsEnumFolderTypes
//
// This API returns an array of DWORDs which indicate what folder types
// CAN be contained within this folder. It is the caller's responsibility
// to ensure that the DWORD array (*pfTypes) is of sufficient size.
// Calling this API with pfTypes of NULL or with *pctFolderTypes of 0,
// will result in the correct count being returned to the caller in
// pctFolderTypes.
// If the *pctFolderTypes is less than the number of folders, then up to
// *pctFolderTypes are returned in the DWORD array, and a status of
// SMS_MORE_DATA is returned.
// If *pctFolderTypes is greater than the number of folders then the maximum
// number of folder types will be stored in the array, and a value of
// PARAMETER_ERROR returned. *pctFolderTypes will be updated to indicate
// the number of folder types.
//
// Note the difference between this API and GetFolderCount. This returns
// a list of sub-folder types that can be contained in the folder,
// GetFolderCount returns a count of how many sub-folders of a specified
// type actually are contained in the folder.
//
// Parameters:
// HANDLE hFolder The folder to query.
// DWORD *pfTypes Points to an array of DWORD.
// Filled in with the types of sub-
// folders that this folder can contain.
// DWORD *pctFolderTypes How many types of sub-folders this
// folder can contain.
//
// Returns:
// SMS_STATUS Status. Either SMS_OK or one of the
// error codes listed above.
//
//===========================================================================
//
// SmsGetFolderCount
//
// This API returns (in the DWORD parameter) how many sub-folders of the
// specified folder-type are contained in this folder.
// Note that a DWORD of F_ANY means return the total count of sub-folders.
//
// Parameters:
// HANDLE hFolder The folder (or container) to query.
// DWORD fType Which type of sub-folder we're
// interested in. F_ANY means all types.
// DWORD *pctFolders Receives the count.
//
// Returns:
// SMS_STATUS Status. Either SMS_OK or one of the
// error codes listed above.
//
//===========================================================================
//
// SmsGetFolderByID
//
// This API the retrieves from the folder a sub-folder of the specified
// type and with a specified ID.
// This method of folder retrieval is non-sequential. Once a sub-folder has
// been retrieved it can be re-retrieved. It is always legal to open a
// folder multiple times. Doing this will create multiple instances of a
// folder. Thus, it is possible to retrieve a folder twice, close once
// instance, and still have an instance of the folder available.
// Note that a folder type of F_ANY is not accepted here, it will result
// in a return code of SMS_INVALID_FOLDER_TYPE.
// Note that a type of F_ANY is not allowed.
//
//
// Parameters:
// HANDLE hFolder The folder to query.
// DWORD fType Which type of sub-folder we want to
// retrieve (see GetFolderCount).
// char *pszFolderID The sub-folder's ID (name).
// HANDLE *phSubFolder Receives a handle to the sub-folder.
//
// Returns:
// SMS_STATUS Status. Either SMS_OK or one of the
// error codes listed above.
//
//===========================================================================
//
// SmsRewind
//
// This API resets the internal counts of either a container, a folder, or
// a filter so that contained sub-folders and/or scalars can be re-
// enumerated.
// Because GetNextFolder and GetNextScalar are sequential, once thay have
// been retrieved once they cannot be re-retrieved with these APIs.
// The Rewind API enbles the retrieval to be restarted.
// The options parameter allows the user to specify that either the folder
// list or the scalar list or both be rewound.
//
//
// Parameters:
// HANDLE hObject The container, folder, or filter
// to be rewound.
// DWORD dwOptions Rewind options:-
// RW_FOLDER: rewind folder lists.
// RW_SCALAR: rewind scalar lists.
// RW_ALL: both.
//
// If the object is a container or
// folder, a particular type of sub-
// folder list may be rewound by passing
// the child folder type in the
// dwOptions parameter.
//
// If the object is a filter container,
// then a particular type of filter list
// may be rewound by passing the filter
// type in the dwOptions parameter.
//
// If the object is a filter then only
// RW_SCALAR is valid.
//
// Returns:
// SMS_STATUS Status. Either SMS_OK or one of the
// error codes listed above.
//
//===========================================================================
//
// SmsCloseFolder
//
// This API closes the specified folder.
// Closing a folder causes sub-folders to be closed and deallocated UNLESS
// they have already been retrieved by a GetSubFolder/GetFolderByID call
// in which case they remain open.
// A folder's scalars are always closed and their memory deallocated.
//
// Parameters:
// HANDLE hFolder The folder to close.
//
// Returns:
// SMS_STATUS Status. Either SMS_OK or one of the
// error codes listed above.
//
//===========================================================================
//
// SmsLinkFolder
//
// This API inserts the specified folder into the in-memory list of folders
// and causes it to be linked to its parent (must still be open).
// The folder is not written back to the datasource until CommitFolder is
// called.
//
// Parameters:
// HANDLE hFolder The folder to insert.
//
// Returns:
// SMS_STATUS Status. Either SMS_OK or one of the
// error codes listed above.
//
//===========================================================================
//
// SmsUnlinkFolder
//
// This API deletes the specified folder from the in-memory list of folders.
// All memory associated with the folder is deallocated. However, the
// folder is not deleted from the datasource until CommitFolder is called.
//
// Parameters:
// HANDLE hFolder The folder to delete.
//
// Returns:
// SMS_STATUS Status. Either SMS_OK or one of the
// error codes listed above.
//
//===========================================================================
//
// SmsCommitFolder
//
// This API causes any changes in the specified folder to be written back to
// the datasource.
// This should be called after LinkFolder and UnlinkFolder in order to make
// the changes permanent.
// Note that a Commit following an Unlink will render the specified folder
// unavailable to all operations (other that SmsCloseFolder).
//
// Parameters:
// HANDLE hFolder The folder to update (insert or delete).
//
// Returns:
// SMS_STATUS Status. Either SMS_OK or one of the
// error codes listed above.
//
//===========================================================================
//
// SmsDupFolder
//
// This API causes the folder (hFolder) to be copied (into hNewFolder)
// in the context of the specified parent (hParent - container or folder).
//
// Parameters:
// HANDLE hParent The parent folder in whose context
// the new folder will be inserted.
// HANDLE hFolder The folder to be duplicated
// HANDLE *phNewFolder The handle to the new folder
// is returned here.
//
// Returns:
// SMS_STATUS Status. Either SMS_OK or one of the
// error codes listed above.
//
//===========================================================================
// 5. Scalar APIs.
//===========================================================================
//
// SmsGetScalarCount
//
// This API returns the count of scalars in this folder.
//
// Parameters:
// HANDLE hFolder The folder to query.
// DWORD *pctScalars Receives the count of scalars.
//
// Returns:
// SMS_STATUS Status. Either SMS_OK or one of the
// error codes listed above.
//
//===========================================================================
//
// SmsGetNextScalar
//
// This API retrieves the next scalar from the folder.
// Scalars can either be retrieved in a sequential fashion (this API)
// or by name (GetScalarByName). The RewindFolder API enables the sequential
// enumeration of scalars to be restarted.
//
// Parameters:
// HANDLE hFolder The folder to query.
// SCALAR *pScalar Pointer to a SCALAR that has been
// allocated by the caller.
// See notes on SCALAR for a full
// description of this structure and
// its use.
// Returns:
// SMS_STATUS Status. Either SMS_OK or one of the
// error codes listed above.
//
//===========================================================================
//
// SmsGetScalarByName
//
// This API retrieves the scalar specified by its name.
//
// Parameters:
// HANDLE hFolder The folder to query.
// const char *pszName Name of the scalar.
// SCALAR *pScalar Pointer to a SCALAR that has been
// allocated by the caller.
// See notes on SCALAR for a full
// description of this structure and
// its use.
// Returns:
// SMS_STATUS Status. Either SMS_OK or one of the
// error codes listed above.
//
//===========================================================================
//
// SmsSetScalar
//
// This API is used to set the value of a scalar. It is used when creating a
// folder. In the future it will also be used to modify the value of a
// scalar in an existing folder.
// The set of scalars supported by a folder is always known at the time a
// folder is opened, this is true even when a folder is being created.
// Scalars have a name, a type, and a value. This API allows the value to
// be set. Only values of the correct type are allowed. Attempting to set,
// for instance, an integer value in a string scalar will result in a
// SMS_SCALAR_WRONG_TYPE error return.
// The API set supports the notion of access rights on folders and scalars,
// in order for this API to succeed the caller must have the correct
// access to both. Failure results in an error return of SMS_SCALAR_NO_UPDATE
// or SMS_FOLDER_NO_UPDATE.
//
// Parameters:
// HANDLE hFolder The folder containing the scalar.
// SCALAR *pScalar Pointer to a SCALAR that has been
// allocated and filled in by the caller.
// See notes on SCALAR for a full
// description of this structure and
// its use.
// Returns:
// SMS_STATUS Status. Either SMS_OK or one of the
// error codes listed above.
//
//===========================================================================
// 6. Filter container APIs.
//===========================================================================
//
// SmsOpenFilterContainer
//
// The filter container is a storage mechanism for persistent filters,
// currently only Machine Filters (SMS Queries) fall into this category.
//
// Calling this API causes the filter container to be automatically populated
// with all persistent filters in the system.
//
// Parameters:
// HANDLE hConnection Which connection to use.
// HANDLE *phFContainer Receives the handle to the opened
// filter container.
//
// Returns:
// SMS_STATUS Status. Either SMS_OK or an error code.
// LIST POSSIBLE ERROR CODES HERE.
//
//===========================================================================
//
// SmsCloseFilterContainer
//
// Closes the filter container. All filters container herein that have
// not been explicitly opened are closed and the memory associated with
// them is freed.
//
// Parameters:
// HANDLE hFContainer The handle to the filter container.
//
// Returns:
// SMS_STATUS Status. Either SMS_OK or an error code.
// LIST POSSIBLE ERROR CODES HERE.
//
//===========================================================================
//
// SmsGetNextFilter
//
// This returns (in *phFilter) a handle to the next sequential filter of
// the specified type from the filter container (specified by hFContainer).
// A filter type of F_ANY is not acceptable.
//
// Parameters:
// HANDLE hFContainer Handle to the filter container.
// DWORD frType Filter type.
// HANDLE *phFilter Handle to the filter returned here.
//
// Returns:
// SMS_STATUS Status. Either SMS_OK or an error code.
// LIST POSSIBLE ERROR CODES HERE.
//
//===========================================================================
//
// SmsGetFilterByID
//
// The API will return (in *phFilter) a handle to the filter of the specified
// type which has the specified ID.
// As above, the handle to the filter container is also passed into the API.
// A filter type of F_ANY is not acceptable.
//
// Parameters:
// HANDLE hFContainer Handle to the filter container.
// DWORD frType Filter type.
// const char *pszID ID of the filter to retrieve.
// HANDLE *phFilter Handle to the filter returned here.
//
// Returns:
// SMS_STATUS Status. Either SMS_OK or an error code.
// LIST POSSIBLE ERROR CODES HERE.
//
//===========================================================================
//
// SmsGetFilterID
//
// This returns, in pszID, the ID of the filter specified by the handle.
//
// Parameters:
// HANDLE hFilter
// char *pszID
//
// Returns:
// SMS_STATUS Status. Either SMS_OK or an error code.
// LIST POSSIBLE ERROR CODES HERE.
//
//===========================================================================
//
// SmsCommitFilter
//
// This API will attempt to make the specified filter persistent. The filter
// must be of a type that supports persistence, and all manadatory scalars
// for the filter must have been set.
//
// Parameters:
// HANDLE hFilter
// HANDLE hFContainer
//
// Returns:
// SMS_STATUS Status. Either SMS_OK or an error code.
// LIST POSSIBLE ERROR CODES HERE.
//
//===========================================================================
//
//===========================================================================
// 7. Filter APIs.
//===========================================================================
//
// SmsCreateFilter
//
// This API creates a filter of the specified type, initially empty. The
// caller must then set tokens in this filter.
// Filter types are listed above.
//
// Parameters:
// DWORD fType Type of filter to create.
// HANDLE hConnection Filters are associated with a
// connection.
// HANDLE *phFilter Receives a handle to the filter.
// Returns:
// SMS_STATUS Status. Either SMS_OK or one of the
// error codes listed above.
//
//============================================================================
//
// SmsCloseFilter
//
// Close the specified filter and deallocate any memory asociated with it.
// Once a filter has been applied to a container (SetFilter), the user is
// free to close it. The API system has made it own copy which will be freed
// when no longer necessary.
//
// Parameters:
// HANDLE hFilter The filter to close.
//
// Returns:
// SMS_STATUS Status. Either SMS_OK or one of the
// error codes listed above.
//
//============================================================================
//
// SmsGetFilterType
//
// This API gets the type for a particular filter. Using this type it is
// possible to get the filter template.
// Parameters:
// HANDLE hFilter The filter to retrieve the type for.
// DWORD *pfilterType The filter type is returned here.
// char *pszTag The filter tag is returned here.
//
// Returns:
// SMS_STATUS Status. Either SMS_OK or one of the
// error codes listed above.
//
//===========================================================================
//
// SmsGetToken
//
// This API retrieves a token from the specified filter or folder. The token
// to retrieve is given by the index parameter. See also SmsGetTokenCount.
// The TOKEN structure is detailed in the file objectty.h.
//
// Parameters:
// HANDLE hObject Handle to filter or folder.
// INT iIndex
// TOKEN *pTokenInfo
//
// Returns:
// SMS_STATUS Status. Either SMS_OK or one of the
// error codes listed above.
//
//===========================================================================
//
// SmsAddToken
//
// This API allows the caller to add a token into a filter (or folder). The
// ANDOR parameter specifies if the token is to be ANDed or ORed with the
// preceeding token. The index specifies whereabout in the filter expression
// the token is to be inserted. The rules are as follows:
// 1. index is AT_START (-1), the token will be inserted at the start of the
// expression and the ANDOR operator will be postfixed.
// 2. index is AT_END (-2), the token will be appended to the end of the
// expression, the ANDOR operator will prefix the token.
// 3. if index is anything else, if the expression is currently empty then
// the token will be inserted at the start of the expression, and the
// ANDOR operator is ignored. If the expression is not empty then the
// token will be inserted at the given index and the operator prefixed.
// The exception here is if the index is out of range, in this case the
// token will be appended with the ANDOR being prefixed.
// In all cases, if inserting the token would cause the resulting
// expression to be illegal a status of SMS_RANGE_ERROR will be returned.
//
// Parameters:
// HANDLE hObject Handle to filter or folder.
// ANDOR opAndOr
// TOKEN *pTokenInfo
// INT iIndex
//
// Returns:
// SMS_STATUS Status. Either SMS_OK or one of the
// error codes listed above.
//
//===========================================================================
//
// SmsGetTokenCount
//
// This API will return (in *pctTokens) the number of tokens currently in
// the filter or folder expression.
//
// Parameters:
// HANDLE hObject Handle to either filter or folder.
// DWORD *pctTokens
//
// Returns:
// SMS_STATUS SMS_OK, or SMS_INVALID_HANDLE.
//
//===========================================================================
//
// SmsManipulateTokens
//
// This APIs allows for the manipulation of tokens within a filter or folder
// expression in various ways, according to the flags parameter.
// TOK_GROUP The tokens between the specified indicies are grouped
// together to form a sub-expression, ie they are backeted by
// parentheses.
// TOK_UNGROUP The tokens between the specified indicies have their
// parenthesis removed. This undoes the action of TOK_GROUP.
// TOK_DELETE The tokens within the specified indecies are deleted.
// In this case the tokens must not form a legal sub-
// expression.
// TOK_GROUP_NOT This is applicable only to persistent filters. At the
// moment that means only machine filters.
// This flag is applied to a range of one or more tokens that
// form a legal sub-expression. That is, a range of tokens
// that can ge grouped. The action performed by this is to
// group these tokens and preceed them with a 'NOT IN'
// token. This has the effect of specifying exclusion.
//
// The user may use the manifests AT_START and AT_END to indicate
// the full range of tokens within the filter or folder object.
// The iStart and iEnd may be one of the following:
// 1. AT_START (-1), the index will be at the start of the expression.
// 2. AT_END (-2), the index will be at the end of the expression.
// 3. For any other valid indexes, the tokens will be manipulated within the given indexes
//
// Parameters:
// HANDLE hObject Handle to either filter or folder.
// DWORD dwFlags
// INT iStart
// INT iEnd
//
// Returns:
// SMS_STATUS Status. Either SMS_OK or one of the
// error codes listed above.
//
//===========================================================================
//
// SmsGetAllFilters
//
// This API retrieves from the specified container a list of filter handles
// that have been applied to that container.
// It is important to note that once this has been called, the API
// SmsCloseFilter must be called for each of the filters in the array.
//
// Calling this with NULL for the array of filters will cause the *pctFilters
// parameter to be set with the number of filters, in this case the API
// will return a status of SMS_MORE_DATA.
// The user should then allocate sufficient memory and call the API again.
//
// Note that the container specified here is a normal (ie folder) container
// and not a filter container.
//
// Parameters:
// HANDLE hContainer
// HANDLE *pahFilters
// DWORD *pctFilters
//
// Returns:
// SMS_STATUS Status. Either SMS_OK or one of the
// error codes listed above.
//
//===========================================================================
//
//===========================================================================
// 8. Object enumeration APIs.
//===========================================================================
//
// SmsEnumObjectTypes
//
// This API returns a list of first-class objects that are known to the
// API.
// These objects do not have a direct existence in the container hierarchy,
// but play an important part in the API. The objects of major concern are
// architectures and their descendents, but Platforms are also supported.
//
// A first-class object is one that is known directly to the APIs and which
// does not require any additional informaion. Thus the system knows
// directly about architectures and platforms, while it cannot know about,
// for instance, attributes, without first knowing about an architecture
// and a groupclass.
//
// The 'pObjects' parameter is an array of SMSBUFF objects. On successful
// completion of the API this array will be filled with the names of
// each first-class object known to the system.
//
// On entry the 'pCtObjects' parameter tells the API the size of the
// pObjects array. On exit it contains the actual number of objects
// known to the system.
// If this parameter is less than the number of objects known to the system
// then it is still set to the total, but no information will have been
// copied to the pObjects array, and a status of SMS_MORE_DATA will be
// returned.
//
// Parameters:
// HANDLE hConnection Handle to a connection that has been
// established via SmsDataSourceConnect.
// SMSBUFF *pObjects
// DWORD *pCtObjects
//
// Returns:
// SMS_STATUS Status. Either SMS_OK or one of the
// error codes listed above.
//
//===========================================================================
//
// SmsEnumObjects
//
// This object actually does the work of enumerating objects. For first-
// class objects (see above) the 'pPredecessor' parameter is not used,
// in this case it may be set to NULL. For non first-class objects this
// list states the predecessor objects that must be given to the system
// in order for it to locate the requested object.
//
// The 'ctPredecessors' parameter tells the API the number of entries in the
// predecessor list.
//
// 'pszObjectType' tells the API what object type the user is interested in.
//
// 'pObjects' is an array of OBJDESCRIPTORS, this array will be filled in
// with details of the requested object type.
//
// 'pCtObjects' is a pointer to a DWORD. On entry it tells the API the number
// of entries in 'pObjects'. On exit it is always set to then count of
// objects of the specified type. If the entry value is less than the actual
// number of objects then no data is copied and a status of SMS_NMO_MORE_DATA
// is returned.
//
// Consider an example.
// If we want to enumerate the attributes in the 'MICROSOFT|IDENTIFICATION|1.0'
// groupclass for 'Personal Computer' objects then we would set the parameters
// as follows:
// pszObjectType = "MICROSOFT|IDENTIFICATION|1.0"
// pPredecessors[0] = "Architectures"
// pPredecessors[1] = "Personal Computer"
// ctPredecessors = 2
// pObjects - you can declare it as 'OBJDESCRIPTOR pObjects[SOME_SIZE]'
// *pCtObjects = SOME_SIZE
//
// On exit the pObjects array would have 9 entries (as currently defined,
// this can change). The first entry would look like this:
// pObjects[0].objType = OT_ATTRIBUTE
// pObjects[0].szName = 'Name"
// pObjects[0].szFriendlyName - unused
// pObjects[0].bGotFriendlyName = FALSE
// pObjects[0].dwRelopMin = QOP_STR_EQ
// pObjects[0].dwRelopMax = QOP_UPCASE_NOTLIKE
// pObjects[0].bGotRelops = TRUE
// Parameters:
// HANDLE hConn
// char *pszObjectType
// SMSBUFF *pPredecessors
// DWORD ctPredecessors
// OBJDESCRIPTOR *pObjects
// DWORD *pCtObjects
//
// Returns:
// SMS_STATUS Status. Either SMS_OK or one of the
// error codes listed above.
//
//===========================================================================
// ====================================================================
// Version number API.
// ====================================================================
__declspec (dllexport) SMS_STATUS SmsAPIVer( char **ppVersion );
// ====================================================================
// Engine APIs.
// ====================================================================
__declspec (dllexport) SMS_STATUS SmsEnumContainers(
FOLDER_INFO **pData,
DWORD *pCount );
__declspec (dllexport) SMS_STATUS SmsEnumFilters(
FILTER_INFO *paFI,
DWORD *pCount );
__declspec (dllexport) SMS_STATUS SmsEnumFolders(
FOLDER_INFO **pData,
DWORD *pCount );
__declspec (dllexport) SMS_STATUS SmsDescribeFolder(
BASETYPE tObjectity, // T_CONTAINER or T_FOLDER.
DWORD dwTag, // folder type (or F_ANY)
FOLDER_INFO **ppFInfo ); // We store the FOLDER_INFO here.
// ====================================================================
// Connection APIs.
// ====================================================================
__declspec (dllexport) SMS_STATUS SmsDataSourceConnect(
DATASOURCE *pd,
HANDLE *phConn );
__declspec (dllexport) SMS_STATUS SmsDataSourceDisconnect(
HANDLE hConn );
// ====================================================================
// Container APIS.
// ====================================================================
__declspec (dllexport) SMS_STATUS SmsOpenContainer(
DWORD cType,
HANDLE hConnection,
HANDLE *phContainer );
__declspec (dllexport) SMS_STATUS SmsSetFilter(
HANDLE hContainer,
HANDLE hFilter );
__declspec (dllexport) SMS_STATUS SmsPopulate(
HANDLE hContainer,
DWORD dwOptions,
NOTIFY *pNotify );
__declspec (dllexport) SMS_STATUS SmsGetNextFolder(
HANDLE hParent,
DWORD fType,
HANDLE *phFolder );
__declspec (dllexport) SMS_STATUS SmsCloseContainer(
HANDLE hContainer );
// ====================================================================
// Folder (collection) APIs.
// A collection contains other things, that is it can have embedded
// collections and it can also have properties (scalars).
// ====================================================================
__declspec (dllexport) SMS_STATUS SmsCreateFolder(
HANDLE hParent,
DWORD fType,
const char *pszFolderID,
HANDLE *phFolder );
__declspec (dllexport) SMS_STATUS SmsGetFolderID(
HANDLE hFolder,
char *pszFolderID );
__declspec (dllexport) SMS_STATUS SmsGetFolderType(
HANDLE hFolder,
DWORD *pfType,
char *pszfType );
__declspec (dllexport) SMS_STATUS SmsEnumFolderTypes(
HANDLE hFolder,
DWORD *pfTypes,
DWORD *pctFolderTypes );
__declspec (dllexport) SMS_STATUS SmsGetFolderCount(
HANDLE hFolder,
DWORD fType,
DWORD *pctFolders );
__declspec (dllexport) SMS_STATUS SmsGetFolderByID(
HANDLE hFolder,
DWORD fType,
char *pszFolderID,
HANDLE *phSubFolder );
__declspec (dllexport) SMS_STATUS SmsRewind(
HANDLE hObject,
DWORD dwOptions );
__declspec (dllexport) SMS_STATUS SmsCloseFolder(
HANDLE hFolder );
__declspec (dllexport) SMS_STATUS SmsLinkFolder(
HANDLE hFolder );
__declspec (dllexport) SMS_STATUS SmsUnlinkFolder(
HANDLE hFolder );
__declspec (dllexport) SMS_STATUS SmsCommitFolder(
HANDLE hFolder );
__declspec (dllexport) SMS_STATUS SmsDupFolder(
HANDLE hParent,
HANDLE hFolder,
HANDLE *phNewFolder );
// ====================================================================
// Scalar APIs.
// ====================================================================
__declspec (dllexport) SMS_STATUS SmsGetScalarCount(
HANDLE hFolder,
DWORD *pctScalars );
__declspec (dllexport) SMS_STATUS SmsGetNextScalar(
HANDLE hFolder,
SCALAR *pScalarStruct );
__declspec (dllexport) SMS_STATUS SmsGetScalarByName(
HANDLE hFolder,
const char *pszName,
SCALAR *pScalarStruct );
__declspec (dllexport) SMS_STATUS SmsSetScalar(
HANDLE hFolder,
SCALAR *pScalarStruct );
// ====================================================================
//
// FilterContainer APIs
//
// ====================================================================
__declspec (dllexport) SMS_STATUS SmsOpenFilterContainer(
HANDLE hConnection,
HANDLE *phFContainer );
__declspec (dllexport) SMS_STATUS SmsCloseFilterContainer(
HANDLE hFContainer );
__declspec (dllexport) SMS_STATUS SmsGetNextFilter(
HANDLE hFContainer,
DWORD frType,
HANDLE *phFilter );
__declspec (dllexport) SMS_STATUS SmsGetFilterByID(
HANDLE hFContainer,
DWORD frType,
const char *pszID,
HANDLE *phFilter );
__declspec (dllexport) SMS_STATUS SmsGetFilterID(
HANDLE hFilter,
char *pszID );
__declspec (dllexport) SMS_STATUS SmsCommitFilter(
HANDLE hFilter,
HANDLE hFContainer );
// ====================================================================
//
// Filter APIs
//
// ====================================================================
__declspec (dllexport) SMS_STATUS SmsCreateFilter(
DWORD frType,
HANDLE hConnection,
HANDLE *phFilter );
__declspec (dllexport) SMS_STATUS SmsCloseFilter(
HANDLE hFilter );
__declspec (dllexport) SMS_STATUS SmsGetFilterType(
HANDLE hFilter,
DWORD *pfilterType,
char *pszTag );
__declspec (dllexport) SMS_STATUS SmsGetToken(
HANDLE hObject,
INT iIndex,
TOKEN *pTokenInfo);
__declspec (dllexport) SMS_STATUS SmsAddToken(
HANDLE hObject,
ANDOR opAndOr,
TOKEN *pTokenInfo,
INT iIndex );
__declspec (dllexport) SMS_STATUS SmsGetTokenCount(
HANDLE hObject,
DWORD *pctTokens );
__declspec (dllexport) SMS_STATUS SmsManipulateTokens(
HANDLE hObject,
DWORD dwFlags,
INT iStart,
INT iEnd );
__declspec (dllexport) SMS_STATUS SmsGetAllFilters(
HANDLE hContainer,
HANDLE *pahFilters,
DWORD *pctFilters );
__declspec (dllexport) SMS_STATUS SmsEnumObjectTypes(
HANDLE hConnection,
SMSBUFF *pObjects,
DWORD *pCtObjects );
__declspec (dllexport) SMS_STATUS SmsEnumObjects(
HANDLE hConn,
char *pszObjectType,
SMSBUFF *pPredecessors,
DWORD ctPredecessors,
OBJDESCRIPTOR *pObjects,
DWORD *pCtObjects );
#ifdef __cplusplus
}
#endif
#pragma option pop /*P_O_Pop*/
#endif // _SMSAPI_H_
/* EOF: smsapi.h */