⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ncbi_conn_stream.cpp

📁 ncbi源码
💻 CPP
字号:
/* * =========================================================================== * PRODUCTION $Log: ncbi_conn_stream.cpp,v $ * PRODUCTION Revision 1000.4  2004/06/01 18:44:41  gouriano * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R6.31 * PRODUCTION * =========================================================================== *//*  $Id: ncbi_conn_stream.cpp,v 1000.4 2004/06/01 18:44:41 gouriano Exp $ * =========================================================================== * *                            PUBLIC DOMAIN NOTICE *               National Center for Biotechnology Information * *  This software/database is a "United States Government Work" under the *  terms of the United States Copyright Act.  It was written as part of *  the author's official duties as a United States Government employee and *  thus cannot be copyrighted.  This software/database is freely available *  to the public for use. The National Library of Medicine and the U.S. *  Government have not placed any restriction on its use or reproduction. * *  Although all reasonable efforts have been taken to ensure the accuracy *  and reliability of the software and data, the NLM and the U.S. *  Government do not and cannot warrant the performance or results that *  may be obtained by using this software or data. The NLM and the U.S. *  Government disclaim all warranties, express or implied, including *  warranties of performance, merchantability or fitness for any particular *  purpose. * *  Please cite the author in any work or product based on this material. * * =========================================================================== * * Authors:  Anton Lavrentiev,  Denis Vakatov * * File Description: *   CONN-based C++ streams * *   See file <connect/ncbi_conn_stream.hpp> for more detailed information. * */#include <ncbi_pch.hpp>#include "ncbi_ansi_ext.h"#include "ncbi_conn_streambuf.hpp"#include <connect/ncbi_conn_stream.hpp>#include <connect/ncbi_core_cxx.hpp>#include <corelib/ncbithr.hpp>#include <memory>BEGIN_NCBI_SCOPECConn_IOStream::CConn_IOStream(CONNECTOR connector, const STimeout* timeout,                               streamsize buf_size, bool do_tie) :    CNcbiIostream(0), m_CSb(0){    auto_ptr<CConn_Streambuf>        csb(new CConn_Streambuf(connector, timeout, buf_size, do_tie));    if ( csb->GetCONN() ) {        init(csb.get());        m_CSb = csb.release();    } else        init(0); // according to the standard (27.4.4.1.3), badbit is set here}CConn_IOStream::~CConn_IOStream(){    Cleanup();}CONN CConn_IOStream::GetCONN(void) const{    return m_CSb ? m_CSb->GetCONN() : 0;}void CConn_IOStream::Cleanup(void){    streambuf* sb = rdbuf();    delete sb;    if (sb != m_CSb)        delete m_CSb;    m_CSb = 0;#ifdef AUTOMATIC_STREAMBUF_DESTRUCTION    rdbuf(0);#endif}CConn_SocketStream::CConn_SocketStream(const string&   host,                                       unsigned short  port,                                       unsigned int    max_try,                                       const STimeout* timeout,                                       streamsize      buf_size)    : CConn_IOStream(SOCK_CreateConnector(host.c_str(), port, max_try),                     timeout, buf_size){    return;}CConn_SocketStream::CConn_SocketStream(SOCK            sock,                                       unsigned int    max_try,                                       const STimeout* timeout,                                       streamsize      buf_size)    : CConn_IOStream(SOCK_CreateConnectorOnTop(sock, max_try),                     timeout, buf_size){    return;}static CONNECTOR s_HttpConnectorBuilder(const SConnNetInfo* net_info_in,                                        const char*         url,                                        const char*         host,                                        unsigned short      port,                                        const char*         path,                                        const char*         args,                                        const char*         user_hdr,                                        THCC_Flags          flags,                                        const STimeout*     timeout){    SConnNetInfo* net_info = net_info_in ?        ConnNetInfo_Clone(net_info_in) : ConnNetInfo_Create(0);    if (!net_info)        return 0;    if (url && !ConnNetInfo_ParseURL(net_info, url))        return 0;    if (host) {        strncpy0(net_info->host, host, sizeof(net_info->host) - 1);        net_info->port = port;    }    if (path)        strncpy0(net_info->path, path, sizeof(net_info->path) - 1);    if (args)        strncpy0(net_info->args, args, sizeof(net_info->args) - 1);    if (timeout && timeout != kDefaultTimeout) {        net_info->tmo     = *timeout;        net_info->timeout = &net_info->tmo;    } else if (!timeout)        net_info->timeout = 0;    CONNECTOR c = HTTP_CreateConnector(net_info, user_hdr, flags);    ConnNetInfo_Destroy(net_info);    return c;}CConn_HttpStream::CConn_HttpStream(const string&   host,                                   const string&   path,                                   const string&   args,                                   const string&   user_header,                                   unsigned short  port,                                   THCC_Flags      flags,                                   const STimeout* timeout,                                   streamsize      buf_size)    : CConn_IOStream(s_HttpConnectorBuilder(0,                                            0,                                            host.c_str(),                                            port,                                            path.c_str(),                                            args.c_str(),                                            user_header.c_str(),                                            flags,                                            timeout),                     timeout, buf_size){    return;}CConn_HttpStream::CConn_HttpStream(const string&       url,                                   THCC_Flags          flags,                                   const STimeout*     timeout,                                   streamsize          buf_size)    : CConn_IOStream(s_HttpConnectorBuilder(0,                                            url.c_str(),                                            0,                                            0,                                            0,                                            0,                                            0,                                            flags,                                            timeout),                     timeout, buf_size){    return;}CConn_HttpStream::CConn_HttpStream(const SConnNetInfo* net_info,                                   const string&       user_header,                                   THCC_Flags          flags,                                   const STimeout*     timeout,                                   streamsize          buf_size)    : CConn_IOStream(s_HttpConnectorBuilder(net_info,                                            0,                                            0,                                            0,                                            0,                                            0,                                            user_header.c_str(),                                            flags,                                            timeout),                     timeout, buf_size){    return;}static CONNECTOR s_ServiceConnectorBuilder(const char*           service,                                           TSERV_Type            types,                                           const SConnNetInfo*   net_info_in,                                           const SSERVICE_Extra* params,                                           const STimeout*       timeout){    SConnNetInfo* net_info = net_info_in ?        ConnNetInfo_Clone(net_info_in) : ConnNetInfo_Create(service);    if (!net_info)        return 0;    if (timeout && timeout != kDefaultTimeout) {        net_info->tmo     = *timeout;        net_info->timeout = &net_info->tmo;    } else if (!timeout)        net_info->timeout = 0;    CONNECTOR c = SERVICE_CreateConnectorEx(service, types, net_info, params);    ConnNetInfo_Destroy(net_info);    return c;}CConn_ServiceStream::CConn_ServiceStream(const string&         service,                                         TSERV_Type            types,                                         const SConnNetInfo*   net_info,                                         const SSERVICE_Extra* params,                                         const STimeout*       timeout,                                         streamsize            buf_size)    : CConn_IOStream(s_ServiceConnectorBuilder(service.c_str(),                                               types,                                               net_info,                                               params,                                               timeout),                     timeout, buf_size){    return;}CConn_MemoryStream::CConn_MemoryStream(CRWLock*   lk,                                       bool       pass_lk_ownership,                                       streamsize buf_size)    : CConn_IOStream(MEMORY_CreateConnector                     (MT_LOCK_cxx2c(lk, pass_lk_ownership)),                     0, buf_size){    return;}CConn_PipeStream::CConn_PipeStream(const string&         cmd,                                   const vector<string>& args,                                   CPipe::TCreateFlags   create_flags,                                   const STimeout*       timeout,                                   streamsize            buf_size)    : CConn_IOStream(PIPE_CreateConnector(cmd, args, create_flags, &m_Pipe),                     timeout, buf_size), m_Pipe(){    return;}CConn_PipeStream::~CConn_PipeStream(){    // Explicitly call Cleanup() to avoid using dead m_Pipe otherwise.    Cleanup();#ifndef AUTOMATIC_STREAMBUF_DESTRUCTION    rdbuf(0);#endif}CConn_NamedPipeStream::CConn_NamedPipeStream(const string&   pipename,                                             size_t          pipebufsize,                                             const STimeout* timeout,                                             streamsize      buf_size)    : CConn_IOStream(NAMEDPIPE_CreateConnector(pipename, pipebufsize),                     timeout, buf_size){    return;}END_NCBI_SCOPE/* * --------------------------------------------------------------------------- * $Log: ncbi_conn_stream.cpp,v $ * Revision 1000.4  2004/06/01 18:44:41  gouriano * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R6.31 * * Revision 6.31  2004/05/17 20:58:13  gorelenk * Added include of PCH ncbi_pch.hpp * * Revision 6.30  2004/03/22 16:54:32  ivanov * Cosmetic changes * * Revision 6.29  2004/01/20 20:36:05  lavr * Cease using HAVE_BUGGY_IOS_CALLBACKS in this file * * Revision 6.28  2003/11/12 17:45:08  lavr * Change log fixed to reflect real changes in previous commit * * Revision 6.27  2003/11/12 16:37:50  ivanov * CConn_PipeStream:: dtor added * * Revision 6.26  2003/10/23 12:16:27  lavr * CConn_IOStream:: base class is now CNcbiIostream * * Revision 6.25  2003/09/23 21:05:23  lavr * +CConn_PipeStream, +CConn_NamedPipeStream * * Revision 6.24  2003/08/25 14:40:43  lavr * Employ new k..Timeout constants * * Revision 6.23  2003/05/20 19:08:28  lavr * Do not use clear() in constructor ('cause it may throw an exception) * * Revision 6.22  2003/05/20 16:57:56  lavr * Fix typo in log * * Revision 6.21  2003/05/20 16:47:19  lavr * GetCONN() to check for NULL; constructor to init(0) if connection is bad * * Revision 6.20  2003/05/12 18:32:27  lavr * Modified not to throw exceptions from stream buffer; few more improvements * * Revision 6.19  2003/04/29 19:58:24  lavr * Constructor taking a URL added in CConn_HttpStream * * Revision 6.18  2003/04/14 21:08:15  lavr * Take advantage of HAVE_BUGGY_IOS_CALLBACKS * * Revision 6.17  2003/04/11 17:57:29  lavr * Take advantage of HAVE_IOS_XALLOC * * Revision 6.16  2003/03/25 22:17:18  lavr * Set timeouts from ctors in SConnNetInfo, too, for display unambigously * * Revision 6.15  2002/10/28 15:42:18  lavr * Use "ncbi_ansi_ext.h" privately and use strncpy0() * * Revision 6.14  2002/06/06 19:02:32  lavr * Some housekeeping: log moved to the end * * Revision 6.13  2002/02/21 18:04:25  lavr * +class CConn_MemoryStream * * Revision 6.12  2002/02/05 22:04:12  lavr * Included header files rearranged * * Revision 6.11  2002/02/05 16:05:26  lavr * List of included header files revised * * Revision 6.10  2002/01/28 21:29:25  lavr * Use iostream(0) as a base class constructor * * Revision 6.9  2002/01/28 20:19:11  lavr * Clean destruction of streambuf sub-object; no exception throw in GetCONN() * * Revision 6.8  2001/12/10 19:41:18  vakatov * + CConn_SocketStream::CConn_SocketStream(SOCK sock, ....) * * Revision 6.7  2001/12/07 22:58:01  lavr * GetCONN(): throw exception if the underlying streambuf is not CONN-based * * Revision 6.6  2001/09/24 20:26:17  lavr * +SSERVICE_Extra* parameter for CConn_ServiceStream::CConn_ServiceStream() * * Revision 6.5  2001/01/12 23:49:19  lavr * Timeout and GetCONN method added * * Revision 6.4  2001/01/11 23:04:06  lavr * Bugfixes; tie is now done at streambuf level, not in iostream * * Revision 6.3  2001/01/11 17:22:41  thiessen * fix args copy in s_HttpConnectorBuilder() * * Revision 6.2  2001/01/10 21:41:10  lavr * Added classes: CConn_SocketStream, CConn_HttpStream, CConn_ServiceStream. * Everything is now wordly documented. * * Revision 6.1  2001/01/09 23:35:25  vakatov * Initial revision (draft, not tested in run-time) * * =========================================================================== */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -