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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: ncbires.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 18:39:25  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.31
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: ncbires.cpp,v 1000.1 2004/06/01 18:39:25 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: 
  35. * Vsevolod Sandomirskiy  
  36. *
  37. * File Description:
  38. *   Basic Resource class
  39. *
  40. * ---------------------------------------------------------------------------
  41. * $Log: ncbires.cpp,v $
  42. * Revision 1000.1  2004/06/01 18:39:25  gouriano
  43. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.31
  44. *
  45. * Revision 1.31  2004/05/17 20:56:50  gorelenk
  46. * Added include of PCH ncbi_pch.hpp
  47. *
  48. * Revision 1.30  2002/04/10 17:04:39  vakatov
  49. * CNcbiRelocateCommand::Execute() -- temp. un-fix:  do not set Status
  50. *
  51. * Revision 1.29  2002/03/19 00:41:48  vakatov
  52. * CNcbiRelocateCommand::Execute() -- set status to 301 (Moved)
  53. *
  54. * Revision 1.28  2000/08/28 16:22:28  golikov
  55. * some _TRACEs removed
  56. *
  57. * Revision 1.27  1999/10/01 14:21:41  golikov
  58. * Now messages in context are html nodes
  59. *
  60. * Revision 1.26  1999/08/12 14:54:43  sandomir
  61. * #include <algorithm> added
  62. *
  63. * Revision 1.25  1999/08/11 18:33:50  sandomir
  64. * class CNcbiResource more logical (some functionality from CNcbiDbResource moved in CNcbiResource; CNcbiCommand get CNcbiResource in ctor
  65. *
  66. * Revision 1.24  1999/05/11 03:11:52  vakatov
  67. * Moved the CGI API(along with the relevant tests) from "corelib/" to "cgi/"
  68. *
  69. * Revision 1.23  1999/05/06 20:33:44  pubmed
  70. * CNcbiResource -> CNcbiDbResource; utils from query; few more context methods
  71. *
  72. * Revision 1.22  1999/04/27 14:50:07  vasilche
  73. * Added FastCGI interface.
  74. * CNcbiContext renamed to CCgiContext.
  75. *
  76. * Revision 1.21  1999/04/14 17:28:59  vasilche
  77. * Added parsing of CGI parameters from IMAGE input tag like "cmd.x=1&cmd.y=2"
  78. * As a result special parameter is added with empty name: "=cmd"
  79. *
  80. * Revision 1.20  1999/04/13 14:26:01  vasilche
  81. * Removed old _TRACE
  82. *
  83. * Revision 1.19  1999/03/17 18:59:51  vasilche
  84. * Changed CNcbiQueryResult&Iterator.
  85. *
  86. * Revision 1.18  1999/03/15 19:58:24  vasilche
  87. * Added CNcbiQueryResultIterator
  88. *
  89. * Revision 1.17  1999/03/10 21:20:23  sandomir
  90. * Resource added to CNcbiContext
  91. *
  92. * Revision 1.16  1999/02/22 21:12:39  sandomir
  93. * MsgRequest -> NcbiContext
  94. *
  95. * Revision 1.15  1999/01/27 16:46:23  sandomir
  96. * minor change: PFindByName added
  97. *
  98. * Revision 1.14  1999/01/14 20:03:49  sandomir
  99. * minor changes
  100. *
  101. * Revision 1.13  1999/01/12 17:06:37  sandomir
  102. * GetLink changed
  103. *
  104. * Revision 1.12  1999/01/06 22:23:40  sandomir
  105. * minor changes
  106. *
  107. * Revision 1.11  1999/01/05 21:03:01  sandomir
  108. * GetEntry() changes
  109. *
  110. * Revision 1.10  1998/12/31 19:47:29  sandomir
  111. * GetEntry() fixed
  112. *
  113. * Revision 1.8  1998/12/28 15:43:13  sandomir
  114. * minor fixed in CgiApp and Resource
  115. *
  116. * Revision 1.7  1998/12/21 17:19:37  sandomir
  117. * VC++ fixes in ncbistd; minor fixes in Resource
  118. *
  119. * Revision 1.6  1998/12/17 21:50:44  sandomir
  120. * CNCBINode fixed in Resource; case insensitive string comparison
  121. * predicate added
  122. *
  123. * Revision 1.5  1998/12/17 17:25:02  sandomir
  124. * minor changes in Report
  125. *
  126. * Revision 1.4  1998/12/14 20:25:37  sandomir
  127. * changed with Command handling
  128. *
  129. * Revision 1.3  1998/12/14 15:30:08  sandomir
  130. * minor fixes in CNcbiApplication; command handling fixed
  131. *
  132. * Revision 1.2  1998/12/10 20:40:21  sandomir
  133. * #include <algorithm> added in ncbires.cpp
  134. *
  135. * Revision 1.1  1998/12/10 17:36:55  sandomir
  136. * ncbires.cpp added
  137. *
  138. * ===========================================================================
  139. */
  140. #include <ncbi_pch.hpp>
  141. #include <corelib/ncbistd.hpp>
  142. #include <corelib/ncbiutil.hpp>
  143. #include <cgi/ncbires.hpp>
  144. #include <cgi/cgictx.hpp>
  145. #include <algorithm>
  146. BEGIN_NCBI_SCOPE
  147. //
  148. // class CNcbiResource 
  149. //
  150. CNcbiResource::CNcbiResource( CNcbiRegistry& config )
  151.     : m_config(config)
  152. {
  153. }
  154. CNcbiResource::~CNcbiResource( void )
  155. {
  156.     DeleteElements( m_cmd );
  157. }
  158. const CNcbiRegistry& CNcbiResource:: GetConfig(void) const
  159.   return m_config; 
  160. }
  161. CNcbiRegistry& CNcbiResource::GetConfig(void)
  162.   return m_config; 
  163. }
  164. const CNcbiResPresentation* CNcbiResource::GetPresentation( void ) const
  165.   return 0; 
  166. }
  167. const TCmdList& CNcbiResource::GetCmdList( void ) const
  168.   return m_cmd; 
  169. }
  170. void CNcbiResource::AddCommand( CNcbiCommand* command )
  171.   m_cmd.push_back( command ); 
  172. }
  173. void CNcbiResource::HandleRequest( CCgiContext& ctx )
  174. {
  175.     bool defCom = false;
  176. try {
  177.     TCmdList::iterator it = find_if( m_cmd.begin(), m_cmd.end(), 
  178.  PRequested<CNcbiCommand>( ctx ) );
  179.     
  180. auto_ptr<CNcbiCommand> cmd( ( it == m_cmd.end() ) 
  181. ? ( defCom = true, GetDefaultCommand() )
  182. : (*it)->Clone() );
  183. cmd->Execute( ctx );
  184.     } catch( std::exception& e ) {
  185.     _TRACE( e.what() );
  186. ctx.PutMsg( string("Error handling request: ") + e.what() );
  187. if( !defCom ) {
  188.   auto_ptr<CNcbiCommand> cmd( GetDefaultCommand() );
  189.   cmd->Execute( ctx );
  190. }
  191.     }
  192. }
  193. //
  194. // class CNcbiCommand
  195. //
  196. CNcbiCommand::CNcbiCommand( CNcbiResource& resource )
  197.     : m_resource( resource )
  198. {
  199. }
  200. CNcbiCommand::~CNcbiCommand( void )
  201. {
  202. }
  203. bool CNcbiCommand::IsRequested( const CCgiContext& ctx ) const
  204.     const string value = GetName();
  205.   
  206.     TCgiEntries& entries =
  207.         const_cast<TCgiEntries&>(ctx.GetRequest().GetEntries());
  208.     pair<TCgiEntriesI,TCgiEntriesI> p = entries.equal_range( GetEntry() );
  209.     for ( TCgiEntriesI itEntr = p.first; itEntr != p.second; ++itEntr ) {
  210.         if( AStrEquiv( value, itEntr->second, PNocase() ) ) {
  211.             return true;
  212.         } // if
  213.     } // for
  214.     // if there is no 'cmd' entry
  215.     // check the same for IMAGE value
  216.     p = entries.equal_range( NcbiEmptyString );
  217.     for ( TCgiEntriesI iti = p.first; iti != p.second; ++iti ) {
  218.         if( AStrEquiv( value, iti->second, PNocase() ) ) {
  219.             return true;
  220.         } // if
  221.     }
  222.     
  223.     return false;
  224. }
  225. //
  226. // class CNcbiRelocateCommand
  227. //
  228. CNcbiRelocateCommand::CNcbiRelocateCommand( CNcbiResource& resource )
  229.     : CNcbiCommand( resource )
  230. {
  231.     return;
  232. }
  233. CNcbiRelocateCommand::~CNcbiRelocateCommand( void )
  234. {
  235.     return;
  236. }
  237. void CNcbiRelocateCommand::Execute( CCgiContext& ctx )
  238. {
  239.     try {
  240.         string url = GetLink(ctx);
  241.         _TRACE("CNcbiRelocateCommand::Execute changing location to:" << url);
  242.         // Theoretically, the status should be set, but...
  243.         // Commented temporarily to avoid the redirection to go out of
  244.         // NCBI and confuse some not-so-smart clients.
  245.         // It can be restored later when (and if) the NCBI internal HTTP
  246.         // servers are tuned to intercept the redirections and resolve these
  247.         // internally.
  248.         //
  249.         //        ctx.GetResponse().SetStatus(301, "Moved");
  250.         ctx.GetResponse().SetHeaderValue("Location", url);
  251.         ctx.GetResponse().WriteHeader();
  252.     }
  253.     catch (exception&) {
  254.         ERR_POST("CNcbiRelocateCommand::Execute error getting url");
  255.         throw;
  256.     }
  257. }
  258. END_NCBI_SCOPE