Skip to content
Snippets Groups Projects
qtlib_ocsapi.cpp 5.57 KiB
Newer Older
  • Learn to ignore specific revisions
  • 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