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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: ncbi_namedpipe_connector.cpp,v $
  4.  * PRODUCTION Revision 1000.3  2004/06/15 12:25:20  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.9
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: ncbi_namedpipe_connector.cpp,v 1000.3 2004/06/15 12:25:20 gouriano Exp $
  10.  * ===========================================================================
  11.  *
  12.  *                            PUBLIC DOMAIN NOTICE
  13.  *               National Center for Biotechnology Information
  14.  *
  15.  *  This software/database is a "United States Government Work" under the
  16.  *  terms of the United States Copyright Act.  It was written as part of
  17.  *  the author's official duties as a United States Government employee and
  18.  *  thus cannot be copyrighted.  This software/database is freely available
  19.  *  to the public for use. The National Library of Medicine and the U.S.
  20.  *  Government have not placed any restriction on its use or reproduction.
  21.  *
  22.  *  Although all reasonable efforts have been taken to ensure the accuracy
  23.  *  and reliability of the software and data, the NLM and the U.S.
  24.  *  Government do not and cannot warrant the performance or results that
  25.  *  may be obtained by using this software or data. The NLM and the U.S.
  26.  *  Government disclaim all warranties, express or implied, including
  27.  *  warranties of performance, merchantability or fitness for any particular
  28.  *  purpose.
  29.  *
  30.  *  Please cite the author in any work or product based on this material.
  31.  *
  32.  * ===========================================================================
  33.  *
  34.  * Author:  Denis Vakatov, Anton Lavrentiev, Vladimir Ivanov
  35.  *
  36.  * File Description:
  37.  *   Implement CONNECTOR for a named pipe interprocess communication
  38.  *   (based on the NCBI CNamedPipe).
  39.  *
  40.  *   See in "connectr.h" for the detailed specification of the underlying
  41.  *   connector("CONNECTOR", "SConnectorTag") methods and structures.
  42.  *
  43.  */
  44. #include <ncbi_pch.hpp>
  45. #include <connect/ncbi_namedpipe_connector.hpp>
  46. USING_NCBI_SCOPE;
  47. /***********************************************************************
  48.  *  INTERNAL -- Auxiliary types and static functions
  49.  ***********************************************************************/
  50. // All internal data necessary to perform the (re)connect and i/o
  51. typedef struct {
  52.     CNamedPipeClient* pipe;         // pipe handle; NULL if not connected yet
  53.     string            pipename;     // pipe name
  54.     size_t            pipebufsize;  // pipe buffer size
  55.     bool              is_open;      // true if pipe is open
  56. } SNamedPipeConnector;
  57. /***********************************************************************
  58.  *  INTERNAL -- "s_VT_*" functions for the "virt. table" of connector methods
  59.  ***********************************************************************/
  60. extern "C" {
  61. static const char* s_VT_GetType
  62. (CONNECTOR /*connector*/)
  63. {
  64.     return "NAMEDPIPE";
  65. }
  66. static char* s_VT_Descr
  67. (CONNECTOR connector)
  68. {
  69.     SNamedPipeConnector* xxx = (SNamedPipeConnector*) connector->handle;
  70.     size_t len = xxx->pipename.length() + 1/*EOL*/;
  71.     char* buf = (char*) malloc(len);
  72.     if (buf) {
  73.         strcpy(buf, xxx->pipename.c_str());
  74.     }
  75.     return buf;
  76. }
  77. static EIO_Status s_VT_Open
  78. (CONNECTOR       connector,
  79.  const STimeout* timeout)
  80. {
  81.     SNamedPipeConnector* xxx = (SNamedPipeConnector*) connector->handle;
  82.     if (!xxx->pipe) {
  83.         return eIO_Unknown;
  84.     }
  85.     // If connected, close previous session first
  86.     if (xxx->is_open) {
  87.         if (xxx->pipe->Close() != eIO_Success) {
  88.             return eIO_Unknown;
  89.         }
  90.         xxx->is_open = false;
  91.     }
  92.     if (xxx->pipe->SetTimeout(eIO_Open, timeout) != eIO_Success) {
  93.         return eIO_Unknown;
  94.     }
  95.     // Open new connection
  96.     EIO_Status status = xxx->pipe->Open(xxx->pipename, timeout, xxx->pipebufsize);
  97.     if (status == eIO_Success) {
  98.         xxx->is_open = true;
  99.     }
  100.     return status;
  101. }
  102. static EIO_Status s_VT_Status
  103. (CONNECTOR connector,
  104.  EIO_Event dir)
  105. {
  106.     SNamedPipeConnector* xxx = (SNamedPipeConnector*) connector->handle;
  107.     return xxx->pipe ? xxx->pipe->Status(dir) : eIO_Success;
  108. }
  109. static EIO_Status s_VT_Wait
  110. (CONNECTOR       /*connector*/,
  111.  EIO_Event       /*event*/,
  112.  const STimeout* /*timeout*/)
  113. {
  114.     return eIO_Success;
  115. }
  116. static EIO_Status s_VT_Write
  117. (CONNECTOR       connector,
  118.  const void*     buf,
  119.  size_t          size,
  120.  size_t*         n_written,
  121.  const STimeout* timeout)
  122. {
  123.     SNamedPipeConnector* xxx = (SNamedPipeConnector*) connector->handle;
  124.     if (!xxx->is_open) {
  125.         return eIO_Closed;
  126.     }
  127.     if (!xxx->pipe  ||
  128.         xxx->pipe->SetTimeout(eIO_Write, timeout) != eIO_Success) {
  129.         return eIO_Unknown;
  130.     }
  131.     return xxx->pipe->Write(buf, size, n_written);
  132. }
  133. static EIO_Status s_VT_Read
  134. (CONNECTOR       connector,
  135.  void*           buf,
  136.  size_t          size,
  137.  size_t*         n_read,
  138.  const STimeout* timeout)
  139. {
  140.     SNamedPipeConnector* xxx = (SNamedPipeConnector*) connector->handle;
  141.     if (!xxx->is_open) {
  142.         return eIO_Closed;
  143.     }
  144.     if (!xxx->pipe  ||
  145.         xxx->pipe->SetTimeout(eIO_Read, timeout) != eIO_Success) {
  146.         return eIO_Unknown;
  147.     }
  148.     return xxx->pipe->Read(buf, size, n_read);
  149. }
  150. static EIO_Status s_VT_Close
  151. (CONNECTOR       connector,
  152.  const STimeout* /*timeout*/)
  153. {
  154.     SNamedPipeConnector* xxx = (SNamedPipeConnector*) connector->handle;
  155.     EIO_Status status = eIO_Success;
  156.     if (xxx->is_open) {
  157.         status = xxx->pipe->Close();
  158.         xxx->is_open = false;
  159.     }
  160.     return status;
  161. }
  162. #ifdef IMPLEMENTED__CONN_WaitAsync
  163. static EIO_Status s_VT_WaitAsync
  164. (void*                   connector,
  165.  FConnectorAsyncHandler  func,
  166.  SConnectorAsyncHandler* data)
  167. {
  168.     return eIO_NotSupported;
  169. }
  170. #endif
  171. static void s_Setup
  172. (SMetaConnector* meta,
  173.  CONNECTOR       connector)
  174. {
  175.     // Initialize virtual table
  176.     CONN_SET_METHOD(meta, get_type,   s_VT_GetType,   connector);
  177.     CONN_SET_METHOD(meta, descr,      s_VT_Descr,     connector);
  178.     CONN_SET_METHOD(meta, open,       s_VT_Open,      connector);
  179.     CONN_SET_METHOD(meta, wait,       s_VT_Wait,      connector);
  180.     CONN_SET_METHOD(meta, write,      s_VT_Write,     connector);
  181.     CONN_SET_METHOD(meta, flush,      0,              0);
  182.     CONN_SET_METHOD(meta, read,       s_VT_Read,      connector);
  183.     CONN_SET_METHOD(meta, status,     s_VT_Status,    connector);
  184.     CONN_SET_METHOD(meta, close,      s_VT_Close,     connector);
  185. #ifdef IMPLEMENTED__CONN_WaitAsync
  186.     CONN_SET_METHOD(meta, wait_async, s_VT_WaitAsync, connector);
  187. #endif
  188.     meta->default_timeout = 0; // infinite
  189. }
  190. static void s_Destroy
  191. (CONNECTOR connector)
  192. {
  193.     SNamedPipeConnector* xxx = (SNamedPipeConnector*) connector->handle;
  194.     if (xxx) {
  195.         if (xxx->pipe) {
  196.             delete xxx->pipe;
  197.         }
  198.         delete xxx;
  199.     }
  200.     connector->handle = 0;
  201.     free(connector);
  202. }
  203. } /* extern "C" */
  204. BEGIN_NCBI_SCOPE
  205. /***********************************************************************
  206.  *  EXTERNAL -- the connector's "constructors"
  207.  ***********************************************************************/
  208. extern CONNECTOR NAMEDPIPE_CreateConnector
  209. (const string& pipename,
  210.  size_t        pipebufsize) 
  211. {
  212.     CONNECTOR       ccc = (SConnector*) malloc(sizeof(SConnector));
  213.     SNamedPipeConnector* xxx = new SNamedPipeConnector();
  214.     // Initialize internal data structures
  215.     xxx->pipe        = new CNamedPipeClient();
  216.     xxx->pipename    = pipename;
  217.     xxx->pipebufsize = pipebufsize;
  218.     xxx->is_open     = false;
  219.     // Initialize connector data
  220.     ccc->handle  = xxx;
  221.     ccc->next    = 0;
  222.     ccc->meta    = 0;
  223.     ccc->setup   = s_Setup;
  224.     ccc->destroy = s_Destroy;
  225.     return ccc;
  226. }
  227. END_NCBI_SCOPE
  228. /*
  229.  * ==========================================================================
  230.  * $Log: ncbi_namedpipe_connector.cpp,v $
  231.  * Revision 1000.3  2004/06/15 12:25:20  gouriano
  232.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.9
  233.  *
  234.  * Revision 1.9  2004/06/04 14:29:34  ivanov
  235.  * Renamed SPipeConnector->SNamedPipeConnector
  236.  *
  237.  * Revision 1.8  2004/05/17 20:58:13  gorelenk
  238.  * Added include of PCH ncbi_pch.hpp
  239.  *
  240.  * Revision 1.7  2004/03/22 16:59:08  ivanov
  241.  * Cosmetic changes
  242.  *
  243.  * Revision 1.6  2003/09/23 21:07:51  lavr
  244.  * bufsize -> pipesize; accept string in ctor instead of char*
  245.  *
  246.  * Revision 1.5  2003/09/03 13:58:12  ivanov
  247.  * ncbi_namedpipe_connector.h -> ncbi_namedpipe_connector.hpp
  248.  *
  249.  * Revision 1.4  2003/08/28 16:01:46  ivanov
  250.  * Set correct timeout value in the Open()
  251.  *
  252.  * Revision 1.3  2003/08/21 20:07:37  ivanov
  253.  * Added NAMEDPIPE_CreateConnectorEx
  254.  *
  255.  * Revision 1.2  2003/08/20 16:51:05  ivanov
  256.  * Get rid of some warnings -- unused function parameters
  257.  *
  258.  * Revision 1.1  2003/08/18 19:18:23  ivanov
  259.  * Initial revision
  260.  *
  261.  * ==========================================================================
  262.  */