storage/Plugin: return std::unique_ptr<Storage>
This commit is contained in:
parent
3f4f7b0a53
commit
3c5e4e2788
@ -175,13 +175,13 @@ glue_mapper_init()
|
|||||||
static void
|
static void
|
||||||
InitStorage(EventLoop &event_loop)
|
InitStorage(EventLoop &event_loop)
|
||||||
{
|
{
|
||||||
Storage *storage = CreateConfiguredStorage(event_loop);
|
auto storage = CreateConfiguredStorage(event_loop);
|
||||||
if (storage == nullptr)
|
if (storage == nullptr)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
CompositeStorage *composite = new CompositeStorage();
|
CompositeStorage *composite = new CompositeStorage();
|
||||||
instance->storage = composite;
|
instance->storage = composite;
|
||||||
composite->Mount("", storage);
|
composite->Mount("", storage.release());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -199,13 +199,13 @@ handle_mount(Client &client, Request args, Response &r)
|
|||||||
}
|
}
|
||||||
|
|
||||||
auto &event_loop = instance.io_thread.GetEventLoop();
|
auto &event_loop = instance.io_thread.GetEventLoop();
|
||||||
Storage *storage = CreateStorageURI(event_loop, remote_uri);
|
auto storage = CreateStorageURI(event_loop, remote_uri);
|
||||||
if (storage == nullptr) {
|
if (storage == nullptr) {
|
||||||
r.Error(ACK_ERROR_ARG, "Unrecognized storage URI");
|
r.Error(ACK_ERROR_ARG, "Unrecognized storage URI");
|
||||||
return CommandResult::ERROR;
|
return CommandResult::ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
composite.Mount(local_uri, storage);
|
composite.Mount(local_uri, storage.release());
|
||||||
instance.EmitIdle(IDLE_MOUNT);
|
instance.EmitIdle(IDLE_MOUNT);
|
||||||
|
|
||||||
#ifdef ENABLE_DATABASE
|
#ifdef ENABLE_DATABASE
|
||||||
|
@ -20,6 +20,7 @@
|
|||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "Configured.hxx"
|
#include "Configured.hxx"
|
||||||
#include "Registry.hxx"
|
#include "Registry.hxx"
|
||||||
|
#include "StorageInterface.hxx"
|
||||||
#include "plugins/LocalStorage.hxx"
|
#include "plugins/LocalStorage.hxx"
|
||||||
#include "config/ConfigGlobal.hxx"
|
#include "config/ConfigGlobal.hxx"
|
||||||
#include "config/ConfigError.hxx"
|
#include "config/ConfigError.hxx"
|
||||||
@ -30,10 +31,10 @@
|
|||||||
|
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
|
||||||
static Storage *
|
static std::unique_ptr<Storage>
|
||||||
CreateConfiguredStorageUri(EventLoop &event_loop, const char *uri)
|
CreateConfiguredStorageUri(EventLoop &event_loop, const char *uri)
|
||||||
{
|
{
|
||||||
Storage *storage = CreateStorageURI(event_loop, uri);
|
auto storage = CreateStorageURI(event_loop, uri);
|
||||||
if (storage == nullptr)
|
if (storage == nullptr)
|
||||||
throw FormatRuntimeError("Unrecognized storage URI: %s", uri);
|
throw FormatRuntimeError("Unrecognized storage URI: %s", uri);
|
||||||
|
|
||||||
@ -50,7 +51,7 @@ GetConfiguredMusicDirectory()
|
|||||||
return path;
|
return path;
|
||||||
}
|
}
|
||||||
|
|
||||||
static Storage *
|
static std::unique_ptr<Storage>
|
||||||
CreateConfiguredStorageLocal()
|
CreateConfiguredStorageLocal()
|
||||||
{
|
{
|
||||||
AllocatedPath path = GetConfiguredMusicDirectory();
|
AllocatedPath path = GetConfiguredMusicDirectory();
|
||||||
@ -62,7 +63,7 @@ CreateConfiguredStorageLocal()
|
|||||||
return CreateLocalStorage(path);
|
return CreateLocalStorage(path);
|
||||||
}
|
}
|
||||||
|
|
||||||
Storage *
|
std::unique_ptr<Storage>
|
||||||
CreateConfiguredStorage(EventLoop &event_loop)
|
CreateConfiguredStorage(EventLoop &event_loop)
|
||||||
{
|
{
|
||||||
auto uri = config_get_string(ConfigOption::MUSIC_DIR);
|
auto uri = config_get_string(ConfigOption::MUSIC_DIR);
|
||||||
|
@ -23,6 +23,8 @@
|
|||||||
#include "check.h"
|
#include "check.h"
|
||||||
#include "Compiler.h"
|
#include "Compiler.h"
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
class Storage;
|
class Storage;
|
||||||
class EventLoop;
|
class EventLoop;
|
||||||
|
|
||||||
@ -32,7 +34,7 @@ class EventLoop;
|
|||||||
*
|
*
|
||||||
* Throws #std::runtime_error on error.
|
* Throws #std::runtime_error on error.
|
||||||
*/
|
*/
|
||||||
Storage *
|
std::unique_ptr<Storage>
|
||||||
CreateConfiguredStorage(EventLoop &event_loop);
|
CreateConfiguredStorage(EventLoop &event_loop);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -20,6 +20,7 @@
|
|||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "Registry.hxx"
|
#include "Registry.hxx"
|
||||||
#include "StoragePlugin.hxx"
|
#include "StoragePlugin.hxx"
|
||||||
|
#include "StorageInterface.hxx"
|
||||||
#include "plugins/LocalStorage.hxx"
|
#include "plugins/LocalStorage.hxx"
|
||||||
#include "plugins/SmbclientStorage.hxx"
|
#include "plugins/SmbclientStorage.hxx"
|
||||||
#include "plugins/NfsStorage.hxx"
|
#include "plugins/NfsStorage.hxx"
|
||||||
@ -54,7 +55,7 @@ GetStoragePluginByName(const char *name) noexcept
|
|||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
Storage *
|
std::unique_ptr<Storage>
|
||||||
CreateStorageURI(EventLoop &event_loop, const char *uri)
|
CreateStorageURI(EventLoop &event_loop, const char *uri)
|
||||||
{
|
{
|
||||||
for (auto i = storage_plugins; *i != nullptr; ++i) {
|
for (auto i = storage_plugins; *i != nullptr; ++i) {
|
||||||
@ -63,7 +64,7 @@ CreateStorageURI(EventLoop &event_loop, const char *uri)
|
|||||||
if (plugin.create_uri == nullptr)
|
if (plugin.create_uri == nullptr)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
Storage *storage = plugin.create_uri(event_loop, uri);
|
auto storage = plugin.create_uri(event_loop, uri);
|
||||||
if (storage != nullptr)
|
if (storage != nullptr)
|
||||||
return storage;
|
return storage;
|
||||||
}
|
}
|
||||||
|
@ -23,6 +23,8 @@
|
|||||||
#include "check.h"
|
#include "check.h"
|
||||||
#include "Compiler.h"
|
#include "Compiler.h"
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
struct StoragePlugin;
|
struct StoragePlugin;
|
||||||
class Storage;
|
class Storage;
|
||||||
class EventLoop;
|
class EventLoop;
|
||||||
@ -37,8 +39,8 @@ gcc_nonnull_all gcc_pure
|
|||||||
const StoragePlugin *
|
const StoragePlugin *
|
||||||
GetStoragePluginByName(const char *name) noexcept;
|
GetStoragePluginByName(const char *name) noexcept;
|
||||||
|
|
||||||
gcc_nonnull_all gcc_malloc
|
gcc_nonnull_all
|
||||||
Storage *
|
std::unique_ptr<Storage>
|
||||||
CreateStorageURI(EventLoop &event_loop, const char *uri);
|
CreateStorageURI(EventLoop &event_loop, const char *uri);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -22,6 +22,8 @@
|
|||||||
|
|
||||||
#include "check.h"
|
#include "check.h"
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
class Storage;
|
class Storage;
|
||||||
class EventLoop;
|
class EventLoop;
|
||||||
|
|
||||||
@ -31,7 +33,8 @@ struct StoragePlugin {
|
|||||||
/**
|
/**
|
||||||
* Throws #std::runtime_error on error.
|
* Throws #std::runtime_error on error.
|
||||||
*/
|
*/
|
||||||
Storage *(*create_uri)(EventLoop &event_loop, const char *uri);
|
std::unique_ptr<Storage> (*create_uri)(EventLoop &event_loop,
|
||||||
|
const char *uri);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -101,7 +101,7 @@ storage_state_restore(const char *line, TextFile &file, Instance &instance)
|
|||||||
FormatDebug(storage_domain, "Restoring mount %s => %s", uri.c_str(), url.c_str());
|
FormatDebug(storage_domain, "Restoring mount %s => %s", uri.c_str(), url.c_str());
|
||||||
|
|
||||||
auto &event_loop = instance.io_thread.GetEventLoop();
|
auto &event_loop = instance.io_thread.GetEventLoop();
|
||||||
Storage *storage = CreateStorageURI(event_loop, url.c_str());
|
auto storage = CreateStorageURI(event_loop, url.c_str());
|
||||||
if (storage == nullptr) {
|
if (storage == nullptr) {
|
||||||
FormatError(storage_domain, "Unrecognized storage URI: %s", url.c_str());
|
FormatError(storage_domain, "Unrecognized storage URI: %s", url.c_str());
|
||||||
return true;
|
return true;
|
||||||
@ -112,7 +112,6 @@ storage_state_restore(const char *line, TextFile &file, Instance &instance)
|
|||||||
try {
|
try {
|
||||||
((SimpleDatabase *)db)->Mount(uri.c_str(), url.c_str());
|
((SimpleDatabase *)db)->Mount(uri.c_str(), url.c_str());
|
||||||
} catch (...) {
|
} catch (...) {
|
||||||
delete storage;
|
|
||||||
FormatError(std::current_exception(),
|
FormatError(std::current_exception(),
|
||||||
"Failed to restore mount to %s",
|
"Failed to restore mount to %s",
|
||||||
url.c_str());
|
url.c_str());
|
||||||
@ -120,7 +119,8 @@ storage_state_restore(const char *line, TextFile &file, Instance &instance)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
((CompositeStorage*)instance.storage)->Mount(uri.c_str(), storage);
|
((CompositeStorage*)instance.storage)->Mount(uri.c_str(),
|
||||||
|
storage.release());
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -549,14 +549,14 @@ CurlStorage::OpenDirectory(const char *uri_utf8)
|
|||||||
return HttpListDirectoryOperation(*curl, uri.c_str()).Perform();
|
return HttpListDirectoryOperation(*curl, uri.c_str()).Perform();
|
||||||
}
|
}
|
||||||
|
|
||||||
static Storage *
|
static std::unique_ptr<Storage>
|
||||||
CreateCurlStorageURI(EventLoop &event_loop, const char *uri)
|
CreateCurlStorageURI(EventLoop &event_loop, const char *uri)
|
||||||
{
|
{
|
||||||
if (strncmp(uri, "http://", 7) != 0 &&
|
if (strncmp(uri, "http://", 7) != 0 &&
|
||||||
strncmp(uri, "https://", 8) != 0)
|
strncmp(uri, "https://", 8) != 0)
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
|
||||||
return new CurlStorage(event_loop, uri);
|
return std::make_unique<CurlStorage>(event_loop, uri);
|
||||||
}
|
}
|
||||||
|
|
||||||
const StoragePlugin curl_storage_plugin = {
|
const StoragePlugin curl_storage_plugin = {
|
||||||
|
@ -179,10 +179,10 @@ LocalDirectoryReader::GetInfo(bool follow)
|
|||||||
return Stat(AllocatedPath::Build(base_fs, reader.GetEntry()), follow);
|
return Stat(AllocatedPath::Build(base_fs, reader.GetEntry()), follow);
|
||||||
}
|
}
|
||||||
|
|
||||||
Storage *
|
std::unique_ptr<Storage>
|
||||||
CreateLocalStorage(Path base_fs)
|
CreateLocalStorage(Path base_fs)
|
||||||
{
|
{
|
||||||
return new LocalStorage(base_fs);
|
return std::make_unique<LocalStorage>(base_fs);
|
||||||
}
|
}
|
||||||
|
|
||||||
const StoragePlugin local_storage_plugin = {
|
const StoragePlugin local_storage_plugin = {
|
||||||
|
@ -23,14 +23,16 @@
|
|||||||
#include "check.h"
|
#include "check.h"
|
||||||
#include "Compiler.h"
|
#include "Compiler.h"
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
struct StoragePlugin;
|
struct StoragePlugin;
|
||||||
class Storage;
|
class Storage;
|
||||||
class Path;
|
class Path;
|
||||||
|
|
||||||
extern const StoragePlugin local_storage_plugin;
|
extern const StoragePlugin local_storage_plugin;
|
||||||
|
|
||||||
gcc_malloc gcc_nonnull_all
|
gcc_nonnull_all
|
||||||
Storage *
|
std::unique_ptr<Storage>
|
||||||
CreateLocalStorage(Path base_fs);
|
CreateLocalStorage(Path base_fs);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -390,7 +390,7 @@ NfsStorage::OpenDirectory(const char *uri_utf8)
|
|||||||
return operation.ToReader();
|
return operation.ToReader();
|
||||||
}
|
}
|
||||||
|
|
||||||
static Storage *
|
static std::unique_ptr<Storage>
|
||||||
CreateNfsStorageURI(EventLoop &event_loop, const char *base)
|
CreateNfsStorageURI(EventLoop &event_loop, const char *base)
|
||||||
{
|
{
|
||||||
if (strncmp(base, "nfs://", 6) != 0)
|
if (strncmp(base, "nfs://", 6) != 0)
|
||||||
@ -406,7 +406,8 @@ CreateNfsStorageURI(EventLoop &event_loop, const char *base)
|
|||||||
|
|
||||||
nfs_set_base(server.c_str(), mount);
|
nfs_set_base(server.c_str(), mount);
|
||||||
|
|
||||||
return new NfsStorage(event_loop, base, server.c_str(), mount);
|
return std::make_unique<NfsStorage>(event_loop, base,
|
||||||
|
server.c_str(), mount);
|
||||||
}
|
}
|
||||||
|
|
||||||
const StoragePlugin nfs_storage_plugin = {
|
const StoragePlugin nfs_storage_plugin = {
|
||||||
|
@ -179,7 +179,7 @@ SmbclientDirectoryReader::GetInfo(gcc_unused bool follow)
|
|||||||
return ::GetInfo(path.c_str());
|
return ::GetInfo(path.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
static Storage *
|
static std::unique_ptr<Storage>
|
||||||
CreateSmbclientStorageURI(gcc_unused EventLoop &event_loop, const char *base)
|
CreateSmbclientStorageURI(gcc_unused EventLoop &event_loop, const char *base)
|
||||||
{
|
{
|
||||||
if (strncmp(base, "smb://", 6) != 0)
|
if (strncmp(base, "smb://", 6) != 0)
|
||||||
@ -198,7 +198,7 @@ CreateSmbclientStorageURI(gcc_unused EventLoop &event_loop, const char *base)
|
|||||||
throw MakeErrno("smbc_new_context() failed");
|
throw MakeErrno("smbc_new_context() failed");
|
||||||
}
|
}
|
||||||
|
|
||||||
return new SmbclientStorage(base, ctx2);
|
return std::make_unique<SmbclientStorage>(base, ctx2);
|
||||||
}
|
}
|
||||||
|
|
||||||
const StoragePlugin smbclient_storage_plugin = {
|
const StoragePlugin smbclient_storage_plugin = {
|
||||||
|
@ -34,10 +34,10 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
|
||||||
static Storage *
|
static std::unique_ptr<Storage>
|
||||||
MakeStorage(EventLoop &event_loop, const char *uri)
|
MakeStorage(EventLoop &event_loop, const char *uri)
|
||||||
{
|
{
|
||||||
Storage *storage = CreateStorageURI(event_loop, uri);
|
auto storage = CreateStorageURI(event_loop, uri);
|
||||||
if (storage == nullptr)
|
if (storage == nullptr)
|
||||||
throw std::runtime_error("Unrecognized storage URI");
|
throw std::runtime_error("Unrecognized storage URI");
|
||||||
|
|
||||||
@ -108,8 +108,8 @@ try {
|
|||||||
|
|
||||||
const char *const path = argv[3];
|
const char *const path = argv[3];
|
||||||
|
|
||||||
std::unique_ptr<Storage> storage(MakeStorage(io_thread.GetEventLoop(),
|
auto storage = MakeStorage(io_thread.GetEventLoop(),
|
||||||
storage_uri));
|
storage_uri);
|
||||||
|
|
||||||
return Ls(*storage, path);
|
return Ls(*storage, path);
|
||||||
} else {
|
} else {
|
||||||
|
@ -14,6 +14,7 @@
|
|||||||
#include "ls.hxx"
|
#include "ls.hxx"
|
||||||
#include "Log.hxx"
|
#include "Log.hxx"
|
||||||
#include "db/DatabaseSong.hxx"
|
#include "db/DatabaseSong.hxx"
|
||||||
|
#include "storage/StorageInterface.hxx"
|
||||||
#include "storage/plugins/LocalStorage.hxx"
|
#include "storage/plugins/LocalStorage.hxx"
|
||||||
#include "Mapper.hxx"
|
#include "Mapper.hxx"
|
||||||
#include "util/ChronoUtil.hxx"
|
#include "util/ChronoUtil.hxx"
|
||||||
@ -309,7 +310,8 @@ CPPUNIT_TEST_SUITE_REGISTRATION(TranslateSongTest);
|
|||||||
int
|
int
|
||||||
main(gcc_unused int argc, gcc_unused char **argv)
|
main(gcc_unused int argc, gcc_unused char **argv)
|
||||||
{
|
{
|
||||||
storage = CreateLocalStorage(Path::FromFS(music_directory));
|
auto _storage = CreateLocalStorage(Path::FromFS(music_directory));
|
||||||
|
storage = _storage.get();
|
||||||
|
|
||||||
CppUnit::TextUi::TestRunner runner;
|
CppUnit::TextUi::TestRunner runner;
|
||||||
auto ®istry = CppUnit::TestFactoryRegistry::getRegistry();
|
auto ®istry = CppUnit::TestFactoryRegistry::getRegistry();
|
||||||
|
Loading…
Reference in New Issue
Block a user