Commit 57fb153c authored by Max Kellermann's avatar Max Kellermann

db/Interface: pass std::string_view to GetSong()

parent 212401d6
...@@ -75,7 +75,7 @@ public: ...@@ -75,7 +75,7 @@ public:
* directory (UTF-8) * directory (UTF-8)
* @return a pointer that must be released with ReturnSong() * @return a pointer that must be released with ReturnSong()
*/ */
virtual const LightSong *GetSong(const char *uri_utf8) const = 0; virtual const LightSong *GetSong(std::string_view uri_utf8) const = 0;
/** /**
* Mark the song object as "unused". Call this on objects * Mark the song object as "unused". Call this on objects
......
...@@ -23,12 +23,6 @@ ...@@ -23,12 +23,6 @@
#include <string_view> #include <string_view>
static inline bool static inline bool
isRootDirectory(const char *name)
{
return name[0] == 0 || (name[0] == '/' && name[1] == 0);
}
static inline bool
isRootDirectory(std::string_view name) noexcept isRootDirectory(std::string_view name) noexcept
{ {
return name.empty() || (name.size() == 1 && name.front() == '/'); return name.empty() || (name.size() == 1 && name.front() == '/');
......
...@@ -121,7 +121,7 @@ public: ...@@ -121,7 +121,7 @@ public:
void Open() override; void Open() override;
void Close() noexcept override; void Close() noexcept override;
const LightSong *GetSong(const char *uri_utf8) const override; const LightSong *GetSong(std::string_view uri_utf8) const override;
void ReturnSong(const LightSong *song) const noexcept override; void ReturnSong(const LightSong *song) const noexcept override;
void Visit(const DatabaseSelection &selection, void Visit(const DatabaseSelection &selection,
...@@ -641,12 +641,12 @@ ProxyDatabase::OnIdle() noexcept ...@@ -641,12 +641,12 @@ ProxyDatabase::OnIdle() noexcept
} }
const LightSong * const LightSong *
ProxyDatabase::GetSong(const char *uri) const ProxyDatabase::GetSong(std::string_view uri) const
{ {
// TODO: eliminate the const_cast // TODO: eliminate the const_cast
const_cast<ProxyDatabase *>(this)->EnsureConnected(); const_cast<ProxyDatabase *>(this)->EnsureConnected();
if (!mpd_send_list_meta(connection, uri)) if (!mpd_send_list_meta(connection, std::string(uri).c_str()))
ThrowError(connection); ThrowError(connection);
struct mpd_song *song = mpd_recv_song(connection); struct mpd_song *song = mpd_recv_song(connection);
......
...@@ -197,7 +197,7 @@ SimpleDatabase::Close() noexcept ...@@ -197,7 +197,7 @@ SimpleDatabase::Close() noexcept
} }
const LightSong * const LightSong *
SimpleDatabase::GetSong(const char *uri) const SimpleDatabase::GetSong(std::string_view uri) const
{ {
assert(root != nullptr); assert(root != nullptr);
assert(prefixed_light_song == nullptr); assert(prefixed_light_song == nullptr);
...@@ -211,10 +211,8 @@ SimpleDatabase::GetSong(const char *uri) const ...@@ -211,10 +211,8 @@ SimpleDatabase::GetSong(const char *uri) const
/* pass the request to the mounted database */ /* pass the request to the mounted database */
protect.unlock(); protect.unlock();
/* note: r.rest.data() is actually null-terminated
because it points inside the "uri" parameter */
const LightSong *song = const LightSong *song =
r.directory->mounted_database->GetSong(r.rest.data()); r.directory->mounted_database->GetSong(r.rest);
if (song == nullptr) if (song == nullptr)
return nullptr; return nullptr;
...@@ -224,7 +222,7 @@ SimpleDatabase::GetSong(const char *uri) const ...@@ -224,7 +222,7 @@ SimpleDatabase::GetSong(const char *uri) const
return prefixed_light_song; return prefixed_light_song;
} }
if (r.rest.data() == nullptr) if (r.rest.empty())
/* it's a directory */ /* it's a directory */
throw DatabaseError(DatabaseErrorCode::NOT_FOUND, throw DatabaseError(DatabaseErrorCode::NOT_FOUND,
"No such song"); "No such song");
......
...@@ -114,7 +114,7 @@ public: ...@@ -114,7 +114,7 @@ public:
void Open() override; void Open() override;
void Close() noexcept override; void Close() noexcept override;
const LightSong *GetSong(const char *uri_utf8) const override; const LightSong *GetSong(std::string_view uri_utf8) const override;
void ReturnSong(const LightSong *song) const noexcept override; void ReturnSong(const LightSong *song) const noexcept override;
void Visit(const DatabaseSelection &selection, void Visit(const DatabaseSelection &selection,
......
...@@ -62,8 +62,9 @@ class UpnpSong : UpnpSongData, public LightSong { ...@@ -62,8 +62,9 @@ class UpnpSong : UpnpSongData, public LightSong {
std::string real_uri2; std::string real_uri2;
public: public:
UpnpSong(UPnPDirObject &&object, std::string &&_uri) noexcept template<typename U>
:UpnpSongData(std::move(_uri), std::move(object.tag)), UpnpSong(UPnPDirObject &&object, U &&_uri) noexcept
:UpnpSongData(std::forward<U>(_uri), std::move(object.tag)),
LightSong(UpnpSongData::uri.c_str(), UpnpSongData::tag), LightSong(UpnpSongData::uri.c_str(), UpnpSongData::tag),
real_uri2(std::move(object.url)) { real_uri2(std::move(object.url)) {
real_uri = real_uri2.c_str(); real_uri = real_uri2.c_str();
...@@ -87,7 +88,7 @@ public: ...@@ -87,7 +88,7 @@ public:
void Open() override; void Open() override;
void Close() noexcept override; void Close() noexcept override;
const LightSong *GetSong(const char *uri_utf8) const override; const LightSong *GetSong(std::string_view uri_utf8) const override;
void ReturnSong(const LightSong *song) const noexcept override; void ReturnSong(const LightSong *song) const noexcept override;
void Visit(const DatabaseSelection &selection, void Visit(const DatabaseSelection &selection,
...@@ -185,7 +186,7 @@ UpnpDatabase::ReturnSong(const LightSong *_song) const noexcept ...@@ -185,7 +186,7 @@ UpnpDatabase::ReturnSong(const LightSong *_song) const noexcept
// Get song info by path. We can receive either the id path, or the titles // Get song info by path. We can receive either the id path, or the titles
// one // one
const LightSong * const LightSong *
UpnpDatabase::GetSong(const char *uri) const UpnpDatabase::GetSong(std::string_view uri) const
{ {
auto vpath = SplitString(uri, '/'); auto vpath = SplitString(uri, '/');
if (vpath.empty()) if (vpath.empty())
......
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