Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • akiraohgaki/ocs-url
  • ab3875o/ocs-url
  • dembego3/ocs-url
  • arakun/ocs-url
  • longviauroy/ocs-url
  • rolfen/ocs-url
  • hemm/ocs-url
  • simonsvw0000/ocs-url
  • dfn2/ocs-url
  • rws77/ocs-url
  • bitwalk/ocs-url
  • visdom/ocs-url
  • ricatfarker/ocs-url
  • mussah/ocs-url
  • tigefa/ocs-url
  • cobalt2727/ocs-url
  • ammark226/ocs-url
  • violethaze74/ocs-url
  • armedssault/ocs-url
  • billflick/ocs-url
  • kimblejeremy/ocs-url
  • yuvrajsm/ocs-url
  • wawmart/ocs-url
  • jhefry/ocs-url
  • robcdntruckin/ocs-url
  • bigmake2266/ocs-url
  • kamil-chbeir/ocs-url
  • jocker73/ocs-url
  • laboties/ocs-url
  • smekke61279-522014/ocs-url
  • coolduck/ocs-url
  • zulfikar-lahiya/ocs-url
  • faz-83/ocs-url
  • dado105/ocs-url
34 results
Show changes
Showing
with 152 additions and 1872 deletions
/**
* qtlib
*
* @author Akira Ohgaki <akiraohgaki@gmail.com>
* @copyright Akira Ohgaki
* @license https://opensource.org/licenses/LGPL-3.0
* @link https://github.com/akiraohgaki/qtlib
*/
#include "qtlib_config.h"
#include "qtlib_file.h"
#include "qtlib_dir.h"
#include "qtlib_json.h"
namespace qtlib {
Config::Config(const QString &configDirPath, QObject *parent)
: QObject(parent), configDirPath_(configDirPath)
{}
Config::Config(const Config &other, QObject *parent)
: QObject(parent)
{
setConfigDirPath(other.configDirPath());
}
Config &Config::operator =(const Config &other)
{
setConfigDirPath(other.configDirPath());
return *this;
}
QString Config::configDirPath() const
{
return configDirPath_;
}
void Config::setConfigDirPath(const QString &configDirPath)
{
configDirPath_ = configDirPath;
}
QJsonObject Config::get(const QString &name)
{
QString configFilePath = configDirPath() + "/" + name + ".json";
QByteArray json = qtlib::File(configFilePath).readData();
if (json.isEmpty()) {
json = QString("{}").toUtf8(); // Blank JSON data as default
}
return qtlib::Json(json).toObject();
}
bool Config::set(const QString &name, const QJsonObject &object)
{
QString configFilePath = configDirPath() + "/" + name + ".json";
QByteArray json = qtlib::Json(object).toJson();
qtlib::Dir(configDirPath()).make();
return qtlib::File(configFilePath).writeData(json);
}
} // namespace qtlib
/**
* qtlib
*
* @author Akira Ohgaki <akiraohgaki@gmail.com>
* @copyright Akira Ohgaki
* @license https://opensource.org/licenses/LGPL-3.0
* @link https://github.com/akiraohgaki/qtlib
*/
#pragma once
#include <QObject>
#include <QJsonObject>
namespace qtlib {
class Config : public QObject
{
Q_OBJECT
public:
explicit Config(const QString &configDirPath = "", QObject *parent = 0);
Config(const Config &other, QObject *parent = 0);
Config &operator =(const Config &other);
QString configDirPath() const;
void setConfigDirPath(const QString &configDirPath);
QJsonObject get(const QString &name);
bool set(const QString &name, const QJsonObject &object);
private:
QString configDirPath_;
};
} // namespace qtlib
/**
* qtlib
*
* @author Akira Ohgaki <akiraohgaki@gmail.com>
* @copyright Akira Ohgaki
* @license https://opensource.org/licenses/LGPL-3.0
* @link https://github.com/akiraohgaki/qtlib
*/
#include "qtlib_dir.h"
#include <QDir>
#include <QFile>
#include <QFileInfo>
#include <QStandardPaths>
namespace qtlib {
Dir::Dir(const QString &path, QObject *parent)
: QObject(parent), path_(path)
{}
Dir::Dir(const Dir &other, QObject *parent)
: QObject(parent)
{
setPath(other.path());
}
Dir &Dir::operator =(const Dir &other)
{
setPath(other.path());
return *this;
}
QString Dir::path() const
{
return path_;
}
void Dir::setPath(const QString &path)
{
path_ = path;
}
bool Dir::exists()
{
return QDir(path()).exists();
}
QFileInfoList Dir::list()
{
QDir dir(path());
dir.setFilter(QDir::AllEntries | QDir::Hidden | QDir::System | QDir::NoDotAndDotDot);
//dir.setSorting(QDir::DirsFirst | QDir::Name);
return dir.entryInfoList();
}
bool Dir::make()
{
// This function will create all parent directories
QDir dir(path());
if (!dir.exists() && dir.mkpath(path())) {
return true;
}
return false;
}
bool Dir::copy(const QString &newPath)
{
// This function will copy files recursively
return copyRecursively(path(), newPath);
}
bool Dir::move(const QString &newPath)
{
return QDir(path()).rename(path(), newPath);
}
bool Dir::remove()
{
// This function will remove files recursively
return QDir(path()).removeRecursively();
}
QString Dir::rootPath()
{
return QDir::rootPath();
}
QString Dir::tempPath()
{
return QDir::tempPath();
}
QString Dir::homePath()
{
return QDir::homePath();
}
QString Dir::genericDataPath()
{
return QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation);
}
QString Dir::genericConfigPath()
{
return QStandardPaths::writableLocation(QStandardPaths::GenericConfigLocation);
}
QString Dir::genericCachePath()
{
return QStandardPaths::writableLocation(QStandardPaths::GenericCacheLocation);
}
QString Dir::kdehomePath()
{
// KDE System Administration/Environment Variables
// https://userbase.kde.org/KDE_System_Administration/Environment_Variables
// KDE 4 maybe uses $KDEHOME
QString kdehomePath = QString::fromLocal8Bit(qgetenv("KDEHOME").constData());
if (kdehomePath.isEmpty()) {
kdehomePath = homePath() + "/.kde";
}
return kdehomePath;
}
bool Dir::copyRecursively(const QString &srcPath, const QString &newPath)
{
QFileInfo fileInfo(srcPath);
if (fileInfo.isSymLink() && !fileInfo.exists()) {
// Ignore broken symlink
return true;
}
else if (fileInfo.isFile()) {
return QFile(srcPath).copy(newPath);
}
else if (fileInfo.isDir()) {
QDir newDir(newPath);
QString newDirName = newDir.dirName();
newDir.cdUp();
if (newDir.mkdir(newDirName)) {
QDir dir(srcPath);
dir.setFilter(QDir::AllEntries | QDir::Hidden | QDir::System | QDir::NoDotAndDotDot);
QStringList entries = dir.entryList();
foreach (const QString &entry, entries) {
if (!copyRecursively(srcPath + "/" + entry, newPath + "/" + entry)) {
return false;
}
}
return true;
}
}
return false;
}
} // namespace qtlib
/**
* qtlib
*
* @author Akira Ohgaki <akiraohgaki@gmail.com>
* @copyright Akira Ohgaki
* @license https://opensource.org/licenses/LGPL-3.0
* @link https://github.com/akiraohgaki/qtlib
*/
#pragma once
#include <QObject>
#include <QFileInfoList>
namespace qtlib {
class Dir : public QObject
{
Q_OBJECT
public:
explicit Dir(const QString &path = "", QObject *parent = 0);
Dir(const Dir &other, QObject *parent = 0);
Dir &operator =(const Dir &other);
QString path() const;
void setPath(const QString &path);
bool exists();
QFileInfoList list();
bool make();
bool copy(const QString &newPath);
bool move(const QString &newPath);
bool remove();
static QString rootPath();
static QString tempPath();
static QString homePath();
static QString genericDataPath();
static QString genericConfigPath();
static QString genericCachePath();
static QString kdehomePath();
private:
bool copyRecursively(const QString &srcPath, const QString &newPath);
QString path_;
};
} // namespace qtlib
/**
* qtlib
*
* @author Akira Ohgaki <akiraohgaki@gmail.com>
* @copyright Akira Ohgaki
* @license https://opensource.org/licenses/LGPL-3.0
* @link https://github.com/akiraohgaki/qtlib
*/
#include "qtlib_file.h"
#include <QIODevice>
#include <QTextStream>
#include <QFile>
namespace qtlib {
File::File(const QString &path, QObject *parent)
: QObject(parent), path_(path)
{}
File::File(const File &other, QObject *parent)
: QObject(parent)
{
setPath(other.path());
}
File &File::operator =(const File &other)
{
setPath(other.path());
return *this;
}
QString File::path() const
{
return path_;
}
void File::setPath(const QString &path)
{
path_ = path;
}
bool File::exists()
{
return QFile(path()).exists();
}
QByteArray File::readData()
{
QByteArray data;
QFile file(path());
if (file.exists() && file.open(QIODevice::ReadOnly)) {
data = file.readAll();
file.close();
}
return data;
}
bool File::writeData(const QByteArray &data)
{
QFile file(path());
if (file.open(QIODevice::WriteOnly)) {
file.write(data);
file.close();
return true;
}
return false;
}
QString File::readText()
{
QString data;
QFile file(path());
if (file.exists() && file.open(QIODevice::ReadOnly | QIODevice::Text)) {
QTextStream in(&file);
in.setCodec("UTF-8");
data = in.readAll();
file.close();
}
return data;
}
bool File::writeText(const QString &data)
{
QFile file(path());
if (file.open(QIODevice::WriteOnly | QIODevice::Text)) {
QTextStream out(&file);
out.setCodec("UTF-8");
out << data;
file.close();
return true;
}
return false;
}
bool File::copy(const QString &newPath)
{
return QFile(path()).copy(newPath);
}
bool File::move(const QString &newPath)
{
return QFile(path()).rename(newPath);
}
bool File::remove()
{
return QFile(path()).remove();
}
} // namespace qtlib
/**
* qtlib
*
* @author Akira Ohgaki <akiraohgaki@gmail.com>
* @copyright Akira Ohgaki
* @license https://opensource.org/licenses/LGPL-3.0
* @link https://github.com/akiraohgaki/qtlib
*/
#pragma once
#include <QObject>
namespace qtlib {
class File : public QObject
{
Q_OBJECT
public:
explicit File(const QString &path = "", QObject *parent = 0);
File(const File &other, QObject *parent = 0);
File &operator =(const File &other);
QString path() const;
void setPath(const QString &path);
bool exists();
QByteArray readData();
bool writeData(const QByteArray &data);
QString readText();
bool writeText(const QString &data);
bool copy(const QString &newPath);
bool move(const QString &newPath);
bool remove();
private:
QString path_;
};
} // namespace qtlib
/**
* qtlib
*
* @author Akira Ohgaki <akiraohgaki@gmail.com>
* @copyright Akira Ohgaki
* @license https://opensource.org/licenses/LGPL-3.0
* @link https://github.com/akiraohgaki/qtlib
*/
#include "qtlib_json.h"
#include <QJsonDocument>
#include <QJsonParseError>
namespace qtlib {
Json::Json(const QByteArray &json, QObject *parent)
: QObject(parent), json_(json)
{}
Json::Json(const QJsonObject &object, QObject *parent)
: QObject(parent)
{
fromObject(object);
}
Json::Json(const QJsonArray &array, QObject *parent)
: QObject(parent)
{
fromArray(array);
}
Json::Json(const Json &other, QObject *parent)
: QObject(parent)
{
setJson(other.json());
}
Json &Json::operator =(const Json &other)
{
setJson(other.json());
return *this;
}
QByteArray Json::json() const
{
return json_;
}
void Json::setJson(const QByteArray &json)
{
json_ = json;
}
void Json::fromObject(const QJsonObject &object)
{
setJson(QJsonDocument(object).toJson());
}
void Json::fromArray(const QJsonArray &array)
{
setJson(QJsonDocument(array).toJson());
}
QByteArray Json::toJson()
{
return QJsonDocument::fromJson(json()).toJson();
}
QJsonObject Json::toObject()
{
return QJsonDocument::fromJson(json()).object();
}
QJsonArray Json::toArray()
{
return QJsonDocument::fromJson(json()).array();
}
bool Json::isValid()
{
QJsonParseError parseError;
QJsonDocument::fromJson(json(), &parseError);
if (parseError.error == QJsonParseError::NoError) {
return true;
}
return false;
}
bool Json::isObject()
{
return QJsonDocument::fromJson(json()).isObject();
}
bool Json::isArray()
{
return QJsonDocument::fromJson(json()).isArray();
}
} // namespace qtlib
/**
* qtlib
*
* @author Akira Ohgaki <akiraohgaki@gmail.com>
* @copyright Akira Ohgaki
* @license https://opensource.org/licenses/LGPL-3.0
* @link https://github.com/akiraohgaki/qtlib
*/
#pragma once
#include <QObject>
#include <QJsonObject>
#include <QJsonArray>
namespace qtlib {
class Json : public QObject
{
Q_OBJECT
public:
explicit Json(const QByteArray &json = QByteArray(), QObject *parent = 0);
explicit Json(const QJsonObject &object, QObject *parent = 0);
explicit Json(const QJsonArray &array, QObject *parent = 0);
Json(const Json &other, QObject *parent = 0);
Json &operator =(const Json &other);
QByteArray json() const;
void setJson(const QByteArray &json);
void fromObject(const QJsonObject &object);
void fromArray(const QJsonArray &array);
QByteArray toJson();
QJsonObject toObject();
QJsonArray toArray();
bool isValid();
bool isObject();
bool isArray();
private:
QByteArray json_;
};
} // namespace qtlib
/**
* qtlib
*
* @author Akira Ohgaki <akiraohgaki@gmail.com>
* @copyright Akira Ohgaki
* @license https://opensource.org/licenses/LGPL-3.0
* @link https://github.com/akiraohgaki/qtlib
*/
#include "qtlib_networkresource.h"
#include <QEventLoop>
#include "qtlib_file.h"
namespace qtlib {
NetworkResource::NetworkResource(const QString &id, const QUrl &url, bool async, QObject *parent)
: QObject(parent), id_(id), url_(url), async_(async)
{
setManager(new QNetworkAccessManager(this));
}
NetworkResource::~NetworkResource()
{
manager()->deleteLater();
}
NetworkResource::NetworkResource(const NetworkResource &other, QObject *parent)
: QObject(parent)
{
setId(other.id());
setUrl(other.url());
setAsync(other.async());
setRequest(other.request());
setManager(new QNetworkAccessManager(this));
}
NetworkResource &NetworkResource::operator =(const NetworkResource &other)
{
setId(other.id());
setUrl(other.url());
setAsync(other.async());
setRequest(other.request());
return *this;
}
QString NetworkResource::id() const
{
return id_;
}
void NetworkResource::setId(const QString &id)
{
id_ = id;
}
QUrl NetworkResource::url() const
{
return url_;
}
void NetworkResource::setUrl(const QUrl &url)
{
url_ = url;
}
bool NetworkResource::async() const
{
return async_;
}
void NetworkResource::setAsync(bool async)
{
async_ = async;
}
QNetworkRequest NetworkResource::request() const
{
return request_;
}
void NetworkResource::setRequest(const QNetworkRequest &request)
{
request_ = request;
}
QNetworkAccessManager *NetworkResource::manager() const
{
return manager_;
}
QNetworkReply *NetworkResource::reply() const
{
return reply_;
}
QString NetworkResource::method() const
{
return method_;
}
QString NetworkResource::contentType() const
{
return contentType_;
}
QByteArray NetworkResource::contentData() const
{
return contentData_;
}
NetworkResource *NetworkResource::head()
{
setMethod("HEAD");
return send(url(), async());
}
NetworkResource *NetworkResource::get()
{
setMethod("GET");
return send(url(), async());
}
NetworkResource *NetworkResource::post(const QByteArray &contentData, const QString &contentType)
{
setMethod("POST");
setContentType(contentType);
setContentData(contentData);
return send(url(), async());
}
NetworkResource *NetworkResource::post(const QUrlQuery &contentData)
{
setMethod("POST");
setContentType("application/x-www-form-urlencoded");
setContentData(contentData.toString(QUrl::FullyEncoded).toUtf8());
return send(url(), async());
}
NetworkResource *NetworkResource::put(const QByteArray &contentData, const QString &contentType)
{
setMethod("PUT");
setContentType(contentType);
setContentData(contentData);
return send(url(), async());
}
NetworkResource *NetworkResource::put(const QUrlQuery &contentData)
{
setMethod("PUT");
setContentType("application/x-www-form-urlencoded");
setContentData(contentData.toString(QUrl::FullyEncoded).toUtf8());
return send(url(), async());
}
NetworkResource *NetworkResource::deleteResource()
{
setMethod("DELETE");
return send(url(), async());
}
bool NetworkResource::isFinishedWithNoError()
{
if (reply()->isFinished() && reply()->error() == QNetworkReply::NoError) {
return true;
}
return false;
}
QByteArray NetworkResource::readData()
{
QByteArray data;
if (isFinishedWithNoError()) {
data = reply()->readAll();
}
return data;
}
bool NetworkResource::saveData(const QString &path)
{
if (isFinishedWithNoError()) {
return qtlib::File(path).writeData(reply()->readAll());
}
return false;
}
void NetworkResource::abort()
{
if (reply()->isRunning()) {
reply()->abort();
}
}
void NetworkResource::replyFinished()
{
if (isFinishedWithNoError()) {
// Check if redirection
// Note: An auto redirection option is available since Qt 5.6
QUrl redirectUrl;
if (reply()->hasRawHeader("Location")) {
redirectUrl.setUrl(QString(reply()->rawHeader("Location")));
}
else if (reply()->hasRawHeader("Refresh")) {
redirectUrl.setUrl(QString(reply()->rawHeader("Refresh")).split("url=").last());
}
if (!redirectUrl.isEmpty()) {
if (redirectUrl.isRelative()) {
redirectUrl = reply()->url().resolved(redirectUrl);
}
reply()->deleteLater();
send(redirectUrl, true);
return;
}
}
emit finished(this);
}
void NetworkResource::replyDownloadProgress(qint64 bytesReceived, qint64 bytesTotal)
{
emit downloadProgress(id(), bytesReceived, bytesTotal);
}
void NetworkResource::replyUploadProgress(qint64 bytesSent, qint64 bytesTotal)
{
emit uploadProgress(id(), bytesSent, bytesTotal);
}
void NetworkResource::setManager(QNetworkAccessManager *manager)
{
manager_ = manager;
}
void NetworkResource::setReply(QNetworkReply *reply)
{
reply_ = reply;
}
void NetworkResource::setMethod(const QString &method)
{
method_ = method;
}
void NetworkResource::setContentType(const QString &contentType)
{
contentType_ = contentType;
}
void NetworkResource::setContentData(const QByteArray &contentData)
{
contentData_ = contentData;
}
NetworkResource *NetworkResource::send(const QUrl &url, bool async)
{
QNetworkRequest networkRequest = request();
networkRequest.setUrl(url);
if (method() == "HEAD") {
setReply(manager()->head(networkRequest));
}
else if (method() == "GET") {
setReply(manager()->get(networkRequest));
}
else if (method() == "POST") {
networkRequest.setHeader(QNetworkRequest::ContentTypeHeader, QVariant(contentType()));
setReply(manager()->post(networkRequest, contentData()));
}
else if (method() == "PUT") {
networkRequest.setHeader(QNetworkRequest::ContentTypeHeader, QVariant(contentType()));
setReply(manager()->put(networkRequest, contentData()));
}
else if (method() == "DELETE") {
setReply(manager()->deleteResource(networkRequest));
}
else {
Q_ASSERT(false);
}
connect(reply(), &QNetworkReply::finished, this, &NetworkResource::replyFinished);
connect(reply(), &QNetworkReply::downloadProgress, this, &NetworkResource::replyDownloadProgress);
connect(reply(), &QNetworkReply::uploadProgress, this, &NetworkResource::replyUploadProgress);
if (!async) {
QEventLoop eventLoop;
connect(this, &NetworkResource::finished, &eventLoop, &QEventLoop::quit);
eventLoop.exec();
}
return this;
}
} // namespace qtlib
/**
* qtlib
*
* @author Akira Ohgaki <akiraohgaki@gmail.com>
* @copyright Akira Ohgaki
* @license https://opensource.org/licenses/LGPL-3.0
* @link https://github.com/akiraohgaki/qtlib
*/
#pragma once
#include <QObject>
#include <QUrl>
#include <QUrlQuery>
#include <QNetworkRequest>
#include <QNetworkAccessManager>
#include <QNetworkReply>
namespace qtlib {
class NetworkResource : public QObject
{
Q_OBJECT
public:
explicit NetworkResource(const QString &id = "", const QUrl &url = QUrl(), bool async = true, QObject *parent = 0);
~NetworkResource();
NetworkResource(const NetworkResource &other, QObject *parent = 0);
NetworkResource &operator =(const NetworkResource &other);
QString id() const;
void setId(const QString &id);
QUrl url() const;
void setUrl(const QUrl &url);
bool async() const;
void setAsync(bool async);
QNetworkRequest request() const;
void setRequest(const QNetworkRequest &request);
QNetworkAccessManager *manager() const;
QNetworkReply *reply() const;
QString method() const;
QString contentType() const;
QByteArray contentData() const;
NetworkResource *head();
NetworkResource *get();
NetworkResource *post(const QByteArray &contentData, const QString &contentType);
NetworkResource *post(const QUrlQuery &contentData);
NetworkResource *put(const QByteArray &contentData, const QString &contentType);
NetworkResource *put(const QUrlQuery &contentData);
NetworkResource *deleteResource();
bool isFinishedWithNoError();
QByteArray readData();
bool saveData(const QString &path);
signals:
void finished(NetworkResource *resource);
void downloadProgress(QString id, qint64 bytesReceived, qint64 bytesTotal);
void uploadProgress(QString id, qint64 bytesSent, qint64 bytesTotal);
public slots:
void abort();
private slots:
void replyFinished();
void replyDownloadProgress(qint64 bytesReceived, qint64 bytesTotal);
void replyUploadProgress(qint64 bytesSent, qint64 bytesTotal);
private:
void setManager(QNetworkAccessManager *manager);
void setReply(QNetworkReply *reply);
void setMethod(const QString &method);
void setContentType(const QString &contentType);
void setContentData(const QByteArray &contentData);
NetworkResource *send(const QUrl &url, bool async);
QString id_;
QUrl url_;
bool async_;
QNetworkRequest request_;
QNetworkAccessManager *manager_;
QNetworkReply *reply_;
QString method_;
QString contentType_;
QByteArray contentData_;
};
} // namespace qtlib
/**
* qtlib
*
* @author Akira Ohgaki <akiraohgaki@gmail.com>
* @copyright Akira Ohgaki
* @license https://opensource.org/licenses/LGPL-3.0
* @link https://github.com/akiraohgaki/qtlib
*/
#include "qtlib_ocsapi.h"
#include <QXmlStreamReader>
#include "qtlib_json.h"
#include "qtlib_networkresource.h"
namespace qtlib {
// 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");
qtlib::NetworkResource resource(url.toString(), url, false);
return qtlib::Json(resource.get()->readData()).toObject();
}
QJsonObject OcsApi::checkPerson()
{
QUrl url = baseUrl().resolved(QUrl("person/check"));
QUrlQuery formData;
formData.addQueryItem("login", userName());
formData.addQueryItem("password", password());
formData.addQueryItem("format", "json");
qtlib::NetworkResource resource(url.toString(), url, false);
return qtlib::Json(resource.post(formData)->readData()).toObject();
}
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);
qtlib::NetworkResource resource(url.toString(), url, false);
return qtlib::Json(resource.get()->readData()).toObject();
}
QJsonObject OcsApi::getPersonData(const QString &personId)
{
QUrl url = baseUrl().resolved(QUrl("person/data/" + personId));
url.setUserName(userName());
url.setPassword(password());
url.setQuery("format=json");
qtlib::NetworkResource resource(url.toString(), url, false);
return qtlib::Json(resource.get()->readData()).toObject();
}
QJsonObject OcsApi::getPersonSelf()
{
QUrl url = baseUrl().resolved(QUrl("person/self"));
url.setUserName(userName());
url.setPassword(password());
url.setQuery("format=json");
qtlib::NetworkResource resource(url.toString(), url, false);
return qtlib::Json(resource.get()->readData()).toObject();
}
QJsonObject OcsApi::getContentCategories()
{
QUrl url = baseUrl().resolved(QUrl("content/categories"));
url.setQuery("format=json");
qtlib::NetworkResource resource(url.toString(), url, false);
return qtlib::Json(resource.get()->readData()).toObject();
}
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);
qtlib::NetworkResource resource(url.toString(), url, false);
return qtlib::Json(resource.get()->readData()).toObject();
}
QJsonObject OcsApi::getContentData(const QString &contentId)
{
QUrl url = baseUrl().resolved(QUrl("content/data/" + contentId));
url.setQuery("format=json");
qtlib::NetworkResource resource(url.toString(), url, false);
return qtlib::Json(resource.get()->readData()).toObject();
}
QJsonObject OcsApi::getContentDownload(const QString &contentId, const QString &itemId)
{
QUrl url = baseUrl().resolved(QUrl("content/download/" + contentId + "/" + itemId));
url.setQuery("format=json");
qtlib::NetworkResource resource(url.toString(), url, false);
return qtlib::Json(resource.get()->readData()).toObject();
}
QJsonArray OcsApi::getProviderFile(const QUrl &url)
{
QJsonArray providers;
qtlib::NetworkResource resource(url.toString(), url, false);
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;
}
} // namespace qtlib
/**
* qtlib
*
* @author Akira Ohgaki <akiraohgaki@gmail.com>
* @copyright Akira Ohgaki
* @license https://opensource.org/licenses/LGPL-3.0
* @link https://github.com/akiraohgaki/qtlib
*/
#pragma once
#include <QObject>
#include <QUrl>
#include <QUrlQuery>
#include <QJsonObject>
#include <QJsonArray>
namespace qtlib {
class OcsApi : public QObject
{
Q_OBJECT
public:
explicit OcsApi(const QString &id = "", const QUrl &baseUrl = QUrl(), const QString &userName = "", const QString &password = "", QObject *parent = 0);
OcsApi(const OcsApi &other, QObject *parent = 0);
OcsApi &operator =(const OcsApi &other);
QString id() const;
void setId(const QString &id);
QUrl baseUrl() const;
void setBaseUrl(const QUrl &baseUrl);
QString userName() const;
void setUserName(const QString &userName);
QString password() const;
void setPassword(const QString &password);
QJsonObject getConfig();
QJsonObject checkPerson();
QJsonObject getPersonDataSet(const QUrlQuery &query = QUrlQuery());
QJsonObject getPersonData(const QString &personId);
QJsonObject getPersonSelf();
QJsonObject getContentCategories();
QJsonObject getContentDataSet(const QUrlQuery &query = QUrlQuery());
QJsonObject getContentData(const QString &contentId);
QJsonObject getContentDownload(const QString &contentId, const QString &itemId);
static QJsonArray getProviderFile(const QUrl &url);
private:
QString id_;
QUrl baseUrl_;
QString userName_;
QString password_;
};
} // namespace qtlib
/**
* qtlib
*
* @author Akira Ohgaki <akiraohgaki@gmail.com>
* @copyright Akira Ohgaki
* @license https://opensource.org/licenses/LGPL-3.0
* @link https://github.com/akiraohgaki/qtlib
*/
#include "qtlib_package.h"
#ifdef QTLIB_UNIX
#include <QJsonObject>
#include <QMimeDatabase>
#include <QProcess>
#endif
#ifdef Q_OS_ANDROID
#include <QAndroidJniObject>
#endif
namespace qtlib {
Package::Package(const QString &path, QObject *parent)
: QObject(parent), path_(path)
{}
Package::Package(const Package &other, QObject *parent)
: QObject(parent)
{
setPath(other.path());
}
Package &Package::operator =(const Package &other)
{
setPath(other.path());
return *this;
}
QString Package::path() const
{
return path_;
}
void Package::setPath(const QString &path)
{
path_ = path;
}
#ifdef QTLIB_UNIX
bool Package::installAsProgram(const QString &newPath)
{
QStringList arguments;
arguments << "-m" << "755" << "-p" << path() << newPath;
return execute("install", arguments);
}
bool Package::installAsFile(const QString &newPath)
{
QStringList arguments;
arguments << "-m" << "644" << "-p" << path() << newPath;
return execute("install", arguments);
}
bool Package::installAsArchive(const QString &destinationDirPath)
{
QJsonObject archiveTypes;
archiveTypes["application/x-tar"] = QString("tar");
archiveTypes["application/x-gzip"] = QString("tar");
archiveTypes["application/gzip"] = QString("tar");
archiveTypes["application/x-bzip"] = QString("tar");
archiveTypes["application/x-bzip2"] = QString("tar");
archiveTypes["application/x-xz"] = QString("tar");
archiveTypes["application/x-lzma"] = QString("tar");
archiveTypes["application/x-lzip"] = QString("tar");
archiveTypes["application/x-compressed-tar"] = QString("tar");
archiveTypes["application/x-bzip-compressed-tar"] = QString("tar");
archiveTypes["application/x-bzip2-compressed-tar"] = QString("tar");
archiveTypes["application/x-xz-compressed-tar"] = QString("tar");
archiveTypes["application/x-lzma-compressed-tar"] = QString("tar");
archiveTypes["application/x-lzip-compressed-tar"] = QString("tar");
archiveTypes["application/zip"] = QString("zip");
archiveTypes["application/x-7z-compressed"] = QString("7z");
archiveTypes["application/x-rar"] = QString("rar");
archiveTypes["application/x-rar-compressed"] = QString("rar");
QString mimeType = QMimeDatabase().mimeTypeForFile(path()).name();
if (archiveTypes.contains(mimeType)) {
QString archiveType = archiveTypes[mimeType].toString();
QString program;
QStringList arguments;
if (archiveType == "tar") {
program = "tar";
arguments << "-xf" << path() << "-C" << destinationDirPath;
}
else if (archiveType == "zip") {
program = "unzip";
arguments << "-o" << path() << "-d" << destinationDirPath;
}
else if (archiveType == "7z") {
program = "7z";
arguments << "x" << path() << "-o" + destinationDirPath; // No space between -o and directory
}
else if (archiveType == "rar") {
program = "unrar";
arguments << "e" << path() << destinationDirPath;
}
return execute(program, arguments);
}
return false;
}
bool Package::installAsPlasmapkg(const QString &type)
{
QStringList arguments;
arguments << "-t" << type << "-i" << path();
return execute("plasmapkg2", arguments);
}
bool Package::uninstallAsPlasmapkg(const QString &type)
{
QStringList arguments;
arguments << "-t" << type << "-r" << path();
return execute("plasmapkg2", arguments);
}
#endif
#ifdef Q_OS_ANDROID
bool Package::installAsApk()
{
QAndroidJniObject activity = QAndroidJniObject::callStaticObjectMethod("org/qtproject/qt5/android/QtNative", "activity", "()Landroid/app/Activity;");
if (activity.isValid()) {
QString filePath = path();
if (filePath.startsWith("file://", Qt::CaseInsensitive)) {
filePath.replace("file://localhost", "", Qt::CaseInsensitive);
filePath.replace("file://", "", Qt::CaseInsensitive);
}
QAndroidJniObject fileUri = QAndroidJniObject::fromString("file://" + filePath);
QAndroidJniObject uri = QAndroidJniObject::callStaticObjectMethod("android/net/Uri", "parse", "(Ljava/lang/String;)Landroid/net/Uri;", fileUri.object());
QAndroidJniObject mimeType = QAndroidJniObject::fromString("application/vnd.android.package-archive");
QAndroidJniObject ACTION_VIEW = QAndroidJniObject::getStaticObjectField("android/content/Intent", "ACTION_VIEW", "Ljava/lang/String");
QAndroidJniObject FLAG_ACTIVITY_NEW_TASK = QAndroidJniObject::getStaticObjectField("android/content/Intent", "FLAG_ACTIVITY_NEW_TASK", "Ljava/lang/Integer");
QAndroidJniObject intent("android/content/Intent", "(Ljava/lang/String;)V", ACTION_VIEW.object());
intent = intent.callObjectMethod("setDataAndType", "(Landroid/net/Uri;Ljava/lang/String;)Landroid/content/Intent;", uri.object(), mimeType.object());
intent = intent.callObjectMethod("setFlags", "(I)Landroid/content/Intent;", FLAG_ACTIVITY_NEW_TASK.object());
activity.callMethod<void>("startActivity", "(Landroid/content/Intent;)V", intent.object());
return true;
}
return false;
}
#endif
#ifdef QTLIB_UNIX
bool Package::execute(const QString &program, const QStringList &arguments)
{
QProcess process;
process.start(program, arguments);
if (process.waitForFinished()) {
process.waitForReadyRead();
return true;
}
return false;
}
#endif
} // namespace qtlib
/**
* qtlib
*
* @author Akira Ohgaki <akiraohgaki@gmail.com>
* @copyright Akira Ohgaki
* @license https://opensource.org/licenses/LGPL-3.0
* @link https://github.com/akiraohgaki/qtlib
*/
#pragma once
#include <QObject>
namespace qtlib {
class Package : public QObject
{
Q_OBJECT
public:
explicit Package(const QString &path = "", QObject *parent = 0);
Package(const Package &other, QObject *parent = 0);
Package &operator =(const Package &other);
QString path() const;
void setPath(const QString &path);
#ifdef QTLIB_UNIX
bool installAsProgram(const QString &newPath);
bool installAsFile(const QString &newPath);
bool installAsArchive(const QString &destinationDirPath);
bool installAsPlasmapkg(const QString &type = "plasmoid");
bool uninstallAsPlasmapkg(const QString &type = "plasmoid");
#endif
#ifdef Q_OS_ANDROID
bool installAsApk();
#endif
private:
#ifdef QTLIB_UNIX
bool execute(const QString &program, const QStringList &arguments);
#endif
QString path_;
};
} // namespace qtlib
......@@ -2,16 +2,14 @@ TARGET = ocs-url
TEMPLATE = app
CONFIG += c++11
DEFINES += QT_DEPRECATED_WARNINGS
DISTFILES += README.md
include(lib/lib.pri)
include(app/app.pri)
include(desktop/desktop.pri)
include(i18n/i18n.pri)
include(pkg/pkg.pri)
DISTFILES += $${PWD}/README.md
include(deployment.pri)
include($${PWD}/lib/lib.pri)
include($${PWD}/app/app.pri)
include($${PWD}/desktop/desktop.pri)
include($${PWD}/i18n/i18n.pri)
include($${PWD}/pkg/pkg.pri)
include($${PWD}/scripts/scripts.pri)
include($${PWD}/deployment.pri)
#!/bin/bash
# The purpose of this script is to provide lightweight desktop integration
# into the host system without special help from the host system.
# If you want to have fuller and automatic desktop integration, you might
# consider to use the optional appimaged daemon instead.
# Exit on errors
set -e
# Be verbose if $DEBUG=1 is set
if [ ! -z "$DEBUG" ] ; then
env
set -x
fi
THIS="$0"
args=("$@") # http://stackoverflow.com/questions/3190818/
NUMBER_OF_ARGS="$#"
# Please do not change $VENDORPREFIX as it will allow for desktop files
# belonging to AppImages to be recognized by future AppImageKit components
# such as desktop integration daemons
VENDORPREFIX=appimagekit
APPDIR="$(dirname "$(readlink -f "${THIS}")")"
BIN="${APPDIR}/ocs-url"
export PATH="${APPDIR}/usr/bin:$PATH"
trap atexit EXIT
# Note that the following handles 0, 1 or more arguments (file paths)
# which can include blanks but uses a bashism; can the same be achieved
# in POSIX-shell? (FIXME)
# http://stackoverflow.com/questions/3190818
atexit()
{
if [ $NUMBER_OF_ARGS -eq 0 ] ; then
exec "${BIN}"
else
exec "${BIN}" "${args[@]}"
fi
}
error()
{
if [ -x /usr/bin/zenity ] ; then
LD_LIBRARY_PATH="" zenity --error --text "${1}" 2>/dev/null
elif [ -x /usr/bin/kdialog ] ; then
LD_LIBRARY_PATH="" kdialog --msgbox "${1}" 2>/dev/null
elif [ -x /usr/bin/Xdialog ] ; then
LD_LIBRARY_PATH="" Xdialog --msgbox "${1}" 2>/dev/null
else
echo "${1}"
fi
exit 1
}
yesno()
{
TITLE=$1
TEXT=$2
if [ -x /usr/bin/zenity ] ; then
LD_LIBRARY_PATH="" zenity --question --title="$TITLE" --text="$TEXT" 2>/dev/null || exit 0
elif [ -x /usr/bin/kdialog ] ; then
LD_LIBRARY_PATH="" kdialog --caption "" --title "$TITLE" -yesno "$TEXT" || exit 0
elif [ -x /usr/bin/Xdialog ] ; then
LD_LIBRARY_PATH="" Xdialog --title "$TITLE" --clear --yesno "$TEXT" 10 80 || exit 0
else
echo "zenity, kdialog, Xdialog missing. Skipping ${THIS}."
exit 0
fi
}
check_prevent()
{
FILE=$1
if [ -e "$FILE" ] ; then
exit 0
fi
}
# Exit immediately of one of these files is present
# (e.g., because the desktop environment wants to handle desktop integration itself)
check_prevent "$HOME/.local/share/$VENDORPREFIX/no_desktopintegration"
check_prevent "/usr/share/$VENDORPREFIX/no_desktopintegration"
check_prevent "/etc/$VENDORPREFIX/no_desktopintegration"
# Exit immediately if appimaged is running
pidof appimaged 2>/dev/null && exit 0
# Exit immediately if $DESKTOPINTEGRATION is not empty
if [ ! -z "$DESKTOPINTEGRATION" ] ; then
exit 0
fi
check_dep()
{
DEP=$1
if [ -z $(which $DEP) ] ; then
echo "$DEP is missing. Skipping ${THIS}."
exit 0
fi
}
DIRNAME="$APPDIR"
# Check whether dependencies are present in base system (we do not bundle these)
# http://cgit.freedesktop.org/xdg/desktop-file-utils/
check_dep desktop-file-validate
check_dep update-desktop-database
check_dep desktop-file-install
check_dep xdg-icon-resource
check_dep xdg-mime
check_dep xdg-desktop-menu
DESKTOPFILE=$(find "$APPDIR" -maxdepth 1 -name "*.desktop" | head -n 1)
# echo "$DESKTOPFILE"
DESKTOPFILE_NAME=$(basename "${DESKTOPFILE}")
if [ ! -f "$DESKTOPFILE" ] ; then
echo "Desktop file is missing. Please run ${THIS} from within an AppImage."
exit 0
fi
if [ -z "$APPIMAGE" ] ; then
APPIMAGE="$APPDIR/AppRun"
# Not running from within an AppImage; hence using the AppRun for Exec=
fi
ABS_APPIMAGE=$(readlink -e "$APPIMAGE")
ICONFILE="$APPDIR/.DirIcon"
# $XDG_DATA_DIRS contains the default paths /usr/local/share:/usr/share
# desktop file has to be installed in an applications subdirectory
# of one of the $XDG_DATA_DIRS components
if [ -z "$XDG_DATA_DIRS" ] ; then
XDG_DATA_DIRS=/usr/local/share:/usr/share
fi
# Determine where the desktop file should be installed
if [[ $EUID -ne 0 ]]; then
DESTINATION_DIR_DESKTOP="$HOME/.local/share/applications"
SYSTEM_WIDE=""
else
# TODO: Check $XDG_DATA_DIRS
DESTINATION_DIR_DESKTOP="/usr/local/share/applications"
SYSTEM_WIDE="--mode system" # for xdg-mime and xdg-icon-resource
fi
# Check if the desktop file is already there
# and if so, whether it points to the same AppImage
if [ -e "$DESTINATION_DIR_DESKTOP/$VENDORPREFIX-$DESKTOPFILE_NAME" ] ; then
# echo "$DESTINATION_DIR_DESKTOP/$VENDORPREFIX-$DESKTOPFILE_NAME already there"
EXEC=$(grep "^Exec=" "$DESTINATION_DIR_DESKTOP/$VENDORPREFIX-$DESKTOPFILE_NAME" | head -n 1 | cut -d " " -f 1)
# echo $EXEC
if [ "Exec=\"$APPIMAGE\"" == "$EXEC" ] ; then
exit 0
fi
fi
# We ask the user only if we have found no reason to skip until here
if [ -z "$SKIP" ] ; then
yesno "Install" "Would you like to integrate $APPIMAGE with your system?\n\nThis will add it to your applications menu and install icons.\nIf you don't do this you can still launch the application by double-clicking on the AppImage."
fi
APP=$(echo "$DESKTOPFILE_NAME" | sed -e 's/.desktop//g')
# If the user has agreed, rewrite and install the desktop file, and the MIME information
if [ -z "$SKIP" ] ; then
# desktop-file-install is supposed to install .desktop files to the user's
# applications directory when run as a non-root user,
# and to /usr/share/applications if run as root
# but that does not really work for me...
#
# For Exec we must use quotes
# For TryExec quotes is not supported, so, space must be replaced to \s
# https://askubuntu.com/questions/175404/how-to-add-space-to-exec-path-in-a-thumbnailer-descrption/175567
desktop-file-install --rebuild-mime-info-cache \
--vendor=$VENDORPREFIX --set-key=Exec --set-value="\"${APPIMAGE}\" %u" \
--set-key=X-AppImage-Comment --set-value="Generated by ${THIS}" \
--set-icon="$ICONFILE" --set-key=TryExec --set-value=${APPIMAGE// /\\s} "$DESKTOPFILE" \
--dir "$DESTINATION_DIR_DESKTOP"
chmod a+x "$DESTINATION_DIR_DESKTOP/"*
RESOURCE_NAME=$(echo "$VENDORPREFIX-$DESKTOPFILE_NAME" | sed -e 's/.desktop//g')
# echo $RESOURCE_NAME
# Install the icon files for the application; TODO: scalable
ICONS=$(find "${APPDIR}/usr/share/icons/" -wholename "*/apps/${APP}.png" 2>/dev/null || true)
for ICON in $ICONS ; do
ICON_SIZE=$(echo "${ICON}" | rev | cut -d "/" -f 3 | rev | cut -d "x" -f 1)
xdg-icon-resource install --context apps --size ${ICON_SIZE} "${ICON}" "${RESOURCE_NAME}"
done
# Install mime type
find "${APPDIR}/usr/share/mime/" -type f -name *xml -exec xdg-mime install $SYSTEM_WIDE --novendor {} \; 2>/dev/null || true
# Install the icon files for the mime type; TODO: scalable
ICONS=$(find "${APPDIR}/usr/share/icons/" -wholename "*/mimetypes/*.png" 2>/dev/null || true)
for ICON in $ICONS ; do
ICON_SIZE=$(echo "${ICON}" | rev | cut -d "/" -f 3 | rev | cut -d "x" -f 1)
xdg-icon-resource install --context mimetypes --size ${ICON_SIZE} "${ICON}" $(basename $ICON | sed -e 's/.png//g')
done
xdg-desktop-menu forceupdate
gtk-update-icon-cache # for MIME
fi
# Maintainer: Akira Ohgaki <akiraohgaki@gmail.com>
pkgname='ocs-url'
pkgver='2.0.3'
pkgver='3.1.0'
pkgrel='1'
pkgdesc='An install helper program for items served on OpenCollaborationServices (OCS).'
pkgdesc='An install helper program for items served via OpenCollaborationServices (ocs://).'
arch=('i686' 'x86_64')
url='https://github.com/ocs-url/ocs-url'
url='https://git.opendesktop.org/akiraohgaki/ocs-url'
license=('GPL3')
depends=('qt5-base>=5.2.0' 'qt5-svg>=5.2.0' 'qt5-declarative>=5.2.0' 'qt5-quickcontrols>=5.2.0')
#source=("https://github.com/ocs-url/ocs-url/archive/release-${pkgver}.tar.gz")
makedepends=('git')
#source=("https://git.opendesktop.org/akiraohgaki/ocs-url/-/archive/release-${pkgver}/ocs-url-release-${pkgver}.tar.gz")
source=("${pkgname}.tar.gz")
md5sums=() #autofill using updpkgsums
prepare() {
#cd "${pkgname}-release-${pkgver}"
cd "${pkgname}"
./scripts/prepare
}
build() {
#cd "${pkgname}-release-${pkgver}"
cd "${pkgname}"
qmake PREFIX="/usr"
qmake PREFIX=/usr
make
}
......
#!/bin/bash
################################################################################
# This is utility script to make distribution packages with CI/CD pipelines
################################################################################
PKGNAME='ocs-url'
PROJDIR="$(cd "$(dirname "${0}")/../" && pwd)"
BUILDTYPE=''
if [ "${1}" ]; then
BUILDTYPE="${1}"
fi
TREEISH='HEAD'
if [ "${2}" ]; then
TREEISH="${2}"
fi
BUILDDIR="${PROJDIR}/pkg/build_${TREEISH}"
SRCARCHIVE="${BUILDDIR}/${PKGNAME}.tar.gz"
################################################################################
# Utility functions
################################################################################
export_srcarchive() {
filepath="${1}"
$(cd "${PROJDIR}" && git archive --prefix="${PKGNAME}/" --output="${filepath}" "${TREEISH}")
}
transfer_file() {
filepath="${1}"
if [ -f "${filepath}" ]; then
filename="$(basename "${filepath}")"
curl -T "${filepath}" "https://transfer.sh/${filename}"
fi
}
################################################################################
# ubuntu
################################################################################
pre_ubuntu() {
cd "${PROJDIR}"
mkdir -p "${BUILDDIR}"
export_srcarchive "${SRCARCHIVE}"
}
build_ubuntu() {
tar -xzvf "${SRCARCHIVE}" -C "${BUILDDIR}"
cp -r "${PROJDIR}/pkg/ubuntu/debian" "${BUILDDIR}/${PKGNAME}"
cd "${BUILDDIR}/${PKGNAME}"
debuild -uc -us -b
}
post_ubuntu() {
transfer_file "$(find ${BUILDDIR} -type f -name "${PKGNAME}*.deb")"
}
################################################################################
# fedora
################################################################################
pre_fedora() {
cd "${PROJDIR}"
mkdir -p "${BUILDDIR}"
export_srcarchive "${SRCARCHIVE}"
}
build_fedora() {
mkdir "${BUILDDIR}/SOURCES"
mkdir "${BUILDDIR}/SPECS"
mv "${SRCARCHIVE}" "${BUILDDIR}/SOURCES"
cp "${PROJDIR}/pkg/fedora/${PKGNAME}.spec" "${BUILDDIR}/SPECS"
rpmbuild --define "_topdir ${BUILDDIR}" -bb "${BUILDDIR}/SPECS/${PKGNAME}.spec"
}
post_fedora() {
transfer_file "$(find ${BUILDDIR} -type f -name "${PKGNAME}*.rpm")"
}
################################################################################
# archlinux
################################################################################
pre_archlinux() {
cd "${PROJDIR}"
mkdir -p "${BUILDDIR}"
export_srcarchive "${SRCARCHIVE}"
}
build_archlinux() {
cp "${PROJDIR}/pkg/archlinux/PKGBUILD" "${BUILDDIR}"
cd "${BUILDDIR}"
updpkgsums
makepkg -s
}
post_archlinux() {
transfer_file "$(find ${BUILDDIR} -type f -name "${PKGNAME}*.pkg.tar.xz")"
}
################################################################################
# snap
################################################################################
pre_snap() {
cd "${PROJDIR}"
mkdir -p "${BUILDDIR}"
export_srcarchive "${SRCARCHIVE}"
}
build_snap() {
tar -xzvf "${SRCARCHIVE}" -C "${BUILDDIR}"
cp "${PROJDIR}/pkg/snap/snapcraft.yaml" "${BUILDDIR}/${PKGNAME}"
cp -r "${PROJDIR}/pkg/snap/setup" "${BUILDDIR}/${PKGNAME}"
cd "${BUILDDIR}/${PKGNAME}"
snapcraft
}
post_snap() {
transfer_file "$(find ${BUILDDIR} -type f -name "${PKGNAME}*.snap")"
}
################################################################################
# appimage
################################################################################
pre_appimage() {
cd "${PROJDIR}"
mkdir -p "${BUILDDIR}"
export_srcarchive "${SRCARCHIVE}"
export VERSION="$(git describe --always)"
}
build_appimage() {
tar -xzvf "${SRCARCHIVE}" -C "${BUILDDIR}"
cd "${BUILDDIR}/${PKGNAME}"
qmake
make
strip "${PKGNAME}"
cd "${BUILDDIR}"
# Replace linuxdeployqt download URL to official download URL when the stable version released
curl -L -o linuxdeployqt https://dl.dropboxusercontent.com/u/150776/temp/linuxdeployqt-799f704-x86-64.appimage
chmod 755 linuxdeployqt
mkdir -p "${BUILDDIR}/${PKGNAME}.AppDir/usr/bin"
install -m 755 -p "${BUILDDIR}/${PKGNAME}/${PKGNAME}" "${BUILDDIR}/${PKGNAME}.AppDir/${PKGNAME}"
install -m 644 -p "${BUILDDIR}/${PKGNAME}/desktop/${PKGNAME}.desktop" "${BUILDDIR}/${PKGNAME}.AppDir/${PKGNAME}.desktop"
install -m 644 -p "${BUILDDIR}/${PKGNAME}/desktop/${PKGNAME}.svg" "${BUILDDIR}/${PKGNAME}.AppDir/${PKGNAME}.svg"
install -m 755 -p /usr/bin/update-desktop-database "${BUILDDIR}/${PKGNAME}.AppDir/usr/bin/update-desktop-database"
install -m 755 -p /usr/bin/desktop-file-validate "${BUILDDIR}/${PKGNAME}.AppDir/usr/bin/desktop-file-validate"
install -m 755 -p /usr/bin/desktop-file-install "${BUILDDIR}/${PKGNAME}.AppDir/usr/bin/desktop-file-install"
./linuxdeployqt "${BUILDDIR}/${PKGNAME}.AppDir/${PKGNAME}" -qmldir="${BUILDDIR}/${PKGNAME}/app/qml" -verbose=2 -bundle-non-qt-libs # https://github.com/probonopd/linuxdeployqt/issues/25
./linuxdeployqt "${BUILDDIR}/${PKGNAME}.AppDir/${PKGNAME}" -qmldir="${BUILDDIR}/${PKGNAME}/app/qml" -verbose=2 -bundle-non-qt-libs # twice because of #25
rm "${BUILDDIR}/${PKGNAME}.AppDir/AppRun"
install -m 755 -p "${BUILDDIR}/${PKGNAME}/pkg/appimage/appimage-desktopintegration_${PKGNAME}" "${BUILDDIR}/${PKGNAME}.AppDir/AppRun"
./linuxdeployqt --appimage-extract
./squashfs-root/usr/bin/appimagetool "${BUILDDIR}/${PKGNAME}.AppDir"
}
post_appimage() {
transfer_file "$(find ${BUILDDIR} -type f -name "${PKGNAME}*.AppImage")"
}
################################################################################
# Make package
################################################################################
if [ "${BUILDTYPE}" = 'ubuntu' ]; then
pre_ubuntu && build_ubuntu && post_ubuntu
elif [ "${BUILDTYPE}" = 'fedora' ]; then
pre_fedora && build_fedora && post_fedora
elif [ "${BUILDTYPE}" = 'archlinux' ]; then
pre_archlinux && build_archlinux && post_archlinux
elif [ "${BUILDTYPE}" = 'snap' ]; then
pre_snap && build_snap && post_snap
elif [ "${BUILDTYPE}" = 'appimage' ]; then
pre_appimage && build_appimage && post_appimage
else
echo "sh $(basename "${0}") [ubuntu|fedora|archlinux|snap|appimage] [tree_ish]"
exit 1
fi
Summary: OCS-URL
Name: ocs-url
Version: 2.0.3
Version: 3.1.0
Release: 1%{?dist}
License: GPLv3+
Group: Applications/Internet
URL: https://github.com/ocs-url/ocs-url
URL: https://git.opendesktop.org/akiraohgaki/ocs-url
#Source0: https://github.com/ocs-url/ocs-url/archive/release-%{version}.tar.gz
#Source0: https://git.opendesktop.org/akiraohgaki/ocs-url/-/archive/release-%{version}/ocs-url-release-%{version}.tar.gz
Source0: %{name}.tar.gz
Requires: qt5-qtbase >= 5.2.0, qt5-qtbase-gui >= 5.2.0, qt5-qtsvg >= 5.2.0, qt5-qtdeclarative >= 5.2.0, qt5-qtquickcontrols >= 5.2.0
BuildRequires: make, automake, gcc, gcc-c++, libtool, qt5-qtbase-devel, qt5-qtsvg-devel, qt5-qtdeclarative-devel, rpm-build
BuildRequires: git, make, automake, gcc, gcc-c++, libtool, qt5-qtbase-devel >= 5.2.0, qt5-qtsvg-devel >= 5.2.0, qt5-qtdeclarative-devel >= 5.2.0, rpm-build
%description
An install helper program for items served on OpenCollaborationServices (OCS).
An install helper program for items served via OpenCollaborationServices (ocs://).
%prep
#%%autosetup -n %{name}-release-%{version}
%autosetup -n %{name}
./scripts/prepare
%build
%define debug_package %{nil}
qmake-qt5 PREFIX="/usr"
qmake-qt5 PREFIX=/usr
make
%install
......@@ -37,6 +38,36 @@ make INSTALL_ROOT="%{buildroot}" install
rm -rf %{buildroot}
%changelog
* Thu Jul 05 2018 Akira Ohgaki <akiraohgaki@gmail.com> - 3.1.0-1
- Drop old xdg:// and xdgs:// schemes
- Update library
* Tue Feb 06 2018 Akira Ohgaki <akiraohgaki@gmail.com> - 3.0.3-1
- Update library
- Fix spelling
* Fri Jun 23 2017 Akira Ohgaki <akiraohgaki@gmail.com> - 3.0.2-1
- Add zh_TW translations (by s8321414)
* Mon Jun 05 2017 Akira Ohgaki <akiraohgaki@gmail.com> - 3.0.1-1
- Update qtlib
- Fix for C++11
- Fix installation/download destination
- Fix translation messages (by otsoga)
* Sun Mar 05 2017 Akira Ohgaki <akiraohgaki@gmail.com> - 3.0.0-1
- Rename xdgurl to ocs-url
- Add ocs:// and ocss:// schemes
- xdg:// and xdgs:// schemes still available for backward compatibile
- New app icon
- New dialog window
- Labels and messages are translatable
- Qt 5.2 support
- Use the same configs of install-types with ocsstore
- Add en_US translation
- Add ja_JP translation
- Add tr_TR translation (by tarakbumba)
* Wed Jan 25 2017 Akira Ohgaki <akiraohgaki@gmail.com> - 2.0.3-1
- Change installation destination of type bin
- Update qtlib
......@@ -56,7 +87,7 @@ rm -rf %{buildroot}
- Add install-type "bin"
* Fri Jul 15 2016 Akira Ohgaki <akiraohgaki@gmail.com> - 1.0.1-1
- Clean successfull message
- Clean successful message
- Return exit code
* Wed Jul 06 2016 Akira Ohgaki <akiraohgaki@gmail.com> - 1.0.0-1
......
Summary: OCS-URL
Name: ocs-url
Version: 3.1.0
Release: 1%{?dist}
License: GPLv3+
Group: Applications/Internet
URL: https://git.opendesktop.org/akiraohgaki/ocs-url
#Source0: https://git.opendesktop.org/akiraohgaki/ocs-url/-/archive/release-%{version}/ocs-url-release-%{version}.tar.gz
Source0: %{name}.tar.gz
Requires: libQt5Svg5 >= 5.2.0, libqt5-qtquickcontrols >= 5.2.0
BuildRequires: git, make, automake, gcc, gcc-c++, libtool, libqt5-qtbase-devel >= 5.2.0, libqt5-qtsvg-devel >= 5.2.0, libqt5-qtdeclarative-devel >= 5.2.0, rpm-build
%description
An install helper program for items served via OpenCollaborationServices (ocs://).
%prep
#%%autosetup -n %{name}-release-%{version}
%autosetup -n %{name}
./scripts/prepare
%build
%define debug_package %{nil}
qmake-qt5 PREFIX=/usr
make
%install
make INSTALL_ROOT="%{buildroot}" install
%files
%defattr(-,root,root)
%{_bindir}/%{name}
%{_datadir}/applications/%{name}.desktop
%{_datadir}/icons/hicolor/scalable/apps/%{name}.svg
%clean
rm -rf %{buildroot}
%changelog
* Thu Jul 05 2018 Akira Ohgaki <akiraohgaki@gmail.com> - 3.1.0-1
- Drop old xdg:// and xdgs:// schemes
- Update library
* Tue Feb 06 2018 Akira Ohgaki <akiraohgaki@gmail.com> - 3.0.3-1
- Update library
- Fix spelling
* Fri Jun 23 2017 Akira Ohgaki <akiraohgaki@gmail.com> - 3.0.2-1
- Add zh_TW translations (by s8321414)
* Mon Jun 05 2017 Akira Ohgaki <akiraohgaki@gmail.com> - 3.0.1-1
- Update qtlib
- Fix for C++11
- Fix installation/download destination
- Fix translation messages (by otsoga)
* Sun Mar 05 2017 Akira Ohgaki <akiraohgaki@gmail.com> - 3.0.0-1
- Rename xdgurl to ocs-url
- Add ocs:// and ocss:// schemes
- xdg:// and xdgs:// schemes still available for backward compatibile
- New app icon
- New dialog window
- Labels and messages are translatable
- Qt 5.2 support
- Use the same configs of install-types with ocsstore
- Add en_US translation
- Add ja_JP translation
- Add tr_TR translation (by tarakbumba)
* Wed Jan 25 2017 Akira Ohgaki <akiraohgaki@gmail.com> - 2.0.3-1
- Change installation destination of type bin
- Update qtlib
- Fix for dialog
* Thu Nov 17 2016 Akira Ohgaki <akiraohgaki@gmail.com> - 2.0.2-1
- Update qtlibs
- Small fix
* Mon Nov 14 2016 Akira Ohgaki <akiraohgaki@gmail.com> - 2.0.1-1
- Update library
- Fix download/installation process
* Fri Oct 28 2016 Akira Ohgaki <akiraohgaki@gmail.com> - 2.0.0-1
- Re-implemented xdgurl as Qt program
- Download progress bar
- Add install-type "bin"
* Fri Jul 15 2016 Akira Ohgaki <akiraohgaki@gmail.com> - 1.0.1-1
- Clean successful message
- Return exit code
* Wed Jul 06 2016 Akira Ohgaki <akiraohgaki@gmail.com> - 1.0.0-1
- Initial release