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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: ncbi_conn_stream.hpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/04/12 17:05:48  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R6.26
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef CONNECT___NCBI_CONN_STREAM__HPP
  10. #define CONNECT___NCBI_CONN_STREAM__HPP
  11. /*  $Id: ncbi_conn_stream.hpp,v 1000.2 2004/04/12 17:05:48 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, Anton Lavrentiev
  37.  *
  38.  * File Description:
  39.  *   CONN-based C++ streams
  40.  *
  41.  * Classes:
  42.  *   CConn_IOStream 
  43.  *      base class derived from "std::iostream" to perform I/O by means
  44.  *      of underlying CConn_Streambuf (implemented privately in
  45.  *      ncbi_conn_streambuf.[ch]pp).
  46.  *
  47.  *   CConn_SocketStream
  48.  *      I/O stream based on socket connector.
  49.  *
  50.  *   CConn_HttpStream
  51.  *      I/O stream based on HTTP connector (that is, the stream, which
  52.  *      connects to HTTP server and exchanges information using HTTP
  53.  *      protocol).
  54.  *
  55.  *   CConn_ServiceStream
  56.  *      I/O stream based on service connector, which is able to exchange
  57.  *      data to/from a named service  that can be found via
  58.  *      dispatcher/load-balancing  daemon and implemented as either
  59.  *      HTTP GCI, standalone server, or NCBID service.
  60.  *
  61.  *   CConn_MemoryStream
  62.  *      In-memory stream of data (analogous to strstream).
  63.  *
  64.  *   CConn_PipeStream
  65.  *      I/O stream based on PIPE connector, which is  able to exchange data
  66.  *      to/from another child process.
  67.  *
  68.  *   CConn_NamedPipeStream
  69.  *      I/O stream based on NAMEDPIPE connector, which is able to exchange
  70.  *      data to/from another process.
  71.  */
  72. #include <corelib/ncbistd.hpp>
  73. #include <connect/ncbi_http_connector.h>
  74. #include <connect/ncbi_namedpipe_connector.hpp>
  75. #include <connect/ncbi_memory_connector.h>
  76. #include <connect/ncbi_pipe_connector.hpp>
  77. #include <connect/ncbi_service_connector.h>
  78. #include <connect/ncbi_socket_connector.h>
  79. /** @addtogroup ConnStreams
  80.  *
  81.  * @{
  82.  */
  83. BEGIN_NCBI_SCOPE
  84. class CConn_Streambuf; // Forward declaration
  85. const streamsize kConn_DefaultBufSize = 4096;
  86. /*
  87.  * Base class, derived from "std::iostream", does both input
  88.  * and output, using the specified CONNECTOR. Input operations
  89.  * can be tied to the output ones by setting 'do_tie' to 'true'
  90.  * (default), which means that any input attempt first flushes
  91.  * the output queue from the internal buffers. 'buf_size'
  92.  * designates the size of the I/O buffers, which reside in between
  93.  * the stream and underlying connector (which in turn may do
  94.  * further buffering, if needed).
  95.  */
  96. class NCBI_XCONNECT_EXPORT CConn_IOStream : public CNcbiIostream
  97. {
  98. public:
  99.     CConn_IOStream
  100.     (CONNECTOR       connector,
  101.      const STimeout* timeout  = kDefaultTimeout,
  102.      streamsize      buf_size = kConn_DefaultBufSize,
  103.      bool            do_tie   = true);
  104.     virtual ~CConn_IOStream();
  105.     CONN GetCONN(void) const;
  106. protected:
  107.     CConn_IOStream(CConn_Streambuf* sb);
  108.     void Cleanup(void);
  109. private:
  110.     CConn_Streambuf* m_CSb;
  111.     // Disable copy constructor and assignment.
  112.     CConn_IOStream(const CConn_IOStream&);
  113.     CConn_IOStream& operator= (const CConn_IOStream&);
  114. };
  115. /*
  116.  * This stream exchanges data in a TCP channel, using socket interface.
  117.  * The endpoint is specified as host/port pair. The maximal
  118.  * number of connection attempts is given as 'max_try'.
  119.  * More details on that: <connect/ncbi_socket_connector.h>.
  120.  */
  121. class NCBI_XCONNECT_EXPORT CConn_SocketStream : public CConn_IOStream
  122. {
  123. public:
  124.     CConn_SocketStream
  125.     (const string&   host,         /* host to connect to  */
  126.      unsigned short  port,         /* ... and port number */
  127.      unsigned int    max_try  = 3, /* number of attempts  */
  128.      const STimeout* timeout  = kDefaultTimeout,
  129.      streamsize      buf_size = kConn_DefaultBufSize);
  130.     // This variant uses existing socket "sock" to build the stream upon it.
  131.     // NOTE:  it revokes all ownership of the socket, and further assumes the
  132.     // socket being in exclusive use of this stream's underlying CONN.
  133.     // More details:  <ncbi_socket_connector.h>::SOCK_CreateConnectorOnTop().
  134.     CConn_SocketStream
  135.     (SOCK            sock,         /* socket              */
  136.      unsigned int    max_try  = 3, /* number of attempts  */
  137.      const STimeout* timeout  = kDefaultTimeout,
  138.      streamsize      buf_size = kConn_DefaultBufSize);
  139. private:
  140.     // Disable copy constructor and assignment.
  141.     CConn_SocketStream(const CConn_SocketStream&);
  142.     CConn_SocketStream& operator= (const CConn_SocketStream&);
  143. };
  144. /*
  145.  * This stream exchanges data with an HTTP server found by URL:
  146.  * http://host[:port]/path[?args]
  147.  *
  148.  * Note that 'path' must include a leading slash,
  149.  * 'args' can be empty, in which case the '?' is not appended to the path.
  150.  *
  151.  * 'User_header' (if not empty) should be a sequence of lines
  152.  * in the form 'HTTP-tag: Tag value', separated by 'rn', and
  153.  * 'rn'-terminated. It is included in the HTTP-header of each transaction.
  154.  *
  155.  * More elaborate specification of the server can be done via
  156.  * SConnNetInfo structure, which otherwise will be created with the
  157.  * use of a standard registry section to obtain default values
  158.  * (details: <connect/ncbi_connutil.h>).
  159.  *
  160.  * THCC_Flags and other details: <connect/ncbi_http_connector.h>.
  161.  *
  162.  * Provided 'timeout' is set at connection level, and if different from
  163.  * CONN_DEFAULT_TIMEOUT, it overrides value supplied by HTTP connector
  164.  * (the latter value is kept in SConnNetInfo::timeout).
  165.  */
  166. class NCBI_XCONNECT_EXPORT CConn_HttpStream : public CConn_IOStream
  167. {
  168. public:
  169.     CConn_HttpStream
  170.     (const string&   host,
  171.      const string&   path,
  172.      const string&   args        = kEmptyStr,
  173.      const string&   user_header = kEmptyStr,
  174.      unsigned short  port        = 80,
  175.      THCC_Flags      flags       = fHCC_AutoReconnect,
  176.      const STimeout* timeout     = kDefaultTimeout,
  177.      streamsize      buf_size    = kConn_DefaultBufSize
  178.      );
  179.     CConn_HttpStream
  180.     (const string&   url,
  181.      THCC_Flags      flags       = fHCC_AutoReconnect,
  182.      const STimeout* timeout     = kDefaultTimeout,
  183.      streamsize      buf_size    = kConn_DefaultBufSize
  184.      );
  185.     CConn_HttpStream
  186.     (const SConnNetInfo* net_info    = 0,
  187.      const string&       user_header = kEmptyStr,
  188.      THCC_Flags          flags       = fHCC_AutoReconnect,
  189.      const STimeout*     timeout     = kDefaultTimeout,
  190.      streamsize          buf_size    = kConn_DefaultBufSize
  191.      );
  192. private:
  193.     // Disable copy constructor and assignment.
  194.     CConn_HttpStream(const CConn_HttpStream&);
  195.     CConn_HttpStream& operator= (const CConn_HttpStream&);
  196. };
  197. /*
  198.  * This stream exchanges the data with a named service, in a
  199.  * constraint that the service is implemented as one of the specified
  200.  * server 'types' (details: <connect/ncbi_server_info.h>).
  201.  *
  202.  * Additional specifications can be passed in the SConnNetInfo structure,
  203.  * otherwise created by using service name as a registry section
  204.  * to obtain the information from (details: <connect/ncbi_connutil.h>).
  205.  *
  206.  * Provided 'timeout' is set at connection level, and if different from
  207.  * CONN_DEFAULT_TIMEOUT, it overrides value supplied by underlying connector
  208.  * (the latter value is kept in SConnNetInfo::timeout).
  209.  */
  210. class NCBI_XCONNECT_EXPORT CConn_ServiceStream : public CConn_IOStream
  211. {
  212. public:
  213.     CConn_ServiceStream
  214.     (const string&         service,
  215.      TSERV_Type            types    = fSERV_Any,
  216.      const SConnNetInfo*   net_info = 0,
  217.      const SSERVICE_Extra* params   = 0,
  218.      const STimeout*       timeout  = kDefaultTimeout,
  219.      streamsize            buf_size = kConn_DefaultBufSize);
  220. private:
  221.     // Disable copy constructor and assignment.
  222.     CConn_ServiceStream(const CConn_ServiceStream&);
  223.     CConn_ServiceStream& operator= (const CConn_ServiceStream&);
  224. };
  225. class CRWLock; // Forward declaration
  226. /*
  227.  * In-memory stream.
  228.  */
  229. class NCBI_XCONNECT_EXPORT CConn_MemoryStream : public CConn_IOStream
  230. {
  231. public:
  232.     CConn_MemoryStream(CRWLock*   lk = 0,
  233.                        bool       pass_lk_ownership = true,
  234.                        streamsize buf_size = kConn_DefaultBufSize);
  235. private:
  236.     // Disable copy constructor and assignment.
  237.     CConn_MemoryStream(const CConn_MemoryStream&);
  238.     CConn_MemoryStream& operator= (const CConn_MemoryStream&);
  239. };
  240. /////////////////////////////////////////////////////////////////////////////
  241. ///
  242. /// CConn_PipeStream
  243. ///
  244. class NCBI_XCONNECT_EXPORT CConn_PipeStream : public CConn_IOStream
  245. {
  246. public:
  247.     CConn_PipeStream
  248.     (const string&         cmd,
  249.      const vector<string>& args,
  250.      CPipe::TCreateFlags   create_flags = 0,
  251.      const STimeout*       timeout      = kDefaultTimeout,
  252.      streamsize            buf_size     = kConn_DefaultBufSize
  253.      );
  254.     virtual ~CConn_PipeStream();
  255.     CPipe& GetPipe(void) { return m_Pipe; }
  256. protected:
  257.     CPipe  m_Pipe; ///< Underlying pipe.
  258. private:
  259.     // Disable copy constructor and assignment.
  260.     CConn_PipeStream(const CConn_PipeStream&);
  261.     CConn_PipeStream& operator= (const CConn_PipeStream&);
  262. };
  263. /////////////////////////////////////////////////////////////////////////////
  264. ///
  265. /// CConn_NamedPipeStream
  266. ///
  267. class NCBI_XCONNECT_EXPORT CConn_NamedPipeStream : public CConn_IOStream
  268. {
  269. public:
  270.     CConn_NamedPipeStream
  271.     (const string&   pipename,
  272.      size_t          pipebufsize = 0 /* default buffer size */,
  273.      const STimeout* timeout     = kDefaultTimeout,
  274.      streamsize      buf_size    = kConn_DefaultBufSize
  275.      );
  276. private:
  277.     // Disable copy constructor and assignment.
  278.     CConn_NamedPipeStream(const CConn_NamedPipeStream&);
  279.     CConn_NamedPipeStream& operator= (const CConn_NamedPipeStream&);
  280. };
  281. END_NCBI_SCOPE
  282. /* @} */
  283. /*
  284.  * ===========================================================================
  285.  * $Log: ncbi_conn_stream.hpp,v $
  286.  * Revision 1000.2  2004/04/12 17:05:48  gouriano
  287.  * PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R6.26
  288.  *
  289.  * Revision 6.26  2004/03/22 16:54:05  ivanov
  290.  * Cosmetic changes
  291.  *
  292.  * Revision 6.25  2003/11/12 17:42:40  lavr
  293.  * Formal (non-functional) changes
  294.  *
  295.  * Revision 6.24  2003/11/12 16:36:12  ivanov
  296.  * Added CConn_IOStream::Cleanup(), removed CConn_PipeStream::SetReadHandle()
  297.  *
  298.  * Revision 6.23  2003/10/23 12:16:48  lavr
  299.  * CConn_IOStream:: base class is now CNcbiIostream
  300.  *
  301.  * Revision 6.22  2003/09/23 21:00:02  lavr
  302.  * +CConn_PipeStream, +CConn_NamedPipeStream, +disabled copy ctors and assigns
  303.  *
  304.  * Revision 6.21  2003/08/25 14:47:00  lavr
  305.  * Employ new k..Timeout constants
  306.  *
  307.  * Revision 6.20  2003/04/29 19:58:04  lavr
  308.  * Constructor taking a URL added in CConn_HttpStream
  309.  *
  310.  * Revision 6.19  2003/04/11 17:55:30  lavr
  311.  * Proper indentation of some fragments
  312.  *
  313.  * Revision 6.18  2003/04/09 17:58:42  siyan
  314.  * Added doxygen support
  315.  *
  316.  * Revision 6.17  2003/01/17 19:44:20  lavr
  317.  * Reduce dependencies
  318.  *
  319.  * Revision 6.16  2002/12/19 14:51:48  dicuccio
  320.  * Added export specifier for Win32 DLL builds.
  321.  *
  322.  * Revision 6.15  2002/08/12 15:05:15  lavr
  323.  * Included header files reordered
  324.  *
  325.  * Revision 6.14  2002/06/12 19:19:25  lavr
  326.  * Guard macro name standardized
  327.  *
  328.  * Revision 6.13  2002/06/06 19:01:31  lavr
  329.  * Take advantage of CConn_Exception class
  330.  * Some housekeeping: guard macro name changed, log moved to the end
  331.  *
  332.  * Revision 6.12  2002/02/21 18:04:24  lavr
  333.  * +class CConn_MemoryStream
  334.  *
  335.  * Revision 6.11  2002/01/28 20:17:43  lavr
  336.  * +Forward declaration of CConn_Streambuf and a private member pointer
  337.  * of this type (for clean destruction of a streambuf sub-object)
  338.  *
  339.  * Revision 6.10  2001/12/10 19:41:16  vakatov
  340.  * + CConn_SocketStream::CConn_SocketStream(SOCK sock, ....)
  341.  *
  342.  * Revision 6.9  2001/12/07 22:55:41  lavr
  343.  * More comments added
  344.  *
  345.  * Revision 6.8  2001/09/24 20:25:57  lavr
  346.  * +SSERVICE_Extra* parameter for CConn_ServiceStream::CConn_ServiceStream()
  347.  *
  348.  * Revision 6.7  2001/04/24 21:18:41  lavr
  349.  * Default timeout is set as a special value CONN_DEFAULT_TIMEOUT.
  350.  * Removed wrong log for R6.6.
  351.  *
  352.  * Revision 6.5  2001/02/09 17:38:16  lavr
  353.  * Typo fixed in comments
  354.  *
  355.  * Revision 6.4  2001/01/12 23:48:51  lavr
  356.  * GetCONN method added
  357.  *
  358.  * Revision 6.3  2001/01/11 23:04:04  lavr
  359.  * Bugfixes; tie is now done at streambuf level, not in iostream
  360.  *
  361.  * Revision 6.2  2001/01/10 21:41:08  lavr
  362.  * Added classes: CConn_SocketStream, CConn_HttpStream, CConn_ServiceStream.
  363.  * Everything is now wordly documented.
  364.  *
  365.  * Revision 6.1  2001/01/09 23:35:24  vakatov
  366.  * Initial revision (draft, not tested in run-time)
  367.  *
  368.  * ===========================================================================
  369.  */
  370. #endif  /* CONNECT___NCBI_CONN_STREAM__HPP */