diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2008-06-02 21:41:35 +0000 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2008-06-02 21:41:35 +0000 |
commit | 449aab3c465bbbf66d221fac3d7ea559f1720357 (patch) | |
tree | 6843cc40c88250a132acac701271f1504cd2df04 /libs/pbd/filesystem.cc | |
parent | 9c0d7d72d70082a54f823cd44c0ccda5da64bb6f (diff) |
rollback to 3428, before the mysterious removal of libs/* at 3431/3432
git-svn-id: svn://localhost/ardour2/branches/3.0@3435 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs/pbd/filesystem.cc')
-rw-r--r-- | libs/pbd/filesystem.cc | 201 |
1 files changed, 201 insertions, 0 deletions
diff --git a/libs/pbd/filesystem.cc b/libs/pbd/filesystem.cc new file mode 100644 index 0000000000..84d18cfcd2 --- /dev/null +++ b/libs/pbd/filesystem.cc @@ -0,0 +1,201 @@ +/* + Copyright (C) 2007 Tim Mayberry + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#include <sys/stat.h> + +#include <glib.h> +#include <glib/gstdio.h> + +#include <cerrno> +#include <fstream> + +#include <glibmm/fileutils.h> +#include <glibmm/miscutils.h> + +#include <pbd/filesystem.h> +#include <pbd/error.h> +#include <pbd/compose.h> + +#include "i18n.h" + +namespace PBD { + +namespace sys { + +path& +path::operator/=(const path& rhs) +{ + m_path = Glib::build_filename(m_path, rhs.m_path); + return *this; +} + +path& +path::operator/=(const string& rhs) +{ + m_path = Glib::build_filename(m_path, rhs); + return *this; +} + +path& +path::operator/=(const char* rhs) +{ + m_path = Glib::build_filename(m_path, rhs); + return *this; +} + +string +path::leaf () const +{ + return Glib::path_get_basename(m_path); +} + +path +path::branch_path () const +{ + string dir = Glib::path_get_dirname (m_path); + + /* + * glib returns "." to signify that the path + * has no directory components(branch path) + * whereas boost::filesystem returns an empty + * string + */ + if(dir == ".") + { + return ""; + } + return dir; +} + +bool +exists (const path & p) +{ + return Glib::file_test (p.to_string(), Glib::FILE_TEST_EXISTS); +} + +bool +is_directory (const path & p) +{ + return Glib::file_test (p.to_string(), Glib::FILE_TEST_IS_DIR); +} + +bool +create_directory(const path & p) +{ + if(is_directory(p)) return false; + + int error = g_mkdir (p.to_string().c_str(), S_IRWXU|S_IRWXG|S_IRWXO); + + if(error == -1) + { + throw filesystem_error(g_strerror(errno), errno); + } + return true; +} + +bool +create_directories(const path & p) +{ + if(is_directory(p)) return false; + + int error = g_mkdir_with_parents (p.to_string().c_str(), S_IRWXU|S_IRWXG|S_IRWXO); + + if(error == -1) + { + throw filesystem_error(g_strerror(errno), errno); + } + return true; +} + +bool +remove(const path & p) +{ + if(!exists(p)) return false; + + int error = g_unlink (p.to_string().c_str()); + + if(error == -1) + { + throw filesystem_error(g_strerror(errno), errno); + } + return true; +} + +void +rename (const path & from_path, const path & to_path) +{ + // g_rename is a macro that evaluates to ::rename on + // POSIX systems, without the global namespace qualifier + // it would evaluate to a recursive call(if it compiled) + if ( ::g_rename( from_path.to_string().c_str(), + to_path.to_string().c_str() ) == -1 ) + { + throw filesystem_error(g_strerror(errno), errno); + } +} + +// XXX character encoding. +void +copy_file(const path & from_path, const path & to_path) +{ + std::ifstream in(from_path.to_string().c_str()); + std::ofstream out(to_path.to_string().c_str()); + + if (!in || !out) { + throw filesystem_error(string_compose(_("Could not open files %1 and %2 for copying"), + from_path.to_string(), to_path.to_string())); + } + + out << in.rdbuf(); + + if (!in || !out) { + remove (to_path); + throw filesystem_error(string_compose(_("Could not copy existing file %1 to %2"), + from_path.to_string(), to_path.to_string())); + } +} + +string +basename (const path & p) +{ + string base(p.leaf()); + + string::size_type n = base.rfind ('.'); + + return base.substr (0, n); +} + +string +extension (const path & p) +{ + string base(p.leaf()); + + string::size_type n = base.rfind ('.'); + + if (n != string::npos) + { + return base.substr(n); + } + + return string(); + +} + +} // namespace sys + +} // namespace PBD |