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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: ncbi_namedpipe.hpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/04/12 17:05:54  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R1.8
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef CONNECT___NCBI_NAMEDPIPE__HPP
  10. #define CONNECT___NCBI_NAMEDPIPE__HPP
  11. /*  $Id: ncbi_namedpipe.hpp,v 1000.2 2004/04/12 17:05:54 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:  Anton Lavrentiev, Mike DiCuccio, Vladimir Ivanov
  37.  *
  38.  *
  39.  */
  40. /// @file ncbi_namedpipe.hpp
  41. /// Portable interprocess named pipe API for:  UNIX, MS-Win
  42. ///
  43. /// Defines classes: 
  44. ///     CNamedPipe        -  base (abstract) class for work with named pipes
  45. ///     CNamedPipeClient  -  class for client-side named pipes
  46. ///     CNamedPipeServer  -  class for server-side named pipes
  47. #include <connect/ncbi_core.h>
  48. #include <corelib/ncbistd.hpp>
  49. #include <corelib/ncbi_limits.h>
  50. #include <vector>
  51. #if defined(NCBI_OS_MSWIN)
  52. #elif defined(NCBI_OS_UNIX)
  53. #else
  54. #  error "Class CNamedPipe is supported only on Windows and Unix"
  55. #endif
  56. /** @addtogroup Pipes
  57.  *
  58.  * @{
  59.  */
  60. BEGIN_NCBI_SCOPE
  61. /// Forward declaration of OS-specific pipe handle class.
  62. class CNamedPipeHandle;
  63. /////////////////////////////////////////////////////////////////////////////
  64. ///
  65. /// CNamedPipe --
  66. ///
  67. /// Define base abstract class for interprocess communication via named pipes.
  68. ///
  69. /// NOTES: 
  70. ///    - On some platforms pipe can be accessed over the network;
  71. ///    - Interprocess pipe always opens in byte/binary mode.
  72. /// 
  73. /// For MS Windows the pipe name must have the following form: 
  74. ///
  75. //     \<machine_name>pipe<pipe_name>,       (correct syntax)
  76. ///    \\< machine_name>\pipe\< pipe_name>, (doxygen)
  77. ///
  78. ///    where "machine_name" is a network name of the PC and can be "." for
  79. ///    access to the pipe on the same machine. The "pipe_name" part of the
  80. ///    name can include any character other than a backslash, including
  81. ///    numbers and special characters. The entire pipe name string can be up
  82. ///    to 256 characters long. Pipe names are not case sensitive. 
  83. ///
  84. /// For UNIXs the pipe name is a generic file name (with or without path).
  85. ///
  86. /// Initially all timeouts are infinite.
  87. ///
  88. /// @sa
  89. ///   CNamedPipeClient, CNamedPipeServer, CPipe
  90. class NCBI_XCONNECT_EXPORT CNamedPipe
  91. {
  92. public:
  93.     /// Default pipe buffer size.
  94.     enum {
  95.         eDefaultBufSize    = 4096,      ///< portable default
  96.         eDefaultSysBufSize = kMax_Int   ///< use system-specific default
  97.     };
  98.     /// Constructor.
  99.     CNamedPipe(void);
  100.     /// Destructor. 
  101.     virtual ~CNamedPipe(void);
  102.     // Implemented in derived specializations (Client/Server).
  103.     virtual EIO_Status Open  (const string&, const STimeout*, size_t) = 0;
  104.     virtual EIO_Status Create(const string&, const STimeout*, size_t) = 0;
  105.          
  106.     /// Close pipe connection.
  107.     ///
  108.     /// The pipe handle becomes invalid after this function call,
  109.     /// regardless of whether the call was successful or not.
  110.     EIO_Status Close(void);
  111.     
  112.     /// Read data from the pipe.
  113.     ///
  114.     /// Always return eIO_Success if some data were read (regardless of pipe
  115.     /// conditions that may include EOF/error).
  116.     //  Return other (error) code only if no data at all could be obtained.
  117.     /// Return in the "n_read" the number of bytes actually read, which may be
  118.     /// less than requested "count" if an error occurs or if the end of
  119.     /// the pipe file stream is encountered before reaching count.
  120.     EIO_Status Read(void* buf, size_t count, size_t* n_read = 0);
  121.     /// Write data to the pipe.
  122.     ///
  123.     /// Return eIO_Success if some data were written.
  124.     /// Return other (error) code only if no data at all could be written.
  125.     /// Return in the "n_written" the number of bytes actually written,
  126.     /// which may be less than "count" if an error occurs or write times out.
  127.     /// NOTE:
  128.     ///    On MS Windows client/server must not attempt to write
  129.     ///    a data block, whose size exceeds the pipe buffer size specified
  130.     ///    on other side of the pipe at the time of creation:  any such
  131.     ///    block will be refused for writing and an error will result.
  132.     EIO_Status Write(const void* buf, size_t count, size_t* n_written = 0);
  133.     /// Wait for I/O readiness in the pipe.
  134.     ///
  135.     /// Return eIO_Success if within the specified time, an operation
  136.     /// requested in "event" (which can be either of eIO_Read, eIO_Write, or
  137.     /// eIO_ReadWrite) can be completed without blocking.
  138.     /// Pipe must be in connected state for this method to work; otherwise
  139.     /// eIO_Closed results.
  140.     /// Note that non-blocking is not guaranteed for more than one byte of
  141.     /// data (i.e. following Read or Write may complete with only one
  142.     /// byte read or written, successfully).  Also note that this method
  143.     /// is currently dummy on MS Windows (and always returns eIO_Success).
  144.     EIO_Status Wait(EIO_Event event, const STimeout* timeout);
  145.     /// Return (for the specified "direction"):
  146.     ///   eIO_Closed     -- if the pipe is closed;
  147.     ///   eIO_Unknown    -- if an error was detected during the last I/O;
  148.     ///   eIO_InvalidArg -- if "direction" is not one of:  eIO_Read, eIO_Write;
  149.     ///   eIO_Timeout    -- if the timeout was on last I/O;
  150.     ///   eIO_Success    -- otherwise.
  151.     EIO_Status Status(EIO_Event direction) const;
  152.     /// Specify timeout for the pipe I/O (see Open|Read|Write functions).
  153.     ///
  154.     /// If "timeout" is NULL then set the timeout to be infinite.
  155.     /// NOTE: 
  156.     ///    - By default, initially all timeouts are infinite;
  157.     ///    - kDefaultTimeout has no effect.
  158.     EIO_Status SetTimeout(EIO_Event event, const STimeout* timeout);
  159.     /// Get the pipe I/O timeout (or NULL, if the timeout is infinite).
  160.     ///
  161.     /// NOTE: 
  162.     ///    The returned timeout is guaranteed to be pointing to a valid
  163.     ///    (and correct) structure in memory at least until the pipe is
  164.     ///    closed or SetTimeout() is called for this pipe.
  165.     const STimeout* GetTimeout(EIO_Event event) const;
  166.     bool IsClientSide(void) const;
  167.     bool IsServerSide(void) const;
  168. protected:
  169.     string            m_PipeName;          ///< pipe name 
  170.     CNamedPipeHandle* m_NamedPipeHandle;   ///< os-specific handle
  171.     size_t            m_PipeBufSize;       ///< pipe buffer size
  172.     bool              m_IsClientSide;      ///< client/server-side pipe
  173.     /// Timeouts
  174.     STimeout*         m_OpenTimeout;       ///< eIO_Open
  175.     STimeout*         m_ReadTimeout;       ///< eIO_Read
  176.     STimeout*         m_WriteTimeout;      ///< eIO_Write
  177.     STimeout          m_OpenTimeoutValue;  ///< storage for m_OpenTimeout
  178.     STimeout          m_ReadTimeoutValue;  ///< storage for m_ReadTimeout
  179.     STimeout          m_WriteTimeoutValue; ///< storage for m_WriteTimeout
  180. private:
  181.     /// Disable copy constructor and assignment.
  182.     CNamedPipe(const CNamedPipe&);
  183.     CNamedPipe& operator= (const CNamedPipe&);
  184. };
  185. /////////////////////////////////////////////////////////////////////////////
  186. ///
  187. /// CNamedPipeClient  --
  188. ///
  189. /// Client-side named pipes
  190. ///
  191. /// @sa
  192. ///   CNamedPipe, CNamedPipeServer
  193. class NCBI_XCONNECT_EXPORT CNamedPipeClient : public CNamedPipe
  194. {
  195. public:
  196.     /// Default constructor.
  197.     CNamedPipeClient(void);
  198.     /// Constructor.
  199.     ///
  200.     /// This constructor just calls Open().
  201.     /// NOTE: Timeout from the argument becomes new open timeout.
  202.     CNamedPipeClient(const string&   pipename,
  203.                      const STimeout* timeout     = kDefaultTimeout,
  204.                      size_t          pipebufsize = 0 /* use default */);
  205.     /// Open a client-side pipe connection.
  206.     ///
  207.     /// NOTE: Should not be called if already opened.
  208.     virtual EIO_Status Open(const string&   pipename,
  209.                             const STimeout* timeout     = kDefaultTimeout,
  210.                             size_t          pipebufsize = 0 /* use default*/);
  211.     // Always returns eIO_Unknown in this class.
  212.     virtual EIO_Status Create(const string&, const STimeout*, size_t);
  213. private:
  214.     /// Disable copy constructor and assignment.
  215.     CNamedPipeClient(const CNamedPipeClient&);
  216.     CNamedPipeClient& operator= (const CNamedPipeClient&);
  217. };
  218.  
  219. /////////////////////////////////////////////////////////////////////////////
  220. ///
  221. /// CNamedPipeServer --
  222. ///
  223. /// Server-side named pipes
  224. ///
  225. /// @sa
  226. ///   CNamedPipe, CNamedPipeClient
  227. class NCBI_XCONNECT_EXPORT CNamedPipeServer : public CNamedPipe
  228. {
  229. public:
  230.     /// Default constructor.
  231.     CNamedPipeServer(void);
  232.     /// Constructor.
  233.     ///
  234.     /// This constructor just calls Create().
  235.     /// NOTES:
  236.     ///   - Timeout from the argument becomes new timeout for a listening;
  237.     ///   - The "pipebufsize" specify a maxium size of data block that can
  238.     ///     be transmitted through the pipe. The actual buffer size reserved
  239.     ///     for each end of the named pipe is the specified size rounded
  240.     ///     up to the next allocation boundary.
  241.     CNamedPipeServer(const string&   pipename,
  242.                      const STimeout* timeout     = kDefaultTimeout,
  243.                      size_t          pipebufsize = 0 /* use default */);
  244.     /// Create a server-side pipe.
  245.     ///
  246.     /// NOTE: Should not be called if already created.
  247.     virtual EIO_Status Create(const string&   pipename,
  248.                               const STimeout* timeout     = kDefaultTimeout,
  249.                               size_t          pipebufsize = 0/*use default*/);
  250.     /// Always returns eIO_Unknown in this class.
  251.     virtual EIO_Status Open(const string&, const STimeout*, size_t);
  252.     /// Listen a pipe for new client connection.
  253.     ///
  254.     /// Wait until new client will be connected or open timeout has been
  255.     /// expired.
  256.     /// Return eIO_Success when client is connected.
  257.     /// Return eIO_Timeout, if open timeout expired before any client
  258.     /// initiate connection. Any other return code indicates some failure.
  259.     EIO_Status Listen(void);
  260.     /// Disconnect a connected client.
  261.     ///
  262.     /// Disconnect the server end of a named pipe instance from a client
  263.     /// process. Reinitialize the pipe for waiting a new client.
  264.     /// Return eIO_Success if client is disconnected and pipe is reinitialized.
  265.     /// Any other return code indicates some failure.
  266.     EIO_Status Disconnect(void);
  267. private:
  268.     /// Disable copy constructor and assignment.
  269.     CNamedPipeServer(const CNamedPipeServer&);
  270.     CNamedPipeServer& operator= (const CNamedPipeServer&);
  271. };
  272. /* @} */
  273. // Inline
  274. inline bool CNamedPipe::IsClientSide(void) const
  275. {
  276.     return m_IsClientSide;
  277. }
  278. inline bool CNamedPipe::IsServerSide(void) const
  279. {
  280.     return !m_IsClientSide;
  281. }
  282. END_NCBI_SCOPE
  283. /*
  284.  * ===========================================================================
  285.  * $Log: ncbi_namedpipe.hpp,v $
  286.  * Revision 1000.2  2004/04/12 17:05:54  gouriano
  287.  * PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R1.8
  288.  *
  289.  * Revision 1.8  2004/03/22 17:03:00  ivanov
  290.  * Replaced static member CNamedPipe::kDefaultPipeSize with enum values
  291.  * for default and system pipe buffer size (by Denis Vakatov).
  292.  *
  293.  * Revision 1.7  2003/12/02 17:48:48  ivanov
  294.  * Made Status() const
  295.  *
  296.  * Revision 1.6  2003/09/23 21:01:44  lavr
  297.  * Slightly reworked to fit in CConn_...Streams better
  298.  *
  299.  * Revision 1.5  2003/08/28 15:57:29  ivanov
  300.  * Comments changes
  301.  *
  302.  * Revision 1.4  2003/08/25 14:47:27  lavr
  303.  * Employ new k..Timeout constants
  304.  *
  305.  * Revision 1.3  2003/08/20 19:01:05  ivanov
  306.  * Fixed cvs log
  307.  *
  308.  * Revision 1.2 2003/08/20 16:49:19;  ivanov
  309.  * - #include <corelib/ncbiobj.hpp>
  310.  *
  311.  * Revision 1.1  2003/08/20 19:01:05  ivanov
  312.  * Initial revision
  313.  *
  314.  * ===========================================================================
  315.  */
  316. #endif  /* CORELIB__NCBI_NAMEDPIPE__HPP */