From c8c3f208405e6ceb2d608bdb9e6d9d4377d9aee6 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Wed, 5 Feb 2014 19:24:59 +0100 Subject: storage/local: move to src/storage/plugins/ --- src/storage/LocalStorage.cxx | 146 ----------------------------------- src/storage/LocalStorage.hxx | 76 ------------------ src/storage/plugins/LocalStorage.cxx | 146 +++++++++++++++++++++++++++++++++++ src/storage/plugins/LocalStorage.hxx | 76 ++++++++++++++++++ 4 files changed, 222 insertions(+), 222 deletions(-) delete mode 100644 src/storage/LocalStorage.cxx delete mode 100644 src/storage/LocalStorage.hxx create mode 100644 src/storage/plugins/LocalStorage.cxx create mode 100644 src/storage/plugins/LocalStorage.hxx (limited to 'src/storage') diff --git a/src/storage/LocalStorage.cxx b/src/storage/LocalStorage.cxx deleted file mode 100644 index f0a1726e0..000000000 --- a/src/storage/LocalStorage.cxx +++ /dev/null @@ -1,146 +0,0 @@ -/* - * Copyright (C) 2003-2014 The Music Player Daemon Project - * http://www.musicpd.org - * - * 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., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -#include "config.h" -#include "LocalStorage.hxx" -#include "FileInfo.hxx" -#include "util/Error.hxx" -#include "fs/FileSystem.hxx" - -static bool -Stat(Path path, bool follow, FileInfo &info, Error &error) -{ - struct stat st; - if (!StatFile(path, st, follow)) { - error.SetErrno(); - - const auto path_utf8 = path.ToUTF8(); - error.FormatPrefix("Failed to stat %s: ", path_utf8.c_str()); - return false; - } - - if (S_ISREG(st.st_mode)) - info.type = FileInfo::Type::REGULAR; - else if (S_ISDIR(st.st_mode)) - info.type = FileInfo::Type::DIRECTORY; - else - info.type = FileInfo::Type::OTHER; - - info.size = st.st_size; - info.mtime = st.st_mtime; - info.device = st.st_dev; - info.inode = st.st_ino; - return true; -} - -std::string -LocalStorage::MapUTF8(const char *uri_utf8) const -{ - assert(uri_utf8 != nullptr); - - if (*uri_utf8 == 0) - return base_utf8; - - return PathTraitsUTF8::Build(base_utf8.c_str(), uri_utf8); -} - -AllocatedPath -LocalStorage::MapFS(const char *uri_utf8, Error &error) const -{ - assert(uri_utf8 != nullptr); - - if (*uri_utf8 == 0) - return base_fs; - - AllocatedPath path_fs = AllocatedPath::FromUTF8(uri_utf8, error); - if (!path_fs.IsNull()) - path_fs = AllocatedPath::Build(base_fs, path_fs); - - return path_fs; -} - -AllocatedPath -LocalStorage::MapFS(const char *uri_utf8) const -{ - return MapFS(uri_utf8, IgnoreError()); -} - -bool -LocalStorage::GetInfo(const char *uri_utf8, bool follow, FileInfo &info, - Error &error) -{ - AllocatedPath path_fs = MapFS(uri_utf8, error); - if (path_fs.IsNull()) - return false; - - return Stat(path_fs, follow, info, error); -} - -LocalDirectoryReader * -LocalStorage::OpenDirectory(const char *uri_utf8, Error &error) -{ - AllocatedPath path_fs = MapFS(uri_utf8, error); - if (path_fs.IsNull()) - return nullptr; - - LocalDirectoryReader *reader = - new LocalDirectoryReader(std::move(path_fs)); - if (reader->HasFailed()) { - error.FormatErrno("Failed to open '%s'", uri_utf8); - delete reader; - return nullptr; - } - - return reader; -} - -gcc_pure -static bool -SkipNameFS(const char *name_fs) -{ - return name_fs[0] == '.' && - (name_fs[1] == 0 || - (name_fs[1] == '.' && name_fs[2] == 0)); -} - -const char * -LocalDirectoryReader::Read() -{ - while (reader.ReadEntry()) { - const Path name_fs = reader.GetEntry(); - if (SkipNameFS(name_fs.c_str())) - continue; - - name_utf8 = name_fs.ToUTF8(); - if (name_utf8.empty()) - continue; - - return name_utf8.c_str(); - } - - return nullptr; -} - -bool -LocalDirectoryReader::GetInfo(bool follow, FileInfo &info, Error &error) -{ - const AllocatedPath path_fs = - AllocatedPath::Build(base_fs, reader.GetEntry()); - return Stat(path_fs, follow, info, error); -} diff --git a/src/storage/LocalStorage.hxx b/src/storage/LocalStorage.hxx deleted file mode 100644 index 4acea3d2a..000000000 --- a/src/storage/LocalStorage.hxx +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright (C) 2003-2014 The Music Player Daemon Project - * http://www.musicpd.org - * - * 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., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -#ifndef MPD_STORAGE_LOCAL_HXX -#define MPD_STORAGE_LOCAL_HXX - -#include "check.h" -#include "StorageInterface.hxx" -#include "fs/AllocatedPath.hxx" -#include "fs/DirectoryReader.hxx" - -#include - -class LocalDirectoryReader final : public StorageDirectoryReader { - AllocatedPath base_fs; - - DirectoryReader reader; - - std::string name_utf8; - -public: - LocalDirectoryReader(AllocatedPath &&_base_fs) - :base_fs(std::move(_base_fs)), reader(base_fs) {} - - bool HasFailed() { - return reader.HasFailed(); - } - - /* virtual methods from class StorageDirectoryReader */ - virtual const char *Read() override; - virtual bool GetInfo(bool follow, FileInfo &info, - Error &error) override; -}; - -class LocalStorage final : public Storage { - const std::string base_utf8; - const AllocatedPath base_fs; - -public: - LocalStorage(const char *_base_utf8, Path _base_fs) - :base_utf8(_base_utf8), base_fs(_base_fs) {} - - LocalStorage(const LocalStorage &) = delete; - - /* virtual methods from class Storage */ - virtual bool GetInfo(const char *uri_utf8, bool follow, FileInfo &info, - Error &error) override; - - virtual LocalDirectoryReader *OpenDirectory(const char *uri_utf8, - Error &error) override; - - virtual std::string MapUTF8(const char *uri_utf8) const override; - - virtual AllocatedPath MapFS(const char *uri_utf8) const override; - -private: - AllocatedPath MapFS(const char *uri_utf8, Error &error) const; -}; - -#endif diff --git a/src/storage/plugins/LocalStorage.cxx b/src/storage/plugins/LocalStorage.cxx new file mode 100644 index 000000000..f06e447b5 --- /dev/null +++ b/src/storage/plugins/LocalStorage.cxx @@ -0,0 +1,146 @@ +/* + * Copyright (C) 2003-2014 The Music Player Daemon Project + * http://www.musicpd.org + * + * 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., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include "config.h" +#include "LocalStorage.hxx" +#include "storage/FileInfo.hxx" +#include "util/Error.hxx" +#include "fs/FileSystem.hxx" + +static bool +Stat(Path path, bool follow, FileInfo &info, Error &error) +{ + struct stat st; + if (!StatFile(path, st, follow)) { + error.SetErrno(); + + const auto path_utf8 = path.ToUTF8(); + error.FormatPrefix("Failed to stat %s: ", path_utf8.c_str()); + return false; + } + + if (S_ISREG(st.st_mode)) + info.type = FileInfo::Type::REGULAR; + else if (S_ISDIR(st.st_mode)) + info.type = FileInfo::Type::DIRECTORY; + else + info.type = FileInfo::Type::OTHER; + + info.size = st.st_size; + info.mtime = st.st_mtime; + info.device = st.st_dev; + info.inode = st.st_ino; + return true; +} + +std::string +LocalStorage::MapUTF8(const char *uri_utf8) const +{ + assert(uri_utf8 != nullptr); + + if (*uri_utf8 == 0) + return base_utf8; + + return PathTraitsUTF8::Build(base_utf8.c_str(), uri_utf8); +} + +AllocatedPath +LocalStorage::MapFS(const char *uri_utf8, Error &error) const +{ + assert(uri_utf8 != nullptr); + + if (*uri_utf8 == 0) + return base_fs; + + AllocatedPath path_fs = AllocatedPath::FromUTF8(uri_utf8, error); + if (!path_fs.IsNull()) + path_fs = AllocatedPath::Build(base_fs, path_fs); + + return path_fs; +} + +AllocatedPath +LocalStorage::MapFS(const char *uri_utf8) const +{ + return MapFS(uri_utf8, IgnoreError()); +} + +bool +LocalStorage::GetInfo(const char *uri_utf8, bool follow, FileInfo &info, + Error &error) +{ + AllocatedPath path_fs = MapFS(uri_utf8, error); + if (path_fs.IsNull()) + return false; + + return Stat(path_fs, follow, info, error); +} + +LocalDirectoryReader * +LocalStorage::OpenDirectory(const char *uri_utf8, Error &error) +{ + AllocatedPath path_fs = MapFS(uri_utf8, error); + if (path_fs.IsNull()) + return nullptr; + + LocalDirectoryReader *reader = + new LocalDirectoryReader(std::move(path_fs)); + if (reader->HasFailed()) { + error.FormatErrno("Failed to open '%s'", uri_utf8); + delete reader; + return nullptr; + } + + return reader; +} + +gcc_pure +static bool +SkipNameFS(const char *name_fs) +{ + return name_fs[0] == '.' && + (name_fs[1] == 0 || + (name_fs[1] == '.' && name_fs[2] == 0)); +} + +const char * +LocalDirectoryReader::Read() +{ + while (reader.ReadEntry()) { + const Path name_fs = reader.GetEntry(); + if (SkipNameFS(name_fs.c_str())) + continue; + + name_utf8 = name_fs.ToUTF8(); + if (name_utf8.empty()) + continue; + + return name_utf8.c_str(); + } + + return nullptr; +} + +bool +LocalDirectoryReader::GetInfo(bool follow, FileInfo &info, Error &error) +{ + const AllocatedPath path_fs = + AllocatedPath::Build(base_fs, reader.GetEntry()); + return Stat(path_fs, follow, info, error); +} diff --git a/src/storage/plugins/LocalStorage.hxx b/src/storage/plugins/LocalStorage.hxx new file mode 100644 index 000000000..d9c2fcb64 --- /dev/null +++ b/src/storage/plugins/LocalStorage.hxx @@ -0,0 +1,76 @@ +/* + * Copyright (C) 2003-2014 The Music Player Daemon Project + * http://www.musicpd.org + * + * 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., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#ifndef MPD_STORAGE_LOCAL_HXX +#define MPD_STORAGE_LOCAL_HXX + +#include "check.h" +#include "storage/StorageInterface.hxx" +#include "fs/AllocatedPath.hxx" +#include "fs/DirectoryReader.hxx" + +#include + +class LocalDirectoryReader final : public StorageDirectoryReader { + AllocatedPath base_fs; + + DirectoryReader reader; + + std::string name_utf8; + +public: + LocalDirectoryReader(AllocatedPath &&_base_fs) + :base_fs(std::move(_base_fs)), reader(base_fs) {} + + bool HasFailed() { + return reader.HasFailed(); + } + + /* virtual methods from class StorageDirectoryReader */ + virtual const char *Read() override; + virtual bool GetInfo(bool follow, FileInfo &info, + Error &error) override; +}; + +class LocalStorage final : public Storage { + const std::string base_utf8; + const AllocatedPath base_fs; + +public: + LocalStorage(const char *_base_utf8, Path _base_fs) + :base_utf8(_base_utf8), base_fs(_base_fs) {} + + LocalStorage(const LocalStorage &) = delete; + + /* virtual methods from class Storage */ + virtual bool GetInfo(const char *uri_utf8, bool follow, FileInfo &info, + Error &error) override; + + virtual LocalDirectoryReader *OpenDirectory(const char *uri_utf8, + Error &error) override; + + virtual std::string MapUTF8(const char *uri_utf8) const override; + + virtual AllocatedPath MapFS(const char *uri_utf8) const override; + +private: + AllocatedPath MapFS(const char *uri_utf8, Error &error) const; +}; + +#endif -- cgit v1.2.3