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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: asn_converter.hpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 18:27:43  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.12
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: asn_converter.hpp,v 1000.1 2004/06/01 18:27:43 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. * Authors:  Paul Thiessen
  35. *
  36. * File Description:
  37. *      templates for converting ASN data of any type from/to a file
  38. *
  39. * ===========================================================================
  40. */
  41. #ifndef CN3D_ASN_CONVERTER__HPP
  42. #define CN3D_ASN_CONVERTER__HPP
  43. #include <corelib/ncbistd.hpp>
  44. #include <corelib/ncbistl.hpp>
  45. #include <corelib/ncbistre.hpp>
  46. #include <serial/serial.hpp>
  47. #include <serial/objistrasnb.hpp>
  48. #include <serial/objostrasnb.hpp>
  49. #include <string>
  50. #include <memory>
  51. // C stuff
  52. #include <stdio.h>
  53. #include <asn.h>
  54. #include <ncbibs.h>
  55. #ifndef NS_AUTO_PTR
  56. #ifdef HAVE_NO_AUTO_PTR
  57. #define NS_AUTO_PTR ncbi::auto_ptr
  58. #else
  59. #define NS_AUTO_PTR std::auto_ptr
  60. #endif
  61. #endif
  62. BEGIN_SCOPE(Cn3D)
  63. // a utility function for converting ASN data structures from C to C++
  64. template < class ASNClass >
  65. bool ConvertAsnFromCToCPP(Pointer from, AsnWriteFunc writeFunc, ASNClass *to, std::string *err)
  66. {
  67.     err->erase();
  68.     Nlm_ByteStorePtr bsp = NULL;
  69.     AsnIoBSPtr aibp = NULL;
  70.     char *asnDataBlock = NULL;
  71.     bool retval = false;
  72.     try {
  73.         bsp = Nlm_BSNew(1024);
  74.         aibp = AsnIoBSOpen("wb", bsp);
  75.         if (!bsp || !aibp) throw "AsnIoBS creation failed";
  76.         if (!((*writeFunc)(from, aibp->aip, NULL))) throw "C object -> AsnIoBS failed";
  77.         AsnIoBSClose(aibp);
  78.         aibp = NULL;
  79.         int dataSize = Nlm_BSLen(bsp);
  80.         asnDataBlock = new char[dataSize];
  81.         if (!asnDataBlock) throw "block allocation failed";
  82.         Nlm_BSSeek(bsp, 0, 0);
  83.         if (Nlm_BSRead(bsp, (void *) asnDataBlock, dataSize) != dataSize)
  84.             throw "AsnIoBS -> datablock failed";
  85.         Nlm_BSFree(bsp);
  86.         bsp = NULL;
  87.         ncbi::CNcbiIstrstream asnIstrstream(asnDataBlock, dataSize);
  88.         ncbi::CObjectIStreamAsnBinary objIstream(asnIstrstream);
  89.         ncbi::SetDiagTrace(ncbi::eDT_Disable);
  90.         objIstream >> *to;
  91.         retval = true;
  92.     } catch (const char *msg) {
  93.         *err = msg;
  94.     } catch (std::exception& e) {
  95.         *err = std::string("uncaught exception: ") + e.what();
  96.     }
  97.     ncbi::SetDiagTrace(ncbi::eDT_Default);
  98.     if (asnDataBlock) delete[] asnDataBlock;
  99.     if (aibp) AsnIoBSClose(aibp);
  100.     if (bsp) Nlm_BSFree(bsp);
  101.     return retval;
  102. }
  103. // a utility function for converting ASN data structures from C++ to C
  104. template < class ASNClass >
  105. Pointer ConvertAsnFromCPPToC(const ASNClass& from, AsnReadFunc readFunc, std::string *err)
  106. {
  107.     err->erase();
  108.     Pointer cObject = NULL;
  109.     AsnIoMemPtr aimp = NULL;
  110.     try {
  111.         ncbi::CNcbiOstrstream asnOstrstream;
  112.         ncbi::CObjectOStreamAsnBinary objOstream(asnOstrstream);
  113.         ncbi::SetDiagTrace(ncbi::eDT_Disable);
  114.         objOstream << from;
  115.         NS_AUTO_PTR<char> strData(asnOstrstream.str()); // to make sure data gets freed
  116.         aimp = AsnIoMemOpen("rb", (unsigned char *) asnOstrstream.str(), asnOstrstream.pcount());
  117.         if (!aimp || !(cObject = (*readFunc)(aimp->aip, NULL)))
  118.             throw "AsnIoMem -> C object failed";
  119.     } catch (const char *msg) {
  120.         *err = msg;
  121.     } catch (std::exception& e) {
  122.         *err = std::string("uncaught exception: ") + e.what();
  123.     }
  124.     ncbi::SetDiagTrace(ncbi::eDT_Default);
  125.     if (aimp) AsnIoMemClose(aimp);
  126.     return cObject;
  127. }
  128. // create a new copy of a C++ ASN data object
  129. template < class ASNClass >
  130. ASNClass * CopyASNObject(const ASNClass& originalObject, std::string *err)
  131. {
  132.     err->erase();
  133.     NS_AUTO_PTR<ASNClass> newObject;
  134.     try {
  135.         newObject.reset(new ASNClass());
  136.         newObject->Assign(originalObject);
  137.     } catch (std::exception& e) {
  138.         *err = e.what();
  139.         return NULL;
  140.     }
  141.     return newObject.release();
  142. }
  143. END_SCOPE(Cn3D)
  144. #endif // CN3D_ASN_CONVERTER__HPP
  145. /*
  146. * ---------------------------------------------------------------------------
  147. * $Log: asn_converter.hpp,v $
  148. * Revision 1000.1  2004/06/01 18:27:43  gouriano
  149. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.12
  150. *
  151. * Revision 1.12  2004/05/27 19:43:24  thiessen
  152. * prefix diag trace stuff with ncbi::
  153. *
  154. * Revision 1.11  2003/08/22 14:33:38  thiessen
  155. * remove static decl from templates
  156. *
  157. * Revision 1.10  2003/03/19 14:43:49  thiessen
  158. * disable trace messages in object loaders for now
  159. *
  160. * Revision 1.9  2003/02/03 19:20:00  thiessen
  161. * format changes: move CVS Log to bottom of file, remove std:: from .cpp files, and use new diagnostic macros
  162. *
  163. * Revision 1.8  2002/10/08 12:35:42  thiessen
  164. * use delete[] for arrays
  165. *
  166. * Revision 1.7  2002/06/12 18:45:41  thiessen
  167. * more linux/gcc fixes
  168. *
  169. * Revision 1.6  2002/06/11 16:27:16  thiessen
  170. * use ncbi::auto_ptr
  171. *
  172. * Revision 1.5  2002/06/11 13:18:47  thiessen
  173. * fixes for gcc 3
  174. *
  175. * Revision 1.4  2002/01/24 18:12:33  thiessen
  176. * fix another leak
  177. *
  178. * Revision 1.3  2002/01/23 21:08:37  thiessen
  179. * fix memory leak
  180. *
  181. * Revision 1.2  2001/09/19 22:55:43  thiessen
  182. * add preliminary net import and BLAST
  183. *
  184. * Revision 1.1  2001/09/18 03:09:38  thiessen
  185. * add preliminary sequence import pipeline
  186. *
  187. */