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

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 _VXIINET_H
  23. #define _VXIINET_H
  24. #include "VXIvalue.h"                  /* For VXIMap, VXIString, etc. */
  25. #include "VXIheaderPrefix.h"
  26. #ifdef VXIINET_EXPORTS
  27. #define VXIINET_API SYMBOL_EXPORT_DECL
  28. #else
  29. #define VXIINET_API SYMBOL_IMPORT_DECL
  30. #endif
  31. #ifdef __cplusplus
  32. extern "C" {
  33. #endif
  34. #ifdef __cplusplus
  35. struct VXIinetStream;
  36. #else
  37. typedef struct VXIinetStream { void * dummy; } VXIinetStream;
  38. #endif
  39. /**
  40.  * defgroup VXIinet Internet Interface
  41.  *
  42.  * Abstract interface for accessing Internet functionality including
  43.  * HTTP requests, local file access, URL caching, and cookie access. <p>
  44.  *
  45.  * The interface is a synchronous interface based on the ANSI/ISO C
  46.  * standard file I/O interface, the only exception is that pre-fetches are
  47.  * asynchronous. The client of the interface may use this in an
  48.  * asynchronous manner by using non-blocking I/O operations, creating
  49.  * threads, or by invoking this from a separate server process. <p>
  50.  *
  51.  */
  52. /*@{*/
  53. /**
  54.  * @name VXIinet argument properties
  55.  * 
  56.  * Keys identifying properties in VXIMap for Prefetch( ) and Open( ):
  57.  * VXIinet functions take a VXIMap argument which contains a set of
  58.  * key/value pairs. The listed arguments must be supported by an
  59.  * implementation. Additional arguments can be added to this argument in
  60.  * other implementations. Time durations are specified in milliseconds, see
  61.  * below for valid values for the enumerated type properties.
  62.  */
  63. /*@{*/
  64.     /** Value for the HTTP 1.1 Cache-Control max-age directive for
  65. requests. This specifies the client is willing to accept a
  66. cached object no older than this value (given in seconds). A
  67. value of 0 may be used to force re-validating the cached copy
  68. with the origin server for every request. In most cases, this
  69. property should not be present, thus allowing the origin
  70. server to control expiration. Value is a VXIInteger */
  71. #define INET_CACHE_CONTROL_MAX_AGE       L"inet.maxage"
  72.     /** Value for the HTTP 1.1 Cache-Control max-stale directive for
  73. requests. This specifies the client is willing to accept a
  74. cached object that is expired by up to this value (given in
  75. seconds) past the expiration time specified by the origin
  76. server. In most cases, this property should be set to 0 or not
  77. present, thus respecting the expiration time specified by the
  78. origin server. Value is a VXIInteger */
  79. #define INET_CACHE_CONTROL_MAX_STALE     L"inet.maxstale"
  80.     /** Type of caching to apply: safe or fast. See the INET_CACHING
  81. defines.  NOTE: Supported for backward compatibility only, use
  82. INET_CACHE_CONTROL_MAX_AGE instead ("safe" mode is identical
  83. to setting that parameter to 0, while "fast" mode is identical
  84. to leaving that parameter unspecified).  Value is a VXIString */
  85. #define INET_CACHING                     L"inet.caching"
  86.     /** Conditional open, used for cases where a cache outside of
  87.       VXIinet is being maintained and the desired object is already
  88.       present in that cache, but the user needs to verify whether
  89.       that cached object is valid for reuse or not. (For example,
  90.       maintaining a compiled grammar cache where the grammar source
  91.       is obtained from a URL.) To do so, when writing data to the
  92.       cache the user must also store the value of the
  93.       INET_INFO_VALIDATOR return property. Then for the next request
  94.       for that data, the user must set this property to that validator
  95.       object and do an Open( ). If VXIinet_RESULT_NOT_MODIFIED is
  96.       returned, the user may re-use the cached data, but must also
  97.       update the associated validator with the updated validator
  98.       returned in INET_INFO_VALIDATOR. Otherwise if
  99.       VXIinet_RESULT_SUCCESS is returned, the cached entry is invalid
  100.       and the user obtains a stream from which they must re-create
  101.       (re-compile) the data.  (A simple case to understand is file://
  102.       access: the validator will usually just be the modification time,
  103.       if that changes the cached data is invalid. The need for an opaque
  104.       validator and this conditional open mechanism is driven by HTTP 1.1,
  105.       where the validator is far more complex, a combination of expiration
  106.       times, a modification date, entity tags, and other data.)  Value is
  107.       a VXIContent as returned for INET_INFO_VALIDATOR */
  108. #define INET_OPEN_IF_MODIFIED   L"inet.openIfModified"
  109.     /** Whether to open local files normally or to return a
  110.       VXIinet_RESULT_LOCAL_FILE error while still returning the
  111.       stream information if requested.  Value is a VXIInteger where
  112.       it is set to TRUE (1) or FALSE (0). */
  113. #define INET_OPEN_LOCAL_FILE    L"inet.openLocalFile"
  114.     /** Prefetch priority. For implementations supporting priority
  115.       this controls the order of opens and reads for multiple current
  116.       reads.  Argument is a VXIInteger */
  117. #define INET_PREFETCH_PRIORITY  L"inet.prefetchPriority"
  118.     /** Submit method: GET or POST.  Argument is a VXIString.
  119.         Default is INET_SUBMIT_METHOD_DEFAULT. */
  120. #define INET_SUBMIT_METHOD      L"inet.submitMethod"
  121.     /** Submit MIME type. MIME type of data sent in the submit. Default
  122.         is INET_SUBMIT_MIME_TYPE_DEFAULT.  Argument is a VXIString */
  123. #define INET_SUBMIT_MIME_TYPE   L"inet.submitMimeType"
  124.     /** Open timeout. Amount of time in (ms) to wait for an open to
  125.       succeed before abadoning the open.  Default is
  126.       INET_TIMEOUT_OPEN_DEFAULT Argument is a VXIInteger */
  127. #define INET_TIMEOUT_OPEN       L"inet.timeoutOpen"
  128.     /** Read timeout.  Time in (ms) to attempt to read on the socket before
  129.       abadoning the read. Default is INET_TIMEOUT_IO_DEFAULT. Argument is a
  130.       VXIInteger */
  131. #define INET_TIMEOUT_IO         L"inet.timeoutIO"
  132.     /** Total download timeout.  Time in (ms) to attempt to open and read
  133.       all the contents on the socket before issuing a read.  This is
  134.       optional and should be used to implement the VoiceXML timeout.
  135.       Argument is a VXIinteger */
  136. #define INET_TIMEOUT_DOWNLOAD   L"inet.timeoutDownload"
  137.     /** URL base for resolving relative URLs.  Note this is not a
  138.       directory name, it is the full URL to the document that refers to
  139.       this URL being fetched. No default.  Argument is a VXIString */
  140. #define INET_URL_BASE           L"inet.urlBase"
  141.     /** URL Query Arguments.  Argument is a VXIMap containing zero or more
  142.       key/value pairs.  When specified a submit is done as controlled
  143.       by the INET_SUBMIT_METHOD and INET_SUBMIT_MIME_TYPE properties, for
  144.       example doing a POST where the key/value pairs are appended to the
  145.       URL in order to perform a query.  Only valid for INET_MODE_READ.
  146.       By default is undefined (no submit performed). */
  147. #define INET_URL_QUERY_ARGS     L"inet.urlQueryArgs"
  148.   /**
  149.    * This property specifies whether the connection should be closed after the
  150.    * fetch is completed.  This property, if specified and is a non-zero
  151.    * VXIInteger, causes the the connection to be closed after the fetch.  If
  152.    * specified and is zero VXIInteger, then an attempt to keep the connection
  153.    * opened will be made.  If not specified, or not VXIInteger, then behaviour
  154.    * is implementation dependant and should be specified in the
  155.    * initialization of the inet layer
  156.    */
  157. #define INET_CLOSE_CONNECTION   L"inet.closeConnection"
  158.   /**
  159.    * This property specifies whether a new connection should be established
  160.    * regardless of the state of a previously established connection.  If
  161.    * specified and is a non-zero VXIinteger, Open() will close any existing
  162.    * connection and attempt establishing a new connection.  If specified and
  163.    * is a zero VXIInteger, then Open() will try to reuse the existing
  164.    * connection.  If not specified, or not VXIInteger, then behaviour
  165.    * is implementation dependant and should be specified in the
  166.    * initialization of the inet layer
  167.    *
  168.    * Whether the connection (whether new of existing) is closed or not after
  169.    * the fetch is still controlled by the INET_CLOSE_CONNECTION property.
  170.    *
  171.    **/
  172. #define INET_NEW_CONNECTION    L"inet.newConnection"
  173. /*@}*/
  174. /**
  175.  * @name VXIinet caching property values
  176.  * Set of defined caching property values that are used to control
  177.  * when to retrieve information from the cache versus when to do a fetch.
  178.  */
  179. /*@{*/
  180.     /** Safe caching, follows VoiceXML 1 safe fetchhint property.
  181.       Safe caching is the equivalent of end-to-end caching expiration
  182.       checking.  The INET component will open a socket and check the
  183.       document on the web server, even if the cache has not expired
  184.       with safe caching */
  185. #define INET_CACHING_SAFE       L"safe"
  186.     /** Fast caching, follows VoiceXML 1 fast fetchhint property.
  187.       Fast caching will check the cache expiration of a document
  188.       before opening a socket to the web server. If the document has
  189.       not expired in the cache it will simply be returned.
  190.       */
  191. #define INET_CACHING_FAST       L"fast"
  192. /*@}*/
  193. /**
  194.  * INET_PREFETCH_PRIORITY property values.
  195.  */
  196. typedef enum VXIinetPrefetchPriority {
  197.   /** Caller is waiting for the document */
  198.   INET_PREFETCH_PRIORITY_CRITICAL    =   40,
  199.   /** Caller is going to get to this real soon */
  200.   INET_PREFETCH_PRIORITY_HIGH        =   30,
  201.   /** Caller is likely to need this in a little bit */
  202.   INET_PREFETCH_PRIORITY_MEDIUM      =   20,
  203.   /** Just initializing the system, no callers yet */
  204.   INET_PREFETCH_PRIORITY_LOW         =   10
  205. } VXIinetPrefetchPriority;
  206. /**
  207.  * @name INET_SUBMIT_METHOD supported property values
  208.  * Full HTTP 1.1 support could be added to this interface. The
  209.  * current interface only supports the two methods commonly used for
  210.  * sending data back to a web server GET and POST.
  211.  */
  212. /*@{*/
  213.   /** HTTP GET */
  214. #define INET_SUBMIT_METHOD_GET   L"GET"
  215.   /** HTTP POST */
  216. #define INET_SUBMIT_METHOD_POST  L"POST"
  217. /*@}*/
  218. /**
  219.  * @name VXIinet property defaults
  220.  * 
  221.  * Default values for properties in the VXIMap argument for
  222.  * Prefetch() and Open().  If the properties are not set in 
  223.  * the call to these function the given default value will 
  224.  * be assumed.
  225.  */
  226. /*@{*/
  227.    /** Cache Control max-age Default - NULL not present by default */
  228. #define INET_CACHE_CONTROL_MAX_AGE_DEFAULT    NULL
  229.    /** Cache Control max-stale Default - 0, do not use expired entries */
  230. #define INET_CACHE_CONTROL_MAX_STALE_DEFAULT  0
  231.    /** Caching Default - INET_CACHING_FAST */
  232. #define INET_CACHING_DEFAULT                  INET_CACHING_FAST
  233.    /** Open If Modified Default - NULL not present by default */
  234. #define INET_OPEN_IF_MODIFIED_DEFAULT         NULL
  235.    /** Open Local File Default - TRUE */
  236. #define INET_OPEN_LOCAL_FILE_DEFAULT          TRUE
  237.    /** Prefetch priority default - INET_PREFETCH_PRIORITY_LOW */
  238. #define INET_PREFETCH_PRIORITY_DEFAULT        INET_PREFETCH_PRIORITY_LOW
  239.    /** Submit method default - INET_SUBMIT_METHOD_GET */
  240. #define INET_SUBMIT_METHOD_DEFAULT            INET_SUBMIT_METHOD_GET
  241.    /** Submit MIME type default - "application/x-www-form-urlencoded" */
  242. #define INET_SUBMIT_MIME_TYPE_DEFAULT      L"application/x-www-form-urlencoded"
  243.    /** Open timeout default - 30000 (30 seconds) */
  244. #define INET_TIMEOUT_OPEN_DEFAULT             30000
  245.    /** Read timeout default - 30000 (30 seconds) */
  246. #define INET_TIMEOUT_IO_DEFAULT               30000
  247.    /** Total download timeout default - 30000 (30 seconds) */
  248. #define INET_TIMEOUT_DOWNLOAD_DEFAULT         30000
  249.    /** URL base default - "" (no base) */
  250. #define INET_URL_BASE_DEFAULT                 L""
  251.    /** URL query arguments default - NULL not present by default */
  252. #define INET_URL_QUERY_ARGS_DEFAULT           NULL
  253. /*@}*/
  254. /**
  255.  * Data source values.
  256.  *
  257.  * An enum in the Inet streamInfo map to indicate the data source: 
  258.  * from a local file, from the fetch cache, from the fetch cache but had to 
  259.  * revalidate with the web server, or from a full Internet fetch.
  260.  */
  261. typedef enum VXIinetDataSource {
  262.   /** Open for reading from a local file */
  263.   INET_DATA_SOURCE_FILE       = 0x0,
  264.   /** Open for reading from a full Internet fetch */
  265.   INET_DATA_SOURCE_HTTP       = 0x1,
  266.   /** Open for reading from a FTP fetch */
  267.   INET_DATA_SOURCE_FTP        = 0x2,
  268.   /** Open for reading from the cache */
  269.   INET_DATA_SOURCE_CACHE      = 0x3,
  270.   /** Open for reading from the cache but had to revalidate */
  271.   INET_DATA_SOURCE_VALIDATED  = 0x4
  272. } VXIinetDataSource;
  273. /**
  274.  * Mode values for Open( )
  275.  */
  276. typedef enum VXIinetOpenMode {
  277.   /** Open for reading, for http:// access this corresponds to a GET
  278.    *  or POST operation (GET in most cases, POST if
  279.    *  INET_URL_QUERY_ARGS is specified and INET_SUBMIT_METHOD is set
  280.    *  to POST)
  281.    */
  282.   INET_MODE_READ    = 0x0,
  283.   /** Open for writing, for http:// access this corresponds to a PUT
  284.    *  operation.  Note that this is OPTIONAL functionality that most
  285.    *  implementations do not support (because most Web servers do not
  286.    *  support PUT operations for security reasons).
  287.    */
  288.   INET_MODE_WRITE   = 0x1
  289. } VXIinetOpenMode;
  290. /**
  291.  * @name Open flags
  292.  *
  293.  * Flags for Open( ), may be combined through bitwise or.
  294.  * The Open() call takes a bitwise or of open flags which control
  295.  * the behavior of the returned stream.
  296.  */
  297. /*@{*/
  298.   /** Null flag.  This causes the cache to use default behavior,
  299.       specifically I/O using blocking operations. */
  300. #define INET_FLAG_NULL             0x0
  301.   /** Non-blocking reads/writes. Do all I/O using non-blocking operations. */
  302. #define INET_FLAG_NONBLOCKING_IO   0x8
  303. /*@}*/
  304. /**
  305.  * @name Open return properties
  306.  * Keys identifying properties in VXIMap used to return stream
  307.  * information for Open( ).
  308.  * The VXIinet implementation determines information about the
  309.  * file or URI when it opens the URI. These are returned as key/value
  310.  * pairs through a VXIMap. Some values are not guaranteed to be returned
  311.  * after an open, see below.
  312.  */
  313. /*@{*/
  314.   /** Absolute Name, always returned.  The absolute URI for a URI
  315.     which may have been provided as a relative URI against a base.
  316.     For local file access (file:// access or an OS dependant path) an
  317.     OS dependant path must be returned, never a file:// URI.  This
  318.     should be passed unmodified as the value of the INET_URL_BASE
  319.     property for fetching URIs referenced within this document, if any.
  320.     Returned as a VXIString */
  321. #define INET_INFO_ABSOLUTE_NAME  L"inet.info.absoluteName"
  322.   /** MIME type, always returned.  The MIME type of the URI.
  323.     For HTTP requests, this is set to the type returned by the
  324.     HTTP server. For file: requests, a MIME mapping table is used
  325.     to determine the correct MIME type. This table is also used
  326.     when the HTTP server returns no MIME type or a generic type.
  327.     If the MIME type cannot be determined at all, it is set to
  328.     "application/octet-stream". Returned as a VXIString */
  329. #define INET_INFO_MIME_TYPE      L"inet.info.mimeType"
  330.   /** Size in bytes, always returned.  Size of the file in bytes.
  331.     For HTTP requests, this is set to the size returned by the
  332.     HTTP server. If the server returns no size, or if the file
  333.     size cannot be determined for file: requests, it is set to
  334.     zero. Returned as a VXIInteger */
  335. #define INET_INFO_SIZE_BYTES     L"inet.info.sizeBytes"
  336.   /** Validator, always returned on a successful Open( ) or
  337.     when INET_OPEN_IF_MODIFIED was specified and
  338.     VXIinet_RESULT_NOT_MODIFIED was returned.  Opaque validator
  339.     for future conditional open operations against the named object,
  340.     see INET_OPEN_IF_MODIFIED for details.  Returned as a VXIContent */
  341. #define INET_INFO_VALIDATOR      L"inet.info.validator"
  342.   /** HTTP status code, always returned for successful HTTP Open( )
  343.     operations, or HTTP Open( ) operations that fail due to the remote
  344.     web server returning a HTTP failure code in the HTTP response.
  345.     Never returned in other cases (such as for failures for file://
  346.     fetches, or failures for HTTP fetches due to non-HTTP response
  347.     failures such as TCP/IP connection failures).  HTTP status code
  348.     from the last HTTP response received related to the Open( )
  349.     request.  Returned as a VXIInteger.  For example, a successful
  350.     Open( ) for a http:// URL will most commonly report a HTTP status
  351.     200 (OK), while a failed attempt will often report a HTTP status
  352.     404 (Not Found).  Note that interim response codes, such as HTTP
  353.     status 301 (Redirect -- Moved Permanently) should not be returned
  354.     as the VXIinet implementation should respond by doing a HTTP
  355.     request against the redirected location, resulting in a new HTTP
  356.     status code from the new HTTP response. */
  357. #define INET_INFO_HTTP_STATUS    L"inet.info.httpStatus"
  358.   /**
  359.    * INET_INFO_VALIDATOR_STRONG. Open() must return this property as a
  360.    * VXIinteger with value TRUE when a strong validator is available for the
  361.    * page.
  362.    **/
  363. #define INET_INFO_VALIDATOR_STRONG L"inet.info.validatorStrong"
  364.   /**
  365.    * Expires hint.  Timestamp indicating when the cache entry will expire.
  366.    * The property is returned by Open() as a VXIInteger representing an
  367.    * ANSI/ISO time_t integer, representing the number of seconds since Jan 1,
  368.    * 1970). If the entry is already expired, a VXIInteger of value 0 is
  369.    * returned.  This number only indicates this is the time where the request
  370.    * has to be made again to the remote web server. This doesn't necessarily
  371.    * mean that there will be new data after this time (For example, having the
  372.    * property INET_INFO_VALIDATOR_STRONG with
  373.    * an EXPIRES_HINT of 0, means the URL has to
  374.    * be revalidated but does not imply that the data will change.
  375.    **/
  376. #define INET_INFO_EXPIRES_HINT  L"inet.info.expiresHint"
  377.   
  378.   /**
  379.    * an enum of type VXIinetDataSource (see above) in the Inet streamInfo 
  380.    * map to indicate the data source: 
  381.    * from a local file, from the fetch cache, from the fetch cache but had to 
  382.    * revalidate with the web server, or from a full Internet fetch.
  383.    * 
  384.    */
  385. #define INET_INFO_DATA_SOURCE  L"inet.info.dataSource"
  386. /*@}*/
  387. /**
  388.  * @name INET_COOKIE
  389.  *
  390.  * Cookie jars are represented by a VXIVector. Each element of the
  391.  * vector is a VXIMap that represents a cookie. The cookie VXIMap will
  392.  * contain zero or more properties, each of which represent properties
  393.  * of the cookie.
  394.  *
  395.  * The properties of the cookie VXIMap match the cookie attribute
  396.  * names as defined in RFC 2965. The only exceptions are as follows:
  397.  *
  398.  *  - INET_COOKIE_NAME, name of the cookie as defined in RFC 2965
  399.  *  - INET_COOKIE_VALUE, value of the cookie as defined in RFC 2965
  400.  *  - INET_COOKIE_EXPIRES, expiration time for the cookie as calculated
  401.  *        off the MaxAge parameter defined in RFC 2965 when the cookie
  402.  *        is accepted
  403.  *  - RFC 2965 Discard attribute: will never be returned in the VXIMap,
  404.  *        cookies with this flag set will never be returned by
  405.  *        GetCookieJar( )
  406.  */
  407. /*@{*/
  408.   /** Cookie name.  Value of the key is a VXIString. */
  409. #define INET_COOKIE_NAME         L"inet.cookie.NAME"
  410.   /** Cookie value key.  Value of the key is a VXIString. */
  411. #define INET_COOKIE_VALUE        L"inet.cookie.VALUE"   /* VXIString  */
  412.   /** Cookie expires key, calculated off the Max-Age property for the
  413.       cookie.  Value of the key is a VXIInteger giving time since the
  414.       epoch for expiration. */
  415. #define INET_COOKIE_EXPIRES      L"inet.cookie.EXPIRES"
  416.   /** Cookie comment, optional.  Value of the key is a VXIString. */
  417. #define INET_COOKIE_COMMENT      L"inet.cookie.Comment"
  418.   /** Cookie comment URL, optional.  Value of the key is a VXIString. */
  419. #define INET_COOKIE_COMMENT_URL  L"inet.cookie.CommentURL"
  420.   /** Cookie domain key.  Value of the key is a VXIString. */
  421. #define INET_COOKIE_DOMAIN       L"inet.cookie.Domain"
  422.   /** Cookie path key.  Value of the key is a VXIString. */
  423. #define INET_COOKIE_PATH         L"inet.cookie.Path"
  424.   /** Cookie port key, optional.  Value of the key is a VXIInteger. */
  425. #define INET_COOKIE_PORT         L"inet.cookie.Port"
  426.   /** Cookie secure key, optional.  Value of the key is a VXIInteger set
  427.       to 0 (FALSE) or 1 (TRUE). */
  428. #define INET_COOKIE_SECURE       L"inet.cookie.Secure"
  429.   /** Cookie standard version.  Value of the key is a VXIInteger. */
  430. #define INET_COOKIE_VERSION      L"inet.cookie.Version"
  431. /*@}*/
  432. /**
  433.  * @name VXIinetResult
  434.  *
  435.  * Result codes less then zero are severe errors (likely to be
  436.  * platform faults), those greater then zero are warnings (likely to
  437.  * be application issues)
  438.  */
  439. typedef enum VXIinetResult {
  440.   /** Fatal error, terminate call    */
  441.   VXIinet_RESULT_FATAL_ERROR       =  -100,
  442.   /** I/O error                      */
  443.   VXIinet_RESULT_IO_ERROR           =   -8,
  444.   /** Out of memory                  */
  445.   VXIinet_RESULT_OUT_OF_MEMORY      =   -7,
  446.   /** System error, out of service   */
  447.   VXIinet_RESULT_SYSTEM_ERROR       =   -6,
  448.   /** Errors from platform services  */
  449.   VXIinet_RESULT_PLATFORM_ERROR     =   -5,
  450.   /** Return buffer too small        */
  451.   VXIinet_RESULT_BUFFER_TOO_SMALL   =   -4,
  452.   /** Property name is not valid    */
  453.   VXIinet_RESULT_INVALID_PROP_NAME  =   -3,
  454.   /** Property value is not valid   */
  455.   VXIinet_RESULT_INVALID_PROP_VALUE =   -2,
  456.   /** Invalid function argument      */
  457.   VXIinet_RESULT_INVALID_ARGUMENT   =   -1,
  458.   /** Success                        */
  459.   VXIinet_RESULT_SUCCESS            =    0,
  460.   /** Normal failure, nothing logged */
  461.   VXIinet_RESULT_FAILURE            =    1,
  462.   /** Non-fatal non-specific error   */
  463.   VXIinet_RESULT_NON_FATAL_ERROR    =    2,
  464.   /** Named data not found           */
  465.   VXIinet_RESULT_NOT_FOUND          =   50,
  466.   /** URL fetch timeout              */
  467.   VXIinet_RESULT_FETCH_TIMEOUT      =   51,
  468.   /** Other URL fetch error          */
  469.   VXIinet_RESULT_FETCH_ERROR        =   52,
  470.   /** I/O operation would block      */
  471.   VXIinet_RESULT_WOULD_BLOCK        =   53,
  472.   /** End of stream                  */
  473.   VXIinet_RESULT_END_OF_STREAM      =   54,
  474.   /** Local file, told not to open it */
  475.   VXIinet_RESULT_LOCAL_FILE         =   55,
  476.   /** Conditional open attempted, cached
  477.       data may be used               */
  478.   VXIinet_RESULT_NOT_MODIFIED       =   57,
  479.   /** Operation is not supported     */
  480.   VXIinet_RESULT_UNSUPPORTED        =  100
  481. } VXIinetResult;
  482. /**
  483.  * Abstract interface for accessing Internet functionality including
  484.  * HTTP requests, local file access, URL caching, and cookie access. <p>
  485.  *
  486.  * The interface is a synchronous interface based on the ANSI/ISO C
  487.  * standard file I/O interface, the only exception is that pre-fetches are
  488.  * asynchronous. The client of the interface may use this in an
  489.  * asynchronous manner by using non-blocking I/O operations, creating
  490.  * threads, or by invoking this from a separate server process. <p>
  491.  *
  492.  * There is one Internet interface per thread/line.
  493.  */
  494. typedef struct VXIinetInterface {
  495.   /**
  496.    * Get the VXI interface version implemented
  497.    *
  498.    * @return  VXIint32 for the version number. The high high word is
  499.    *          the major version number, the low word is the minor version
  500.    *          number, using the native CPU/OS byte order. The current
  501.    *          version is VXI_CURRENT_VERSION as defined in VXItypes.h.
  502.    */
  503.   VXIint32 (*GetVersion)(void);
  504.   /**
  505.    * Get the name of the implementation
  506.    *
  507.    * @return  Implementation defined string that must be different from
  508.    *          all other implementations. The recommended name is one
  509.    *          where the interface name is prefixed by the implementator's
  510.    *          Internet address in reverse order, such as com.xyz.rec for
  511.    *          VXIrec from xyz.com. This is similar to how VoiceXML 1.0
  512.    *          recommends defining application specific error types.
  513.    */
  514.   const VXIchar* (*GetImplementationName)(void);
  515.   /**
  516.    * Prefetch information (non-blocking)
  517.    *
  518.    * Note that this is optional, it does not need to be called prior
  519.    * to Open( ). <p>
  520.    *
  521.    * Use the INET_PREFETCH_PRIORITY property to provide a hint to
  522.    * indicate the priority of the prefetch. Note that the
  523.    * implementation may opt to ignore the prefetch request (for
  524.    * example a low priority prefetch when the cache is already full
  525.    * with frequently used information). <p>
  526.    *
  527.    * @param moduleName  [IN] Name of the software module that is
  528.    *                      outputting the error. See the top of VXIlog.h
  529.    *                      for moduleName allocation rules.
  530.    * @param name        [IN] Name of the data to fetch, see Open( ) for
  531.    *                      a description of supported types
  532.    * @param mode        [IN] Reserved for future use, pass INET_MODE_READ
  533.    * @param flags       [IN] Reserved for future use, pass 0
  534.    * @param properties  [IN] Properties to control the prefetch, as listed
  535.    *                      above. May be NULL. Of particular note are:
  536.    *                    INET_PREFETCH_PRIORITY, hint to indicate whether
  537.    *                      and how soon to prefetch the data
  538.    *                    INET_URL_BASE, base URL for resolving relative URLs
  539.    *                    INET_URL_QUERY_ARGS, map containing key/value
  540.    *                      pairs for HTTP queries, where the name of each
  541.    *                      key is the query argument name, and the value of
  542.    *                      each key is a VXIValue subclass that provides the
  543.    *                      value for that argument
  544.    *
  545.    * @return VXIinet_RESULT_SUCCESS on success
  546.    */
  547.   VXIinetResult (*Prefetch)(struct VXIinetInterface *pThis,
  548.     const VXIchar           *moduleName,
  549.     const VXIchar           *name,
  550.     VXIinetOpenMode          mode,
  551.     VXIint32                 flags,
  552.     const VXIMap            *properties);
  553.   /**
  554.    * Open a stream for reading or writing
  555.    *
  556.    * All implementations must support opening a URL for reading using
  557.    * file:// or http:// access, and opening a platform dependant path
  558.    * for reading. All implementations must support all the flags for
  559.    * each of the above. For all other combinations support is
  560.    * implementation dependant (i.e. write for URLs and platform dependant
  561.    * paths). <p>
  562.    *
  563.    * For URLs, the only accepted unsafe characters are: { } [ ] ^ ~ '
  564.    * They will be escaped if only when processing a HTTP request. <p>
  565.    *
  566.    * @param moduleName   [IN] Name of the software module that is
  567.    *                       outputting the error. See the top of VXIlog.h
  568.    *                       for moduleName allocation rules.
  569.    * @param name         [IN] Name of the data to fetch, see above for
  570.    *                       supported types
  571.    * @param mode         [IN] Mode to open the data with, an INET_MODE
  572.    *                       value as defined above
  573.    * @param flags        [IN] Flags to control the open:
  574.    *                     INET_FLAG_NONBLOCKING_IO, non-blocking reads and
  575.    *                       writes, although the open and close is still
  576.    *                       blocking
  577.    * @param properties   [IN] Properties to control the open, as listed
  578.    *                       above. May be NULL. Of particular note are:
  579.    *                     INET_URL_BASE, base URL for resolving relative URLs
  580.    *                     INET_URL_QUERY_ARGS, map containing key/value
  581.    *                       pairs for HTTP queries, where the name of each
  582.    *                       key is the query argument name, and the value of
  583.    *                       each key is a VXIValue subclass that provides the
  584.    *                       value for that argument
  585.    * @param streamInfo   [OUT] (Optional, pass NULL if not required) Map
  586.    *                       that will be populated with information about
  587.    *                       the stream. See the INET_INFO_[...] keys listed
  588.    *                       above, with the implementation possibly setting
  589.    *                       other keys
  590.    * @param stream       [OUT] Handle to the opened stream
  591.    *
  592.    * @return VXIinet_RESULT_SUCCESS on success
  593.    */
  594.   VXIinetResult (*Open)(struct VXIinetInterface  *pThis,
  595. const VXIchar            *moduleName,
  596. const VXIchar            *name,
  597. VXIinetOpenMode           mode,
  598. VXIint32                  flags,
  599. const VXIMap             *properties,
  600. VXIMap                   *streamInfo,
  601. VXIinetStream           **stream);
  602.   /**
  603.    * Close a previously opened stream
  604.    * Close a stream that was previously opened. Closing a NULL or
  605.    * previously closed stream will result in an error.
  606.    *
  607.    * @param stream       [IN/OUT] Stream to close
  608.    *
  609.    * @return VXIinet_RESULT_SUCCESS on success
  610.    */
  611.   VXIinetResult (*Close)(struct VXIinetInterface  *pThis,
  612.  VXIinetStream           **stream);
  613.   /**
  614.    * Read from a stream
  615.    *
  616.    * This may or not block, as determined by the flags used when opening
  617.    * the stream. When in non-blocking mode, partial buffers may be
  618.    * returned instead of blocking, or an VXIinet_RESULT_WOULD_BLOCK error
  619.    * is returned if no data is available at all.
  620.    *
  621.    * NOTE: VXIinet_RESULT_END_OF_STREAM may be returned even when
  622.    *   nread is greater then 0.  Example: if there are 20 more bytes
  623.    *   remaining in a stream and the client component requests 50
  624.    *   bytes via Read( ), the implementation should return
  625.    *   VXIinet_RESULT_END_OF_STREAM with nread = 20. If the client
  626.    *   component then (incorrectly) requests 50 more bytes via Read( ),
  627.    *   return VXIinet_RESULT_END_OF_STREAM again with nread = 0.
  628.    *
  629.    * @param buffer   [OUT] Buffer that will receive data from the stream
  630.    * @param buflen   [IN] Length of buffer, in bytes
  631.    * @param nread    [OUT] Number of bytes actual read, may be less then
  632.    *                   buflen if the end of the stream was found, or if
  633.    *                   using non-blocking I/O and there is currently no
  634.    *                   more data available to read
  635.    * @param stream   [IN] Handle to the stream to read from
  636.    *
  637.    * @return VXIinet_RESULT_SUCCESS on success
  638.    */
  639.   VXIinetResult (*Read)(struct VXIinetInterface *pThis,
  640. VXIbyte                 *buffer,
  641. VXIulong                 buflen,
  642. VXIulong                *nread,
  643. VXIinetStream           *stream);
  644.   /**
  645.    * Write to a stream
  646.    *
  647.    * This may or not block, as determined by the flags used when opening
  648.    * the stream. When in non-blocking mode, partial writes may occur
  649.    * instead of blocking, or an VXIinet_RESULT_WOULD_BLOCK error
  650.    * is returned if no data could be written at all.
  651.    *
  652.    * @param buffer   [OUT] Buffer of data to write to the stream
  653.    * @param buflen   [IN] Number of bytes to write
  654.    * @param nwritten [OUT] Number of bytes actual written, may be less then
  655.    *                   buflen if an error is returned, or if using
  656.    *                   non-blocking I/O and the write operation would block
  657.    * @param stream   [IN] Handle to the stream to write to
  658.    *
  659.    * @return VXIinet_RESULT_SUCCESS on success
  660.    */
  661.   VXIinetResult (*Write)(struct VXIinetInterface *pThis,
  662.  const VXIbyte           *buffer,
  663.  VXIulong                 buflen,
  664.  VXIulong                *nwritten,
  665.  VXIinetStream           *stream);
  666.   /**
  667.    * Set the cookie jar
  668.    *
  669.    * The cookie jar is used to provide cookies and store cookies
  670.    * during future VXIinet Prefetch( ) and Open( ) operations. Expired
  671.    * cookies within the jar will not be used. Each time this is called
  672.    * the prior cookie jar is discarded, the caller is responsible for
  673.    * persistent storage of the cookie jar if desired. See
  674.    * GetCookieJar( ) for details.
  675.    *
  676.    * If SetCookieJar( ) is never called, or if it is called with a
  677.    * NULL jar, the VXIinet implementation will refuse to accept
  678.    * cookies for fetches.
  679.    *
  680.    * @param jar     [IN] Cookie jar, specified as a VXIVector (see the
  681.    *                  description of the cookie jar structure above).
  682.    *                  Pass NULL to refuse all cookies. Pass an empty
  683.    *                  VXIVector to accept new cookies starting with an
  684.    *                  empty jar. Pass a non-empty VXIVector as returned
  685.    *                  by GetCookieJar( ) to implement persist cookies
  686.    *                  across multiple user sessions (telephone calls).
  687.    *
  688.    * @return VXIinet_RESULT_SUCCESS on success
  689.    */
  690.   VXIinetResult (*SetCookieJar)(struct VXIinetInterface  *pThis,
  691. const VXIVector          *jar);
  692.   /**
  693.    * Get the cookie jar
  694.    *
  695.    * The caller of VXIinet is responsible for persistent storage of
  696.    * the cookie jar if desired. This is done by calling SetCookieJar( )
  697.    * with the caller's cookie jar at the start of each call (use an
  698.    * empty cookie jar if this is a new caller), then calling this
  699.    * function to retrieve the updated cookie jar at the end of the
  700.    * call for storage. When the cookie jar is returned, any expired
  701.    * cookies will have been deleted.
  702.    *
  703.    * @param jar     [OUT] Cookie jar, returned as a newly allocated
  704.    *                  VXIVector (see the description of the cookie jar
  705.    *                  structure above, it may be empty). The client
  706.    *                  is responsible for destroying this via
  707.    *                  VXIVectorDestroy( ) when appropriate.
  708.    * @param changed [OUT] Flag to indicate whether the cookie jar
  709.    *                  has been modified since SetCookieJar( ), allows
  710.    *                  suppressing the write of the cookie jar to
  711.    *                  persistant storage when that operation is
  712.    *                  expensive. Pass NULL if this information is not
  713.    *                  desired.
  714.    *
  715.    * @return VXIinet_RESULT_SUCCESS on success
  716.    */
  717.   VXIinetResult (*GetCookieJar)(struct VXIinetInterface  *pThis,
  718. VXIVector               **jar,
  719. VXIbool                  *changed);
  720.   /**
  721.    * Get absolute URI
  722.    *
  723.    * To get the canonical absolute URI from a base/relative URI pair.
  724.    * @param moduleName    [IN] Name of the software module that is
  725.    *                           outputting the error. See the top of VXIlog.h
  726.    *                           for moduleName allocation rules.
  727.    * @param name          [IN] Name of the data to canonicalize, see above for
  728.    *                           supported types
  729.    * @param properties    [IN] Properties to control the canonicalization,
  730.    *                        may be NULL. Of particular note are:
  731.    *                        INET_URL_BASE, base URL for resolving relative URLs
  732.    *                        INET_URL_QUERY_ARGS, map containing key/value
  733.    *                        pairs for HTTP queries, where the name of each
  734.    *                        key is the query argument name, and the value of
  735.    *                        each key is a VXIValue subclass that provides the
  736.    *                        value for that argument
  737.    * @param absoluteName  [OUT] The absolute URI after the canonicalization,
  738.    *                            may be NULL if an error occured.
  739.    *
  740.    * @return VXIinet_RESULT_SUCCESS on success
  741.    */   
  742.   VXIinetResult (*GetAbsoluteName)(struct VXIinetInterface  *pThis,
  743.                                    const VXIchar            *moduleName,
  744.                                    const VXIchar            *name,
  745.                                    const VXIMap             *properties,
  746.                                    VXIString                **absoluteName);  
  747. } VXIinetInterface;
  748. /*@}*/
  749. #ifdef __cplusplus
  750. }
  751. #endif
  752. #include "VXIheaderSuffix.h"
  753. #endif  /* include guard */