Gaudi Framework, version v20r4

Generated: 8 Jan 2009

DirSearchPath.cpp

Go to the documentation of this file.
00001 // $Id: DirSearchPath.cpp,v 1.2 2007/10/16 15:37:25 marcocle Exp $
00002 
00003 //<<<<<< INCLUDES                                                       >>>>>>
00004 #include <algorithm>  /* find */
00005 #include <iostream>
00006 #include "boost/filesystem/operations.hpp"
00007 #include "boost/tokenizer.hpp"
00008 #include "GaudiKernel/DirSearchPath.h"
00009 
00010 using namespace std;
00011 
00012 using boost::filesystem::filesystem_error;
00013 using boost::filesystem::exists;
00014 using boost::filesystem::is_directory;
00015 
00016 using boost::tokenizer;
00017 using boost::char_separator;
00018 
00019 //structors
00020 DirSearchPath::DirSearchPath(const std::string& stringifiedPath, const char* separator) {
00021   addCWD(); //FIXME is this a good idea?
00022 
00023   typedef  tokenizer<char_separator<char> > Tokenizer;
00024 
00025   Tokenizer tok(stringifiedPath, char_separator<char>(separator));
00026 
00027 
00028   //add names to dir container, filtering dir names to remove invalid ones
00029   //notice how we iterate over all tokens even if there is an illegal one
00030   Tokenizer::iterator it = tok.begin();
00031   while(it != tok.end()) {
00032     try {
00033       //path p( *(it++), boost::filesystem::native);
00034       // For some reason native() does not work with boost 1.31. Changed to no_check and cross the fingers....
00035       path p( *(it++), boost::filesystem::no_check);
00036       add(p);
00037     }
00038     catch (boost::filesystem::filesystem_error /*err*/) {
00039     }
00040   }
00041 }
00042 
00043 //modifiers
00044 // bool DirSearchPath::add(const std::string& dirName) {
00045 //   bool rc(false);
00046 //   try {
00047 //     rc=add(path(dirName));
00048 //   } catch (const filesystem_error& err) {
00049 // #ifndef NDEBUG
00050 //     cerr << "DirSearchPath::DirSearchPath: ERROR adding dir "
00051 //       << err.what() << endl;
00052 //     throw err;
00053 // #endif
00054 //   }
00055 //   return rc;
00056 // }
00057 
00058 bool DirSearchPath::addCWD() {
00059   return add(boost::filesystem::current_path());
00060 }
00061 
00062 bool DirSearchPath::add(const path& dir) {
00063   bool dirExist(existsDir(dir));
00064   //add dir to path even if dir does not (yet) exist,
00065   // but don't add twice same dir
00066   if (m_dirs.end() == std::find_if(m_dirs.begin(), m_dirs.end(), eqPath(dir)))
00067     m_dirs.push_back(dir);
00068   return dirExist;
00069 }
00070 
00071 //accessors
00072 bool DirSearchPath::find(const string& fileName, string& fullFileName) const {
00073   bool rc(false);
00074   try {
00075     path fileFound;
00076     if ( (rc = find(path(fileName), fileFound)) )
00077       fullFileName = fileFound.native_directory_string();
00078   } catch (...) {}
00079   return rc;
00080 }
00081 
00082 //accessors
00083 bool DirSearchPath::find(const path& file, path& fileFound) const {
00084   bool rc(false);
00085   for (std::list<path>::const_iterator iDir=m_dirs.begin(); iDir!=m_dirs.end(); ++iDir) {
00086     path full(*iDir / file);
00087     if (exists(full)) {
00088       fileFound = full;
00089       rc = true;
00090       break;
00091     }
00092   }
00093   return rc;
00094 }
00095 
00096 //accessors
00097 std::list<DirSearchPath::path>
00098 DirSearchPath::find_all(const path& file) const {
00099   std::list<path> found;
00100   for (std::list<path>::const_iterator iDir=m_dirs.begin(); iDir!=m_dirs.end(); ++iDir) {
00101     path full(*iDir / file);
00102     if (exists(full)) {
00103       found.push_back(full);
00104     }
00105   }
00106   return found;
00107 }
00108 
00109 //helpers
00110 bool DirSearchPath::existsDir(const std::string& dirName) {
00111   bool rc(false);
00112   try {
00113     rc=is_directory(path(dirName));
00114   } catch(...) {}
00115   return rc;
00116 }
00117 bool DirSearchPath::existsDir(const path& dir) {
00118   return (exists(dir) && is_directory(dir));
00119 }

Generated at Thu Jan 8 17:44:21 2009 for Gaudi Framework, version v20r4 by Doxygen version 1.5.6 written by Dimitri van Heesch, © 1997-2004