system_path.cpp
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:8k
- /*
- * ===========================================================================
- * PRODUCTION $Log: system_path.cpp,v $
- * PRODUCTION Revision 1000.1 2004/06/01 21:05:13 gouriano
- * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.4
- * PRODUCTION
- * ===========================================================================
- */
- /* $Id: system_path.cpp,v 1000.1 2004/06/01 21:05:13 gouriano Exp $
- * ===========================================================================
- *
- * PUBLIC DOMAIN NOTICE
- * National Center for Biotechnology Information
- *
- * This software / database is a "United States Government Work" under the
- * terms of the United States Copyright Act. It was written as part of
- * the author's official duties as a United States Government employee and
- * thus cannot be copyrighted. This software / database is freely available
- * to the public for use. The National Library of Medicine and the U.S.
- * Government have not placed any restriction on its use or reproduction.
- *
- * Although all reasonable efforts have been taken to ensure the accuracy
- * and reliability of the software and data, the NLM and the U.S.
- * Government do not and cannot warrant the performance or results that
- * may be obtained by using this software or data. The NLM and the U.S.
- * Government disclaim all warranties, express or implied, including
- * warranties of performance, merchantability or fitness for any particular
- * purpose.
- *
- * Please cite the author in any work or product based on this material.
- *
- * ===========================================================================
- *
- * Authors: Robert G. Smith
- *
- * File Description:
- * CSystemPath -- System dependent functions needed by CGBenchApp, the main
- * application class for GBENCH
- */
- #include <ncbi_pch.hpp>
- #include <gui/utils/system_path.hpp>
- #include <corelib/ncbiapp.hpp>
- #include <corelib/ncbienv.hpp>
- #include <corelib/ncbifile.hpp>
- #include <gui/utils/message_box.hpp>
- #if defined(NCBI_OS_DARWIN)
- #define __NOEXTENSIONS__
- #include <Carbon/Carbon.h>
- #endif
- BEGIN_NCBI_SCOPE
- //
- // ResolvePath()
- // this function performs any standard app-specific directory mapping
- // so that we can use a series of standard aliases for directory names
- //
- string CSystemPath::ResolvePath(const string& path,
- const string& subdir)
- {
- string ret_val(path);
- if (ret_val == "<std>") {
- ret_val = GetStdPath();
- } else if (ret_val == "<home>") {
- ret_val = GetHomePath();
- } else if (ret_val == "<res>") {
- ret_val = GetResourcePath();
- }
- if ( !subdir.empty() ) {
- ret_val += CDirEntry::GetPathSeparator();
- ret_val += subdir;
- }
- return ret_val;
- }
- //
- // ResolvePathExisting ensures that a named file exists
- //
- string CSystemPath::ResolvePathExisting(const string& path,
- const string& delim)
- {
- list<string> toks;
- NStr::Split(path, delim, toks);
- ITERATE( list<string>, iter, toks) {
- string p(*iter);
- p = NStr::TruncateSpaces(p);
- string tmp = ResolvePath(p);
- // check for existence
- CDirEntry entry(tmp);
- if (entry.Exists()) {
- return tmp;
- }
- }
- return string();
- }
- string CSystemPath::ResolvePath(const string& path)
- {
- string path1, path2;
- string path_delim("\/");
- NStr::SplitInTwo(path, path_delim, path1, path2);
- if ( ! path1.empty()) {
- return ResolvePath(path1, path2);
- }
- return path;
- }
- // the GBench installation directory. Usually the parent of the App Path.
- // corresponds to the <std> alias in ResolvePath().
- string CSystemPath::GetStdPath(void)
- {
- string ret_val;
- CNcbiApplication *myApp = CNcbiApplication::Instance();
- _ASSERT(myApp);
- // First, was the value set in the environment variable $NCBI_GBENCH_HOME
- ret_val = myApp->GetEnvironment().Get(string("NCBI_GBENCH_HOME"));
- if (ret_val.empty()) {
- // Next, look at the application's own location.
- ret_val = myApp->GetArguments().GetProgramDirname();
- if (!ret_val.empty()) {
- // strip off the bin directory, if it is there.
- string::size_type pos = ret_val.rfind("bin");
- if (pos != string::npos && pos == ret_val.length() - 4) {
- ret_val.erase(pos);
- while ( (pos = ret_val.find_last_of("\/")) ==
- ret_val.length() - 1) {
- ret_val.erase(pos);
- }
- }
- }
- // Hmmm... We aren't where we should be.
- if (ret_val.empty()) {
- NcbiMessageBox("Warning:n"
- "Can't identify the application's execution path.n"
- "Some components may be unavailable.");
- }
- }
- return ret_val;
- }
- string CSystemPath::GetResourcePath()
- {
- string path = GetStdPath();
- path += CDirEntry::GetPathSeparator();
- path += "share";
- return path;
- }
- // The place gbench keeps stuff.
- // corresponds to the <home> alias in ResolvePath().
- // Is NOT the same as the user's home directory.
- // That is returned by CDir::GetHome()
- string CSystemPath::GetHomePath(void)
- {
- string ret_val(CDir::GetHome());
- #if defined(NCBI_OS_UNIX) && ! defined(NCBI_OS_DARWIN)
- ret_val += ".gbench";
- #elif defined(NCBI_OS_DARWIN) // for now use the Unix location for Mac OS X.
- OSErr err;
- short appsuppVRefNum;
- long appsuppDirID;
- FSSpec appsuppFSSpec;
- FSRef appsuppFSRef;
- char appsuppPath[1024];
- // Get the path to the Application Support folder for this user.
- //
- err = FindFolder(kUserDomain, kApplicationSupportFolderType, kCreateFolder,
- &appsuppVRefNum, &appsuppDirID);
- if (err == noErr) {
- err = FSMakeFSSpec(appsuppVRefNum, appsuppDirID,
- (ConstStr255Param) "", &appsuppFSSpec);
- if (err == noErr || err == fnfErr) {
- err = FSpMakeFSRef(&appsuppFSSpec, &appsuppFSRef);
- if (err == noErr) {
- err = FSRefMakePath(&appsuppFSRef, (UInt8 *) appsuppPath, 1024);
- }
- }
- }
- if (err == noErr) {
- ret_val = appsuppPath;
- ret_val = CDirEntry::MakePath(ret_val, "gbench"); // not a hidden folder
- } else {
- // Problems getting the Mac Application Support folder?
- // use ~/.gbench/ just like on other Unixes.
- ret_val = CDirEntry::MakePath(ret_val, ".gbench");
- }
- #elif defined(NCBI_OS_MSWIN)
- ret_val += "GenomeWorkbench";
- #else
- #error "platform unrecognized"
- #endif
- return ret_val;
- }
- END_NCBI_SCOPE
- /*
- * ===========================================================================
- * $Log: system_path.cpp,v $
- * Revision 1000.1 2004/06/01 21:05:13 gouriano
- * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.4
- *
- * Revision 1.4 2004/05/21 22:27:51 gorelenk
- * Added PCH ncbi_pch.hpp
- *
- * Revision 1.3 2004/05/20 12:41:30 dicuccio
- * Added standard resolution of '<res>' alias
- *
- * Revision 1.2 2004/05/07 17:54:11 dicuccio
- * Altered GetStdPath() - don't erase system path if it doesn't end in bin
- *
- * Revision 1.1 2004/02/17 20:35:20 rsmith
- * moved core/settings.[ch]pp and core/system_path.[ch]pp to config and utils, respectively.
- *
- * Revision 1.4 2004/01/21 12:36:07 dicuccio
- * Replace int with string::size_type where necessary
- *
- * Revision 1.3 2003/10/14 16:22:19 dicuccio
- * Added ResolvePathExisting(). Changed ResolvePath(const string&) to search all
- * delimited directories, not just the platform-specific one
- *
- * Revision 1.2 2003/08/25 17:57:12 rsmith
- * add member ResolvePath that splits and resolves a single string.
- *
- * Revision 1.1 2003/07/30 12:51:53 dicuccio
- * Moved 'gbench_system.[h,c]pp' to 'system_path.[h,c]pp'
- *
- * Revision 1.5 2003/07/30 12:18:48 dicuccio
- * Changed class name to CSystemPath. Minor reformatting.
- *
- * Revision 1.4 2003/07/30 01:43:53 ucko
- * Fix path to gbench_system.hpp.
- *
- * Revision 1.3 2003/06/25 16:52:48 rsmith
- * <home> on Mac is in Users Application Support folder.
- *
- * Revision 1.2 2003/06/16 17:57:38 meric
- * Fixed to use string::erase() instead of string::clear() (MSVC++ peculiarity)
- *
- * Revision 1.1 2003/06/16 13:50:12 rsmith
- * initial checkin. Resolve paths in a system independent manner.
- *
- */