Commit 61eb2aa3 authored by Max Kellermann's avatar Max Kellermann

storage/Interface: wrap StorageDirectoryReader in std::unique_ptr

parent a9847ebf
......@@ -337,7 +337,7 @@ UpdateWalk::UpdateDirectory(Directory &directory,
std::unique_ptr<StorageDirectoryReader> reader;
try {
reader.reset(storage.OpenDirectory(directory.GetPath()));
reader = storage.OpenDirectory(directory.GetPath());
} catch (...) {
LogError(std::current_exception());
return false;
......
......@@ -33,25 +33,20 @@
* instance and the virtual directory entries.
*/
class CompositeDirectoryReader final : public StorageDirectoryReader {
StorageDirectoryReader *other;
std::unique_ptr<StorageDirectoryReader> other;
std::set<std::string> names;
std::set<std::string>::const_iterator current, next;
public:
template<typename M>
CompositeDirectoryReader(StorageDirectoryReader *_other,
const M &map)
:other(_other) {
template<typename O, typename M>
CompositeDirectoryReader(O &&_other, const M &map)
:other(std::forward<O>(_other)) {
for (const auto &i : map)
names.insert(i.first);
next = names.begin();
}
virtual ~CompositeDirectoryReader() {
delete other;
}
/* virtual methods from class StorageDirectoryReader */
const char *Read() noexcept override;
StorageFileInfo GetInfo(bool follow) override;
......@@ -67,8 +62,7 @@ CompositeDirectoryReader::Read() noexcept
return name;
}
delete other;
other = nullptr;
other.reset();
}
if (next == names.end())
......@@ -271,7 +265,7 @@ CompositeStorage::GetInfo(const char *uri, bool follow)
throw std::runtime_error("No such file or directory");
}
StorageDirectoryReader *
std::unique_ptr<StorageDirectoryReader>
CompositeStorage::OpenDirectory(const char *uri)
{
const std::lock_guard<Mutex> protect(mutex);
......@@ -287,14 +281,15 @@ CompositeStorage::OpenDirectory(const char *uri)
return f.directory->storage->OpenDirectory(f.uri);
}
StorageDirectoryReader *other = nullptr;
std::unique_ptr<StorageDirectoryReader> other;
try {
other = f.directory->storage->OpenDirectory(f.uri);
} catch (...) {
}
return new CompositeDirectoryReader(other, directory->children);
return std::make_unique<CompositeDirectoryReader>(std::move(other),
directory->children);
}
std::string
......
......@@ -119,7 +119,7 @@ public:
/* virtual methods from class Storage */
StorageFileInfo GetInfo(const char *uri, bool follow) override;
StorageDirectoryReader *OpenDirectory(const char *uri) override;
std::unique_ptr<StorageDirectoryReader> OpenDirectory(const char *uri) override;
std::string MapUTF8(const char *uri) const noexcept override;
......
......@@ -23,6 +23,7 @@
#include "check.h"
#include "Compiler.h"
#include <memory>
#include <string>
struct StorageFileInfo;
......@@ -56,7 +57,7 @@ public:
/**
* Throws #std::runtime_error on error.
*/
virtual StorageDirectoryReader *OpenDirectory(const char *uri_utf8) = 0;
virtual std::unique_ptr<StorageDirectoryReader> OpenDirectory(const char *uri_utf8) = 0;
/**
* Map the given relative URI to an absolute URI.
......
......@@ -60,7 +60,7 @@ public:
/* virtual methods from class Storage */
StorageFileInfo GetInfo(const char *uri_utf8, bool follow) override;
StorageDirectoryReader *OpenDirectory(const char *uri_utf8) override;
std::unique_ptr<StorageDirectoryReader> OpenDirectory(const char *uri_utf8) override;
std::string MapUTF8(const char *uri_utf8) const noexcept override;
......@@ -474,14 +474,14 @@ public:
:PropfindOperation(curl, uri, 1),
base_path(UriPathOrSlash(uri)) {}
StorageDirectoryReader *Perform() {
std::unique_ptr<StorageDirectoryReader> Perform() {
Wait();
return ToReader();
}
private:
StorageDirectoryReader *ToReader() {
return new MemoryStorageDirectoryReader(std::move(entries));
std::unique_ptr<StorageDirectoryReader> ToReader() {
return std::make_unique<MemoryStorageDirectoryReader>(std::move(entries));
}
/**
......@@ -534,7 +534,7 @@ protected:
}
};
StorageDirectoryReader *
std::unique_ptr<StorageDirectoryReader>
CurlStorage::OpenDirectory(const char *uri_utf8)
{
// TODO: escape the given URI
......
......@@ -59,7 +59,7 @@ public:
/* virtual methods from class Storage */
StorageFileInfo GetInfo(const char *uri_utf8, bool follow) override;
StorageDirectoryReader *OpenDirectory(const char *uri_utf8) override;
std::unique_ptr<StorageDirectoryReader> OpenDirectory(const char *uri_utf8) override;
std::string MapUTF8(const char *uri_utf8) const noexcept override;
......@@ -140,10 +140,10 @@ LocalStorage::GetInfo(const char *uri_utf8, bool follow)
return Stat(MapFSOrThrow(uri_utf8), follow);
}
StorageDirectoryReader *
std::unique_ptr<StorageDirectoryReader>
LocalStorage::OpenDirectory(const char *uri_utf8)
{
return new LocalDirectoryReader(MapFSOrThrow(uri_utf8));
return std::make_unique<LocalDirectoryReader>(MapFSOrThrow(uri_utf8));
}
gcc_pure
......
......@@ -88,7 +88,7 @@ public:
/* virtual methods from class Storage */
StorageFileInfo GetInfo(const char *uri_utf8, bool follow) override;
StorageDirectoryReader *OpenDirectory(const char *uri_utf8) override;
std::unique_ptr<StorageDirectoryReader> OpenDirectory(const char *uri_utf8) override;
std::string MapUTF8(const char *uri_utf8) const noexcept override;
......@@ -334,8 +334,8 @@ public:
const char *_path)
:BlockingNfsOperation(_connection), path(_path) {}
StorageDirectoryReader *ToReader() {
return new MemoryStorageDirectoryReader(std::move(entries));
std::unique_ptr<StorageDirectoryReader> ToReader() {
return std::make_unique<MemoryStorageDirectoryReader>(std::move(entries));
}
protected:
......@@ -377,7 +377,7 @@ NfsListDirectoryOperation::CollectEntries(struct nfsdir *dir)
}
}
StorageDirectoryReader *
std::unique_ptr<StorageDirectoryReader>
NfsStorage::OpenDirectory(const char *uri_utf8)
{
const std::string path = UriToNfsPath(uri_utf8);
......
......@@ -67,7 +67,7 @@ public:
/* virtual methods from class Storage */
StorageFileInfo GetInfo(const char *uri_utf8, bool follow) override;
StorageDirectoryReader *OpenDirectory(const char *uri_utf8) override;
std::unique_ptr<StorageDirectoryReader> OpenDirectory(const char *uri_utf8) override;
std::string MapUTF8(const char *uri_utf8) const noexcept override;
......@@ -124,7 +124,7 @@ SmbclientStorage::GetInfo(const char *uri_utf8, gcc_unused bool follow)
return ::GetInfo(mapped.c_str());
}
StorageDirectoryReader *
std::unique_ptr<StorageDirectoryReader>
SmbclientStorage::OpenDirectory(const char *uri_utf8)
{
std::string mapped = MapUTF8(uri_utf8);
......@@ -138,7 +138,8 @@ SmbclientStorage::OpenDirectory(const char *uri_utf8)
throw MakeErrno("Failed to open directory");
}
return new SmbclientDirectoryReader(std::move(mapped.c_str()), handle);
return std::make_unique<SmbclientDirectoryReader>(std::move(mapped.c_str()),
handle);
}
gcc_pure
......
......@@ -82,7 +82,6 @@ Ls(Storage &storage, const char *path)
mtime, name);
}
delete dir;
return EXIT_SUCCESS;
}
......
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