diff --git a/src/libs/subsonic/impl/SubsonicResponse.cpp b/src/libs/subsonic/impl/SubsonicResponse.cpp index 95952e2e..3f177a6d 100644 --- a/src/libs/subsonic/impl/SubsonicResponse.cpp +++ b/src/libs/subsonic/impl/SubsonicResponse.cpp @@ -82,7 +82,7 @@ namespace API::Subsonic void Response::Node::createEmptyArrayValue(std::string_view key) { - assert (!_value); + assert(!_value); _childrenValues.emplace(key, ValuesType{}); } @@ -97,7 +97,7 @@ namespace API::Subsonic void Response::Node::addArrayValue(std::string_view key, long long value) { assert(!_value); - auto& values {_childrenValues[std::string{ key }]}; + auto& values{ _childrenValues[std::string{ key }] }; values.push_back(value); assert(std::all_of(std::cbegin(values) + 1, std::cend(values), [&](const ValueType& value) {return value.index() == values.front().index();})); } @@ -120,13 +120,30 @@ namespace API::Subsonic } Response Response::createOkResponse(ProtocolVersion protocolVersion) + { + return createResponseCommon(protocolVersion); + } + + Response Response::createFailedResponse(ProtocolVersion protocolVersion, const Error& error) + { + return createResponseCommon(protocolVersion, &error); + } + + Response Response::createResponseCommon(ProtocolVersion protocolVersion, const Error* error) { Response response; Node& responseNode{ response._root.createChild("subsonic-response") }; - responseNode.setAttribute("status", "ok"); + responseNode.setAttribute("status", error ? "failed" : "ok"); responseNode.setVersionAttribute(protocolVersion); + if (error) + { + Node& errorNode{ responseNode.createChild("error") }; + errorNode.setAttribute("code", static_cast(error->getCode())); + errorNode.setAttribute("message", error->getMessage()); + } + // OpenSubsonic mandatory fields responseNode.setAttribute("type", "lms"); responseNode.setAttribute("serverVersion", serverVersion); @@ -135,22 +152,6 @@ namespace API::Subsonic return response; } - Response Response::createFailedResponse(ProtocolVersion protocolVersion, const Error& error) - { - Response response; - Node& responseNode{ response._root.createChild("subsonic-response") }; - - responseNode.setAttribute("status", "failed"); - responseNode.setVersionAttribute(protocolVersion); - responseNode.setAttribute("type", "lms"); // non standard field to ease client hacks - - Node& errorNode{ responseNode.createChild("error") }; - errorNode.setAttribute("code", static_cast(error.getCode())); - errorNode.setAttribute("message", error.getMessage()); - - return response; - } - void Response::addNode(const std::string& key, Node node) { return _root._children["subsonic-response"].front().addChild(key, std::move(node)); @@ -198,15 +199,15 @@ namespace API::Subsonic } auto valueToPropertyTree = [](const Node::ValueType& value) - { - boost::property_tree::ptree res; - std::visit([&](const auto& rawValue) { - res.put_value(rawValue); - }, value); + boost::property_tree::ptree res; + std::visit([&](const auto& rawValue) + { + res.put_value(rawValue); + }, value); - return res; - }; + return res; + }; if (node._value) { @@ -300,4 +301,3 @@ namespace API::Subsonic } } // namespace - diff --git a/src/libs/subsonic/impl/SubsonicResponse.hpp b/src/libs/subsonic/impl/SubsonicResponse.hpp index 1d04fd6e..64046ac0 100644 --- a/src/libs/subsonic/impl/SubsonicResponse.hpp +++ b/src/libs/subsonic/impl/SubsonicResponse.hpp @@ -249,6 +249,7 @@ namespace API::Subsonic void write(std::ostream& os, ResponseFormat format); private: + static Response createResponseCommon(ProtocolVersion protocolVersion, const Error* error = nullptr); void writeJSON(std::ostream& os); void writeXML(std::ostream& os);