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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: app_popup.cpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 21:04:40  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.18
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: app_popup.cpp,v 1000.2 2004/06/01 21:04:40 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:  Peter Meric
  35.  *
  36.  * File Description:
  37.  *    CAppPopup -- launch a url in a web browser
  38.  */
  39. #include <ncbi_pch.hpp>
  40. #include <gui/utils/app_popup.hpp>
  41. #include <gui/utils/exec.hpp>
  42. #include <corelib/ncbiexec.hpp>
  43. #ifdef NCBI_OS_MSWIN
  44. #include <windows.h>
  45. #include <ShellAPI.h>
  46. #endif
  47. #if defined(NCBI_OS_MAC) || defined(NCBI_OS_DARWIN)
  48. #define __NOEXTENSIONS__
  49. #include <ApplicationServices/ApplicationServices.h>
  50. #endif
  51. BEGIN_NCBI_SCOPE
  52. //
  53. // function prototypes
  54. //
  55. CAppRegistry s_CreateDefaultAppRegistry(void);
  56. //
  57. // CAppPopup:: static member definition
  58. //
  59. CAppRegistry CAppPopup::m_Registry(s_CreateDefaultAppRegistry());
  60. CAppInfo::CAppInfo(const string& path)
  61.     : m_Exepath(path)
  62. {
  63. }
  64. CAppInfo::~CAppInfo()
  65. {
  66. }
  67. const string& CAppInfo::GetExePath(void) const
  68. {
  69.     return m_Exepath;
  70. }
  71. CNcbiOstream& filetype::operator<< (CNcbiOstream& strm,
  72.                                     filetype::TFileType& ftype)
  73. {
  74.     switch (ftype) {
  75.     case filetype::ePdf:
  76.         strm << "PDF";
  77.         break;
  78.     case filetype::eUnknown:
  79.         strm << "Unknown";
  80.         break;
  81.     default:
  82.         strm << "Unrecognized file type";
  83.         break;
  84.     }
  85.     return strm;
  86. }
  87. CAppRegistry s_CreateDefaultAppRegistry(void)
  88. {
  89.     CAppRegistry ar;
  90.     ar[filetype::ePdf] = CRef<CAppInfo>(new CAppInfo("acroread"));
  91.     return ar;
  92. }
  93. CAppRegistry::CAppRegistry()
  94. {
  95. }
  96. CAppRegistry::~CAppRegistry()
  97. {
  98. }
  99. CAppRegistry::TAppInfoRef& CAppRegistry::operator[](const TFileType& type)
  100. {
  101.     return m_AppReg[type];
  102. }
  103. const CAppRegistry::TAppInfoRef& CAppRegistry::Find(TFileType filetype) const
  104. {
  105.     TRegistry::const_iterator it = m_AppReg.find(filetype);
  106.     if (it == m_AppReg.end()) {
  107.         ERR_POST(Warning
  108.                  << "CAppRegistry::Find(): no application associated with type "
  109.                  << filetype
  110.                 );
  111.     }
  112.     return it->second;
  113. }
  114. CAppRegistry& CAppPopup::GetRegistry(void)
  115. {
  116.     return m_Registry;
  117. }
  118. bool CAppPopup::PopupFile(const string& file, TFileType filetype)
  119. {
  120.     if (file.empty()) {
  121.         return false;
  122.     }
  123. #ifdef NCBI_OS_MSWIN
  124.     return PopupURL(file);
  125. #elif  defined(NCBI_OS_DARWIN)
  126.         
  127.     FSRef fileRef;
  128.     OSErr err = FSPathMakeRef((const UInt8 *) file.c_str(), &fileRef, NULL);
  129.     if (err == noErr) {
  130.         err = LSOpenFSRef(&fileRef, NULL);
  131.     }
  132.     return (err == noErr);
  133. #else
  134.     const CRef<CAppInfo>& ai = m_Registry.Find(filetype);
  135.     const string& prog = ai->GetExePath();
  136.     const string app(prog + " " + file);
  137.     return CExec::System(app.c_str()) != 0;
  138. #endif
  139. }
  140. bool CAppPopup::PopupURL(const string& url)
  141. {
  142.     _TRACE(Info << "CAppPopup::PopupURL: opening URL: " << url);
  143.     if (url.empty()) {
  144.         return false;
  145.     }
  146. #ifdef NCBI_OS_MSWIN
  147.     int res = 
  148.         reinterpret_cast<int>(ShellExecute(NULL, 
  149.                                            "open", 
  150.                                            url.c_str(), 
  151.                                            NULL, 
  152.                                            NULL, 
  153.                                            SW_SHOWNORMAL));
  154.     return res > 32;
  155. #elif defined(NCBI_OS_DARWIN)
  156.    /* open the url with the default browser */
  157.     CFURLRef urlRef = CFURLCreateWithBytes(kCFAllocatorDefault,
  158.                                            (const UInt8 *) url.c_str(),
  159.                                            url.size(),  
  160.                                            kCFStringEncodingMacRoman,
  161.                                            NULL
  162.                                           );
  163.     const OSErr err = LSOpenCFURLRef(urlRef, NULL);
  164.     return (err == noErr);
  165. #elif defined(NCBI_OS_UNIX)
  166.     // Use netscape -remote mechanism is netscape is running
  167.     // Otherwise, launch netscape anew
  168.     string std_in, std_out, std_err;
  169.     vector<string> args;
  170.     int exit_status;
  171.     // try pop up a new window using netscape -remote
  172.     args.push_back("-remote");
  173.     string arg = "openURL(" + url + ",new-window)";
  174.     args.push_back(arg);
  175.     exit_status = CExecute::Exec("netscape", args, std_in, std_out, std_err);
  176.     if (!exit_status && std_err.empty()) {
  177.         return true;
  178.     } else {
  179.         // start a new netscape
  180.         exit_status = CExec::SpawnLP(CExec::eDetach, "netscape",
  181.                                      url.c_str(), 0);
  182.         return exit_status != -1;
  183.     }
  184. #else
  185.     return false;
  186. #endif
  187. }
  188. END_NCBI_SCOPE
  189. /*
  190.  * ===========================================================================
  191.  * $Log: app_popup.cpp,v $
  192.  * Revision 1000.2  2004/06/01 21:04:40  gouriano
  193.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.18
  194.  *
  195.  * Revision 1.18  2004/05/21 22:27:50  gorelenk
  196.  * Added PCH ncbi_pch.hpp
  197.  *
  198.  * Revision 1.17  2004/05/17 13:54:51  dicuccio
  199.  * Added include for <widnows.h> in Win32-specific section
  200.  *
  201.  * Revision 1.16  2004/03/22 18:07:41  gorelenk
  202.  * Changed implementations of CAppPopup::PopupURL and CAppPopup::PopupFile,
  203.  * removed include of urlmon.h to get rid of usage urlmon.dll on Win32 .
  204.  *
  205.  * Revision 1.15  2003/09/26 15:47:22  jcherry
  206.  * One less exec for linkouts under unix
  207.  *
  208.  * Revision 1.14  2003/09/25 23:04:26  jcherry
  209.  * Made linkouts work on unix
  210.  *
  211.  * Revision 1.13  2003/09/24 20:10:35  dicuccio
  212.  * Restore Shellapi.h for Win32
  213.  *
  214.  * Revision 1.12  2003/09/24 18:38:26  dicuccio
  215.  * +ncbiexec.hpp for CExec
  216.  *
  217.  * Revision 1.11  2003/09/24 18:28:02  dicuccio
  218.  * Dropped internal app spawn function in favor of CExec::System()
  219.  *
  220.  * Revision 1.10  2003/08/21 12:04:00  dicuccio
  221.  * Code formatting changes.  Changed typedefs to be standards-compliant
  222.  *
  223.  * Revision 1.9  2003/06/24 19:46:34  rsmith
  224.  * Get the right Mac header
  225.  *
  226.  * Revision 1.8  2003/06/23 19:07:20  meric
  227.  * Added tests for empty strings
  228.  *
  229.  * Revision 1.7  2003/06/23 18:47:46  rsmith
  230.  * app_popup.cpp
  231.  *
  232.  * Revision 1.6  2003/06/19 16:39:33  meric
  233.  * Renamed AppInfo to CAppInfo
  234.  *
  235.  * Revision 1.5  2003/06/19 16:32:57  meric
  236.  * Added CAppRegistry, a simple application registry for file types
  237.  * Added unix support for opening files associated with applications
  238.  *
  239.  * Revision 1.4  2003/06/17 19:50:25  meric
  240.  * Replace Popup() with PopupFile() and PopupURL()
  241.  *
  242.  * Revision 1.3  2003/06/16 16:56:58  dicuccio
  243.  * Remove unneeded header for widening strings.  Fix resize of dlg box
  244.  *
  245.  * Revision 1.2  2003/06/16 16:01:38  dicuccio
  246.  * Moved generic print code code from opengl/print to utils.
  247.  *
  248.  * Revision 1.1  2003/06/13 18:53:05  meric
  249.  * Initial revision
  250.  *
  251.  *
  252.  * ===========================================================================
  253.  */