SMSAPI.BAS
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:23k
源码类别:

Windows编程

开发平台:

Visual C++

  1. Option Explicit
  2. '// **************************************************************************
  3. '//
  4. '//  File: SMSAPI.H
  5. '//
  6. '//  Copyright (c) 1994, 1995 Microsoft Corp.
  7. '//
  8. '//  This is the header file for the SMS API.
  9. '//
  10. '//  This file contains all data definitions, manifests, return codes and
  11. '//  API declarations that constitute the API set.
  12. '//
  13. '//
  14. '// **************************************************************************
  15. '
  16. '
  17. '
  18. '// **************************************************************************
  19. '//
  20. '//  The SMS API set provides a set of interfaces to enable querying and,
  21. '//  in some cases creation and deletion, of data from an SMS database.
  22. '//
  23. '//  SMS contains numerous objects to which an ISV needs access. These objects
  24. '//  are (not in any particular order): packages, jobs, workstation command
  25. '//  lines, program items, sites, domains, machines, machine groups.
  26. '//
  27. '//  The SMS API is built using a technology known as the objectity technique.
  28. '//  This technique expresses all objects in terms of containers, folders,
  29. '//  and scalars. All SMS objects are thus expressed in these terms.
  30. '//  The advantage of this is that we have a standard interface to all
  31. '//  objects. That is, the API does not distinguish between, say, a job and
  32. '//  a machine.
  33. '//
  34. '//  The starting point is the container. There are certain types of container
  35. '//  defined (container types below). A container is opened and then
  36. '//  populated. The act of populating a container causes it to be filled with
  37. '//  folders of defned types. A folder can contain sub-folders and scalars.
  38. '//  Scalars are akin to leaf nodes in a hierarchy graph. The contain a
  39. '//  name, type, and value.
  40. '//
  41. '//  Much of the power to the objectity technique is provided by filters.
  42. '//  These are objects which specify selection criteria. Filters are applied
  43. '//  by the user at the container level, at which point the implementation of
  44. '//  the API will assume ownership of the filter. It is guaranteed that only
  45. '//  folders matching the filters will be included in the container hierarchy.
  46. '//
  47. '//  Every folder can contain a set of scalars. Not all folders do, for
  48. '//  example a machine folder does not. In some cases a folder contains a
  49. '//  defined set of scalars, in other cases the scalar set can only be
  50. '//  determined at run time. In cases where the scalar set is predetermined
  51. '//  it will be documented in supporting documentation.
  52. '//
  53. '//  The APIs behave in an uniform manner.
  54. '//  1. They all return a status code (SMS_STATUS).
  55. '//  2. Where a value needs to be returned, it is done via a reference
  56. '//     parameter.
  57. '//
  58. '//  An API is provided to determine the API version. Any problems involving
  59. '//  the SMS API should include the information provided by this API.
  60. '//
  61. '//  The first step in using the APIs to to establish a connection to a
  62. '//  datasource. Currently the only datasource supported in SQL, but the
  63. '//  API is designed in such a way that additional datasources can be
  64. '//  added. Two APIs are provided for dealing with datasources:
  65. '//  DataSourceConnect and DataSourceDisonnect. The connect API returns a
  66. '//  connection handle, this is used in subsequent calls to open containers.
  67. '//
  68. '//  Apart from these APIs, the rest of the API set is divided into four
  69. '//  groups:
  70. '//  1. Container APIs.
  71. '//  2. Folder APIs.
  72. '//  3. Scalar APIs.
  73. '//  4. Filter APIs.
  74. '//
  75. '//  1. Container APIs.
  76. '//  These allow a container to be opened, a filter to be applied to a
  77. '//  container, a container to be populated with folders, a folder to be
  78. '//  retrieved, and the container to be closed. An API also exists to
  79. '//  return the number of folders currently contained in a container.
  80. '//
  81. '//  2. Folder APIs.
  82. '//  These allow a for retrieval of various types of information about a
  83. '//  folder (its ID or name, its type, the number of sub-folders, the number
  84. '//  of scalars). Retrieval of sub-folders within a folder in both a
  85. '//  sequential fashion and by name. Retrieval of scalars (sequential and by
  86. '//  name. And closure of the folder.
  87. '//  An API exists to allow folder creation. However, this is implementation
  88. '//  dependant. That is, most folders do not permit creation, some (eg
  89. '//  ceratin types of jobs) do.
  90. '//
  91. '//  3. Scalar APIs.
  92. '//  There is a bit of overlap between this and the previous group. Although
  93. '//  scalar retrieval is included in the Folder API group, it can also be
  94. '//  considered a scalar API.
  95. '//  An API is provided to set/update the value of a scalar. This can
  96. '//  currently only be done in a folder that is being newly created.
  97. '//
  98. '//  4. Filter APIs.
  99. '//  APIs for opening and closing a filter, and adding tokens into a filter.
  100. '//  Filters are composed of one or more tokens of the same type. Some filters
  101. '//  permit grouping of tokens within the filter (ie machine filter). This
  102. '//  allows for complex boolean expressions.
  103. '//  Tokens differ between different filters, but have a common interface.
  104. '//  Tokens are contructed via the SmsAddToken API.
  105. '//
  106. '//  5. Filter container APIs
  107. '//  Certain filters can be persistent, that is they are saved in the database
  108. '//  and can be reloaded by separate processes. These filters can be created
  109. '//  either the APIs, or via the SMS Admin.
  110. '//   These APIs enable the retrieval of these filters from the datasource
  111. '//  and the commital of new filters into the datasource.
  112. '//  Currently machine filters are the only filters capable of exhibiting
  113. '//  persistence.
  114. '//
  115. '// **************************************************************************
  116. '
  117. '// ====================================================================
  118. '//
  119. '//  Includes
  120. '//
  121. '// ====================================================================
  122. '
  123. '/* VB: These includes must be explicitly listed in the VB makefile   */
  124. '
  125. 'include qrycodes.bas         // The query codes for Machine queries.
  126. '
  127. 'include smsinfo.bas          // Manifests related to scalar settings.
  128. '
  129. 'include objectty.bas         // Objectity engine.
  130. '
  131. '
  132. '// ====================================================================
  133. '//
  134. '//  Datasource definition information.
  135. '//
  136. '// ====================================================================
  137. '
  138. '//
  139. '// Supported datasources.
  140. '// (NOTE: only sql supported currently).
  141. '//
  142.  Type DATASOURCE_TYPE
  143.      enum As Long
  144.  End Type
  145.  
  146.  ' These are initialized in Init_DATASOURCE_TYPE_enums()
  147.  Global DB_SQL As DATASOURCE_TYPE
  148.  Global DB_SQL_CONNECTED As DATASOURCE_TYPE
  149.  Global DB_OTHER As DATASOURCE_TYPE
  150. '
  151. '
  152. '//
  153. '// Prototype for a decryption function. This is the last parameter
  154. '// to the SQL_CONNECT_PARAMS structure.
  155. '// When a user calls the DataSourceConnect API he can pass in the
  156. '// user name and password in encrypted form. If the decryption function
  157. '// pointer is non-null the the API will attempt to call this function
  158. '// both for the user name and password.
  159. '// The decryption function is user-supplied, it is expected to return
  160. '// the decrypted data in the first parameter.
  161. '//
  162. '
  163. 'typedef void (*PDECRYPTFUNC)(char *pszBuffer, char *pszDecryptMe, char *pszKey);
  164. '/* VB: This can not be done this way in VB  */
  165. '
  166. '
  167. '//
  168. '//  The information block needed for the DataSourceConnect API.
  169. '//  1. SQL datasource.
  170. '//
  171. '
  172.  Type SQL_CONNECT_PARAMS
  173.      ds As DATASOURCE_TYPE
  174.      pszServer As String                 '// SQL Server name.
  175.      pszUserName As String               '// User name (possibly encrypted).
  176.      pszPasswd As String                 '// Password (possibly encrypted).
  177.      pszDbName As String                 '// Database name.
  178.      pszKey As String                    '// Decryption key.
  179.      pFunc As Long                       '// Pointer to a decryption function.
  180.  End Type
  181. '
  182. '
  183. '//
  184. '//  2. RESERVED DO NOT USE
  185. '//
  186. '
  187. 'typedef struct _SQL_CONNECT_CONNECTED_PARAMS {
  188. '    DATASOURCE_TYPE ds;
  189. '    HANDLE hDataSource;
  190. '    const char *pszAccessType;
  191. '} SQL_CONNECT_CONNECTED_PARAMS;
  192. '
  193. '
  194. '
  195. '//
  196. '// This only has the type field. It is used for extracting the type
  197. '// in such a fashion that user code doesn't have to imply any
  198. '// particular data source. It has no use other than that.
  199. '//
  200. '
  201.  Type GENERIC
  202.      ds As DATASOURCE_TYPE
  203.  End Type
  204. '
  205. '
  206. '
  207. '// We can now define the DATASOURCE. It is a union of the structs above.
  208. 'typedef union {
  209. '    GENERIC             type;
  210. '    SQL_CONNECT_PARAMS  sqlParams;
  211. '    SQL_CONNECT_CONNECTED_PARAMS sqlConnectedParams;
  212. '} DATASOURCE;
  213. '
  214. '/* VB: Unions can not be done in VB  */
  215. '
  216. '
  217. '
  218. '// ====================================================================
  219. '//
  220. '//  Return codes. See also objectty.h.
  221. '//
  222. '// ====================================================================
  223. 'typedef DWORD SMS_STATUS;           // All APIs return an SMS_STATUS.
  224. '/* VB: All API's return Long  */
  225. '
  226.  Global Const SMS_OK = OTT_OK
  227.  Global Const SMS_MORE_DATA = OTT_MORE_DATA
  228.  Global Const SMS_NO_MORE_DATA = OTT_NO_MORE_DATA
  229.  Global Const SMS_FOLDER_NO_UPDATE = OTT_FOLDER_NO_UPDATE
  230. '
  231. '// Error codes when registering (and accessing) containers and filters
  232.  Global Const SMS_DUPLICATE_CONTAINER_ID = OTT_DUPLICATE_CONTAINER_ID
  233.  Global Const SMS_DUPLICATE_FOLDER_ID = OTT_DUPLICATE_FOLDER_ID
  234.  Global Const SMS_DUPLICATE_FILTER_ID = OTT_DUPLICATE_FILTER_ID
  235. '
  236.  Global Const SMS_DUPLICATE_FILTER = OTT_DUPLICATE_FILTER
  237. '
  238.  Global Const SMS_SCALAR_NO_UPDATE = OTT_SCALAR_NO_UPDATE
  239.  Global Const SMS_SCALAR_WRONG_TYPE = OTT_SCALAR_WRONG_TYPE
  240.  Global Const SMS_INVALID_CONTAINER_ID = OTT_INVALID_CONTAINER_ID
  241.  Global Const SMS_INVALID_FOLDER_ID = OTT_INVALID_FOLDER_ID
  242.  Global Const SMS_INVALID_FILTER_ID = OTT_INVALID_FILTER_ID
  243. '
  244.  Global Const SMS_CONTAINER_NO_UPDATE = OTT_CONTAINER_NO_UPDATE
  245. '
  246.  Global Const SMS_PARAMETER_ERROR = OTT_PARAMETER_ERROR
  247.  Global Const SMS_UNSUPPORTED = OTT_UNSUPPORTED
  248. '
  249. '// This is returned when a specific object (folder or scalar) is
  250. '// requested and not found. APIs returning this are GetFolderByID
  251. '// and GetScalarByName.
  252.  Global Const SMS_NOT_FOUND = OTT_NOT_FOUND
  253. '
  254.  Global Const SMS_PARENT_NOT_FOUND = OTT_PARENT_NOT_FOUND
  255. '
  256.  Global Const SMS_CANT_DELETE = OTT_CANT_DELETE
  257. '
  258.  Global Const SMS_NEW_FOLDER = OTT_NEW_FOLDER
  259. '
  260. '// Error when attempting to multiply link a folder.
  261.  Global Const SMS_FOLDER_LINKED = OTT_FOLDER_LINKED
  262. '
  263. '// Filter operations.
  264.  Global Const SMS_RANGE_ERROR = OTT_RANGE_ERROR
  265. '
  266. '// These are returned when a container operation is tried
  267. '// when it shouldn't be.
  268.  Global Const SMS_CONTAINER_NOT_POPULATED = OTT_CONTAINER_NOT_POPULATED
  269.  Global Const SMS_CONTAINER_POPULATED = OTT_CONTAINER_POPULATED
  270. '
  271. '
  272. '// Attempt to perform persistent operation on a non-persistent filter.
  273.  Global Const SMS_FILTER_NOT_PERSISTENT = OTT_FILTER_NOT_PERSISTENT
  274. '
  275. '// Error return if the connection handle of a filter doesn't match
  276. '// that of a container to which the filter is being applied.
  277.  Global Const SMS_INVALID_CONNECTION_HANDLE = OTT_INVALID_CONNECTION_HANDLE
  278.  Global Const SMS_INVALID_FILTER_TYPE = OTT_INVALID_FILTER_TYPE
  279. '// Folder's can't be unlinked if there are multiple handles
  280. '// to the same object.
  281.  Global Const SMS_IN_USE_BY_OTHER = OTT_IN_USE_BY_OTHER
  282. '
  283. '
  284. '// User (ie non-engine) codes begin here.
  285.  Global Const SMS_ERROR = OTT_END + 1
  286.  Global Const SMS_SQL_ERROR = OTT_END + 2
  287.  Global Const SMS_INVALID_DATASOURCE = OTT_END + 3
  288.  Global Const SMS_INVALID_HANDLE = OTT_END + 4
  289.  Global Const SMS_INVALID_FOLDER_TYPE = OTT_END + 6
  290. '
  291.  Global Const SMS_CONNECT_FAILED = OTT_END + 7
  292.  Global Const SMS_NO_CREATE = OTT_END + 8
  293.  Global Const SMS_FOLDER_NOT_MODIFIED = OTT_END + 9
  294.  Global Const SMS_INCORRECT_FOLDER_TYPE = OTT_END + 10 'Unused.
  295.  Global Const SMS_INVALID_PARAMETER = OTT_END + 11
  296.  Global Const SMS_EMPTY = OTT_END + 12
  297. '
  298. '// Error when attempting to commit a child folder when the
  299. '// parent folder must be committed.
  300.  Global Const SMS_PARENT_NEEDS_COMMIT = OTT_END + 13
  301.  Global Const SMS_PARENT_ALREADY_COMMITTED = OTT_END + 14
  302. '
  303. '// Used in asynchronous folder retrieval. Indicates that there
  304. '// might be more data but it isn't available yet.
  305.  Global Const SMS_NOT_READY = OTT_END + 15
  306. '
  307.  Global Const SMS_FILTER_NO_MODIFY = OTT_END + 16
  308.  Global Const SMS_FOLDER_ALREADY_DELETED = OTT_END + 17
  309. '
  310. '// Only allow one active connection. This is an SMS restriction.
  311.  Global Const SMS_ALREADY_CONNECTED = OTT_END + 18
  312. '// Some failure in committing a folder
  313.  Global Const SMS_COMMIT_FAILED = OTT_END + 19
  314. '// Specific failure in linking a folder
  315.  Global Const SMS_DUPLICATE_FOLDER = OTT_END + 20
  316.  Global Const SMS_ERROR_LAST = OTT_END + 20
  317. 'Error strings
  318. 'This array is initialized in Init_SMSError_array()
  319. Global SMSError$(0 To SMS_ERROR_LAST)
  320. '
  321. '// ====================================================================
  322. '//
  323. '//  Various manifests.
  324. '//
  325. '// ====================================================================
  326. '
  327. '// The location of the SMS registry root.
  328.  Global Const SMS_REG_ROOT = "SOFTWAREMicrosoftSMS"
  329. '
  330. '// The max size of character (string) data that we return.
  331.  Global Const SMS_DATA_BUFF_SIZE = 255
  332. '
  333. '
  334. '// 'SMSBUFF' and 'OBJDESCRIPTOR' used in object type enumeration APIs.
  335. '// ===================================================================
  336. '// A character buffer.
  337. '// -------------------
  338. 'typedef char SMSBUFF[SMS_DATA_BUFF_SIZE+1];
  339. '// Describes an object returned from SmsEnumObjects.
  340. '// -------------------------------------------------
  341.  Type OBJDESCRIPTOR
  342.      objType As Long                   '// Type of this object.
  343.      szName As String                  '// Object name (eg 'Personal Computer')
  344.      szFriendlyName As String          '// Friendly name. Only used in groups
  345.                                        '// where szName would be, eg,
  346.                                        '// 'MICROSOFT|IDENTIFICATION|1.0', the
  347.                                        '// friendly name would be 'Identification'.
  348.      bGotFriendlyName As Long          '// TRUE if we have a friendly name.
  349.      dwRelopMin As Long                '// For attributes, indicates range of
  350.      dwRelopMax As Long                '// relational operators that can be used
  351.                                        '// for this attribute.
  352.      bGotRelops As Long                '// TRUE if we have the relops fields set.
  353.  End Type
  354. '// Object types.
  355. '// =============
  356. '// This is the value that is inserted by the object
  357. '// enumeration APIs into the OBJDESCRIPTOR structure.
  358. '// --------------------------------------------------
  359.  Global Const OT_ARCHLIST = 1
  360.  Global Const OT_ARCH = 2
  361.  Global Const OT_GROUP = 3
  362.  Global Const OT_ATTRIBUTE = 4
  363.  Global Const OT_PLATFORMS = 5
  364.  Global Const OT_PLATFORM_PDF = 6
  365.  Global Const OT_PLATFORM_WINST = 7
  366.  Global Const OT_PLATFORM_NAD = 8
  367.  Global Const OT_UNKNOWN = 100
  368. '// --------------------------------------------------------------------
  369. '// Flags for Populate options.
  370. '// --------------------------------------------------------------------
  371.  Global Const POP_SYNC = &H0&
  372.  Global Const POP_ASYNC = &H1&
  373.  Global Const POP_EVENT = &H10&
  374.  Global Const POP_WINDOW = &H20&
  375. '
  376. '
  377. '// --------------------------------------------------------------------
  378. '// Folder types supported by smsapi (MUST NOT BEGIN AT ZERO).
  379. '// --------------------------------------------------------------------
  380.  Global Const F_SITE = 1                 'Site folder
  381.  Global Const F_MACHINE = 2              'Machine folder
  382.  Global Const F_GROUP = 3                'Subfolder of machine
  383.  Global Const F_DOMAIN = 4               'Domain folder, subfolder of a site
  384. '// Jobs
  385.  Global Const F_SYSTEMJOB = 5            'System (NAD/Site) job folder
  386. 'Global Const F_MINIJOB = 6              'Mini-job folder
  387.  Global Const F_INSTALLJOB = 7           'Job folder (wksta install)
  388.  Global Const F_SRVINSTALLJOB = 8        'Job folder (server install)
  389.  Global Const F_REMPKGJOB = 9            'Remove package Job folder
  390. '
  391.  Global Const F_PACKAGE = 10             'Packages
  392.  Global Const F_WCL = 11                 'Workstation command lines
  393.  Global Const F_PROGITEM = 12            'Program items
  394.  Global Const F_INVENTORY = 13           'Inventory rules.
  395. '
  396.  Global Const F_MACHINEGROUP = 14        'Machine group
  397.  Global Const F_SITEGROUP = 15           'Site group folder
  398. '
  399. '// --------------------------------------------------------------------
  400. '// Container types supported by smsapi (MUST NOT BEGIN AT ZERO).
  401. '// --------------------------------------------------------------------
  402.  Global Const C_SITE = 1                 'Site container
  403.  Global Const C_JOB = 2                  'Job container
  404.  Global Const C_MACHINE = 3              'Machine container
  405.  Global Const C_PACKAGE = 4              'Package container
  406.  Global Const C_MACHINEGROUP = 5         'Machine group
  407.  Global Const C_SITEGROUP = 6            'Site group
  408. '
  409. '
  410. '// ====================================================================
  411. '//
  412. '//      Filter information.
  413. '//
  414. '// ====================================================================
  415. '
  416. '
  417. '// --------------------------------------------------------------------
  418. '//  Filter types
  419. '// --------------------------------------------------------------------
  420.  Global Const SITE_FILTER = 1
  421.  Global Const MACHINE_FILTER = 2
  422.  Global Const GROUP_FILTER = 3
  423.  Global Const JOB_FILTER = 4
  424.  Global Const ARCHITECTURE_FILTER = 5
  425.  Global Const PACKAGE_FILTER = 6
  426.  Global Const ATTRIBUTE_FILTER = 7
  427.  Global Const SITELIMIT_FILTER = 8
  428. '
  429. '
  430. '// --------------------------------------------------------------------
  431. '// Token types.
  432. '// --------------------------------------------------------------------
  433.  Global Const TOKEN_USER = &H8      '1000 bit 3 always set for user-token
  434.  Global Const TOKEN_OR = &H2        '0010 bit 1 always set for AND/OR
  435.  Global Const TOKEN_AND = &H3       '0011 bit 1 always set for AND/OR
  436.  Global Const TOKEN_OPENPAREN = &H4 '0100 bit 2 always set for PAREN
  437.  Global Const TOKEN_CLOSEPAREN = &H5'0101 bit 2 always set for PAREN
  438.  Global Const TOKEN_NOTIN = &H20    '10100 bit 2 set for a PAREN plus bit 4 for an extra indicator.
  439.  Global Const TOKEN_OPERATOR = &H2  'Detects both AND or OR
  440.  Global Const TOKEN_PAREN = &H4     'Detects either open or close paren
  441. '
  442. '
  443. '// --------------------------------------------------------------------
  444. '// Manifests used in filter token APIs.
  445. '// --------------------------------------------------------------------
  446.  Global Const AT_START = OTT_AT_START 'Token will be inserted at start of expression
  447.  Global Const AT_END = OTT_AT_END     'Token will be appended to end of expression
  448. '
  449. '//
  450. '// Flags fields in SmsManipulateTokens.
  451. '//
  452.  Global Const TOK_GROUP = 1          'Flags field in SmsManipulateTokens
  453.  Global Const TOK_UNGROUP = 2
  454.  Global Const TOK_DELETE = 3
  455.  Global Const TOK_GROUP_NOT = 4
  456. '
  457. '
  458.  Sub Init_DATASOURCE_TYPE_enums ()
  459.      DB_SQL.enum = 0
  460.      DB_SQL_CONNECTED.enum = 1
  461.      DB_OTHER.enum = 2
  462.  End Sub
  463.  Function Init_SMSAPI% ()
  464.      'Default return value True (DLL loaded)
  465.      Init_SMSAPI% = True
  466.  
  467.      'Initialize "included" modules
  468.      Init_OBJECTTY
  469.      Init_QRYCODES
  470.  
  471.      'Initialize this module
  472.      Init_DATASOURCE_TYPE_enums
  473.  
  474.      'Initialize error string array
  475.      Init_SMSError_array
  476.  End Function
  477.  Sub Init_SMSError_array ()
  478.      SMSError$(SMS_OK) = "SMS_OK"
  479.      SMSError$(SMS_MORE_DATA) = "SMS_MORE_DATA"
  480.      SMSError$(SMS_NO_MORE_DATA) = "SMS_NO_MORE_DATA"
  481.      SMSError$(SMS_FOLDER_NO_UPDATE) = "SMS_FOLDER_NO_UPDATE"
  482.  
  483. '// Error codes when registering (and accessing) containers and filters
  484.      SMSError$(SMS_DUPLICATE_CONTAINER_ID) = "SMS_DUPLICATE_CONTAINER_ID"
  485.      SMSError$(SMS_DUPLICATE_FOLDER_ID) = "SMS_DUPLICATE_FOLDER_ID"
  486.      SMSError$(SMS_DUPLICATE_FILTER_ID) = "SMS_DUPLICATE_FILTER_ID"
  487.      SMSError$(SMS_DUPLICATE_FILTER) = "SMS_DUPLICATE_FILTER"
  488.      
  489.      SMSError$(SMS_SCALAR_NO_UPDATE) = "SMS_SCALAR_NO_UPDATE"
  490.      SMSError$(SMS_SCALAR_WRONG_TYPE) = "SMS_SCALAR_WRONG_TYPE"
  491.      SMSError$(SMS_INVALID_CONTAINER_ID) = "SMS_INVALID_CONTAINER_ID"
  492.      SMSError$(SMS_INVALID_FOLDER_ID) = "SMS_INVALID_FOLDER_ID"
  493.      SMSError$(SMS_INVALID_FILTER_ID) = "SMS_INVALID_FILTER_ID"
  494.  
  495.      SMSError$(SMS_CONTAINER_NO_UPDATE) = "SMS_CONTAINER_NO_UPDATE"
  496.  
  497.      SMSError$(SMS_PARAMETER_ERROR) = "SMS_PARAMETER_ERROR"
  498.      SMSError$(SMS_UNSUPPORTED) = "SMS_UNSUPPORTED"
  499.  
  500. '// This is returned when a specific object (folder or scalar) is
  501. '// requested and not found. APIs returning this are GetFolderByID
  502. '// and GetScalarByName.
  503.      SMSError$(SMS_NOT_FOUND) = "SMS_NOT_FOUND"
  504.  
  505.      SMSError$(SMS_PARENT_NOT_FOUND) = "SMS_PARENT_NOT_FOUND"
  506.      
  507.      SMSError$(SMS_CANT_DELETE) = "SMS_CANT_DELETE"
  508.      
  509.      SMSError$(SMS_NEW_FOLDER) = "SMS_NEW_FOLDER"
  510.  
  511. '// Error when attempting to multiply link a folder.
  512.      SMSError$(SMS_FOLDER_LINKED) = "SMS_FOLDER_LINKED"
  513.      
  514. '// Filter operations.
  515.      SMSError$(SMS_RANGE_ERROR) = "SMS_RANGE_ERROR"
  516.      
  517. '// These are returned when a container operation is tried
  518. '// when it shouldn't be.
  519.      SMSError$(SMS_CONTAINER_NOT_POPULATED) = "SMS_CONTAINER_NOT_POPULATED"
  520.      SMSError$(SMS_CONTAINER_POPULATED) = "SMS_CONTAINER_POPULATED"
  521.  
  522. '// Attempt to perform persistent operation on a non-persistent filter.
  523.      SMSError$(SMS_FILTER_NOT_PERSISTENT) = "SMS_FILTER_NOT_PERSISTENT"
  524.  
  525. '// Error return if the connection handle of a filter doesn't match
  526. '// that of a container to which the filter is being applied.
  527.      SMSError$(SMS_INVALID_CONNECTION_HANDLE) = "SMS_INVALID_CONNECTION_HANDLE"
  528.  
  529. '// User (ie non-engine) codes begin here.
  530.      SMSError$(SMS_ERROR) = "SMS_ERROR"
  531.      SMSError$(SMS_SQL_ERROR) = "SMS_SQL_ERROR"
  532.      SMSError$(SMS_INVALID_DATASOURCE) = "SMS_INVALID_DATASOURCE"
  533.      SMSError$(SMS_INVALID_HANDLE) = "SMS_INVALID_HANDLE"
  534.      SMSError$(SMS_INVALID_FILTER_TYPE) = "SMS_INVALID_FILTER_TYPE"
  535.      SMSError$(SMS_INVALID_FOLDER_TYPE) = "SMS_INVALID_FOLDER_TYPE"
  536.  
  537.      SMSError$(SMS_CONNECT_FAILED) = "SMS_CONNECT_FAILED"
  538.      SMSError$(SMS_NO_CREATE) = "SMS_NO_CREATE"
  539.      SMSError$(SMS_FOLDER_NOT_MODIFIED) = "SMS_FOLDER_NOT_MODIFIED"
  540.      SMSError$(SMS_INCORRECT_FOLDER_TYPE) = "SMS_INCORRECT_FOLDER_TYPE"
  541.      SMSError$(SMS_INVALID_PARAMETER) = "SMS_INVALID_PARAMETER"
  542.      SMSError$(SMS_EMPTY) = "SMS_EMPTY"
  543.  
  544. '// Error when attempting to commit a child folder when the
  545. '// parent folder must be committed.
  546.      SMSError$(SMS_PARENT_NEEDS_COMMIT) = "SMS_PARENT_NEEDS_COMMIT"
  547.      SMSError$(SMS_PARENT_ALREADY_COMMITTED) = "SMS_PARENT_ALREADY_COMMITTED"
  548.  
  549. '// Used in asynchronous folder retrieval. Indicates that there
  550. '// might be more data but it isn't available yet.
  551.      SMSError$(SMS_NOT_READY) = "SMS_NOT_READY"
  552.      
  553.      SMSError$(SMS_FILTER_NO_MODIFY) = "SMS_FILTER_NO_MODIFY"
  554.      SMSError$(SMS_FOLDER_ALREADY_DELETED) = "SMS_FOLDER_ALREADY_DELETED"
  555.  
  556. '// Only allow one active connection (SMS restriction).
  557.      SMSError$(SMS_ALREADY_CONNECTED) = "SMS_ALREADY_CONNECTED"
  558.  End Sub