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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: ncbi_core_cxx.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 18:44:50  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R6.18
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: ncbi_core_cxx.cpp,v 1000.1 2004/06/01 18:44:50 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:  Anton Lavrentiev
  35.  *
  36.  * File Description:
  37.  *   C++->C conversion functions for basic CORE connect stuff:
  38.  *     Registry
  39.  *     Logging
  40.  *     Locking
  41.  *
  42.  */
  43. #include <ncbi_pch.hpp>
  44. #include "ncbi_ansi_ext.h"
  45. #include <connect/ncbi_core_cxx.hpp>
  46. #include <connect/ncbi_util.h>
  47. #include <corelib/ncbidiag.hpp>
  48. #include <corelib/ncbistr.hpp>
  49. BEGIN_NCBI_SCOPE
  50. /***********************************************************************
  51.  *                              Registry                               *
  52.  ***********************************************************************/
  53. static void s_REG_Get(void* user_data,
  54.                       const char* section, const char* name,
  55.                       char* value, size_t value_size) THROWS_NONE
  56. {
  57.     try {
  58.         string result = static_cast<CNcbiRegistry*> (user_data)->
  59.             Get(section, name);
  60.         if ( !result.empty() )
  61.             strncpy0(value, result.c_str(), value_size - 1);
  62.     }
  63.     catch (CException& e) {
  64.         NCBI_REPORT_EXCEPTION("s_REG_Get() failed", e);
  65.     }
  66.     STD_CATCH_ALL("s_REG_Get() failed");
  67. }
  68. static void s_REG_Set(void* user_data,
  69.                       const char* section, const char* name,
  70.                       const char* value, EREG_Storage storage) THROWS_NONE
  71. {
  72.     try {
  73.         static_cast<CNcbiRegistry*> (user_data)->
  74.             Set(section, name, value,
  75.                 (storage == eREG_Persistent ? CNcbiRegistry::ePersistent : 0) |
  76.                 CNcbiRegistry::eOverride | CNcbiRegistry::eTruncate);
  77.     }
  78.     catch (CException& e) {
  79.         NCBI_REPORT_EXCEPTION("s_REG_Set() failed", e);
  80.     }
  81.     STD_CATCH_ALL("s_REG_Set() failed");
  82. }
  83. static void s_REG_Cleanup(void* user_data) THROWS_NONE
  84. {
  85.     try {
  86.         delete static_cast<CNcbiRegistry*> (user_data);
  87.     }
  88.     catch (CException& e) {
  89.         NCBI_REPORT_EXCEPTION("s_REG_Cleanup() failed", e);
  90.     }
  91.     STD_CATCH_ALL("s_REG_Cleanup() failed");
  92. }
  93. extern REG REG_cxx2c(CNcbiRegistry* reg, bool pass_ownership)
  94. {
  95.     return reg ? REG_Create
  96.         (static_cast<void*> (reg),
  97.          reinterpret_cast<FREG_Get> (s_REG_Get),
  98.          reinterpret_cast<FREG_Set> (s_REG_Set),
  99.          pass_ownership ? reinterpret_cast<FREG_Cleanup> (s_REG_Cleanup) : 0,
  100.          0) : 0;
  101. }
  102. /***********************************************************************
  103.  *                                Logger                               *
  104.  ***********************************************************************/
  105. static void s_LOG_Handler(void*         /*user_data*/,
  106.                           SLOG_Handler*   call_data) THROWS_NONE
  107. {
  108.     try {
  109.         EDiagSev level;
  110.         switch ( call_data->level ) {
  111.         case eLOG_Trace:
  112.             level = eDiag_Trace;
  113.             break;
  114.         case eLOG_Note:
  115.             level = eDiag_Info;
  116.             break;
  117.         case eLOG_Warning:
  118.             level = eDiag_Warning;
  119.             break;
  120.         case eLOG_Error:
  121.             level = eDiag_Error;
  122.             break;
  123.         case eLOG_Critical:
  124.             level = eDiag_Critical;
  125.             break;
  126.         case eLOG_Fatal:
  127.             /*fallthru*/
  128.         default:
  129.             level = eDiag_Fatal;
  130.             break;
  131.         }
  132.         CNcbiDiag diag(level);
  133.         if (call_data->file) {
  134.             diag.SetFile(call_data->file);
  135.         }
  136.         if (call_data->line) {
  137.             diag.SetLine(call_data->line);
  138.         }
  139.         diag << call_data->message;
  140.         if ( call_data->raw_size ) {
  141.             diag <<
  142.                 "n#################### [BEGIN] Raw Data (" <<
  143.                 call_data->raw_size <<
  144.                 " byte" << (call_data->raw_size != 1 ? "s" : "") << ")n" <<
  145.                 NStr::PrintableString
  146.                 (string(static_cast<const char*> (call_data->raw_data),
  147.                         call_data->raw_size), NStr::eNewLine_Passthru) <<
  148.                 "n#################### [END] Raw Data";
  149.         }
  150.     }
  151.     catch (CException& e) {
  152.         NCBI_REPORT_EXCEPTION("s_LOG_Handler() failed", e);
  153.     }
  154.     STD_CATCH_ALL("s_LOG_Handler() failed");
  155. }
  156. extern LOG LOG_cxx2c(void)
  157. {
  158.     return LOG_Create(0,
  159.                       reinterpret_cast<FLOG_Handler> (s_LOG_Handler),
  160.                       0,
  161.                       0);
  162. }
  163. /***********************************************************************
  164.  *                               MT-Lock                               *
  165.  ***********************************************************************/
  166. static int/*bool*/ s_LOCK_Handler(void* user_data, EMT_Lock how) THROWS_NONE
  167. {
  168.     try {
  169.         CRWLock* lock = static_cast<CRWLock*> (user_data);
  170.         switch ( how ) {
  171.         case eMT_Lock:
  172.             lock->WriteLock();
  173.             break;
  174.         case eMT_LockRead:
  175.             lock->ReadLock();
  176.             break;
  177.         case eMT_Unlock:
  178.             lock->Unlock();
  179.             break;
  180.         default:
  181.             NCBI_THROW(CCoreException, eCore,
  182.                        "Used with op " + (unsigned int) how);
  183.         }
  184.         return 1/*true*/;
  185.     }
  186.     catch (CException& e) {
  187.         NCBI_REPORT_EXCEPTION("s_LOCK_Handler() failed", e);
  188.     }
  189.     STD_CATCH_ALL("s_LOCK_Handler() failed");
  190.     return 0/*false*/;
  191. }
  192. static void s_LOCK_Cleanup(void* user_data) THROWS_NONE
  193. {
  194.     try {
  195.         delete static_cast<CRWLock*> (user_data);
  196.     }
  197.     catch (CException& e) {
  198.         NCBI_REPORT_EXCEPTION("s_LOCK_Cleanup() failed", e);
  199.     }
  200.     STD_CATCH_ALL("s_LOCK_Cleanup() failed");
  201. }
  202. extern MT_LOCK MT_LOCK_cxx2c(CRWLock* lock, bool pass_ownership)
  203. {
  204.     return MT_LOCK_Create(static_cast<void*> (lock ? lock : new CRWLock),
  205.                           reinterpret_cast<FMT_LOCK_Handler> (s_LOCK_Handler),
  206.                           !lock  ||  pass_ownership ?
  207.                           reinterpret_cast<FMT_LOCK_Cleanup> (s_LOCK_Cleanup) :
  208.                           0);
  209. }
  210. /***********************************************************************
  211.  *                                 Init                                *
  212.  ***********************************************************************/
  213. extern void CONNECT_Init(CNcbiRegistry* reg)
  214. {
  215.     CORE_SetLOCK(MT_LOCK_cxx2c());
  216.     CORE_SetLOG(LOG_cxx2c());
  217.     CORE_SetREG(REG_cxx2c(reg, true/*pass ownership*/));
  218. }
  219. END_NCBI_SCOPE
  220. /*
  221.  * ---------------------------------------------------------------------------
  222.  * $Log: ncbi_core_cxx.cpp,v $
  223.  * Revision 1000.1  2004/06/01 18:44:50  gouriano
  224.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R6.18
  225.  *
  226.  * Revision 6.18  2004/05/17 20:58:13  gorelenk
  227.  * Added include of PCH ncbi_pch.hpp
  228.  *
  229.  * Revision 6.17  2003/05/14 03:52:50  lavr
  230.  * Minor change: use of default's parameter default value removed in CNcbiDiag
  231.  *
  232.  * Revision 6.16  2003/05/05 20:17:59  lavr
  233.  * s_LOG_Handler() to explicitly check data_size only
  234.  *
  235.  * Revision 6.15  2002/12/19 20:48:33  lavr
  236.  * Fix double exception handling in both catch() and STD_CATCH_ALL()
  237.  *
  238.  * Revision 6.14  2002/12/19 17:33:47  lavr
  239.  * More complete (and consistent with corelib) exception handling
  240.  *
  241.  * Revision 6.13  2002/10/28 15:42:57  lavr
  242.  * Use "ncbi_ansi_ext.h" privately and use strncpy0()
  243.  *
  244.  * Revision 6.12  2002/10/21 18:31:31  lavr
  245.  * Take advantage of eNewLine_Passthru in data dumping
  246.  *
  247.  * Revision 6.11  2002/09/24 15:07:13  lavr
  248.  * File description indented uniformly
  249.  *
  250.  * Revision 6.10  2002/06/10 19:50:02  lavr
  251.  * +CONNECT_Init(). Log moved to the end
  252.  *
  253.  * Revision 6.9  2002/05/07 18:21:23  lavr
  254.  * +#include <ncbidiag.hpp>
  255.  *
  256.  * Revision 6.8  2002/01/25 23:33:04  vakatov
  257.  * s_LOCK_Handler() -- to match handler proto, return boolean value (not VOID!)
  258.  *
  259.  * Revision 6.7  2002/01/15 21:28:49  lavr
  260.  * +MT_LOCK_cxx2c()
  261.  *
  262.  * Revision 6.6  2001/03/02 20:08:17  lavr
  263.  * Typos fixed
  264.  *
  265.  * Revision 6.5  2001/01/25 17:03:46  lavr
  266.  * s_LOG_Handler: user_data commented out as unused
  267.  *
  268.  * Revision 6.4  2001/01/23 23:08:06  lavr
  269.  * LOG_cxx2c introduced
  270.  *
  271.  * Revision 6.3  2001/01/12 05:48:50  vakatov
  272.  * Use reinterpret_cast<> rather than static_cast<> to cast functions.
  273.  * Added more paranoia to catch ALL possible exceptions in the s_*** functions.
  274.  *
  275.  * Revision 6.2  2001/01/11 23:51:47  lavr
  276.  * static_cast instead of linkage specification 'extern "C" {}'.
  277.  * Reason: MSVC++ doesn't allow C-linkage of the funs compiled in C++ file.
  278.  *
  279.  * Revision 6.1  2001/01/11 23:08:16  lavr
  280.  * Initial revision
  281.  *
  282.  * ===========================================================================
  283.  */