ncbi_connection.h
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:16k
源码类别:

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: ncbi_connection.h,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 18:44:35  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R6.19
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef CONNECT___NCBI_CONNECTION__H
  10. #define CONNECT___NCBI_CONNECTION__H
  11. /*  $Id: ncbi_connection.h,v 1000.2 2004/06/01 18:44:35 gouriano Exp $
  12.  * ===========================================================================
  13.  *
  14.  *                            PUBLIC DOMAIN NOTICE
  15.  *               National Center for Biotechnology Information
  16.  *
  17.  *  This software/database is a "United States Government Work" under the
  18.  *  terms of the United States Copyright Act.  It was written as part of
  19.  *  the author's official duties as a United States Government employee and
  20.  *  thus cannot be copyrighted.  This software/database is freely available
  21.  *  to the public for use. The National Library of Medicine and the U.S.
  22.  *  Government have not placed any restriction on its use or reproduction.
  23.  *
  24.  *  Although all reasonable efforts have been taken to ensure the accuracy
  25.  *  and reliability of the software and data, the NLM and the U.S.
  26.  *  Government do not and cannot warrant the performance or results that
  27.  *  may be obtained by using this software or data. The NLM and the U.S.
  28.  *  Government disclaim all warranties, express or implied, including
  29.  *  warranties of performance, merchantability or fitness for any particular
  30.  *  purpose.
  31.  *
  32.  *  Please cite the author in any work or product based on this material.
  33.  *
  34.  * ===========================================================================
  35.  *
  36.  * Author:  Denis Vakatov
  37.  *
  38.  * File Description:
  39.  *   Generic API to open and handle connection to an abstract I/O service.
  40.  *   Several methods can be used to establish the connection, and each of them
  41.  *   yields in a simple handle(of type "CONN") that contains a handle(of type
  42.  *   "CONNECTOR") to a data and methods implementing the generic connection I/O
  43.  *   operations. E.g. this API can be used to:
  44.  *     1) connect using HTTPD-based dispatcher (e.g. to NCBI services);
  45.  *     2) hit a CGI script;
  46.  *     3) connect to a bare socket at some "host:port";
  47.  *     4) whatever else can fit this paradigm -- see the SConnectorTag-related
  48.  *        structures;  e.g. it could be a plain file I/O or even a memory area.
  49.  *
  50.  *  See in "ncbi_connector.h" for the detailed specification of the underlying
  51.  *  connector("CONNECTOR", "SConnectorTag") methods and data structures.
  52.  *
  53.  */
  54. #include <connect/ncbi_connector.h>
  55. /** @addtogroup Connectors
  56.  *
  57.  * @{
  58.  */
  59. #ifdef __cplusplus
  60. extern "C" {
  61. #endif
  62. struct SConnectionTag;
  63. typedef struct SConnectionTag* CONN;      /* connection handle */
  64. /* Compose all data necessary to establish a new connection
  65.  * (merely bind it to the specified connector). Unsuccessful completion
  66.  * sets conn to 0, and leaves connector intact (can be used again).
  67.  * NOTE1:  The real connection will not be established right away. Instead,
  68.  *         it will be established at the moment of the first call to one of
  69.  *         "Flush", "Wait", "WaitAsync", "Write", or "Read" methods.
  70.  * NOTE2:  "Connection establishment" at this level of abstraction may differ
  71.  *         from actual link establishment at the underlying connector's level.
  72.  * NOTE3:  Initial timeout values are set to CONN_DEFAULT_TIMEOUT, meaning
  73.  *         that connector-specific timeouts are in force for the connection.
  74.  */
  75. extern NCBI_XCONNECT_EXPORT EIO_Status CONN_Create
  76. (CONNECTOR connector,  /* [in]  connector                        */
  77.  CONN*     conn        /* [out] handle of the created connection */
  78.  );
  79. /* Reinit, using "connector".
  80.  * If "conn" is already opened then close the current connection at first,
  81.  * even if "connector" is just the same as the current connector.
  82.  * If "connector" is NULL then close and destroy current connector, and leave
  83.  * connection empty (effective way to destroy connector(s)).
  84.  * NOTE:  Although it closes the previous connection immediately, however it
  85.  *        does not open the new connection right away -- see notes to "Create".
  86.  */
  87. extern NCBI_XCONNECT_EXPORT EIO_Status CONN_ReInit
  88. (CONN      conn,      /* [in] connection handle */
  89.  CONNECTOR connector  /* [in] new connector     */
  90.  );
  91. /* Get verbal representation of connection type as a character string.
  92.  * Note that the returned value is only valid until the next
  93.  * I/O operation in the connection. Return value NULL denotes
  94.  * unknown connection type.
  95.  */
  96. extern NCBI_XCONNECT_EXPORT const char* CONN_GetType
  97. (CONN conn  /* [in]  connection handle */ 
  98.  );
  99. /* Return human-readable description of the connection as a character
  100.  * 0-terminated string. The string is not guaranteed to have any
  101.  * particular format and is intended solely for something like
  102.  * logging and debugging. Return NULL if the connection cannot
  103.  * provide any description information (or if it is in a bad state).
  104.  * Application program is responsible to deallocate the space occupied
  105.  * by the returned string calling free() when the description is no longer
  106.  * needed.
  107.  */
  108. extern NCBI_XCONNECT_EXPORT char* CONN_Description
  109. (CONN conn  /* [in]  connection handle */
  110.  );
  111. /* Specify timeout for the connection I/O (including "Connect" (aka "Open")
  112.  * and "Close"). May be called at any time during the connection lifetime.
  113.  * NOTE1:  if "new_timeout" is NULL then set the timeout to be infinite.
  114.  * NOTE2:  if "new_timeout" is CONN_DEFAULT_TIMEOUT then underlying
  115.  *         connector-specific value is used (this is the default).
  116.  */
  117. extern NCBI_XCONNECT_EXPORT EIO_Status CONN_SetTimeout
  118. (CONN            conn,        /* [in] connection handle */
  119.  EIO_Event       event,       /* [in] I/O direction     */
  120.  const STimeout* new_timeout  /* [in] new timeout       */
  121.  );
  122. /* Retrieve current timeout (return NULL if it is infinite).
  123.  * The returned pointer is guaranteed to point to the valid timeout structure
  124.  * (or be either NULL or CONN_DEFAULT_TIMEOUT) until the next "SetTimeout"
  125.  * or "Close" method's call.
  126.  */
  127. extern NCBI_XCONNECT_EXPORT const STimeout* CONN_GetTimeout
  128. (CONN      conn,  /* [in] connection handle                  */
  129.  EIO_Event event  /* [in] I/O direction, not "eIO_ReadWrite" */
  130.  );
  131. /* Block on the connection until it becomes available for either read or
  132.  * write (dep. on "event"), or until the timeout expires, or until any error.
  133.  * NOTE:  "timeout" can also be one of two special values:
  134.  *         NULL (means infinite), CONN_DEFAULT_TIMEOUT (connector-defined).
  135.  */
  136. extern NCBI_XCONNECT_EXPORT EIO_Status CONN_Wait
  137. (CONN            conn,    /* [in] connection handle                  */
  138.  EIO_Event       event,   /* [in] can be eIO_Read or eIO_Write only! */
  139.  const STimeout* timeout  /* [in] the maximal wait time              */
  140.  );
  141. /* Write "size" bytes from the mem.buffer "buf" to the connection.
  142.  * In "*n_written", return the number of successfully written bytes.
  143.  * Parameter "how" modifies behavior of CONN_Write():
  144.  * eIO_WritePlain   -- return eIO_Success if some data were written and
  145.  *                     yet write timeout had not occurred, error otherwise;
  146.  * eIO_WritePersist -- return eIO_Success only if all data were written and
  147.  *                     yet write timeout had not occurred, error otherwise.
  148.  * NOTE:  See CONN_SetTimeout() hoe to set write timeout.
  149.  */
  150. extern NCBI_XCONNECT_EXPORT EIO_Status CONN_Write
  151. (CONN            conn,      /* [in]  connection handle                     */ 
  152.  const void*     buf,       /* [in]  pointer to the data buffer to write   */ 
  153.  size_t          size,      /* [in]  # of bytes to write                   */ 
  154.  size_t*         n_written, /* [out, non-NULL] # of actually written bytes */
  155.  EIO_WriteMethod how        /* [in]  eIO_WritePlain or eIO_WritePersist    */
  156.  );
  157. /* Push back "size" bytes from the mem.buffer "buf" into connection.
  158.  * Return eIO_Success on success, other code on an error.
  159.  * NOTE1:  Data pushed back are not necessarily those taken from the
  160.  *         connection before.
  161.  * NOTE2:  Upon successive read operation, the pushed back data are
  162.  *         taken out first.
  163.  */
  164. extern NCBI_XCONNECT_EXPORT EIO_Status CONN_PushBack
  165. (CONN        conn,  /* [in]  connection handle                     */
  166.  const void* buf,   /* [in]  pointer to the data being pushed back */
  167.  size_t      size   /* [in]  # of bytes to push back               */
  168.  );
  169. /* Explicitly flush to the connection all data written by "CONN_Write()".
  170.  * NOTE1:  CONN_Flush() effectively opens connection (if it wasn't open yet).
  171.  * NOTE2:  Connection considered open if underlying connector's "Open" method
  172.  *         has successfully executed; actual data link may not yet exist.
  173.  * NOTE3:  CONN_Read() always calls CONN_Flush() before proceeding.
  174.  *         So does CONN_Close() but only if connection is was open before.
  175.  */
  176. extern NCBI_XCONNECT_EXPORT EIO_Status CONN_Flush
  177. (CONN conn              /* [in] connection handle                      */ 
  178.  );
  179. /* Read up to "size" bytes from a connection to the buffer to pointed by "buf".
  180.  * In "*n_read", return the number of successfully read bytes.
  181.  * If there is absolutely no data available to read and the timeout (see
  182.  * CONN_SetTimeout()) is expired then return eIO_Timeout (and "*n_read" := 0).
  183.  * The arg "how" means:
  184.  *   eIO_ReadPlain   -- read presently available data only and return
  185.  *   eIO_ReadPeek    -- eIO_ReadPlain but dont discard read data from inp.queue
  186.  *   eIO_ReadPersist -- try to read exactly "n" bytes;  return eIO_Timeout if
  187.  *                      could not read the requested # of bytes, and read
  188.  *                      timeout has expired.
  189.  */
  190. extern NCBI_XCONNECT_EXPORT EIO_Status CONN_Read
  191. (CONN           conn,   /* [in]  connection handle                  */
  192.  void*          buf,    /* [out] memory buffer to read to           */
  193.  size_t         size,   /* [in]  max. # of bytes to read            */
  194.  size_t*        n_read, /* [out, non-NULL] # of actually read bytes */
  195.  EIO_ReadMethod how     /* [in]  read/peek | persist                */
  196.  );
  197. /* Read up to "size" bytes from a connection into the string buffer pointed
  198.  * to by "line".  Stop reading if either 'n' or an error is encountered.
  199.  * Replace 'n' with ''.  Upon return "*n_read" contains the number
  200.  * of characters written to "line", not including the terminating ''.
  201.  * If not enough space provided in "line" to accomodate the ''-terminated
  202.  * line, then all "size" bytes are used and "*n_read" equals "size" on return.
  203.  * This is the only case when "line" will not be ''-terminated.
  204.  * Return code advises the caller whether another line read can be attempted:
  205.  *   eIO_Success -- read completed successfully, keep reading;
  206.  *   other code  -- an error occurred, and further attempt may fail.
  207.  *
  208.  * This call utilizes eIO_Read timeout as set by CONN_SetTimeout().
  209.  */
  210. extern NCBI_XCONNECT_EXPORT EIO_Status CONN_ReadLine
  211. (CONN    conn,
  212.  char*   line,
  213.  size_t  size,
  214.  size_t* n_read
  215.  );
  216. /* Obtain status of the last IO operation. This is NOT a completion
  217.  * code of the last CONN-call, but rather a status from the lower level
  218.  * connector's layer.
  219.  */
  220. extern NCBI_XCONNECT_EXPORT EIO_Status CONN_Status
  221. (CONN      conn,   /* [in]  connection handle       */
  222.  EIO_Event dir     /* [in] = {eIO_Read | eIO_Write} */
  223.  );
  224. /* Close the connection, destroy relevant internal data.
  225.  * NOTE:  whatever error code is returned, the connection handle "conn"
  226.  *        will become invalid (so, you should not use it anymore).
  227.  */
  228. extern NCBI_XCONNECT_EXPORT EIO_Status CONN_Close
  229. (CONN conn  /* [in] connection handle */
  230.  );
  231. /* Set user callback function to be called upon an event specified by the
  232.  * callback type. Note that the callback function is always called prior to
  233.  * the event to happen, e.g. the eCONN_OnClose callback is called when
  234.  * the connection is about to close, but not closed yet.
  235.  * The callback function is supplied with 3 arguments: connection handle,
  236.  * type of event, and user data (specified when the callback was set).
  237.  * CONN_SetCallback stores previous callback in "old_cb" (if it is not NULL).
  238.  */
  239. typedef enum {
  240.     eCONN_OnClose = 0
  241. #define CONN_N_CALLBACKS 1
  242. } ECONN_Callback;
  243. typedef void (*FConnCallback)(CONN conn, ECONN_Callback type, void* data);
  244. typedef struct {
  245.     FConnCallback func;  /* Function to call on event                */
  246.     void*         data;  /* Data to pass to the callback as last arg */
  247. } SCONN_Callback;
  248. extern NCBI_XCONNECT_EXPORT EIO_Status CONN_SetCallback
  249. (CONN                  conn,    /* [in]  connection to set callback for     */
  250.  ECONN_Callback        type,    /* [in]  callback type                      */
  251.  const SCONN_Callback* new_cb,  /* [in]  callback to set (may be 0)         */
  252.  SCONN_Callback*       old_cb   /* [out] to save old callback at (may be 0) */
  253. );
  254. #ifdef IMPLEMENTED__CONN_WaitAsync
  255. /* Wait for an asynchronous I/O event, then call the specified handler.
  256.  * In the "handler" function:
  257.  *   "event"  -- is the I/O direction where the async. event happened
  258.  *   "status" -- must be "eIO_Success" if it is ready for I/O
  259.  *   "data"   -- callback data (passed as "data" in CONN_WaitAsync())
  260.  * If "handler" is NULL then discard the current handler, if any.
  261.  * The "cleanup" function to be called right after the call to "handler" or
  262.  * by CONN_Close(), or if the handler is reset by calling CONN_WaitAsync()
  263.  * again -- whichever happens first.
  264.  */
  265. typedef void (*FConnAsyncHandler)
  266. (CONN       conn,
  267.  EIO_Event  event,
  268.  EIO_Status status,
  269.  void*      data
  270. );
  271. typedef void (*FConnAsyncCleanup)(void* data);
  272. extern EIO_Status CONN_WaitAsync
  273. (CONN              conn,      /* [in] connection handle */
  274.  EIO_Event         event,     /* [in] I/O direction     */
  275.  FConnAsyncHandler handler,   /* [in] callback function */
  276.  void*             data,      /* [in] callback data     */
  277.  FConnAsyncCleanup cleanup    /* [in] cleanup procedure */
  278.  );
  279. #endif /* IMPLEMENTED__CONN_WaitAsync */
  280. #ifdef __cplusplus
  281. }  /* extern "C" */
  282. #endif
  283. /* @} */
  284. /*
  285.  * ---------------------------------------------------------------------------
  286.  * $Log: ncbi_connection.h,v $
  287.  * Revision 1000.2  2004/06/01 18:44:35  gouriano
  288.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R6.19
  289.  *
  290.  * Revision 6.19  2004/05/24 19:58:29  lavr
  291.  * +NCBI_XCONNECT_EXPORT for CONN_ReadLine()
  292.  *
  293.  * Revision 6.18  2004/05/24 19:53:30  lavr
  294.  * +CONN_ReadLine()
  295.  *
  296.  * Revision 6.17  2004/02/23 15:23:36  lavr
  297.  * New (last) parameter "how" added in CONN_Write() API call
  298.  *
  299.  * Revision 6.16  2003/05/14 03:47:12  lavr
  300.  * +CONN_Description()
  301.  *
  302.  * Revision 6.15  2003/04/09 17:58:43  siyan
  303.  * Added doxygen support
  304.  *
  305.  * Revision 6.14  2003/01/15 19:50:17  lavr
  306.  * +CONN_PushBack()
  307.  *
  308.  * Revision 6.13  2003/01/08 01:59:32  lavr
  309.  * DLL-ize CONNECT library for MSVC (add NCBI_XCONNECT_EXPORT)
  310.  *
  311.  * Revision 6.12  2002/09/19 18:00:04  lavr
  312.  * Header file guard macro changed
  313.  *
  314.  * Revision 6.11  2002/09/06 15:40:32  lavr
  315.  * More comments and notes to the API
  316.  *
  317.  * Revision 6.10  2002/08/07 16:27:33  lavr
  318.  * EIO_ReadMethod enums changed accordingly; log moved to the bottom
  319.  *
  320.  * Revision 6.9  2001/08/20 20:00:22  vakatov
  321.  * CONN_SetTimeout() to return "EIO_Status".
  322.  *
  323.  * Revision 6.8  2001/06/28 22:00:31  lavr
  324.  * Added function: CONN_SetCallback
  325.  * Added callback: eCONN_OnClose
  326.  *
  327.  * Revision 6.7  2001/04/24 21:19:29  lavr
  328.  * Introduced CONN_DEFAULT_TIMEOUT for use as a CONNECTOR-specific timeout
  329.  *
  330.  * Revision 6.6  2001/03/02 20:07:33  lavr
  331.  * Typo fixed
  332.  *
  333.  * Revision 6.5  2001/02/09 17:33:38  lavr
  334.  * CONN_GetType added
  335.  *
  336.  * Revision 6.4  2001/01/03 22:29:22  lavr
  337.  * Changed IOStatus -> Status
  338.  *
  339.  * Revision 6.3  2000/12/29 17:43:42  lavr
  340.  * Pretty printed;
  341.  * Reconnect renamed to ReInit with ability to close current connector
  342.  *
  343.  * Revision 6.2  2000/04/07 19:59:47  vakatov
  344.  * Moved forward-declaration of CONNECTOR from "ncbi_connection.h"
  345.  * to "ncbi_connector.h"
  346.  *
  347.  * Revision 6.1  2000/03/24 22:52:20  vakatov
  348.  * Initial revision
  349.  *
  350.  * ===========================================================================
  351.  */
  352. #endif /* CONNECT___NCBI_CONNECTION__H */