Commit 0ba1b733 authored by Max Kellermann's avatar Max Kellermann

storage: add abstract interface

Prepare for the plugin interface.
parent 4c995eb4
...@@ -418,6 +418,7 @@ if ENABLE_DATABASE ...@@ -418,6 +418,7 @@ if ENABLE_DATABASE
noinst_LIBRARIES += libstorage.a noinst_LIBRARIES += libstorage.a
libstorage_a_SOURCES = \ libstorage_a_SOURCES = \
src/storage/StorageInterface.cxx src/storage/StorageInterface.hxx \
src/storage/LocalStorage.cxx src/storage/LocalStorage.hxx \ src/storage/LocalStorage.cxx src/storage/LocalStorage.hxx \
src/storage/FileInfo.hxx src/storage/FileInfo.hxx
......
...@@ -61,7 +61,7 @@ class UpdateService final : DeferredMonitor { ...@@ -61,7 +61,7 @@ class UpdateService final : DeferredMonitor {
public: public:
UpdateService(EventLoop &_loop, SimpleDatabase &_db, UpdateService(EventLoop &_loop, SimpleDatabase &_db,
LocalStorage &_storage, Storage &_storage,
DatabaseListener &_listener); DatabaseListener &_listener);
/** /**
......
...@@ -151,7 +151,7 @@ UpdateService::RunDeferred() ...@@ -151,7 +151,7 @@ UpdateService::RunDeferred()
} }
UpdateService::UpdateService(EventLoop &_loop, SimpleDatabase &_db, UpdateService::UpdateService(EventLoop &_loop, SimpleDatabase &_db,
LocalStorage &_storage, Storage &_storage,
DatabaseListener &_listener) DatabaseListener &_listener)
:DeferredMonitor(_loop), db(_db), listener(_listener), :DeferredMonitor(_loop), db(_db), listener(_listener),
progress(UPDATE_PROGRESS_IDLE), progress(UPDATE_PROGRESS_IDLE),
......
...@@ -22,7 +22,7 @@ ...@@ -22,7 +22,7 @@
#include "UpdateDomain.hxx" #include "UpdateDomain.hxx"
#include "db/Directory.hxx" #include "db/Directory.hxx"
#include "storage/FileInfo.hxx" #include "storage/FileInfo.hxx"
#include "storage/LocalStorage.hxx" #include "storage/StorageInterface.hxx"
#include "fs/Traits.hxx" #include "fs/Traits.hxx"
#include "fs/FileSystem.hxx" #include "fs/FileSystem.hxx"
#include "util/Error.hxx" #include "util/Error.hxx"
...@@ -32,7 +32,7 @@ ...@@ -32,7 +32,7 @@
#include <unistd.h> #include <unistd.h>
bool bool
GetInfo(LocalStorage &storage, const char *uri_utf8, FileInfo &info) GetInfo(Storage &storage, const char *uri_utf8, FileInfo &info)
{ {
Error error; Error error;
bool success = storage.GetInfo(uri_utf8, true, info, error); bool success = storage.GetInfo(uri_utf8, true, info, error);
...@@ -42,7 +42,7 @@ GetInfo(LocalStorage &storage, const char *uri_utf8, FileInfo &info) ...@@ -42,7 +42,7 @@ GetInfo(LocalStorage &storage, const char *uri_utf8, FileInfo &info)
} }
bool bool
GetInfo(LocalDirectoryReader &reader, FileInfo &info) GetInfo(StorageDirectoryReader &reader, FileInfo &info)
{ {
Error error; Error error;
bool success = reader.GetInfo(true, info, error); bool success = reader.GetInfo(true, info, error);
...@@ -52,7 +52,7 @@ GetInfo(LocalDirectoryReader &reader, FileInfo &info) ...@@ -52,7 +52,7 @@ GetInfo(LocalDirectoryReader &reader, FileInfo &info)
} }
bool bool
DirectoryExists(LocalStorage &storage, const Directory &directory) DirectoryExists(Storage &storage, const Directory &directory)
{ {
FileInfo info; FileInfo info;
if (!storage.GetInfo(directory.GetPath(), true, info, IgnoreError())) if (!storage.GetInfo(directory.GetPath(), true, info, IgnoreError()))
...@@ -65,7 +65,7 @@ DirectoryExists(LocalStorage &storage, const Directory &directory) ...@@ -65,7 +65,7 @@ DirectoryExists(LocalStorage &storage, const Directory &directory)
} }
static bool static bool
GetDirectoryChildInfo(LocalStorage &storage, const Directory &directory, GetDirectoryChildInfo(Storage &storage, const Directory &directory,
const char *name_utf8, FileInfo &info, Error &error) const char *name_utf8, FileInfo &info, Error &error)
{ {
const auto uri_utf8 = PathTraitsUTF8::Build(directory.GetPath(), const auto uri_utf8 = PathTraitsUTF8::Build(directory.GetPath(),
...@@ -74,7 +74,7 @@ GetDirectoryChildInfo(LocalStorage &storage, const Directory &directory, ...@@ -74,7 +74,7 @@ GetDirectoryChildInfo(LocalStorage &storage, const Directory &directory,
} }
bool bool
directory_child_is_regular(LocalStorage &storage, const Directory &directory, directory_child_is_regular(Storage &storage, const Directory &directory,
const char *name_utf8) const char *name_utf8)
{ {
FileInfo info; FileInfo info;
...@@ -84,7 +84,7 @@ directory_child_is_regular(LocalStorage &storage, const Directory &directory, ...@@ -84,7 +84,7 @@ directory_child_is_regular(LocalStorage &storage, const Directory &directory,
} }
bool bool
directory_child_access(LocalStorage &storage, const Directory &directory, directory_child_access(Storage &storage, const Directory &directory,
const char *name, int mode) const char *name, int mode)
{ {
#ifdef WIN32 #ifdef WIN32
......
...@@ -25,30 +25,30 @@ ...@@ -25,30 +25,30 @@
struct Directory; struct Directory;
struct FileInfo; struct FileInfo;
class LocalStorage; class Storage;
class LocalDirectoryReader; class StorageDirectoryReader;
/** /**
* Wrapper for LocalStorage::GetInfo() that logs errors instead of * Wrapper for Storage::GetInfo() that logs errors instead of
* returning them. * returning them.
*/ */
bool bool
GetInfo(LocalStorage &storage, const char *uri_utf8, FileInfo &info); GetInfo(Storage &storage, const char *uri_utf8, FileInfo &info);
/** /**
* Wrapper for LocalDirectoryReader::GetInfo() that logs errors * Wrapper for LocalDirectoryReader::GetInfo() that logs errors
* instead of returning them. * instead of returning them.
*/ */
bool bool
GetInfo(LocalDirectoryReader &reader, FileInfo &info); GetInfo(StorageDirectoryReader &reader, FileInfo &info);
gcc_pure gcc_pure
bool bool
DirectoryExists(LocalStorage &storage, const Directory &directory); DirectoryExists(Storage &storage, const Directory &directory);
gcc_pure gcc_pure
bool bool
directory_child_is_regular(LocalStorage &storage, const Directory &directory, directory_child_is_regular(Storage &storage, const Directory &directory,
const char *name_utf8); const char *name_utf8);
/** /**
...@@ -56,7 +56,7 @@ directory_child_is_regular(LocalStorage &storage, const Directory &directory, ...@@ -56,7 +56,7 @@ directory_child_is_regular(LocalStorage &storage, const Directory &directory,
*/ */
gcc_pure gcc_pure
bool bool
directory_child_access(LocalStorage &storage, const Directory &directory, directory_child_access(Storage &storage, const Directory &directory,
const char *name, int mode); const char *name, int mode);
#endif #endif
...@@ -27,7 +27,7 @@ ...@@ -27,7 +27,7 @@
#include "db/Song.hxx" #include "db/Song.hxx"
#include "db/PlaylistVector.hxx" #include "db/PlaylistVector.hxx"
#include "db/Uri.hxx" #include "db/Uri.hxx"
#include "storage/LocalStorage.hxx" #include "storage/StorageInterface.hxx"
#include "playlist/PlaylistRegistry.hxx" #include "playlist/PlaylistRegistry.hxx"
#include "Mapper.hxx" #include "Mapper.hxx"
#include "ExcludeList.hxx" #include "ExcludeList.hxx"
...@@ -49,7 +49,7 @@ ...@@ -49,7 +49,7 @@
#include <errno.h> #include <errno.h>
UpdateWalk::UpdateWalk(EventLoop &_loop, DatabaseListener &_listener, UpdateWalk::UpdateWalk(EventLoop &_loop, DatabaseListener &_listener,
LocalStorage &_storage) Storage &_storage)
:storage(_storage), :storage(_storage),
editor(_loop, _listener) editor(_loop, _listener)
{ {
...@@ -140,7 +140,7 @@ UpdateWalk::PurgeDeletedFromDirectory(Directory &directory) ...@@ -140,7 +140,7 @@ UpdateWalk::PurgeDeletedFromDirectory(Directory &directory)
#ifndef WIN32 #ifndef WIN32
static bool static bool
update_directory_stat(LocalStorage &storage, Directory &directory) update_directory_stat(Storage &storage, Directory &directory)
{ {
FileInfo info; FileInfo info;
if (!GetInfo(storage, directory.GetPath(), info)) if (!GetInfo(storage, directory.GetPath(), info))
...@@ -152,7 +152,7 @@ update_directory_stat(LocalStorage &storage, Directory &directory) ...@@ -152,7 +152,7 @@ update_directory_stat(LocalStorage &storage, Directory &directory)
#endif #endif
static int static int
find_inode_ancestor(LocalStorage &storage, Directory *parent, find_inode_ancestor(Storage &storage, Directory *parent,
unsigned inode, unsigned device) unsigned inode, unsigned device)
{ {
#ifndef WIN32 #ifndef WIN32
...@@ -320,7 +320,7 @@ UpdateWalk::UpdateDirectory(Directory &directory, const FileInfo &info) ...@@ -320,7 +320,7 @@ UpdateWalk::UpdateDirectory(Directory &directory, const FileInfo &info)
directory_set_stat(directory, info); directory_set_stat(directory, info);
Error error; Error error;
LocalDirectoryReader *const reader = StorageDirectoryReader *const reader =
storage.OpenDirectory(directory.GetPath(), error); storage.OpenDirectory(directory.GetPath(), error);
if (reader == nullptr) { if (reader == nullptr) {
LogError(error); LogError(error);
......
...@@ -29,7 +29,7 @@ struct stat; ...@@ -29,7 +29,7 @@ struct stat;
struct FileInfo; struct FileInfo;
struct Directory; struct Directory;
struct archive_plugin; struct archive_plugin;
class LocalStorage; class Storage;
class ExcludeList; class ExcludeList;
class UpdateWalk final { class UpdateWalk final {
...@@ -48,13 +48,13 @@ class UpdateWalk final { ...@@ -48,13 +48,13 @@ class UpdateWalk final {
bool walk_discard; bool walk_discard;
bool modified; bool modified;
LocalStorage &storage; Storage &storage;
DatabaseEditor editor; DatabaseEditor editor;
public: public:
UpdateWalk(EventLoop &_loop, DatabaseListener &_listener, UpdateWalk(EventLoop &_loop, DatabaseListener &_listener,
LocalStorage &_storage); Storage &_storage);
/** /**
* Returns true if the database was modified. * Returns true if the database was modified.
......
...@@ -81,14 +81,6 @@ LocalStorage::MapFS(const char *uri_utf8) const ...@@ -81,14 +81,6 @@ LocalStorage::MapFS(const char *uri_utf8) const
return MapFS(uri_utf8, IgnoreError()); return MapFS(uri_utf8, IgnoreError());
} }
AllocatedPath
LocalStorage::MapChildFS(const char *uri_utf8,
const char *child_utf8) const
{
const auto uri2 = PathTraitsUTF8::Build(uri_utf8, child_utf8);
return MapFS(uri2.c_str());
}
bool bool
LocalStorage::GetInfo(const char *uri_utf8, bool follow, FileInfo &info, LocalStorage::GetInfo(const char *uri_utf8, bool follow, FileInfo &info,
Error &error) Error &error)
......
...@@ -21,14 +21,13 @@ ...@@ -21,14 +21,13 @@
#define MPD_STORAGE_LOCAL_HXX #define MPD_STORAGE_LOCAL_HXX
#include "check.h" #include "check.h"
#include "StorageInterface.hxx"
#include "fs/AllocatedPath.hxx" #include "fs/AllocatedPath.hxx"
#include "fs/DirectoryReader.hxx" #include "fs/DirectoryReader.hxx"
#include <string> #include <string>
struct FileInfo; class LocalDirectoryReader final : public StorageDirectoryReader {
class LocalDirectoryReader {
AllocatedPath base_fs; AllocatedPath base_fs;
DirectoryReader reader; DirectoryReader reader;
...@@ -43,12 +42,13 @@ public: ...@@ -43,12 +42,13 @@ public:
return reader.HasFailed(); return reader.HasFailed();
} }
const char *Read(); /* virtual methods from class StorageDirectoryReader */
virtual const char *Read() override;
bool GetInfo(bool follow, FileInfo &info, Error &error); virtual bool GetInfo(bool follow, FileInfo &info,
Error &error) override;
}; };
class LocalStorage { class LocalStorage final : public Storage {
const std::string base_utf8; const std::string base_utf8;
const AllocatedPath base_fs; const AllocatedPath base_fs;
...@@ -58,29 +58,16 @@ public: ...@@ -58,29 +58,16 @@ public:
LocalStorage(const LocalStorage &) = delete; LocalStorage(const LocalStorage &) = delete;
bool GetInfo(const char *uri_utf8, bool follow, FileInfo &info, /* virtual methods from class Storage */
Error &error); virtual bool GetInfo(const char *uri_utf8, bool follow, FileInfo &info,
Error &error) override;
LocalDirectoryReader *OpenDirectory(const char *uri_utf8, virtual LocalDirectoryReader *OpenDirectory(const char *uri_utf8,
Error &error); Error &error) override;
/** virtual std::string MapUTF8(const char *uri_utf8) const override;
* Map the given relative URI to an absolute URI.
*/
gcc_pure
std::string MapUTF8(const char *uri_utf8) const;
/**
* Map the given relative URI to a local file path. Returns
* AllocatedPath::Null() on error or if this storage does not
* support local files.
*/
gcc_pure
AllocatedPath MapFS(const char *uri_utf8) const;
gcc_pure virtual AllocatedPath MapFS(const char *uri_utf8) const override;
AllocatedPath MapChildFS(const char *uri_utf8,
const char *child_utf8) const;
private: private:
AllocatedPath MapFS(const char *uri_utf8, Error &error) const; AllocatedPath MapFS(const char *uri_utf8, Error &error) const;
......
/*
* 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 "StorageInterface.hxx"
#include "fs/AllocatedPath.hxx"
#include "fs/Traits.hxx"
AllocatedPath
Storage::MapFS(gcc_unused const char *uri_utf8) const
{
return AllocatedPath::Null();
}
AllocatedPath
Storage::MapChildFS(const char *uri_utf8,
const char *child_utf8) const
{
const auto uri2 = PathTraitsUTF8::Build(uri_utf8, child_utf8);
return MapFS(uri2.c_str());
}
/*
* 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_INTERFACE_HXX
#define MPD_STORAGE_INTERFACE_HXX
#include "check.h"
#include "fs/AllocatedPath.hxx"
#include "fs/DirectoryReader.hxx"
#include <string>
struct FileInfo;
class AllocatedPath;
class StorageDirectoryReader {
public:
virtual ~StorageDirectoryReader() {}
virtual const char *Read() = 0;
virtual bool GetInfo(bool follow, FileInfo &info, Error &error) = 0;
};
class Storage {
public:
virtual ~Storage() {}
virtual bool GetInfo(const char *uri_utf8, bool follow, FileInfo &info,
Error &error) = 0;
virtual StorageDirectoryReader *OpenDirectory(const char *uri_utf8,
Error &error) = 0;
/**
* Map the given relative URI to an absolute URI.
*/
gcc_pure
virtual std::string MapUTF8(const char *uri_utf8) const = 0;
/**
* Map the given relative URI to a local file path. Returns
* AllocatedPath::Null() on error or if this storage does not
* support local files.
*/
gcc_pure
virtual AllocatedPath MapFS(const char *uri_utf8) const;
gcc_pure
AllocatedPath MapChildFS(const char *uri_utf8,
const char *child_utf8) const;
};
#endif
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment