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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: cgictx.hpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 18:38:59  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.29
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef NCBI_CGI_CTX__HPP
  10. #define NCBI_CGI_CTX__HPP
  11. /*  $Id: cgictx.hpp,v 1000.2 2004/06/01 18:38:59 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: 
  37. * Vsevolod Sandomirskiy
  38. *
  39. * File Description:
  40. *   Basic CGI Application class
  41. */
  42. #include <corelib/ncbistd.hpp>
  43. #include <cgi/ncbicgi.hpp>
  44. #include <cgi/ncbicgir.hpp>
  45. #include <connect/ncbi_types.h>
  46. /** @addtogroup CGIBase
  47.  *
  48.  * @{
  49.  */
  50. BEGIN_NCBI_SCOPE
  51. /////////////////////////////////////////////////////////////////////////////
  52. //
  53. //  CCgiServerContext::
  54. //
  55. class NCBI_XCGI_EXPORT CCgiServerContext
  56. {
  57. public:
  58.     virtual ~CCgiServerContext(void);
  59. };
  60. /////////////////////////////////////////////////////////////////////////////
  61. //
  62. //  CCtxMsg::
  63. //
  64. class NCBI_XCGI_EXPORT CCtxMsg
  65. {
  66. public:
  67.     virtual ~CCtxMsg(void);
  68.     virtual CNcbiOstream& Write(CNcbiOstream& os) const = 0;
  69. };
  70. /* @} */
  71. inline
  72. CNcbiOstream& operator<< (CNcbiOstream& os, const CCtxMsg& ctx_msg)
  73. {
  74.     return ctx_msg.Write(os);
  75. }
  76. /** @addtogroup CGIBase
  77.  *
  78.  * @{
  79.  */
  80. /////////////////////////////////////////////////////////////////////////////
  81. //
  82. //  CCtxMsgString::
  83. //
  84. class NCBI_XCGI_EXPORT CCtxMsgString : public CCtxMsg
  85. {
  86. public:
  87.     CCtxMsgString(const string& msg) : m_Message(msg) {}
  88.     virtual ~CCtxMsgString(void);
  89.     virtual CNcbiOstream& Write(CNcbiOstream& os) const;
  90.     static string sm_nl;
  91. private:
  92.     string m_Message;
  93. };
  94. /////////////////////////////////////////////////////////////////////////////
  95. //
  96. //  CCgiContext::
  97. //
  98. // CCgiContext is a wrapper for request, response, server context.
  99. // In addition, it contains list of messages (as HTML nodes).
  100. // Having non-const reference, CCgiContext's user has access to all its 
  101. // internal data.
  102. // Context will try to create request from given data or default request
  103. // on any request creation error
  104. //
  105. class CNcbiEnvironment;
  106. class CNcbiRegistry;
  107. class CNcbiResource;
  108. class CCgiApplication;
  109. class NCBI_XCGI_EXPORT CCgiContext
  110. {
  111. public:
  112.     CCgiContext(CCgiApplication&        app,
  113.                 const CNcbiArguments*   args = 0 /* D: app.GetArguments()   */,
  114.                 const CNcbiEnvironment* env  = 0 /* D: app.GetEnvironment() */,
  115.                 CNcbiIstream*           inp  = 0 /* see ::CCgiRequest(istr) */,
  116.                 CNcbiOstream*           out  = 0 /* see ::CCgiResponse(out) */,
  117.                 int                     ifd  = -1,
  118.                 int                     ofd  = -1,
  119.                 size_t                  errbuf_size = 256, /* see CCgiRequest */
  120.                 CCgiRequest::TFlags     flags = 0
  121.                 );
  122.     virtual ~CCgiContext(void);
  123.     const CCgiApplication& GetApp(void) const;
  124.     const CNcbiRegistry& GetConfig(void) const;
  125.     CNcbiRegistry& GetConfig(void);
  126.     
  127.     // these methods will throw exception if no server context is set
  128.     const CNcbiResource& GetResource(void) const;
  129.     CNcbiResource&       GetResource(void);
  130.     const CCgiRequest& GetRequest(void) const;
  131.     CCgiRequest&       GetRequest(void);
  132.     
  133.     const CCgiResponse& GetResponse(void) const;
  134.     CCgiResponse&       GetResponse(void);
  135.     
  136.     // these methods will throw exception if no server context set
  137.     const CCgiServerContext& GetServCtx(void) const;
  138.     CCgiServerContext&       GetServCtx(void);
  139.     // message buffer functions
  140.     CNcbiOstream& PrintMsg(CNcbiOstream& os);
  141.     void PutMsg(const string& msg);
  142.     void PutMsg(CCtxMsg*      msg);
  143.     bool EmptyMsg(void);
  144.     void ClearMsg(void);
  145.     // request access wrappers
  146.     // return entry from request
  147.     // return empty string if no such entry
  148.     // throw runtime_error if there are several entries with the same name
  149.     const CCgiEntry& GetRequestValue(const string& name, bool* is_found = 0)
  150.         const;
  151.     void AddRequestValue    (const string& name, const CCgiEntry& value);
  152.     void RemoveRequestValues(const string& name);
  153.     void ReplaceRequestValue(const string& name, const CCgiEntry& value);
  154.     // program name access
  155.     const string& GetSelfURL(void) const;
  156.     // Which streams are ready?
  157.     enum EStreamStatus {
  158.         fInputReady  = 0x1,
  159.         fOutputReady = 0x2
  160.     };
  161.     typedef int TStreamStatus;  // binary OR of 'EStreamStatus'
  162.     TStreamStatus GetStreamStatus(STimeout* timeout) const;
  163.     TStreamStatus GetStreamStatus(void) const; // supplies {0,0}
  164. private:
  165.     CCgiServerContext& x_GetServerContext(void) const;
  166.     CCgiApplication&      m_App;
  167.     auto_ptr<CCgiRequest> m_Request;  // CGI request  information
  168.     CCgiResponse          m_Response; // CGI response information
  169.     // message buffer
  170.     typedef list< AutoPtr<CCtxMsg> > TMessages;
  171.     TMessages m_Messages;
  172.     // server context will be obtained from CCgiApp::LoadServerContext()
  173.     auto_ptr<CCgiServerContext> m_ServerContext; // application defined context
  174.     mutable string m_SelfURL;
  175.     // forbidden
  176.     CCgiContext(const CCgiContext&);
  177.     CCgiContext& operator=(const CCgiContext&);
  178. }; 
  179. /* @} */
  180. /////////////////////////////////////////////////////////////////////////////
  181. /////////////////////////////////////////////////////////////////////////////
  182. //  IMPLEMENTATION of INLINE functions
  183. /////////////////////////////////////////////////////////////////////////////
  184. /////////////////////////////////////////////////////////////////////////////
  185. //  CCgiContext::
  186. //
  187. inline
  188. const CCgiApplication& CCgiContext::GetApp(void) const
  189.     return m_App;
  190. }
  191.     
  192. inline
  193. const CCgiRequest& CCgiContext::GetRequest(void) const
  194. {
  195.     return *m_Request;
  196. }
  197. inline
  198. CCgiRequest& CCgiContext::GetRequest(void)
  199. {
  200.     return *m_Request;
  201. }
  202.     
  203. inline
  204. const CCgiResponse& CCgiContext::GetResponse(void) const
  205. {
  206.     return m_Response;
  207. }
  208. inline
  209. CCgiResponse& CCgiContext::GetResponse(void)
  210. {
  211.     return m_Response;
  212. }
  213. inline
  214. const CCgiServerContext& CCgiContext::GetServCtx(void) const
  215. {
  216.     return x_GetServerContext();
  217. }
  218. inline
  219. CCgiServerContext& CCgiContext::GetServCtx(void)
  220. {
  221.     return x_GetServerContext();
  222. }
  223. inline
  224. CNcbiOstream& CCgiContext::PrintMsg(CNcbiOstream& os)
  225. {
  226.     ITERATE (TMessages, it, m_Messages) {
  227.         os << **it;
  228.     }
  229.     return os;
  230. }
  231. inline
  232. void CCgiContext::PutMsg(const string& msg)
  233. {
  234.     m_Messages.push_back(new CCtxMsgString(msg));
  235. }
  236. inline
  237. void CCgiContext::PutMsg(CCtxMsg* msg)
  238. {
  239.     m_Messages.push_back(msg);
  240. }
  241. inline
  242. bool CCgiContext::EmptyMsg(void)
  243. {
  244.     return m_Messages.empty();
  245. }
  246. inline
  247. void CCgiContext::ClearMsg(void)
  248. {
  249.     m_Messages.clear();
  250. }
  251. inline
  252. CCgiContext::TStreamStatus CCgiContext::GetStreamStatus(void) const
  253. {
  254.     STimeout timeout = {0, 0};
  255.     return GetStreamStatus(&timeout);
  256. }
  257. END_NCBI_SCOPE
  258. /*
  259. * ===========================================================================
  260. * $Log: cgictx.hpp,v $
  261. * Revision 1000.2  2004/06/01 18:38:59  gouriano
  262. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.29
  263. *
  264. * Revision 1.29  2004/05/11 12:43:29  kuznets
  265. * Changes to control HTTP parsing (CCgiRequest flags)
  266. *
  267. * Revision 1.28  2003/11/05 18:25:32  dicuccio
  268. * Added export specifiers.  Added private, unimplemented copy ctor/assignment
  269. * operator
  270. *
  271. * Revision 1.27  2003/04/16 21:48:17  vakatov
  272. * Slightly improved logging format, and some minor coding style fixes.
  273. *
  274. * Revision 1.26  2003/04/10 19:01:41  siyan
  275. * Added doxygen support
  276. *
  277. * Revision 1.25  2003/03/11 19:17:10  kuznets
  278. * Improved error diagnostics in CCgiRequest
  279. *
  280. * Revision 1.24  2003/03/10 17:46:36  kuznets
  281. * iterate->ITERATE
  282. *
  283. * Revision 1.23  2003/02/21 19:19:15  vakatov
  284. * CCgiContext::GetRequestValue() -- added optional arg "is_found"
  285. *
  286. * Revision 1.22  2003/02/16 05:30:18  vakatov
  287. * GetRequestValue() to return "const CCgiEntry&" rather than just "CCgiEntry"
  288. * to avoid some nasty surprises for earlier user code looking as:
  289. *    const string& s = GetRequestValue(...);
  290. * caused by 'premature' destruction of temporary CCgiEntry object (GCC 3.0.4).
  291. *
  292. * Revision 1.21  2002/07/17 17:03:01  ucko
  293. * Phase out GetRequestValueEx.
  294. *
  295. * Revision 1.20  2002/07/10 18:39:44  ucko
  296. * Made CCgiEntry-based functions the only version; kept "Ex" names as
  297. * temporary synonyms, to go away in a few days.
  298. *
  299. * Revision 1.19  2002/07/03 20:24:30  ucko
  300. * Extend to support learning uploaded files' names; move CVS logs to end.
  301. *
  302. * Revision 1.18  2001/10/04 18:17:51  ucko
  303. * Accept additional query parameters for more flexible diagnostics.
  304. * Support checking the readiness of CGI input and output streams.
  305. *
  306. * Revision 1.17  2001/06/13 21:04:35  vakatov
  307. * Formal improvements and general beautifications of the CGI lib sources.
  308. *
  309. * Revision 1.16  2001/05/17 14:49:01  lavr
  310. * Typos corrected
  311. *
  312. * Revision 1.15  2000/12/23 23:53:19  vakatov
  313. * TLMsg container to use AutoPtr instead of regular pointer
  314. *
  315. * Revision 1.14  2000/01/20 17:54:13  vakatov
  316. * CCgiContext:: constructor to get "CNcbiArguments*" instead of raw argc/argv.
  317. * All virtual member function implementations moved away from the header.
  318. *
  319. * Revision 1.13  1999/12/23 17:16:11  golikov
  320. * CtxMsgs made not HTML lib depended
  321. *
  322. * Revision 1.12  1999/11/15 15:53:20  sandomir
  323. * Registry support moved from CCgiApplication to CNcbiApplication
  324. *
  325. * Revision 1.11  1999/10/28 16:53:53  vasilche
  326. * Fixed bug with error message node.
  327. *
  328. * Revision 1.10  1999/10/28 13:37:49  vasilche
  329. * Fixed small memory leak.
  330. *
  331. * Revision 1.9  1999/10/01 14:22:04  golikov
  332. * Now messages in context are html nodes
  333. *
  334. * Revision 1.8  1999/07/15 19:04:37  sandomir
  335. * GetSelfURL(() added in Context
  336. *
  337. * Revision 1.7  1999/06/29 20:04:37  pubmed
  338. * many changes due to query interface changes
  339. *
  340. * Revision 1.6  1999/05/14 19:21:49  pubmed
  341. * myncbi - initial version; minor changes in CgiContext, history, query
  342. *
  343. * Revision 1.4  1999/05/06 20:32:48  pubmed
  344. * CNcbiResource -> CNcbiDbResource; utils from query; few more context methods
  345. *
  346. * Revision 1.3  1999/05/04 16:14:03  vasilche
  347. * Fixed problems with program environment.
  348. * Added class CNcbiEnvironment for cached access to C environment.
  349. *
  350. * Revision 1.2  1999/04/28 16:54:18  vasilche
  351. * Implemented stream input processing for FastCGI applications.
  352. *
  353. * Revision 1.1  1999/04/27 14:49:48  vasilche
  354. * Added FastCGI interface.
  355. * CNcbiContext renamed to CCgiContext.
  356. *
  357. * Revision 1.11  1999/02/22 21:12:37  sandomir
  358. * MsgRequest -> NcbiContext
  359. *
  360. * Revision 1.10  1998/12/28 23:28:59  vakatov
  361. * New CVS and development tree structure for the NCBI C++ projects
  362. *
  363. * Revision 1.9  1998/12/28 15:43:09  sandomir
  364. * minor fixed in CgiApp and Resource
  365. *
  366. * Revision 1.8  1998/12/10 17:36:54  sandomir
  367. * ncbires.cpp added
  368. *
  369. * Revision 1.7  1998/12/09 22:59:05  lewisg
  370. * use new cgiapp class
  371. *
  372. * Revision 1.6  1998/12/09 17:27:44  sandomir
  373. * tool should be changed to work with the new CCgiApplication
  374. *
  375. * Revision 1.5  1998/12/09 16:49:55  sandomir
  376. * CCgiApplication added
  377. *
  378. * Revision 1.1  1998/12/03 21:24:21  sandomir
  379. * NcbiApplication and CgiApplication updated
  380. *
  381. * Revision 1.3  1998/12/01 19:12:36  lewisg
  382. * added CCgiApplication
  383. *
  384. * Revision 1.2  1998/11/05 21:45:13  sandomir
  385. * std:: deleted
  386. *
  387. * Revision 1.1  1998/11/02 22:10:12  sandomir
  388. * CNcbiApplication added; netest sample updated
  389. * ===========================================================================
  390. */
  391. #endif // NCBI_CGI_CTX__HPP