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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: ncbi_connector.h,v $
  4.  * PRODUCTION Revision 1000.0  2003/10/29 16:29:56  gouriano
  5.  * PRODUCTION PRODUCTION: IMPORTED [ORIGINAL] Dev-tree R6.16
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef CONNECT___NCBI_CONNECTOR__H
  10. #define CONNECT___NCBI_CONNECTOR__H
  11. /*  $Id: ncbi_connector.h,v 1000.0 2003/10/29 16:29:56 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.  *   Specifications to implement a connector("CONNECTOR") to be used to open
  40.  *   and handle connection("CONN", see also in "ncbi_connection.[ch]") to an
  41.  *   abstract I/O service. This is generally not for the public use.
  42.  *   It is to be used in the modules that implement a particular connector.
  43.  *
  44.  */
  45. #include <connect/ncbi_core.h>
  46. /** @addtogroup Connectors
  47.  *
  48.  * @{
  49.  */
  50. #ifdef __cplusplus
  51. extern "C" {
  52. #endif
  53. struct SConnectorTag;
  54. typedef struct SConnectorTag* CONNECTOR;  /* connector handle */
  55. /* Function type definitions for the connector method table.
  56.  * The arguments & the behavior of "FConnector***" functions are mostly just
  57.  * the same as those for their counterparts "CONN_***" in ncbi_connection.h.
  58.  * First argument of these functions accepts a real connector handle
  59.  * rather than a connection handle("CONN").
  60.  * In every call, which has STimeout as an argument, this argument
  61.  * can be either NULL, CONN_DEFAULT_TIMEOUT, or other non-NULL pointer,
  62.  * pointing to finite timeout structure. NULL is treated as an infinite
  63.  * timeout, while CONN_DEFAULT_TIMEOUT means to use any timeout, which
  64.  * is somehow pre-defined by the connector itself.
  65.  */
  66. /* Get the name of the connector (may be NULL on error)
  67.  */
  68. typedef const char* (*FConnectorGetType)
  69. (CONNECTOR       connector
  70.  );
  71. /* Get the human readable connector's description (may be NULL on error)
  72.  */
  73. typedef char* (*FConnectorDescr)
  74. (CONNECTOR       connector
  75.  );
  76. /* Open connection. Used to setup all related data structures,
  77.  * but not necessarily has to actually open the data channel.
  78.  */
  79. typedef EIO_Status (*FConnectorOpen)
  80. (CONNECTOR       connector,
  81.  const STimeout* timeout
  82.  );
  83. /* Wait until either read or write (dep. on the "direction" value) becomes
  84.  * available, or until "timeout" expires, or until error occurs.
  85.  * NOTE 1:  FConnectorWait is guaranteed to be called after FConnectorOpen,
  86.  *          and only if FConnectorOpen returned "eIO_Success".
  87.  * NOTE 2:  "event" is guaranteed to be either "eIO_Read" or "eIO_Write".
  88.  */
  89. typedef EIO_Status (*FConnectorWait)
  90. (CONNECTOR       connector,
  91.  EIO_Event       event,
  92.  const STimeout* timeout
  93.  );
  94. /* The passed "n_written" is always non-NULL, and "*n_written" is always zero.
  95.  * It returns "eIO_Success" if at least some data have been successfully
  96.  * written; other error code if no data at all have been written.
  97.  * It returns the # of successfully written data (in bytes) in "*n_written".
  98.  * NOTE:  FConnectorWrite is guaranteed to be called after FConnectorOpen,
  99.  *        and only if the latter succeeded (returned "eIO_Success").
  100.  */
  101. typedef EIO_Status (*FConnectorWrite)
  102. (CONNECTOR       connector,
  103.  const void*     buf,
  104.  size_t          size,
  105.  size_t*         n_written,
  106.  const STimeout* timeout
  107.  );
  108. /* Flush yet unwritten output data, if any.
  109.  * NOTE:  FConnectorFlush is guaranteed to be called after FConnectorOpen,
  110.  *        and only if the latter succeeded (returned "eIO_Success").
  111.  */
  112. typedef EIO_Status (*FConnectorFlush)
  113. (CONNECTOR       connector,
  114.  const STimeout* timeout
  115.  );
  116. /* The passed "n_read" is always non-NULL, and "*n_read" is always zero.
  117.  * It returns "eIO_Success" if at least some data have been successfully
  118.  * read; other error code if no data at all have been read.
  119.  * The number of successfully read bytes returned in "*n_read".
  120.  * NOTE:  FConnectorRead is guaranteed to be called after FConnectorOpen,
  121.  *        and only if the latter succeeded (returned "eIO_Success").
  122.  */
  123. typedef EIO_Status (*FConnectorRead)
  124. (CONNECTOR       connector,
  125.  void*           buf,
  126.  size_t          size,
  127.  size_t*         n_read,
  128.  const STimeout* timeout
  129.  );
  130. /* Obtain last I/O completion code from the transport level (connector).
  131.  * NOTE 1:  FConnectorStatus is guaranteed to be called after FConnectorOpen,
  132.  *          and only if the latter succeeded (returned "eIO_Success").
  133.  * NOTE 2:  "direction" is guaranteed to be either "eIO_Read" or "eIO_Write".
  134.  * NOTE 3:  Should return "eIO_Success" in case of inexistent (incomplete)
  135.  *          low level transport, if any.
  136.  */
  137. typedef EIO_Status (*FConnectorStatus)
  138. (CONNECTOR       connector,
  139.  EIO_Event       direction
  140.  );
  141.           
  142. /* Close data link (if any) and cleanup related data structures.
  143.  * NOTE 1:  FConnectorClose is guaranteed to be called after FConnectorOpen,
  144.  *          and only if the latter succeeded (returned "eIO_Success").
  145.  * NOTE 2:  FConnectorFlush gets called before FConnectorClose automatically.
  146.  */
  147. typedef EIO_Status (*FConnectorClose)
  148. (CONNECTOR       connector,
  149.  const STimeout* timeout
  150.  );
  151. /* Standard set of connector methods to handle a connection (corresponding
  152.  * connectors are also here), part of connection handle("CONN").
  153.  */
  154. typedef struct {
  155.     FConnectorGetType   get_type;    CONNECTOR c_get_type;
  156.     FConnectorDescr     descr;       CONNECTOR c_descr;
  157.     FConnectorOpen      open;        CONNECTOR c_open;
  158.     FConnectorWait      wait;        CONNECTOR c_wait;
  159. #ifdef IMPLEMENTED__CONN_WaitAsync
  160.     FConnectorWaitAsync wait_async;  CONNECTOR c_wait_async;
  161. #endif
  162.     FConnectorWrite     write;       CONNECTOR c_write;
  163.     FConnectorFlush     flush;       CONNECTOR c_flush;
  164.     FConnectorRead      read;        CONNECTOR c_read;
  165.     FConnectorStatus    status;      CONNECTOR c_status;
  166.     FConnectorClose     close;       CONNECTOR c_close;
  167.     const STimeout*     default_timeout; /* default timeout pointer     */
  168.     STimeout            default_tmo;     /* storage for default_timeout  */
  169.     CONNECTOR           list;
  170. } SMetaConnector;
  171. #define CONN_TWO2ONE(a, b)   a##b
  172. #define CONN_SET_METHOD(meta, method, function, connector) 
  173.     do {                                                   
  174.         meta->method = function;                           
  175.         meta->CONN_TWO2ONE(c_,method) = connector;         
  176.     } while (0);
  177. #define CONN_SET_DEFAULT_TIMEOUT(meta, timeout)            
  178.     do {                                                   
  179.         if (timeout) {                                     
  180.             meta->default_timeout = &meta->default_tmo;    
  181.             meta->default_tmo     = *timeout;              
  182.         } else                                             
  183.             meta->default_timeout = 0;                     
  184.     } while (0);
  185. /* Insert a connector in the beginning of the connection's list of connectors.
  186.  */
  187. extern NCBI_XCONNECT_EXPORT EIO_Status METACONN_Add
  188. (SMetaConnector* meta,
  189.  CONNECTOR       connector
  190.  );
  191. /* Delete given "connector" all its descendants (all connectors if "connector"
  192.  * is 0) from the connections's list of connectors. FConnectorDestroy is
  193.  * called for each removed connector.
  194.  */
  195. extern NCBI_XCONNECT_EXPORT EIO_Status METACONN_Remove
  196. (SMetaConnector* meta,
  197.  CONNECTOR       connector
  198.  );
  199. /* Upcall on request to setup virtual function table (called from connection).
  200.  */
  201. typedef void (*FSetupVTable)
  202. (SMetaConnector* meta,
  203.  CONNECTOR       connector
  204.  );
  205. /* Destroy connector and its data handle. This is NOT a close request!
  206.  * Should not to be used on open connectors (that is, for those
  207.  * FConnectorClose has to be called first prior to this call).
  208.  */
  209. typedef void (*FDestroy)
  210. (CONNECTOR       connector
  211.  );
  212. /* Connector specification.
  213.  */
  214. typedef struct SConnectorTag {
  215.     void*                handle;    /* data handle of the connector */
  216.     CONNECTOR            next;      /* linked list                  */
  217.     SMetaConnector*      meta;      /* back link to CONNECTION      */
  218.     FSetupVTable         setup;     /* used in CONNECTION init      */
  219.     FDestroy             destroy;   /* destroys handle, can be NULL */
  220. } SConnector;
  221. #ifdef IMPLEMENTED__CONN_WaitAsync
  222. typedef struct {
  223.   CONN                   conn;
  224.   EIO_Event              event;
  225.   FConnAsyncHandler      handler;
  226.   void*                  data;
  227.   FConnAsyncCleanup      cleanup;
  228. } SConnectorAsyncHandler;
  229. typedef void (*FConnectorAsyncHandler)
  230. (SConnectorAsyncHandler* data,
  231.  EIO_Event               event,
  232.  EIO_Status              status
  233.  );
  234. typedef EIO_Status (*FConnectorWaitAsync)
  235. (CONNECTOR               connector,
  236.  FConnectorAsyncHandler  func,
  237.  SConnectorAsyncHandler* data
  238.  );
  239. #endif /* IMPLEMENTED__CONN_WaitAsync */
  240. #ifdef __cplusplus
  241. }  /* extern "C" */
  242. #endif
  243. /* @} */
  244. /*
  245.  * --------------------------------------------------------------------------
  246.  * $Log: ncbi_connector.h,v $
  247.  * Revision 1000.0  2003/10/29 16:29:56  gouriano
  248.  * PRODUCTION: IMPORTED [ORIGINAL] Dev-tree R6.16
  249.  *
  250.  * Revision 6.16  2003/08/25 14:47:59  lavr
  251.  * Get rid of old ...TIMEOUT constants [now replaced with k...Timeout]
  252.  *
  253.  * Revision 6.15  2003/05/21 17:52:37  lavr
  254.  * Pre- and post-conditions clarified for read and write virtual methods
  255.  *
  256.  * Revision 6.14  2003/05/14 03:47:53  lavr
  257.  * +(*FConnectorDescr)()
  258.  *
  259.  * Revision 6.13  2003/04/09 17:58:45  siyan
  260.  * Added doxygen support
  261.  *
  262.  * Revision 6.12  2003/01/08 01:59:32  lavr
  263.  * DLL-ize CONNECT library for MSVC (add NCBI_XCONNECT_EXPORT)
  264.  *
  265.  * Revision 6.11  2002/09/19 18:00:11  lavr
  266.  * Header file guard macro changed
  267.  *
  268.  * Revision 6.10  2002/09/06 15:40:54  lavr
  269.  * More comments and notes to the API; log moved to end
  270.  *
  271.  * Revision 6.9  2002/04/26 16:29:32  lavr
  272.  * Add default_timeout member to meta-connector
  273.  *
  274.  * Revision 6.8  2002/03/22 22:18:48  lavr
  275.  * Cosmetic update
  276.  *
  277.  * Revision 6.7  2001/04/24 21:20:01  lavr
  278.  * Introduced CONN_DEFAULT_TIMEOUT and CONN_INFINITE_TIMEOUT
  279.  *
  280.  * Revision 6.6  2001/03/02 20:07:18  lavr
  281.  * Typos fixed
  282.  *
  283.  * Revision 6.5  2001/01/11 16:39:33  lavr
  284.  * FDestroy function is now clearly documented not to destroy
  285.  * the connector itself, only its handle (private internal data).
  286.  *
  287.  * Revision 6.4  2001/01/03 22:29:22  lavr
  288.  * Changed IOStatus -> Status
  289.  *
  290.  * Revision 6.3  2000/12/29 17:45:07  lavr
  291.  * Heavily modified to have a stack of connectors
  292.  * VTable format changed; all virtual function now accept CONNECTOR as a
  293.  * first argument (not void* as in previous versions)
  294.  *
  295.  * Revision 6.2  2000/04/07 19:59:49  vakatov
  296.  * Moved forward-declaration of CONNECTOR from "ncbi_connection.h"
  297.  * to "ncbi_connector.h"
  298.  *
  299.  * Revision 6.1  2000/03/24 22:52:48  vakatov
  300.  * Initial revision
  301.  *
  302.  * ==========================================================================
  303.  */
  304. #endif /* CONNECT___NCBI_CONNECTOR__H */