VXIlog.h
上传用户:xqtpzdz
上传日期:2022-05-21
资源大小:1764k
文件大小:29k
源码类别:

xml/soap/webservice

开发平台:

Visual C++

  1. /****************License************************************************
  2.  * Vocalocity OpenVXI
  3.  * Copyright (C) 2004-2005 by Vocalocity, Inc. All Rights Reserved.
  4.  * This program is free software; you can redistribute it and/or
  5.  * modify it under the terms of the GNU General Public License
  6.  * as published by the Free Software Foundation; either version 2
  7.  * of the License, or (at your option) any later version.
  8.  *  
  9.  * This program is distributed in the hope that it will be useful,
  10.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12.  * GNU General Public License for more details.
  13.  *
  14.  * You should have received a copy of the GNU General Public License
  15.  * along with this program; if not, write to the Free Software
  16.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  17.  * Vocalocity, the Vocalocity logo, and VocalOS are trademarks or 
  18.  * registered trademarks of Vocalocity, Inc. 
  19.  * OpenVXI is a trademark of Scansoft, Inc. and used under license 
  20.  * by Vocalocity.
  21.  ***********************************************************************/
  22. #ifndef _VXILOG_H                 /* Allows multiple inclusions */
  23. #define _VXILOG_H
  24. #include <stdarg.h>               /* For va_list */
  25. #include "VXItypes.h"             /* For VXIchar */
  26. #include "VXIvalue.h"             /* For VXIString */
  27. #include "VXIheaderPrefix.h"
  28. #ifdef VXILOG_EXPORTS
  29. #define VXILOG_API SYMBOL_EXPORT_DECL
  30. #else
  31. #define VXILOG_API SYMBOL_IMPORT_DECL
  32. #endif
  33. #ifdef __cplusplus
  34. extern "C" {
  35. #endif
  36. #ifdef __cplusplus
  37. struct VXIlogStream;
  38. #else
  39. typedef struct VXIlogStream { void * dummy; } VXIlogStream;
  40. #endif
  41. /**
  42.   defgroup VXIlog Logging Interface
  43.   The VXIlog Facility supports the following types of log streams:<br>
  44.   <ul>
  45.   <li><b> Error stream:</b><br>
  46.    Used to report system faults (errors) and possible system faults
  47.    (warnings) to the system operator for diagnosis and repair. Errors
  48.    are reported by error numbers that are mapped to text with an
  49.    associated severity level. This mapping may be maintained in a
  50.    separate XML document.  This allows integrators to localize and
  51.    customize the text without code changes, and also allows integrators
  52.    and developers to review and re-define severity levels without code
  53.    changes. Optional attribute/value pairs are used to convey details
  54.    about the fault, such the file or URL that is associated with the
  55.    fault.
  56.   </li>
  57.  
  58.   <li><b>Diagnostic stream: </b><br>
  59.    Used by developers and support staff to trace and diagnose system
  60.    behavior. Diagnostic messages are hard-coded text since they are
  61.    private messages that are not intended for system operator
  62.    use. Diagnostic messages are all associated with developer defined
  63.    "tags" for grouping, where each tag may be independently
  64.    enabled/disabled. It is guaranteed that diagnostic logging will have
  65.    little or no performance impact if the tag is disabled, meaning that
  66.    developers should be generous in their insertion of diagnostic log
  67.    messages. These will be disabled by default, but specific tags can
  68.    then be enabled for rapid diagnosis with minimal performance impact
  69.    when issues arise.
  70.   </li>
  71.   <li><b>Event stream: </b><br>
  72.    Summarizes normal caller activity in order to support service
  73.    bureau billing; reporting for capacity planning, application and
  74.    recognition monitoring, and caller behavior trending; and traces of
  75.    individual calls for application tuning.  Events are reported by
  76.    event numbers that are mapped to event names. Optional
  77.    attribute/value pairs are used to convey details about the event,
  78.    such as the base application for a new call event.
  79.   </li>
  80.   <li><b>Content stream: </b><br>
  81.    The content stream is not really a seperate conceptual stream: it
  82.    is merely a mechanism to log large blocks of data (BLOBs) in a 
  83.    flexible and efficient manner, for example diagnostic logging of
  84.    the VoiceXML page being executed, or event logging of the audio
  85.    input for recognition. To log this information, a request to
  86.    open a content stream handle is made, then the data is written
  87.    to that stream handle. Next the client uses a key/value pair
  88.    returned by the VXIlog implementation to cross-reference the
  89.    content within an appropriate error, diagnostic, or event log
  90.    entry. This mechanism gives the VXIlog implementation high
  91.    flexibility: the implementation may simply write each request
  92.    to a new file and return a cross-reference key/value pair that
  93.    indicates the file path (key = "URL", value = &lt;path&gt;), or may
  94.    POST the data to a centralized web server, or may write each 
  95.    request to a database. The system operator console software
  96.    may then transparently join the error, diagnostic, and event
  97.    log streams with the appropriate content data based on the
  98.    key/value pair.
  99.   </li>
  100.   </ul>
  101. <p>
  102.   Across all streams, the log implementation is responsible for
  103.   automatically supplying the following information in some manner
  104.   (possibly encoded into a file name, possibly in a data header,
  105.   possibly as part of each log message) for end consumer use:
  106.  <ul>
  107.     <li> timestamp </li>
  108.     <li> channel name and/or number </li>
  109.     <li> host name </li>
  110.     <li> application name </li>
  111.     <li> (Error only) error text and severity based on the error number,
  112.          and the supplied module name </li>
  113.     <li> (Diagnostic only) tag name based on the tag number, and the
  114.          supplied subtag name </li>
  115.     <li> (Event only) event name based on the event number </li>
  116.  </ul>
  117.  <p>
  118.   In addition, for diagnostic logging the log implementation is
  119.   responsible for defining a mechanism for enabling/disabling messages
  120.   on an individual tag basis without requiring a recompile for use by
  121.   consumers of the diagnostic log. It is critical that Diagnostic( )
  122.   is highly efficient for cases when the tag is disabled: in other
  123.   words, the lookup for seeing if a tag (an integer) is enabled should
  124.   be done using a simple array or some other extremely low-overhead
  125.   mechanism. It is highly recommended that log implementations provide
  126.   a way to enable/disable tags on-the-fly (without needing to restart
  127.   the software), and log implementations should consider providing a
  128.   way to enable/disable tabs on a per-channel basis (for enabling tags
  129.   in tight loops where the performance impact can be large).
  130.  
  131.   <p>
  132.   Each of the streams has fields that need to be allocated by
  133.   developers. The rules for each follows. As background, several of
  134.   these fields require following the rules for XML names: it must
  135.   begin with a letter, underscore, or colon, and is followed by one or
  136.   more of those plus digits, hyphens, or periods. However, colons must
  137.   only be used when indicating XML namespaces, and the "vxi" and "swi"
  138.   namespaces (such as "swi:SBprompt") are reserved for use by
  139.   Vocalocity, Inc.
  140.   <p>
  141.   <ul>
  142.   <li><b>Error logging:</b><br>
  143.     Module names (moduleName) must follow XML name rules as described
  144.     above, and must be unique for each implementation of each VXI
  145.     interface. <p>
  146.  
  147.     Error IDs (errorID) are unsigned integers that for each module
  148.     start at 0 and increase from there, allocated by each named module
  149.     as it sees fit. Each VXI interface implementation must provide a
  150.     document that provides the list of error IDs and the recommended
  151.     text (for at least one language) and severity. Severities should
  152.     be constrained to one of three levels: "Critical - out of service"
  153.     (affects multiple callers), "Severe - service affecting" (affects
  154.     a single caller), "Warning - not service affecting" (not readily
  155.     apparent to callers, or it is at least fairly likely callers will
  156.     not notice). <p>
  157.     Attribute names must follow XML name rules as described
  158.     above. However, these need not be unique for each implementation
  159.     as they are interpreted relative to the module name (and
  160.     frequently not interpreted at all, but merely output). For
  161.     consumer convenience the data type for each attribute name should
  162.     never vary, although most log implementations will not enforce
  163.     this. <p>
  164.  </li>
  165.  <li><b>Diagnostic logging:</b><br>
  166.     Tags (tagID) are unsigned integers that must be globally unique
  167.     across the entire run-time environment in order to allow VXIlog
  168.     implementations to have very low overhead diagnostic log
  169.     enablement lookups (see above). The recommended mechanism for
  170.     avoiding conflicts with components produced by other developers is
  171.     to make it so the initialization function for your component takes
  172.     an unsigned integer argument that is a tag ID base. Then within
  173.     your component code, allocate locally unique tag ID numbers
  174.     starting at zero, but offset them by the base variable prior to
  175.     calling the VXIlog Diagostic( ) method. This way integrators of
  176.     your component can assign a non-conflicting base as they see
  177.     fit. <p>
  178.  
  179.     There are no restrictions on subtag use, as they are relative to
  180.     the tag ID and most log implementations will merely output them as
  181.     a prefix to the diagnostic text. <p>
  182.   </li>
  183.  
  184.   <li><b>Event logging:</b><br>
  185.     Events (eventID) are unsigned integers that are defined by each
  186.     developer as they see fit in coordination with other component
  187.     developers to avoid overlaps.  Globally unique events are required
  188.     to make it easy for event log consumers to parse the log, all
  189.     events should be well-known and well documented. <p>
  190.  
  191.     Attribute names must follow XML name rules as described
  192.     above. However, these need not be unique for each implementation
  193.     as they are interpreted relative to the module name (and
  194.     frequently not interpreted at all, but merely output). For
  195.     consumer convenience the data type for each attribute name should
  196.     never vary, although most log implementations will not enforce
  197.     this. <p> 
  198.   </li>
  199.   <li><b>Content logging:</b><br>
  200.     Module names (moduleName) must follow XML name rules as described
  201.     above, and must be unique for each implementation of each VXI
  202.     interface. <p>
  203.     When a content stream is opened for writing data, a key/value pair
  204.     is returned by the VXIlog interface. This key/value pair must be used
  205.     to cross-reference this data in error, diagnostic, and/or event
  206.     logging messages. <p>
  207.   </li>
  208.   </ul> 
  209. */
  210. /*@{*/
  211. /**
  212.  * Standard VXIlog events
  213.  *
  214.  * Standardized events that may be reported to the VXIlog
  215.  * interface. Platform dependant events start at
  216.  * VXIlog_EVENT_PLATFORM_DEFINED and increase from there.
  217.  */
  218. typedef enum VXIlogEvent {
  219.   VXIlog_EVENT_CALL_START         = 0,
  220.   VXIlog_EVENT_CALL_END           = 1,
  221.   VXIlog_EVENT_LOG_ELEMENT        = 2,
  222.   VXIlog_EVENT_SPEECH_DETECTED    = 3,
  223.   VXIlog_EVENT_ENDPOINTER_AUDIO   = 4,
  224.   VXIlog_EVENT_RECOGNIZER_AUDIO   = 5,
  225.   VXIlog_EVENT_RECOGNITION_START  = 6,
  226.   VXIlog_EVENT_RECOGNITION_END    = 7,
  227.   VXIlog_EVENT_SPEECH_RESULT      = 8,
  228.   VXIlog_EVENT_DTMF_RESULT        = 9,
  229.   VXIlog_EVENT_PLATFORM_DEFINED   = 10000
  230. } VXIlogEvent;
  231. /**
  232.  * Macros to determine the availability of new methods
  233.  */
  234. #define LOG_EVENT_VECTOR_SUPPORTED(logIntf) 
  235.   (logIntf->GetVersion( ) >= 0x00010001)
  236. #define LOG_CONTENT_METHODS_SUPPORTED(logIntf) 
  237.   (logIntf->GetVersion( ) >= 0x00010001)
  238. /**
  239.  * Result codes for interface methods
  240.  * 
  241.  * Result codes less then zero are severe errors (likely to be
  242.  * platform faults), those greater then zero are warnings (likely to
  243.  * be application issues) 
  244.  */
  245. typedef enum VXIlogResult {
  246.   /** Fatal error, terminate call    */
  247.   VXIlog_RESULT_FATAL_ERROR       =  -100, 
  248.   /** I/O error                      */
  249.   VXIlog_RESULT_IO_ERROR           =   -8,
  250.   /** Out of memory                  */
  251.   VXIlog_RESULT_OUT_OF_MEMORY      =   -7, 
  252.   /** System error, out of service   */
  253.   VXIlog_RESULT_SYSTEM_ERROR       =   -6, 
  254.   /** Errors from platform services  */
  255.   VXIlog_RESULT_PLATFORM_ERROR     =   -5, 
  256.   /** Return buffer too small        */
  257.   VXIlog_RESULT_BUFFER_TOO_SMALL   =   -4, 
  258.   /** Property name is not valid    */
  259.   VXIlog_RESULT_INVALID_PROP_NAME  =   -3, 
  260.   /** Property value is not valid   */
  261.   VXIlog_RESULT_INVALID_PROP_VALUE =   -2, 
  262.   /** Invalid function argument      */
  263.   VXIlog_RESULT_INVALID_ARGUMENT   =   -1, 
  264.   /** Success.  Note that Success is defined as 0 and that all
  265.     critical errors are less than 0 and all non critical errors are
  266.     greater than 0.            */
  267.   VXIlog_RESULT_SUCCESS            =    0,
  268.   /** Normal failure, nothing logged */
  269.   VXIlog_RESULT_FAILURE            =    1,
  270.   /** Non-fatal non-specific error   */
  271.   VXIlog_RESULT_NON_FATAL_ERROR    =    2, 
  272.   /** Operation is not supported     */
  273.   VXIlog_RESULT_UNSUPPORTED        =  100
  274. } VXIlogResult;
  275. /**
  276.  * VXIlog interface for logging
  277.  * The VXIlogInterface provides a set of functions which are used for
  278.  * logging by all the OpenVXI browser components.
  279.  */
  280. typedef struct VXIlogInterface {
  281.   /**
  282.    * Get the VXI interface version implemented
  283.    *
  284.    * @return  VXIint32 for the version number. The high high word is 
  285.    *          the major version number, the low word is the minor version 
  286.    *          number, using the native CPU/OS byte order. The current
  287.    *          version is VXI_CURRENT_VERSION as defined in VXItypes.h.
  288.    */ 
  289.   VXIint32 (*GetVersion)(void);
  290.   
  291.   /**
  292.    * Get the name of the implementation
  293.    *
  294.    * @return  Implementation defined string that must be different from
  295.    *          all other implementations. The recommended name is one
  296.    *          where the interface name is prefixed by the implementator's
  297.    *          Internet address in reverse order, such as com.xyz.rec for
  298.    *          VXIrec from xyz.com. This is similar to how VoiceXML 1.0
  299.    *          recommends defining application specific error types.
  300.    */
  301.   const VXIchar* (*GetImplementationName)(void);
  302.   
  303.   /**
  304.    * Log an error
  305.    * Basic error reporting mechanism.  Errors are reported by
  306.    * moduleName, error number, a format, and a varargs argument list. <p>
  307.    *
  308.    * IMPORTANT: Error details are not free-form, they must be passed
  309.    *    as a succession of key-value pairs, i.e. a string key followed by
  310.    *    a value. For example, this format string and arguments is
  311.    *    correct:<p>
  312.    *
  313.    *    L"%s%i%s%s", L"key1", 911, L"key2", L"value2" <p>
  314.    *
  315.    *    While this one is incorrect (second key missing):<br>
  316.    *
  317.    *    L"%s%i%f", L"key1", 911, (float)22 / 7<p>
  318.    *
  319.    *    Keys must always be specified by a %s, and the key names must
  320.    *    follow the rules for XML names as summarized at the top of
  321.    *    this header. Values may be specified by the ANSI C defined
  322.    *    format parameters for printf( ), including the ability to
  323.    *    control string widths, number of decimals to output, padding
  324.    *    etc. There are no restrictions on the variable values, it is
  325.    *    the responsibility of the logging system to escape the
  326.    *    variable values if required by the final output stream (such
  327.    *    as output via XML).<p>
  328.    *
  329.    *    NOTE: Do NOT use %C and %S in the format string for inserting
  330.    *    narrow character buffers (char and char *) as supported by
  331.    *    some compilers, as this is not portable and may result in
  332.    *    system crashes on some UNIX variants if the VXIlog
  333.    *    implementation uses the compiler supplied printf( ) family of
  334.    *    functions for handling these variable argument lists.
  335.    *
  336.    * @param  moduleName   [IN] Name of the software module that is 
  337.    *                      outputting the error. See the top of this file
  338.    *                      for moduleName allocation rules.
  339.    * @param  errorID      [IN] Error number to log, this is mapped to 
  340.    *                      localized error text that is displayed to the 
  341.    *                      system operator that has an associated severity
  342.    *                      level. It is CRITICAL that this provides primary, 
  343.    *                      specific, actionable information to the system 
  344.    *                      operator, with attribute/value pairs only used to 
  345.    *                      provide details. See the top of this file for 
  346.    *                      errorID allocation rules.
  347.    * @param  format       [IN] Format string as passed to wprintf( ) (the
  348.    *                      wchar_t version of printf( ) as defined by the
  349.    *                      ANSI C standard) for outputting optional error
  350.    *                      details. This is followed by a variable list of
  351.    *                      arguments supplying variables for insertion into the 
  352.    *                      format string, also as passed to wprintf( ).
  353.    *
  354.    * @param  ...          [IN] Arguments matching the error details format
  355.    *                      specified above.
  356.    *
  357.    * @return VXIlog_RESULT_SUCCESS on success 
  358.    */
  359.   VXIlogResult (*Error)(struct VXIlogInterface* pThis,
  360. const VXIchar*          moduleName,
  361. VXIunsigned             errorID,
  362. const VXIchar*          format,
  363. ...);
  364.   
  365.   /**
  366.    * Log an error (va_list variant).
  367.    *
  368.    * Same as Error, but a va_list is supplied as
  369.    * an argument instead of "..." in order to make it easy to layer
  370.    * convenience functions/classes for logging on top of this
  371.    * interface.<p>
  372.    *  
  373.    * @return VXIlog_RESULT_SUCCESS on success
  374.    */
  375.   VXIlogResult (*VError)(struct VXIlogInterface* pThis,
  376.  const VXIchar*          moduleName,
  377.  VXIunsigned             errorID,
  378.  const VXIchar*          format,
  379.  va_list                 vargs);
  380.   
  381.   /**
  382.    * Log a diagnostic message.<p>
  383.    * Basic diagnostic reporting mechanism.  Diagnostic messages are
  384.    * reported by moduleName, tag id, subtag, a format, and a variable length
  385.    * argument list.
  386.    *
  387.    * @param  tagID    [IN] Identifier that classifies a group of logically
  388.    *                  associated diagnostic messages (usually from a single
  389.    *                  software module) that are desirable to enable or
  390.    *                  disable as a single unit. See the top of this file 
  391.    *                  for tagID allocation rules.
  392.    * @param  subtag   [IN] Arbitrary string that may be used to subdivide
  393.    *                  the diagnostic messages of that tagID, or provide
  394.    *                  additional standardized information such as the
  395.    *                  source file, function, or method. There are no
  396.    *                  rules for the content of this field.
  397.    * @param  format   [IN] Format string as passed to wprintf( ) (the
  398.    *                  wchar_t version of printf( ) as defined by the ANSI C 
  399.    *                  standard) for outputting free-form diagnostic text. 
  400.    *                  This is followed by a variable list of arguments that 
  401.    *                  supply values for insertion into the format string, 
  402.    *                  also as passed to wprintf( ).<p>
  403.    *
  404.    *                  NOTE: Do NOT use %C and %S in the format string
  405.    *                  for inserting narrow character strings (char and char *)
  406.    *                  as supported by some compilers, as this is not portable
  407.    *                  and may result in system crashes on some UNIX variants
  408.    *                  if the VXIlog implementation uses the compiler supplied
  409.    *                  ...printf( ) family of functions for handling these
  410.    *                  variable argument lists.
  411.    * @param  ...      [IN] Arguments matching the free-form diagnostic text
  412.    *                  format specified above.
  413.    *
  414.    * @return VXIlog_RESULT_SUCCESS on success
  415.    */
  416.   VXIlogResult (*Diagnostic)(struct VXIlogInterface* pThis,
  417.      VXIunsigned             tagID,
  418.      const VXIchar*          subtag,
  419.      const VXIchar*          format,
  420.      ...);
  421.   /**
  422.    * Log a diagnostic message (va_list variant)
  423.    *
  424.    * Same as <a href="Diagnostic.html"> Diagnostic</a>, but a va_list is
  425.    * supplied as an argument instead of "..." in order to make it easy
  426.    * to layer convenience functions/classes for logging on top of this
  427.    * interface.
  428.    *   
  429.    * @return VXIlog_RESULT_SUCCESS on success
  430.    */
  431.   VXIlogResult (*VDiagnostic)(struct VXIlogInterface* pThis,
  432.       VXIunsigned             tagID,
  433.       const VXIchar*          subtag,
  434.       const VXIchar*          format,
  435.       va_list                 vargs);
  436.   /**
  437.    * Query whether diagnostic logging is enabled
  438.    *
  439.    * NOTE: Diagnostic log messages are automatically filtered in a
  440.    *  high-performance way by the <a href="Diagnostic.html">
  441.    *  Diagnostic </a>  method. This should only be used in the rare
  442.    *  conditions when there is significant pre-processing work 
  443.    *  required to assemble the input parameters for Diagnostic( ),
  444.    *  and thus it is best to suppress that performance impacting
  445.    *  pre-processing as well.
  446.    *
  447.    * @param  tagID        [IN] Identifier for a class of 
  448.    *
  449.    * @return TRUE if that tag is enabled (information for that tag
  450.    *         will be written to the diagnostic log), FALSE if that
  451.    *         tag is disabled (information for that tag will be ignored)
  452.    */
  453.   VXIbool (*DiagnosticIsEnabled)(struct VXIlogInterface* pThis,
  454.  VXIunsigned             tagID);
  455.   /**
  456.    * Log an event.
  457.    *
  458.    * Basic error reporting mechanism.  Errors are reported by
  459.    * moduleName, error number, and with a varargs format. Event
  460.    * details are not free-form, they  must be passed as a succession of 
  461.    * key-value pairs, i.e. a string key followed by a value. See the
  462.    * description of the format parameter for 
  463.    * <a=href="Error.html"> Error </a> for a full explanation.
  464.    *
  465.    * @param  eventID      [IN] Event number to log, this is mapped to a
  466.    *                      localized event name that is placed in the event
  467.    *                      log. It is critical that this provide unambiguous
  468.    *                      information about the nature of the event. See 
  469.    *                      the top of this file for eventID allocation rules.
  470.    * @param  format       [IN] Format string as passed to wprintf( ) (the
  471.    *                      wchar_t version of printf( ) as defined by the
  472.    *                      ANSI C standard) for outputting optional event
  473.    *                      details. This is followed by a variable list of
  474.    *                      arguments supplying values for insertion into the 
  475.    *                      format string, also as passed to wprintf(). <p>
  476.    *
  477.    *                      IMPORTANT: Event details are not free-form, they
  478.    *                      must be passed as a succession of key-value pairs,
  479.    *                      i.e. a string key followed by a value. See the
  480.    *                      description of the format parameter for 
  481.    *                      <a href="Error.html"> Error </a> for a full 
  482.    *                      explanation.
  483.    * @param  ...          [IN] Arguments matching the event details format
  484.    *                      specified above.
  485.    *
  486.    * @return VXIlog_RESULT_SUCCESS on success
  487.    */
  488.   VXIlogResult (*Event)(struct VXIlogInterface* pThis,
  489. VXIunsigned             eventID,
  490. const VXIchar*          format,
  491. ...);
  492.   /**
  493.    * Log an event (va_list variant)
  494.    *
  495.    * Same as <a href="Event.html"> Event </a>, but a va_list is supplied as
  496.    * an argument instead of "..." in order to make it easy to layer
  497.    * convenience functions/classes for logging on top of this
  498.    * interface.
  499.    *    
  500.    * @return VXIlog_RESULT_SUCCESS on success
  501.    */
  502.   VXIlogResult (*VEvent)(struct VXIlogInterface* pThis,
  503.  VXIunsigned             eventID,
  504.  const VXIchar*          format,
  505.  va_list                 vargs);
  506.   /**
  507.    * Log an event (VXIVector variant).
  508.    *
  509.    * NOTE: This is only available as of version 1.1 of the VXIlogInterface,
  510.    *       use LOG_EVENT_VECTOR_SUPPORTED( ) to determine availability.<p>
  511.    *
  512.    * Same as <a href="Event.html"> Event </a>, but a vector of keys and
  513.    * a vector of values is supplied as arguments to make it possible
  514.    * to build dynamic lists of key/value pairs for logging (such as
  515.    * event logging of recognition results)<p>
  516.    *
  517.    * @param  eventID      [IN] Event number to log, this is mapped to a
  518.    *                      localized event name that is placed in the event
  519.    *                      log. It is critical that this provide unambiguous
  520.    *                      information about the nature of the event. See 
  521.    *                      the top of this file for eventID allocation rules.
  522.    * @param  keys         [IN] Key names for the event data, where keys[i]
  523.    *                      is the key for the value in value[i]. Each key
  524.    *                      must be a VXIString.
  525.    * @param  values       [IN] Values for the event data. Each value must
  526.    *                      be a VXIInteger, VXIFloat, VXIString, or VXIPtr.
  527.    *
  528.    * @return VXIlog_RESULT_SUCCESS on success
  529.    */
  530.   VXIlogResult (*EventVector)(struct VXIlogInterface* pThis,
  531.       VXIunsigned             eventID,
  532.       const VXIVector*        keys,
  533.       const VXIVector*        values);
  534.   /**
  535.    * Open a handle to log (potentially large or binary) content
  536.    *
  537.    * NOTE: This is only available as of version 1.1 of the VXIlogInterface,
  538.    *       use LOG_CONTENT_METHODS_SUPPORTED( ) to determine availability.
  539.    *
  540.    * In situations where large blocks of data need to be logged
  541.    * and/or the data is binary, this method should be used to
  542.    * open a content logging stream. Data is written via
  543.    * ContentWrite( ), and the stream is then closed via 
  544.    * ContentClose( ). The key/value pair returned by this method
  545.    * indicates the location of the logged data, and should be
  546.    * used to reference this content within error, event, and/or
  547.    * diagnostic messages.
  548.    *
  549.    * @param  moduleName   [IN] Name of the software module that is 
  550.    *                      outputting the data. See the top of this file
  551.    *                      for moduleName allocation rules.
  552.    * @param  contentType  [IN] MIME content type for the data
  553.    * @param  logKey       [OUT] Key name to cross-reference this content
  554.    *                      in logging errors, events, and/or diagnostic 
  555.    *                      messages. Ownership is passed on success, call
  556.    *                      VXIStringDestroy( ) to free this when no longer
  557.    *                      required.
  558.    * @param  logValue     [OUT] Value to cross-reference this content
  559.    *                      in logging errors, events, and/or diagnostic 
  560.    *                      messages. Ownership is passed on success, call
  561.    *                      VXIStringDestroy( ) to free this when no longer
  562.    *                      required.
  563.    * @param  stream       [OUT] Handle for writing the content via 
  564.    *                      ContentWrite( ) and closing it via ContentClose( )
  565.    *
  566.    * @return VXIlog_RESULT_SUCCESS on success
  567.    */
  568.   VXIlogResult (*ContentOpen)(struct VXIlogInterface* pThis,
  569.       const VXIchar*          moduleName,
  570.       const VXIchar*          contentType,
  571.       VXIString**             logKey,
  572.       VXIString**             logValue,
  573.       VXIlogStream**          stream);
  574.   /**
  575.    * Close a stream for logging (potentially large or binary) content.
  576.    *
  577.    * NOTE: This is only available as of version 1.1 of the VXIlogInterface,
  578.    *       use LOG_CONTENT_METHODS_SUPPORTED( ) to determine availability.<p>
  579.    *
  580.    * Close a content stream that was previously opened. Closing
  581.    * a NULL or previously closed stream will result in an error.
  582.    *
  583.    * @param  stream   [IN/OUT] Handle to the stream to close, will be
  584.    *                  set to NULL on success
  585.    *
  586.    * @return VXIlog_RESULT_SUCCESS on success
  587.    */
  588.   VXIlogResult (*ContentClose)(struct VXIlogInterface* pThis,
  589.        VXIlogStream**          stream);
  590.   /**
  591.    * Write (potentially large or binary) content to a logging stream
  592.    *
  593.    * NOTE: This is only available as of version 1.1 of the VXIlogInterface,
  594.    *       use LOG_CONTENT_METHODS_SUPPORTED( ) to determine availability.<p>
  595.    *
  596.    * Write data to a content stream that was previously opened.
  597.    *
  598.    * @param buffer   [OUT] Buffer of data to write to the stream
  599.    * @param buflen   [IN]  Number of bytes to write
  600.    * @param nwritten [OUT] Number of bytes actual written, may be less then
  601.    *                 buflen if an error is returned
  602.    * @param stream   [IN] Handle to the stream to write to
  603.    *
  604.    * @return VXIlog_RESULT_SUCCESS on success
  605.    */
  606.   VXIlogResult (*ContentWrite)(struct VXIlogInterface* pThis,
  607.        const VXIbyte*          buffer,
  608.        VXIulong                buflen,
  609.        VXIulong*               nwritten,
  610.        VXIlogStream*           stream);
  611.   
  612. } VXIlogInterface;
  613. /*@}*/
  614. #ifdef __cplusplus
  615. }
  616. #endif
  617. #include "VXIheaderSuffix.h"
  618. #endif  /* include guard */