pkix_util.h (31440B)
1 /* This Source Code Form is subject to the terms of the Mozilla Public 2 * License, v. 2.0. If a copy of the MPL was not distributed with this 3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 4 /* 5 * These functions provide support for a number of other functions 6 * by creating and manipulating data structures used by those functions. 7 * 8 */ 9 10 #ifndef _PKIX_UTIL_H 11 #define _PKIX_UTIL_H 12 13 #include "pkixt.h" 14 15 #ifdef __cplusplus 16 extern "C" { 17 #endif 18 19 /* General 20 * 21 * Please refer to the libpkix Programmer's Guide for detailed information 22 * about how to use the libpkix library. Certain key warnings and notices from 23 * that document are repeated here for emphasis. 24 * 25 * All identifiers in this file (and all public identifiers defined in 26 * libpkix) begin with "PKIX_". Private identifiers only intended for use 27 * within the library begin with "pkix_". 28 * 29 * A function returns NULL upon success, and a PKIX_Error pointer upon failure. 30 * 31 * Unless otherwise noted, for all accessor (gettor) functions that return a 32 * PKIX_PL_Object pointer, callers should assume that this pointer refers to a 33 * shared object. Therefore, the caller should treat this shared object as 34 * read-only and should not modify this shared object. When done using the 35 * shared object, the caller should release the reference to the object by 36 * using the PKIX_PL_Object_DecRef function. 37 * 38 * While a function is executing, if its arguments (or anything referred to by 39 * its arguments) are modified, free'd, or destroyed, the function's behavior 40 * is undefined. 41 * 42 */ 43 44 /* PKIX_Logger 45 * 46 * PKIX_Loggers provide a standard way for the caller to insert custom logging 47 * facilities. These are used by libpkix to log errors, debug information, 48 * status, etc. The LogCallback allows custom logging to take place. 49 * Additionally, a Logger can be initialized with a loggerContext, which is 50 * where the caller can specify configuration data such as the name of a 51 * logfile or database. Note that this loggerContext must be a PKIX_PL_Object, 52 * allowing it to be reference-counted and allowing it to provide the standard 53 * PKIX_PL_Object functions (Equals, Hashcode, ToString, Compare, Duplicate). 54 * 55 * Once the caller has created the Logger object(s) (and set the loggerContext 56 * (if any) and the Log callback), the caller then registers these Loggers 57 * with the system by calling PKIX_SetLoggers or PKIX_AddLogger. All log 58 * entries will then be logged using the specified Loggers. If multiple 59 * Loggers are specified, every log entry will be logged with each of them. 60 * 61 * XXX Maybe give some guidance somewhere on how much detail each logging 62 * level should have and where component boundaries should be. Maybe in 63 * Implementor's Guide or Programmer's Guide. 64 */ 65 66 #define PKIX_LOGGER_LEVEL_TRACE 5 67 #define PKIX_LOGGER_LEVEL_DEBUG 4 68 #define PKIX_LOGGER_LEVEL_WARNING 3 69 #define PKIX_LOGGER_LEVEL_ERROR 2 70 #define PKIX_LOGGER_LEVEL_FATALERROR 1 71 72 #define PKIX_LOGGER_LEVEL_MAX 5 73 74 /* 75 * FUNCTION: PKIX_Logger_LogCallback 76 * DESCRIPTION: 77 * 78 * This callback function logs a log entry containing the String pointed to 79 * by "message", the integer value of logLevel, and the String pointed to by 80 * "logComponent". A log entry can be associated with a particular log 81 * level (i.e. level 3) and a particular log component (i.e. "CertStore"). 82 * For example, someone reading the log may only be interested in very general 83 * log entries so they look only for log level 1. Similarly, they may only be 84 * interested in log entries pertaining to the CertStore component so they 85 * look only for that log component. This function can be used before calling 86 * PKIX_Initialize. 87 * 88 * PARAMETERS: 89 * "logger" 90 * Address of logger whose LogCallback is to be used. Must be non-NULL. 91 * "message" 92 * Address of String that is to be logged used "logger". Must be non-NULL. 93 * "logLevel" 94 * Integer value representing the log level for this entry. The higher the 95 * level, the more detail. Must be non-NULL. 96 * "logComponent" 97 * PKIXERRORNUM value (defined in pkixt.h) designating the log component 98 * for this entry. 99 * "plContext" 100 * Platform-specific context pointer. 101 * THREAD SAFETY: 102 * Thread Safe 103 * 104 * Multiple threads must be able to safely call this function without 105 * worrying about conflicts, even if they're operating on the same objects. 106 * RETURNS: 107 * Returns NULL if the function succeeds. 108 * Returns a Logger Error if the function fails in a non-fatal way. 109 * Returns a Fatal Error if the function fails in an unrecoverable way. 110 */ 111 typedef PKIX_Error * 112 (*PKIX_Logger_LogCallback)( 113 PKIX_Logger *logger, 114 PKIX_PL_String *message, 115 PKIX_UInt32 logLevel, 116 PKIX_ERRORCLASS logComponent, 117 void *plContext); 118 119 /* 120 * FUNCTION: PKIX_Logger_Create 121 * DESCRIPTION: 122 * 123 * Creates a new Logger using the Object pointed to by "loggerContext" 124 * (if any) and stores it at "pLogger". The new Logger uses the LogCallback 125 * pointed to by "callback". The Logger's maximum logging level is initially 126 * set to a very high level and its logging component is set to NULL (all 127 * components). 128 * 129 * PARAMETERS: 130 * "callback" 131 * The LogCallback function to be used. Must be non-NULL. 132 * "loggerContext" 133 * Address of Object representing the Logger's context (if any). 134 * "pLogger" 135 * Address where object pointer will be stored. Must be non-NULL. 136 * "plContext" 137 * Platform-specific context pointer. 138 * THREAD SAFETY: 139 * Thread Safe (see Thread Safety Definitions in Programmer's Guide) 140 * RETURNS: 141 * Returns NULL if the function succeeds. 142 * Returns a Logger Error if the function fails in a non-fatal way. 143 * Returns a Fatal Error if the function fails in an unrecoverable way. 144 */ 145 PKIX_Error * 146 PKIX_Logger_Create( 147 PKIX_Logger_LogCallback callback, 148 PKIX_PL_Object *loggerContext, 149 PKIX_Logger **pLogger, 150 void *plContext); 151 152 /* 153 * FUNCTION: PKIX_Logger_GetLogCallback 154 * DESCRIPTION: 155 * 156 * Retrieves a pointer to "logger's" Log callback function and puts it in 157 * "pCallback". 158 * 159 * PARAMETERS: 160 * "logger" 161 * Address of Logger whose Log callback is desired. Must be non-NULL. 162 * "pCallback" 163 * Address where Log callback function pointer will be stored. 164 * Must be non-NULL. 165 * "plContext" 166 * Platform-specific context pointer. 167 * THREAD SAFETY: 168 * Thread Safe (see Thread Safety Definitions in Programmer's Guide) 169 * RETURNS: 170 * Returns NULL if the function succeeds. 171 * Returns a Logger Error if the function fails in a non-fatal way. 172 * Returns a Fatal Error if the function fails in an unrecoverable way. 173 */ 174 PKIX_Error * 175 PKIX_Logger_GetLogCallback( 176 PKIX_Logger *logger, 177 PKIX_Logger_LogCallback *pCallback, 178 void *plContext); 179 180 /* 181 * FUNCTION: PKIX_Logger_GetLoggerContext 182 * DESCRIPTION: 183 * 184 * Retrieves a pointer to a PKIX_PL_Object representing the context (if any) 185 * of the Logger pointed to by "logger" and stores it at "pLoggerContext". 186 * 187 * PARAMETERS: 188 * "logger" 189 * Address of Logger whose context is to be stored. Must be non-NULL. 190 * "pLoggerContext" 191 * Address where object pointer will be stored. Must be non-NULL. 192 * "plContext" 193 * Platform-specific context pointer. 194 * THREAD SAFETY: 195 * Thread Safe (see Thread Safety Definitions in Programmer's Guide) 196 * RETURNS: 197 * Returns NULL if the function succeeds. 198 * Returns a Logger Error if the function fails in a non-fatal way. 199 * Returns a Fatal Error if the function fails in an unrecoverable way. 200 */ 201 PKIX_Error * 202 PKIX_Logger_GetLoggerContext( 203 PKIX_Logger *logger, 204 PKIX_PL_Object **pLoggerContext, 205 void *plContext); 206 207 /* 208 * FUNCTION: PKIX_Logger_GetMaxLoggingLevel 209 * DESCRIPTION: 210 * 211 * Retrieves a pointer to a PKIX_UInt32 representing the maximum logging 212 * level of the Logger pointed to by "logger" and stores it at "pLevel". Only 213 * log entries whose log level is less than or equal to this maximum logging 214 * level will be logged. 215 * 216 * PARAMETERS: 217 * "logger" 218 * Address of Logger whose maximum logging level is to be stored. 219 * Must be non-NULL. 220 * "pLevel" 221 * Address where PKIX_UInt32 will be stored. Must be non-NULL. 222 * "plContext" 223 * Platform-specific context pointer. 224 * THREAD SAFETY: 225 * Conditionally Thread Safe 226 * (see Thread Safety Definitions in Programmer's Guide) 227 * RETURNS: 228 * Returns NULL if the function succeeds. 229 * Returns a Logger Error if the function fails in a non-fatal way. 230 * Returns a Fatal Error if the function fails in an unrecoverable way. 231 */ 232 PKIX_Error * 233 PKIX_Logger_GetMaxLoggingLevel( 234 PKIX_Logger *logger, 235 PKIX_UInt32 *pLevel, 236 void *plContext); 237 238 /* 239 * FUNCTION: PKIX_Logger_SetMaxLoggingLevel 240 * DESCRIPTION: 241 * 242 * Sets the maximum logging level of the Logger pointed to by "logger" with 243 * the integer value of "level". 244 * 245 * PARAMETERS: 246 * "logger" 247 * Address of Logger whose maximum logging level is to be set. 248 * Must be non-NULL. 249 * "level" 250 * Maximum logging level to be set 251 * "plContext" 252 * Platform-specific context pointer. 253 * THREAD SAFETY: 254 * Not Thread Safe - assumes exclusive access to "logger" 255 * (see Thread Safety Definitions in Programmer's Guide) 256 * RETURNS: 257 * Returns NULL if the function succeeds. 258 * Returns a Logger Error if the function fails in a non-fatal way. 259 * Returns a Fatal Error if the function fails in an unrecoverable way. 260 */ 261 PKIX_Error * 262 PKIX_Logger_SetMaxLoggingLevel( 263 PKIX_Logger *logger, 264 PKIX_UInt32 level, 265 void *plContext); 266 267 /* 268 * FUNCTION: PKIX_Logger_GetLoggingComponent 269 * DESCRIPTION: 270 * 271 * Retrieves a pointer to a String representing the logging component of the 272 * Logger pointed to by "logger" and stores it at "pComponent". Only log 273 * entries whose log component matches the specified logging component will 274 * be logged. 275 * 276 * PARAMETERS: 277 * "logger" 278 * Address of Logger whose logging component is to be stored. 279 * Must be non-NULL. 280 * "pComponent" 281 * Address where PKIXERRORNUM will be stored. Must be non-NULL. 282 * "plContext" 283 * Platform-specific context pointer. 284 * THREAD SAFETY: 285 * Conditionally Thread Safe 286 * (see Thread Safety Definitions in Programmer's Guide) 287 * RETURNS: 288 * Returns NULL if the function succeeds. 289 * Returns a Logger Error if the function fails in a non-fatal way. 290 * Returns a Fatal Error if the function fails in an unrecoverable way. 291 */ 292 PKIX_Error * 293 PKIX_Logger_GetLoggingComponent( 294 PKIX_Logger *logger, 295 PKIX_ERRORCLASS *pComponent, 296 void *plContext); 297 298 /* 299 * FUNCTION: PKIX_Logger_SetLoggingComponent 300 * DESCRIPTION: 301 * 302 * Sets the logging component of the Logger pointed to by "logger" with the 303 * PKIXERRORNUM pointed to by "component". To match a small set of components, 304 * create a Logger for each. 305 * 306 * PARAMETERS: 307 * "logger" 308 * Address of Logger whose logging component is to be set. 309 * Must be non-NULL. 310 * "component" 311 * PKIXERRORNUM value representing logging component to be set. 312 * "plContext" 313 * Platform-specific context pointer. 314 * THREAD SAFETY: 315 * Not Thread Safe - assumes exclusive access to "logger" 316 * (see Thread Safety Definitions in Programmer's Guide) 317 * RETURNS: 318 * Returns NULL if the function succeeds. 319 * Returns a Logger Error if the function fails in a non-fatal way. 320 * Returns a Fatal Error if the function fails in an unrecoverable way. 321 */ 322 PKIX_Error * 323 PKIX_Logger_SetLoggingComponent( 324 PKIX_Logger *logger, 325 PKIX_ERRORCLASS component, 326 void *plContext); 327 328 /* 329 * FUNCTION: PKIX_GetLoggers 330 * DESCRIPTION: 331 * 332 * Retrieves a pointer to the List of Loggers (if any) being used for logging 333 * by libpkix and stores it at "pLoggers". If no loggers are being used, this 334 * function stores an empty List at "pLoggers". 335 * 336 * Note that the List returned by this function is immutable. 337 * 338 * PARAMETERS: 339 * "pLoggers" 340 * Address where object pointer will be stored. Must be non-NULL. 341 * "plContext" 342 * Platform-specific context pointer. 343 * THREAD SAFETY: 344 * Conditionally Thread Safe 345 * (see Thread Safety Definitions in Programmer's Guide) 346 * RETURNS: 347 * Returns NULL if the function succeeds. 348 * Returns a Logger Error if the function fails in a non-fatal way. 349 * Returns a Fatal Error if the function fails in an unrecoverable way. 350 */ 351 PKIX_Error * 352 PKIX_GetLoggers( 353 PKIX_List **pLoggers, /* list of PKIX_Logger */ 354 void *plContext); 355 356 /* 357 * FUNCTION: PKIX_SetLoggers 358 * DESCRIPTION: 359 * 360 * Sets the Loggers to be used by libpkix to the List of Loggers pointed to 361 * by "loggers". If "loggers" is NULL, no Loggers will be used. 362 * 363 * PARAMETERS: 364 * "loggers" 365 * Address of List of Loggers to be set. NULL for no Loggers. 366 * "plContext" 367 * Platform-specific context pointer. 368 * THREAD SAFETY: 369 * Not Thread Safe 370 * (see Thread Safety Definitions in Programmer's Guide) 371 * RETURNS: 372 * Returns NULL if the function succeeds. 373 * Returns a Logger Error if the function fails in a non-fatal way. 374 * Returns a Fatal Error if the function fails in an unrecoverable way. 375 */ 376 PKIX_Error * 377 PKIX_SetLoggers( 378 PKIX_List *loggers, /* list of PKIX_Logger */ 379 void *plContext); 380 381 /* 382 * FUNCTION: PKIX_AddLogger 383 * DESCRIPTION: 384 * 385 * Adds the Logger pointed to by "logger" to the List of Loggers used by 386 * libpkix. 387 * 388 * PARAMETERS: 389 * "logger" 390 * Address of Logger to be added. Must be non-NULL. 391 * "plContext" 392 * Platform-specific context pointer. 393 * THREAD SAFETY: 394 * Not Thread Safe 395 * (see Thread Safety Definitions in Programmer's Guide) 396 * RETURNS: 397 * Returns NULL if the function succeeds. 398 * Returns a Logger Error if the function fails in a non-fatal way. 399 * Returns a Fatal Error if the function fails in an unrecoverable way. 400 */ 401 PKIX_Error * 402 PKIX_AddLogger( 403 PKIX_Logger *logger, 404 void *plContext); 405 406 /* Functions pertaining to the PKIX_Error type */ 407 408 /* Error 409 * 410 * An Error object is returned by a function upon encountering some error 411 * condition. Each Error is associated with an errorCode specified in pkixt.h. 412 * The remaining components of an Error are optional. An Error's description 413 * specifies a text message describing the Error. An Error's supplementary info 414 * specifies additional information that might be useful. Finally, an Error's 415 * cause specifies the underlying Error (if any) that resulted in this Error 416 * being returned, thereby allowing Errors to be chained so that an entire 417 * "error stack trace" can be represented. Once created, an Error is immutable. 418 * 419 * Note that the Error's supplementary info must be an Object (although any 420 * object type), allowing it to be reference-counted and allowing it to 421 * provide the standard Object functions (Equals, Hashcode, ToString, Compare, 422 * Duplicate). 423 * 424 * Errors are classified as either being fatal or non-fatal. If a function 425 * fails in an unrecoverable way, it returns an Error whose errorCode is 426 * PKIX_FATAL_ERROR. If such an error is encountered, the caller should 427 * not attempt to recover since something seriously wrong has happened 428 * (e.g. corrupted memory, memory finished, etc.). All other errorCodes 429 * are considered non-fatal errors and can be handled by the caller as they 430 * see fit. 431 */ 432 433 /* 434 * FUNCTION: PKIX_Error_Create 435 * DESCRIPTION: 436 * 437 * Creates a new Error using the value of "errorCode", the Error pointed to by 438 * "cause" (if any), the Object pointed to by "info" (if any), and the String 439 * pointed to by "desc" and stores it at "pError". If any error occurs during 440 * error allocation, it will be returned without chaining, since new errors 441 * cannot be created. Once created, an Error is immutable. 442 * 443 * PARAMETERS: 444 * "errorCode" 445 * Value of error code. 446 * "cause" 447 * Address of Error representing error's cause. 448 * NULL if none or unspecified. 449 * "info" 450 * Address of Object representing error's supplementary information. 451 * NULL if none. 452 * "desc" 453 * Address of String representing error's description. NULL if none. 454 * "pError" 455 * Address where object pointer will be stored. Must be non-NULL. 456 * "plContext" 457 * Platform-specific context pointer. 458 * THREAD SAFETY: 459 * Thread Safe (see Thread Safety Definitions in Programmer's Guide) 460 * RETURNS: 461 * Returns NULL if the function succeeds. 462 * Returns an Error Error if the function fails in a non-fatal way. 463 * Returns a Fatal Error if the function fails in an unrecoverable way. 464 */ 465 PKIX_Error * 466 PKIX_Error_Create( 467 PKIX_ERRORCLASS errClass, 468 PKIX_Error *cause, 469 PKIX_PL_Object *info, 470 PKIX_ERRORCODE errCode, 471 PKIX_Error **pError, 472 void *plContext); 473 474 /* 475 * FUNCTION: PKIX_Error_GetErrorClass 476 * DESCRIPTION: 477 * 478 * Retrieves the error class of the Error pointed to by "error" and 479 * stores it at "pClass". Supported error codes are defined in pkixt.h. 480 * 481 * PARAMETERS: 482 * "error" 483 * Address of Error whose error code is desired. Must be non-NULL. 484 * "pClass" 485 * Address where PKIX_UInt32 will be stored. Must be non-NULL. 486 * "plContext" 487 * Platform-specific context pointer. 488 * THREAD SAFETY: 489 * Thread Safe (see Thread Safety Definitions in Programmer's Guide) 490 * RETURNS: 491 * Returns NULL if the function succeeds. 492 * Returns an Error Error if the function fails in a non-fatal way. 493 * Returns a Fatal Error if the function fails in an unrecoverable way. 494 */ 495 PKIX_Error * 496 PKIX_Error_GetErrorClass( 497 PKIX_Error *error, 498 PKIX_ERRORCLASS *pClass, 499 void *plContext); 500 501 /* 502 * FUNCTION: PKIX_Error_GetErrorCode 503 * DESCRIPTION: 504 * 505 * Retrieves the error code of the Error pointed to by "error" and 506 * stores it at "pCode". Supported error codes are defined in pkixt.h. 507 * 508 * PARAMETERS: 509 * "error" 510 * Address of Error whose error code is desired. Must be non-NULL. 511 * "pCode" 512 * Address where PKIX_UInt32 will be stored. Must be non-NULL. 513 * "plContext" 514 * Platform-specific context pointer. 515 * THREAD SAFETY: 516 * Thread Safe (see Thread Safety Definitions in Programmer's Guide) 517 * RETURNS: 518 * Returns NULL if the function succeeds. 519 * Returns an Error Error if the function fails in a non-fatal way. 520 * Returns a Fatal Error if the function fails in an unrecoverable way. 521 */ 522 PKIX_Error * 523 PKIX_Error_GetErrorCode( 524 PKIX_Error *error, 525 PKIX_ERRORCODE *pCode, 526 void *plContext); 527 528 /* 529 * FUNCTION: PKIX_Error_GetCause 530 * DESCRIPTION: 531 * 532 * Retrieves the cause of the Error pointed to by "error" and stores it at 533 * "pCause". If no cause was specified, NULL will be stored at "pCause". 534 * 535 * PARAMETERS: 536 * "error" 537 * Address of Error whose cause is desired. Must be non-NULL. 538 * "pCause" 539 * Address where object pointer will be stored. Must be non-NULL. 540 * "plContext" 541 * Platform-specific context pointer. 542 * THREAD SAFETY: 543 * Thread Safe (see Thread Safety Definitions in Programmer's Guide) 544 * RETURNS: 545 * Returns NULL if the function succeeds. 546 * Returns an Error Error if the function fails in a non-fatal way. 547 * Returns a Fatal Error if the function fails in an unrecoverable way. 548 */ 549 PKIX_Error * 550 PKIX_Error_GetCause( 551 PKIX_Error *error, 552 PKIX_Error **pCause, 553 void *plContext); 554 555 /* 556 * FUNCTION: PKIX_Error_GetSupplementaryInfo 557 * DESCRIPTION: 558 * 559 * Retrieves the supplementary info of the Error pointed to by "error" and 560 * stores it at "pInfo". 561 * 562 * PARAMETERS: 563 * "error" 564 * Address of Error whose info is desired. Must be non-NULL. 565 * "pInfo" 566 * Address where info pointer will be stored. Must be non-NULL. 567 * "plContext" 568 * Platform-specific context pointer. 569 * THREAD SAFETY: 570 * Thread Safe (see Thread Safety Definitions in Programmer's Guide) 571 * RETURNS: 572 * Returns NULL if the function succeeds. 573 * Returns an Error Error if the function fails in a non-fatal way. 574 * Returns a Fatal Error if the function fails in an unrecoverable way. 575 */ 576 PKIX_Error * 577 PKIX_Error_GetSupplementaryInfo( 578 PKIX_Error *error, 579 PKIX_PL_Object **pInfo, 580 void *plContext); 581 582 /* 583 * FUNCTION: PKIX_Error_GetDescription 584 * DESCRIPTION: 585 * 586 * Retrieves the description of the Error pointed to by "error" and stores it 587 * at "pDesc". If no description was specified, NULL will be stored at 588 * "pDesc". 589 * 590 * PARAMETERS: 591 * "error" 592 * Address of Error whose description is desired. Must be non-NULL. 593 * "pDesc" 594 * Address where object pointer will be stored. Must be non-NULL. 595 * "plContext" 596 * Platform-specific context pointer. 597 * THREAD SAFETY: 598 * Thread Safe (see Thread Safety Definitions in Programmer's Guide) 599 * RETURNS: 600 * Returns NULL if the function succeeds. 601 * Returns an Error Error if the function fails in a non-fatal way. 602 * Returns a Fatal Error if the function fails in an unrecoverable way. 603 */ 604 PKIX_Error * 605 PKIX_Error_GetDescription( 606 PKIX_Error *error, 607 PKIX_PL_String **pDesc, 608 void *plContext); 609 610 /* PKIX_List 611 * 612 * Represents a collection of items. NULL is considered a valid item. 613 */ 614 615 /* 616 * FUNCTION: PKIX_List_Create 617 * DESCRIPTION: 618 * 619 * Creates a new List and stores it at "pList". The List is initially empty 620 * and holds no items. To initially add items to the List, use 621 * PKIX_List_AppendItem 622 * 623 * PARAMETERS: 624 * "pList" 625 * Address where object pointer will be stored. Must be non-NULL. 626 * "plContext" 627 * Platform-specific context pointer. 628 * THREAD SAFETY: 629 * Thread Safe (see Thread Safety Definitions in Programmer's Guide) 630 * RETURNS: 631 * Returns NULL if the function succeeds. 632 * Returns a Fatal Error if the function fails in an unrecoverable way. 633 */ 634 PKIX_Error * 635 PKIX_List_Create( 636 PKIX_List **pList, 637 void *plContext); 638 639 /* 640 * FUNCTION: PKIX_List_SetImmutable 641 * DESCRIPTION: 642 * 643 * Sets the List pointed to by "list" to be immutable. If a caller tries to 644 * change a List after it has been marked immutable (i.e. by calling 645 * PKIX_List_AppendItem, PKIX_List_InsertItem, PKIX_List_SetItem, or 646 * PKIX_List_DeleteItem), an Error is returned. 647 * 648 * PARAMETERS: 649 * "list" 650 * Address of List to be marked immutable. Must be non-NULL. 651 * "plContext" 652 * Platform-specific context pointer. 653 * THREAD SAFETY: 654 * Not Thread Safe - assumes exclusive access to "list" 655 * (see Thread Safety Definitions in Programmer's Guide) 656 * RETURNS: 657 * Returns NULL if the function succeeds. 658 * Returns a Fatal Error if the function fails in an unrecoverable way. 659 */ 660 PKIX_Error * 661 PKIX_List_SetImmutable( 662 PKIX_List *list, 663 void *plContext); 664 665 /* 666 * FUNCTION: PKIX_List_IsImmutable 667 * DESCRIPTION: 668 * 669 * Checks whether the List pointed to by "list" is immutable and stores 670 * the Boolean result at "pImmutable". If a caller tries to change a List 671 * after it has been marked immutable (i.e. by calling PKIX_List_AppendItem, 672 * PKIX_List_InsertItem, PKIX_List_SetItem, or PKIX_List_DeleteItem), an 673 * Error is returned. 674 * 675 * PARAMETERS: 676 * "list" 677 * Address of List whose immutability is to be determined. 678 * Must be non-NULL. 679 * "pImmutable" 680 * Address where PKIX_Boolean will be stored. Must be non-NULL. 681 * "plContext" 682 * Platform-specific context pointer. 683 * THREAD SAFETY: 684 * Conditionally Thread Safe 685 * (see Thread Safety Definitions in Programmer's Guide) 686 * RETURNS: 687 * Returns NULL if the function succeeds. 688 * Returns a Fatal Error if the function fails in an unrecoverable way. 689 */ 690 PKIX_Error * 691 PKIX_List_IsImmutable( 692 PKIX_List *list, 693 PKIX_Boolean *pImmutable, 694 void *plContext); 695 696 /* 697 * FUNCTION: PKIX_List_GetLength 698 * DESCRIPTION: 699 * 700 * Retrieves the length of the List pointed to by "list" and stores it at 701 * "pLength". 702 * 703 * PARAMETERS: 704 * "list" 705 * Address of List whose length is desired. Must be non-NULL. 706 * "pLength" 707 * Address where PKIX_UInt32 will be stored. Must be non-NULL. 708 * "plContext" 709 * Platform-specific context pointer. 710 * THREAD SAFETY: 711 * Conditionally Thread Safe 712 * (see Thread Safety Definitions in Programmer's Guide) 713 * RETURNS: 714 * Returns NULL if the function succeeds. 715 * Returns a Fatal Error if the function fails in an unrecoverable way. 716 */ 717 PKIX_Error * 718 PKIX_List_GetLength( 719 PKIX_List *list, 720 PKIX_UInt32 *pLength, 721 void *plContext); 722 723 /* 724 * FUNCTION: PKIX_List_IsEmpty 725 * DESCRIPTION: 726 * 727 * Checks whether the List pointed to by "list" is empty and stores 728 * the Boolean result at "pEmpty". 729 * 730 * PARAMETERS: 731 * "list" 732 * Address of List whose emptiness is to be determined. Must be non-NULL. 733 * "pEmpty" 734 * Address where PKIX_Boolean will be stored. Must be non-NULL. 735 * "plContext" 736 * Platform-specific context pointer. 737 * THREAD SAFETY: 738 * Conditionally Thread Safe 739 * (see Thread Safety Definitions in Programmer's Guide) 740 * RETURNS: 741 * Returns NULL if the function succeeds. 742 * Returns a Fatal Error if the function fails in an unrecoverable way. 743 */ 744 PKIX_Error * 745 PKIX_List_IsEmpty( 746 PKIX_List *list, 747 PKIX_Boolean *pEmpty, 748 void *plContext); 749 750 /* 751 * FUNCTION: PKIX_List_AppendItem 752 * DESCRIPTION: 753 * 754 * Appends the Object pointed to by "item" after the last non-NULL item in 755 * List pointed to by "list", if any. Note that a List may validly contain 756 * NULL items. Appending "c" into the List ("a", NULL, "b", NULL) will result 757 * in ("a", NULL, "b", "c"). 758 * 759 * PARAMETERS: 760 * "list" 761 * Address of List to append to. Must be non-NULL. 762 * "item" 763 * Address of new item to append. 764 * "plContext" 765 * Platform-specific context pointer. 766 * THREAD SAFETY: 767 * Not Thread Safe - assumes exclusive access to "list" 768 * (see Thread Safety Definitions in Programmer's Guide) 769 * RETURNS: 770 * Returns NULL if the function succeeds. 771 * Returns a Fatal Error if the function fails in an unrecoverable way. 772 */ 773 PKIX_Error * 774 PKIX_List_AppendItem( 775 PKIX_List *list, 776 PKIX_PL_Object *item, 777 void *plContext); 778 779 /* 780 * FUNCTION: PKIX_List_InsertItem 781 * DESCRIPTION: 782 * 783 * Inserts the Object pointed to by "item" into the List pointed to by "list" 784 * at the given "index". The index counts from zero and must be less than the 785 * List's length. Existing list entries at or after this index will be moved 786 * to the next highest index. 787 * 788 * XXX why not allow equal to length which would be equivalent to AppendItem? 789 * 790 * PARAMETERS: 791 * "list" 792 * Address of List to insert into. Must be non-NULL. 793 * "index" 794 * Position to insert into. Must be less than List's length. 795 * "item" 796 * Address of new item to append. 797 * "plContext" 798 * Platform-specific context pointer. 799 * THREAD SAFETY: 800 * Not Thread Safe - assumes exclusive access to "list" 801 * (see Thread Safety Definitions in Programmer's Guide) 802 * RETURNS: 803 * Returns NULL if the function succeeds. 804 * Returns a Fatal Error if the function fails in an unrecoverable way. 805 */ 806 PKIX_Error * 807 PKIX_List_InsertItem( 808 PKIX_List *list, 809 PKIX_UInt32 index, 810 PKIX_PL_Object *item, 811 void *plContext); 812 813 /* 814 * FUNCTION: PKIX_List_GetItem 815 * DESCRIPTION: 816 * 817 * Copies the "list"'s item at "index" into "pItem". The index counts from 818 * zero and must be less than the list's length. Increments the reference 819 * count on the returned object, if non-NULL. 820 * 821 * PARAMETERS: 822 * "list" 823 * Address of List to get item from. Must be non-NULL. 824 * "index" 825 * Index of list to get item from. Must be less than List's length. 826 * "pItem" 827 * Address where object pointer will be stored. Must be non-NULL. 828 * "plContext" 829 * Platform-specific context pointer. 830 * THREAD SAFETY: 831 * Conditionally Thread Safe 832 * (see Thread Safety Definitions in Programmer's Guide) 833 * RETURNS: 834 * Returns NULL if the function succeeds. 835 * Returns a Fatal Error if the function fails in an unrecoverable way. 836 */ 837 PKIX_Error * 838 PKIX_List_GetItem( 839 PKIX_List *list, 840 PKIX_UInt32 index, 841 PKIX_PL_Object **pItem, 842 void *plContext); 843 844 /* 845 * FUNCTION: PKIX_List_SetItem 846 * DESCRIPTION: 847 * 848 * Sets the item at "index" of the List pointed to by "list" with the Object 849 * pointed to by "item". The index counts from zero and must be less than the 850 * List's length. The previous entry at this index will have its reference 851 * count decremented and the new entry will have its reference count 852 * incremented. 853 * 854 * PARAMETERS: 855 * "list" 856 * Address of List to modify. Must be non-NULL. 857 * "index" 858 * Position in List to set. Must be less than List's length. 859 * "item" 860 * Address of Object to set at "index". 861 * "plContext" 862 * Platform-specific context pointer. 863 * THREAD SAFETY: 864 * Not Thread Safe - assumes exclusive access to "list" 865 * (see Thread Safety Definitions in Programmer's Guide) 866 * RETURNS: 867 * Returns NULL if the function succeeds. 868 * Returns a Fatal Error if the function fails in an unrecoverable way. 869 */ 870 PKIX_Error * 871 PKIX_List_SetItem( 872 PKIX_List *list, 873 PKIX_UInt32 index, 874 PKIX_PL_Object *item, 875 void *plContext); 876 877 /* 878 * FUNCTION: PKIX_List_DeleteItem 879 * 880 * Deletes the item at "index" from the List pointed to by "list". The index 881 * counts from zero and must be less than the List's length. Note that this 882 * function does not destroy the List. It simply decrements the reference 883 * count of the item at "index" in the List, deletes that item from the list 884 * and moves all subsequent entries to a lower index in the list. If there is 885 * only a single element in the List and that element is deleted, then the 886 * List will be empty. 887 * 888 * PARAMETERS: 889 * "list" 890 * Address of List to delete from. Must be non-NULL. 891 * "index" 892 * Position in List to delete. Must be less than List's length. 893 * "plContext" 894 * Platform-specific context pointer. 895 * THREAD SAFETY: 896 * Not Thread Safe - assumes exclusive access to "list" 897 * (see Thread Safety Definitions in Programmer's Guide) 898 * RETURNS: 899 * Returns NULL if the function succeeds. 900 * Returns a Fatal Error if the function fails in an unrecoverable way. 901 */ 902 PKIX_Error * 903 PKIX_List_DeleteItem( 904 PKIX_List *list, 905 PKIX_UInt32 index, 906 void *plContext); 907 908 /* 909 * FUNCTION: PKIX_List_ReverseList 910 * DESCRIPTION: 911 * 912 * Creates a new List whose elements are in the reverse order as the elements 913 * of the Object pointed to by "list" and stores the copy at "pReversedList". 914 * If "list" is empty, the new reversed List will be a copy of "list". 915 * Changes to the new object will not affect the original and vice versa. 916 * 917 * PARAMETERS: 918 * "list" 919 * Address of List whose elements are to be reversed. Must be non-NULL. 920 * "pReversedList" 921 * Address where object pointer will be stored. Must be non-NULL. 922 * "plContext" 923 * Platform-specific context pointer. 924 * THREAD SAFETY: 925 * Conditionally Thread Safe 926 * (see Thread Safety Definitions in Programmer's Guide) 927 * RETURNS: 928 * Returns NULL if the function succeeds. 929 * Returns a Fatal Error if the function fails in an unrecoverable way. 930 */ 931 PKIX_Error * 932 PKIX_List_ReverseList( 933 PKIX_List *list, 934 PKIX_List **pReversedList, 935 void *plContext); 936 937 #ifdef __cplusplus 938 } 939 #endif 940 941 #endif /* _PKIX_UTIL_H */