Skip to content
Snippets Groups Projects
qtlib_ocsapi.cpp 5.57 KiB
Newer Older
akiraohgaki's avatar
akiraohgaki committed
/**
akiraohgaki's avatar
akiraohgaki committed
 * qtlib
akiraohgaki's avatar
akiraohgaki committed
 *
 * @author      Akira Ohgaki <akiraohgaki@gmail.com>
 * @copyright   Akira Ohgaki
akiraohgaki's avatar
akiraohgaki committed
 * @license     https://opensource.org/licenses/LGPL-3.0
akiraohgaki's avatar
akiraohgaki committed
 * @link        https://github.com/akiraohgaki/qtlib
akiraohgaki's avatar
akiraohgaki committed
 */

akiraohgaki's avatar
akiraohgaki committed
#include "qtlib_ocsapi.h"
akiraohgaki's avatar
akiraohgaki committed

#include <QXmlStreamReader>

akiraohgaki's avatar
akiraohgaki committed
#include "qtlib_json.h"
#include "qtlib_networkresource.h"
akiraohgaki's avatar
akiraohgaki committed

akiraohgaki's avatar
akiraohgaki committed
namespace qtlib {
akiraohgaki's avatar
akiraohgaki committed

// OCS-API Specification
// https://www.freedesktop.org/wiki/Specifications/open-collaboration-services/

OcsApi::OcsApi(const QString &id, const QUrl &baseUrl, const QString &userName, const QString &password, QObject *parent)
    : QObject(parent), id_(id), baseUrl_(baseUrl), userName_(userName), password_(password)
{}

OcsApi::OcsApi(const OcsApi &other, QObject *parent)
    : QObject(parent)
{
    setId(other.id());
    setBaseUrl(other.baseUrl());
    setUserName(other.userName());
    setPassword(other.password());
}

OcsApi &OcsApi::operator =(const OcsApi &other)
{
    setId(other.id());
    setBaseUrl(other.baseUrl());
    setUserName(other.userName());
    setPassword(other.password());
    return *this;
}

QString OcsApi::id() const
{
    return id_;
}

void OcsApi::setId(const QString &id)
{
    id_ = id;
}

QUrl OcsApi::baseUrl() const
{
    return baseUrl_;
}

void OcsApi::setBaseUrl(const QUrl &baseUrl)
{
    baseUrl_ = baseUrl;
}

QString OcsApi::userName() const
{
    return userName_;
}

void OcsApi::setUserName(const QString &userName)
{
    userName_ = userName;
}

QString OcsApi::password() const
{
    return password_;
}

void OcsApi::setPassword(const QString &password)
{
    password_ = password;
}

QJsonObject OcsApi::getConfig()
{
    QUrl url = baseUrl().resolved(QUrl("config"));
    url.setQuery("format=json");
akiraohgaki's avatar
akiraohgaki committed
    qtlib::NetworkResource resource(url.toString(), url, false);
    return qtlib::Json(resource.get()->readData()).toObject();
akiraohgaki's avatar
akiraohgaki committed
}

QJsonObject OcsApi::checkPerson()
{
    QUrl url = baseUrl().resolved(QUrl("person/check"));
    QUrlQuery formData;
    formData.addQueryItem("login", userName());
    formData.addQueryItem("password", password());
    formData.addQueryItem("format", "json");
akiraohgaki's avatar
akiraohgaki committed
    qtlib::NetworkResource resource(url.toString(), url, false);
    return qtlib::Json(resource.post(formData)->readData()).toObject();
akiraohgaki's avatar
akiraohgaki committed
}

QJsonObject OcsApi::getPersonDataSet(const QUrlQuery &query)
{
    QUrl url = baseUrl().resolved(QUrl("person/data"));
    url.setUserName(userName());
    url.setPassword(password());
    QUrlQuery newQuery(query);
    newQuery.removeQueryItem("format");
    newQuery.addQueryItem("format", "json");
    url.setQuery(newQuery);
akiraohgaki's avatar
akiraohgaki committed
    qtlib::NetworkResource resource(url.toString(), url, false);
    return qtlib::Json(resource.get()->readData()).toObject();
akiraohgaki's avatar
akiraohgaki committed
}

QJsonObject OcsApi::getPersonData(const QString &personId)
{
    QUrl url = baseUrl().resolved(QUrl("person/data/" + personId));
    url.setUserName(userName());
    url.setPassword(password());
    url.setQuery("format=json");
akiraohgaki's avatar
akiraohgaki committed
    qtlib::NetworkResource resource(url.toString(), url, false);
    return qtlib::Json(resource.get()->readData()).toObject();
akiraohgaki's avatar
akiraohgaki committed
}

QJsonObject OcsApi::getPersonSelf()
{
    QUrl url = baseUrl().resolved(QUrl("person/self"));
    url.setUserName(userName());
    url.setPassword(password());
    url.setQuery("format=json");
akiraohgaki's avatar
akiraohgaki committed
    qtlib::NetworkResource resource(url.toString(), url, false);
    return qtlib::Json(resource.get()->readData()).toObject();
akiraohgaki's avatar
akiraohgaki committed
}

QJsonObject OcsApi::getContentCategories()
{
    QUrl url = baseUrl().resolved(QUrl("content/categories"));
    url.setQuery("format=json");
akiraohgaki's avatar
akiraohgaki committed
    qtlib::NetworkResource resource(url.toString(), url, false);
    return qtlib::Json(resource.get()->readData()).toObject();
akiraohgaki's avatar
akiraohgaki committed
}

QJsonObject OcsApi::getContentDataSet(const QUrlQuery &query)
{
    QUrl url = baseUrl().resolved(QUrl("content/data"));
    QUrlQuery newQuery(query);
    newQuery.removeQueryItem("format");
    newQuery.addQueryItem("format", "json");
    url.setQuery(newQuery);
akiraohgaki's avatar
akiraohgaki committed
    qtlib::NetworkResource resource(url.toString(), url, false);
    return qtlib::Json(resource.get()->readData()).toObject();
akiraohgaki's avatar
akiraohgaki committed
}

QJsonObject OcsApi::getContentData(const QString &contentId)
{
    QUrl url = baseUrl().resolved(QUrl("content/data/" + contentId));
    url.setQuery("format=json");
akiraohgaki's avatar
akiraohgaki committed
    qtlib::NetworkResource resource(url.toString(), url, false);
    return qtlib::Json(resource.get()->readData()).toObject();
akiraohgaki's avatar
akiraohgaki committed
}

QJsonObject OcsApi::getContentDownload(const QString &contentId, const QString &itemId)
{
    QUrl url = baseUrl().resolved(QUrl("content/download/" + contentId + "/" + itemId));
    url.setQuery("format=json");
akiraohgaki's avatar
akiraohgaki committed
    qtlib::NetworkResource resource(url.toString(), url, false);
    return qtlib::Json(resource.get()->readData()).toObject();
akiraohgaki's avatar
akiraohgaki committed
}

QJsonArray OcsApi::getProviderFile(const QUrl &url)
{
    QJsonArray providers;
akiraohgaki's avatar
akiraohgaki committed
    qtlib::NetworkResource resource(url.toString(), url, false);
akiraohgaki's avatar
akiraohgaki committed
    QXmlStreamReader reader(resource.get()->readData());
    QStringList whitelist;
    whitelist << "id" << "location" << "name" << "icon" << "termsofuse" << "register";
    while (!reader.atEnd() && !reader.hasError()) {
        reader.readNext();
        if (reader.isStartElement() && reader.name() == "provider") {
            QJsonObject provider;
            provider["_providerfile"] = url.toString();
            providers.append(provider);
            continue;
        }
        QString elementName = reader.name().toString();
        if (!providers.isEmpty() && whitelist.contains(elementName)) {
            int i(providers.size() - 1);
            QJsonObject provider = providers[i].toObject();
            provider[elementName] = reader.readElementText();
            providers[i] = provider;
        }
    }
    return providers;
}

akiraohgaki's avatar
akiraohgaki committed
} // namespace qtlib