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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: system_path.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 21:05:13  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.4
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: system_path.cpp,v 1000.1 2004/06/01 21:05:13 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:  Robert G. Smith
  35.  *
  36.  * File Description:
  37.  *    CSystemPath -- System dependent functions needed by CGBenchApp, the main
  38.  *                         application class for GBENCH
  39.  */
  40. #include <ncbi_pch.hpp>
  41. #include <gui/utils/system_path.hpp>
  42. #include <corelib/ncbiapp.hpp>
  43. #include <corelib/ncbienv.hpp>
  44. #include <corelib/ncbifile.hpp>
  45. #include <gui/utils/message_box.hpp>
  46. #if defined(NCBI_OS_DARWIN)
  47. #define __NOEXTENSIONS__
  48. #include <Carbon/Carbon.h>
  49. #endif
  50. BEGIN_NCBI_SCOPE
  51. //
  52. // ResolvePath()
  53. // this function performs any standard app-specific directory mapping
  54. // so that we can use a series of standard aliases for directory names
  55. //
  56. string CSystemPath::ResolvePath(const string& path,
  57.                                 const string& subdir)
  58. {
  59.     string ret_val(path);
  60.     if (ret_val == "<std>") {
  61.         ret_val = GetStdPath();
  62.     } else if (ret_val == "<home>") {
  63.         ret_val = GetHomePath();
  64.     } else if (ret_val == "<res>") {
  65.         ret_val = GetResourcePath();
  66.     }
  67.     if ( !subdir.empty() ) {
  68.         ret_val += CDirEntry::GetPathSeparator();
  69.         ret_val += subdir;
  70.     }
  71.     return ret_val;
  72. }
  73. //
  74. // ResolvePathExisting ensures that a named file exists
  75. //
  76. string CSystemPath::ResolvePathExisting(const string& path,
  77.                                         const string& delim)
  78. {
  79.     list<string> toks;
  80.     NStr::Split(path, delim, toks);
  81.     ITERATE( list<string>, iter, toks) {
  82.         string p(*iter);
  83.         p = NStr::TruncateSpaces(p);
  84.         string tmp = ResolvePath(p);
  85.         // check for existence
  86.         CDirEntry entry(tmp);
  87.         if (entry.Exists()) {
  88.             return tmp;
  89.         }
  90.     }
  91.     return string();
  92. }
  93. string CSystemPath::ResolvePath(const string& path)
  94. {
  95.     string  path1, path2;
  96.     string  path_delim("\/");
  97.     NStr::SplitInTwo(path, path_delim, path1, path2);
  98.     if ( ! path1.empty()) {
  99.         return ResolvePath(path1, path2);
  100.     }
  101.     return path;
  102. }
  103. // the GBench installation directory. Usually the parent of the App Path.
  104. // corresponds to the <std> alias in ResolvePath().
  105. string CSystemPath::GetStdPath(void)
  106. {
  107.     string ret_val;
  108.     CNcbiApplication  *myApp = CNcbiApplication::Instance();
  109.     _ASSERT(myApp);
  110.     // First, was the value set in the environment variable $NCBI_GBENCH_HOME
  111.     ret_val = myApp->GetEnvironment().Get(string("NCBI_GBENCH_HOME"));
  112.     if (ret_val.empty()) {
  113.         // Next, look at the application's own location.
  114.         ret_val = myApp->GetArguments().GetProgramDirname();
  115.         if (!ret_val.empty()) {
  116.             // strip off the bin directory, if it is there.
  117.             string::size_type pos = ret_val.rfind("bin");
  118.             if (pos != string::npos  &&  pos == ret_val.length() - 4) {
  119.                 ret_val.erase(pos);
  120.                 while ( (pos = ret_val.find_last_of("\/")) ==
  121.                          ret_val.length() - 1) {
  122.                     ret_val.erase(pos);
  123.                 }
  124.             }
  125.         }
  126.         // Hmmm... We aren't where we should be.
  127.         if (ret_val.empty()) {
  128.             NcbiMessageBox("Warning:n"
  129.                            "Can't identify the application's execution path.n"
  130.                            "Some components may be unavailable.");
  131.         }
  132.     }    
  133.     return ret_val;
  134. }
  135. string CSystemPath::GetResourcePath()
  136. {
  137.     string path = GetStdPath();
  138.     path += CDirEntry::GetPathSeparator();
  139.     path += "share";
  140.     return path;
  141. }
  142. // The place gbench keeps stuff.
  143. // corresponds to the <home> alias in ResolvePath().
  144. //   Is NOT the same as the user's home directory.
  145. //   That is returned by CDir::GetHome()
  146. string CSystemPath::GetHomePath(void)
  147. {
  148.     string ret_val(CDir::GetHome());
  149. #if defined(NCBI_OS_UNIX)   &&  ! defined(NCBI_OS_DARWIN)
  150.     ret_val += ".gbench";
  151. #elif defined(NCBI_OS_DARWIN) // for now use the Unix location for Mac OS X.
  152.     OSErr       err;
  153.     short       appsuppVRefNum;
  154.     long        appsuppDirID;
  155.     FSSpec      appsuppFSSpec;
  156.     FSRef       appsuppFSRef;
  157.     char        appsuppPath[1024];
  158.     // Get the path to the Application Support folder for this user.
  159.     // 
  160.     err = FindFolder(kUserDomain, kApplicationSupportFolderType, kCreateFolder, 
  161.                      &appsuppVRefNum, &appsuppDirID);
  162.     if (err == noErr) {
  163.         err = FSMakeFSSpec(appsuppVRefNum, appsuppDirID,
  164.                            (ConstStr255Param) "", &appsuppFSSpec);
  165.         if (err == noErr  ||  err == fnfErr) {
  166.             err = FSpMakeFSRef(&appsuppFSSpec, &appsuppFSRef);
  167.             if (err == noErr) {
  168.                 err = FSRefMakePath(&appsuppFSRef, (UInt8 *) appsuppPath, 1024);
  169.             }
  170.         }
  171.     }
  172.     if (err == noErr) {
  173.         ret_val = appsuppPath;    
  174.         ret_val = CDirEntry::MakePath(ret_val, "gbench"); // not a hidden folder
  175.     } else {
  176.         // Problems getting the Mac Application Support folder?
  177.         // use ~/.gbench/ just like on other Unixes.
  178.         ret_val = CDirEntry::MakePath(ret_val, ".gbench");
  179.     }
  180. #elif defined(NCBI_OS_MSWIN)
  181.     ret_val += "GenomeWorkbench";
  182. #else
  183. #error "platform unrecognized"
  184. #endif
  185.     return ret_val;
  186. }
  187. END_NCBI_SCOPE
  188. /*
  189.  * ===========================================================================
  190.  * $Log: system_path.cpp,v $
  191.  * Revision 1000.1  2004/06/01 21:05:13  gouriano
  192.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.4
  193.  *
  194.  * Revision 1.4  2004/05/21 22:27:51  gorelenk
  195.  * Added PCH ncbi_pch.hpp
  196.  *
  197.  * Revision 1.3  2004/05/20 12:41:30  dicuccio
  198.  * Added standard resolution of '<res>' alias
  199.  *
  200.  * Revision 1.2  2004/05/07 17:54:11  dicuccio
  201.  * Altered GetStdPath() - don't erase system path if it doesn't end in bin
  202.  *
  203.  * Revision 1.1  2004/02/17 20:35:20  rsmith
  204.  * moved core/settings.[ch]pp and core/system_path.[ch]pp to config and utils, respectively.
  205.  *
  206.  * Revision 1.4  2004/01/21 12:36:07  dicuccio
  207.  * Replace int with string::size_type where necessary
  208.  *
  209.  * Revision 1.3  2003/10/14 16:22:19  dicuccio
  210.  * Added ResolvePathExisting().  Changed ResolvePath(const string&) to search all
  211.  * delimited directories, not just the platform-specific one
  212.  *
  213.  * Revision 1.2  2003/08/25 17:57:12  rsmith
  214.  * add member ResolvePath that splits and resolves a single string.
  215.  *
  216.  * Revision 1.1  2003/07/30 12:51:53  dicuccio
  217.  * Moved 'gbench_system.[h,c]pp' to 'system_path.[h,c]pp'
  218.  *
  219.  * Revision 1.5  2003/07/30 12:18:48  dicuccio
  220.  * Changed class name to CSystemPath.  Minor reformatting.
  221.  *
  222.  * Revision 1.4  2003/07/30 01:43:53  ucko
  223.  * Fix path to gbench_system.hpp.
  224.  *
  225.  * Revision 1.3  2003/06/25 16:52:48  rsmith
  226.  * <home> on Mac is in Users Application Support folder.
  227.  *
  228.  * Revision 1.2  2003/06/16 17:57:38  meric
  229.  * Fixed to use string::erase() instead of string::clear() (MSVC++ peculiarity)
  230.  *
  231.  * Revision 1.1  2003/06/16 13:50:12  rsmith
  232.  * initial checkin. Resolve paths in a system independent manner.
  233.  *
  234.  */