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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: cn3d_tools.cpp,v $
  4.  * PRODUCTION Revision 1000.3  2004/06/01 18:28:23  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.9
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: cn3d_tools.cpp,v 1000.3 2004/06/01 18:28:23 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. *      Miscellaneous utility functions
  38. *
  39. * ===========================================================================
  40. */
  41. #include <ncbi_pch.hpp>
  42. #ifdef _MSC_VER
  43. #pragma warning(disable:4018)   // disable signed/unsigned mismatch warning in MSVC
  44. #endif
  45. #if defined(__WXMSW__)
  46. #include <windows.h>
  47. #include <shellapi.h>   // for ShellExecute, needed to launch browser
  48. #elif defined(__WXGTK__)
  49. #include <unistd.h>
  50. #elif defined(__WXMAC__)
  51. // full paths needed to void having to add -I/Developer/Headers/FlatCarbon to all modules...
  52. #include "/Developer/Headers/FlatCarbon/Types.h"
  53. #include "/Developer/Headers/FlatCarbon/InternetConfig.h"
  54. #endif
  55. #include <corelib/ncbistd.hpp>
  56. #include <corelib/ncbireg.hpp>
  57. #include <objects/seq/Bioseq.hpp>
  58. #include <objects/seqset/Seq_entry.hpp>
  59. #include <objects/seqset/Bioseq_set.hpp>
  60. #ifdef __WXMSW__
  61. #include <windows.h>
  62. #include <wx/msw/winundef.h>
  63. #endif
  64. #include <wx/wx.h>
  65. #include <wx/file.h>
  66. #include "cn3d_tools.hpp"
  67. #include "asn_reader.hpp"
  68. #include <memory>
  69. USING_NCBI_SCOPE;
  70. USING_SCOPE(objects);
  71. BEGIN_SCOPE(Cn3D)
  72. ///// Registry stuff /////
  73. static CNcbiRegistry registry;
  74. static string registryFile;
  75. static bool registryChanged = false;
  76. void LoadRegistry(void)
  77. {
  78.     if (GetPrefsDir().size() > 0)
  79.         registryFile = GetPrefsDir() + "Preferences";
  80.     else
  81.         registryFile = GetProgramDir() + "Preferences";
  82.     auto_ptr<CNcbiIfstream> iniIn(new CNcbiIfstream(registryFile.c_str(), IOS_BASE::in));
  83.     if (*iniIn) {
  84.         INFOMSG("loading program registry " << registryFile);
  85.         registry.Read(*iniIn);
  86.     }
  87.     registryChanged = false;
  88. }
  89. void SaveRegistry(void)
  90. {
  91.     if (registryChanged) {
  92.         auto_ptr<CNcbiOfstream> iniOut(new CNcbiOfstream(registryFile.c_str(), IOS_BASE::out));
  93.         if (*iniOut) {
  94. //            TESTMSG("saving program registry " << registryFile);
  95.             registry.Write(*iniOut);
  96.         }
  97.     }
  98. }
  99. bool RegistryIsValidInteger(const string& section, const string& name)
  100. {
  101.     long value;
  102.     wxString regStr = registry.Get(section, name).c_str();
  103.     return (regStr.size() > 0 && regStr.ToLong(&value));
  104. }
  105. bool RegistryIsValidDouble(const string& section, const string& name)
  106. {
  107.     double value;
  108.     wxString regStr = registry.Get(section, name).c_str();
  109.     return (regStr.size() > 0 && regStr.ToDouble(&value));
  110. }
  111. bool RegistryIsValidBoolean(const string& section, const string& name)
  112. {
  113.     string regStr = registry.Get(section, name);
  114.     return (regStr.size() > 0 && (
  115.         toupper(regStr[0]) == 'T' || toupper(regStr[0]) == 'F' ||
  116.         toupper(regStr[0]) == 'Y' || toupper(regStr[0]) == 'N'));
  117. }
  118. bool RegistryIsValidString(const string& section, const string& name)
  119. {
  120.     string regStr = registry.Get(section, name);
  121.     return (regStr.size() > 0);
  122. }
  123. bool RegistryGetInteger(const string& section, const string& name, int *value)
  124. {
  125.     wxString regStr = registry.Get(section, name).c_str();
  126.     long l;
  127.     if (regStr.size() == 0 || !regStr.ToLong(&l)) {
  128.         WARNINGMSG("Can't get long from registry: " << section << ", " << name);
  129.         return false;
  130.     }
  131.     *value = (int) l;
  132.     return true;
  133. }
  134. bool RegistryGetDouble(const string& section, const string& name, double *value)
  135. {
  136.     wxString regStr = registry.Get(section, name).c_str();
  137.     if (regStr.size() == 0 || !regStr.ToDouble(value)) {
  138.         WARNINGMSG("Can't get double from registry: " << section << ", " << name);
  139.         return false;
  140.     }
  141.     return true;
  142. }
  143. bool RegistryGetBoolean(const string& section, const string& name, bool *value)
  144. {
  145.     string regStr = registry.Get(section, name);
  146.     if (regStr.size() == 0 || !(
  147.             toupper(regStr[0]) == 'T' || toupper(regStr[0]) == 'F' ||
  148.             toupper(regStr[0]) == 'Y' || toupper(regStr[0]) == 'N')) {
  149.         WARNINGMSG("Can't get boolean from registry: " << section << ", " << name);
  150.         return false;
  151.     }
  152.     *value = (toupper(regStr[0]) == 'T' || toupper(regStr[0]) == 'Y');
  153.     return true;
  154. }
  155. bool RegistryGetString(const string& section, const string& name, string *value)
  156. {
  157.     string regStr = registry.Get(section, name);
  158.     if (regStr.size() == 0) {
  159.         WARNINGMSG("Can't get string from registry: " << section << ", " << name);
  160.         return false;
  161.     }
  162.     *value = regStr;
  163.     return true;
  164. }
  165. bool RegistrySetInteger(const string& section, const string& name, int value)
  166. {
  167.     wxString regStr;
  168.     regStr.Printf("%i", value);
  169.     bool okay = registry.Set(section, name, regStr.c_str(), CNcbiRegistry::ePersistent);
  170.     if (!okay)
  171.         ERRORMSG("registry Set(" << section << ", " << name << ") failed");
  172.     else
  173.         registryChanged = true;
  174.     return okay;
  175. }
  176. bool RegistrySetDouble(const string& section, const string& name, double value)
  177. {
  178.     wxString regStr;
  179.     regStr.Printf("%g", value);
  180.     bool okay = registry.Set(section, name, regStr.c_str(), CNcbiRegistry::ePersistent);
  181.     if (!okay)
  182.         ERRORMSG("registry Set(" << section << ", " << name << ") failed");
  183.     else
  184.         registryChanged = true;
  185.     return okay;
  186. }
  187. bool RegistrySetBoolean(const string& section, const string& name, bool value, bool useYesOrNo)
  188. {
  189.     string regStr;
  190.     if (useYesOrNo)
  191.         regStr = value ? "yes" : "no";
  192.     else
  193.         regStr = value ? "true" : "false";
  194.     bool okay = registry.Set(section, name, regStr, CNcbiRegistry::ePersistent);
  195.     if (!okay)
  196.         ERRORMSG("registry Set(" << section << ", " << name << ") failed");
  197.     else
  198.         registryChanged = true;
  199.     return okay;
  200. }
  201. bool RegistrySetString(const string& section, const string& name, const string& value)
  202. {
  203.     bool okay = registry.Set(section, name, value, CNcbiRegistry::ePersistent);
  204.     if (!okay)
  205.         ERRORMSG("registry Set(" << section << ", " << name << ") failed");
  206.     else
  207.         registryChanged = true;
  208.     return okay;
  209. }
  210. ///// Misc stuff /////
  211. #ifdef __WXMSW__
  212. // code borrowed (and modified) from Nlm_MSWin_OpenDocument() in vibutils.c
  213. static bool MSWin_OpenDocument(const char* doc_name)
  214. {
  215.     int status = (int) ShellExecute(0, "open", doc_name, NULL, NULL, SW_SHOWNORMAL);
  216.     if (status <= 32) {
  217.         ERRORMSG("Unable to open document "" << doc_name << "", error = " << status);
  218.         return false;
  219.     }
  220.     return true;
  221. }
  222. #endif
  223. #ifdef __WXMAC__
  224. static OSStatus MacLaunchURL(ConstStr255Param urlStr)
  225. {
  226.     OSStatus err;
  227.     ICInstance inst;
  228.     SInt32 startSel;
  229.     SInt32 endSel;
  230.     err = ICStart(&inst, 'Cn3D');
  231.     if (err == noErr) {
  232. #if !TARGET_CARBON
  233.         err = ICFindConfigFile(inst, 0, nil);
  234. #endif
  235.         if (err == noErr) {
  236.             startSel = 0;
  237.             endSel = strlen(urlStr);
  238.             err = ICLaunchURL(inst, "p", urlStr, endSel, &startSel, &endSel);
  239.         }
  240.         ICStop(inst);
  241.     }
  242.     return err;
  243. }
  244. #endif
  245. void LaunchWebPage(const char *url)
  246. {
  247.     if(!url) return;
  248.     INFOMSG("launching url " << url);
  249. #if defined(__WXMSW__)
  250.     if (!MSWin_OpenDocument(url)) {
  251.         ERRORMSG("Unable to launch browser");
  252.     }
  253. #elif defined(__WXGTK__)
  254.     string command;
  255.     RegistryGetString(REG_ADVANCED_SECTION, REG_BROWSER_LAUNCH, &command);
  256.     size_t pos = 0;
  257.     while ((pos=command.find("<URL>", pos)) != string::npos)
  258.         command.replace(pos, 5, url);
  259.     TRACEMSG("launching browser with: " << command);
  260.     system(command.c_str());
  261. #elif defined(__WXMAC__)
  262.     MacLaunchURL(url);
  263. #endif
  264. }
  265. CRef < CBioseq > FetchSequenceViaHTTP(const string& id)
  266. {
  267.     CSeq_entry seqEntry;
  268.     string err;
  269.     static const string host("www.ncbi.nlm.nih.gov"), path("/entrez/viewer.cgi");
  270.     string args = string("view=0&maxplex=1&save=idf&val=") + id;
  271.     INFOMSG("Trying to load sequence from URL " << host << path << '?' << args);
  272.     CRef < CBioseq > bioseq;
  273.     if (GetAsnDataViaHTTP(host, path, args, &seqEntry, &err)) {
  274.         if (seqEntry.IsSeq())
  275.             bioseq.Reset(&(seqEntry.SetSeq()));
  276.         else if (seqEntry.IsSet() && seqEntry.GetSet().GetSeq_set().front()->IsSeq())
  277.             bioseq.Reset(&(seqEntry.SetSet().SetSeq_set().front()->SetSeq()));
  278.         else
  279.             ERRORMSG("FetchSequenceViaHTTP() - confused by SeqEntry format");
  280.     }
  281.     if (bioseq.Empty())
  282.         ERRORMSG("FetchSequenceViaHTTP() - HTTP Bioseq retrieval failed");
  283.     return bioseq;
  284. }
  285. END_SCOPE(Cn3D)
  286. /*
  287. * ---------------------------------------------------------------------------
  288. * $Log: cn3d_tools.cpp,v $
  289. * Revision 1000.3  2004/06/01 18:28:23  gouriano
  290. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.9
  291. *
  292. * Revision 1.9  2004/05/24 15:56:33  gorelenk
  293. * Changed position of PCH include
  294. *
  295. * Revision 1.8  2004/05/21 21:41:39  gorelenk
  296. * Added PCH ncbi_pch.hpp
  297. *
  298. * Revision 1.7  2004/02/19 17:04:52  thiessen
  299. * remove cn3d/ from include paths; add pragma to disable annoying msvc warning
  300. *
  301. * Revision 1.6  2004/01/17 00:17:30  thiessen
  302. * add Biostruc and network structure load
  303. *
  304. * Revision 1.5  2003/12/16 02:16:49  ucko
  305. * +<memory> for auto_ptr<>
  306. *
  307. * Revision 1.4  2003/11/15 16:08:35  thiessen
  308. * add stereo
  309. *
  310. * Revision 1.3  2003/03/19 14:44:56  thiessen
  311. * remove header dependency
  312. *
  313. * Revision 1.2  2003/03/13 22:48:43  thiessen
  314. * fixes for Mac/OSX/gcc
  315. *
  316. * Revision 1.1  2003/03/13 14:26:18  thiessen
  317. * add file_messaging module; split cn3d_main_wxwin into cn3d_app, cn3d_glcanvas, structure_window, cn3d_tools
  318. *
  319. */