diff --git a/README.md b/README.md index 307d216..939f3cf 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,7 @@ Additionally, on Linux, you require: * XCB * XCB xfixes * XCB cursor -* libnotify +* Notifications Daemon with org.freedesktop.notifications DBus support (like dunst) Despite the name implying so, this project does not depend on the KDE API at all. diff --git a/src/io/ioutils.cpp b/src/io/ioutils.cpp index 1666510..4502671 100644 --- a/src/io/ioutils.cpp +++ b/src/io/ioutils.cpp @@ -5,16 +5,17 @@ #include #include #include +#include QNetworkAccessManager ioutils::networkManager; -void ioutils::addLogEntry(QNetworkReply* reply, QByteArray data, QString result, QString filename) { +void ioutils::addLogEntry(QNetworkReply* reply, QByteArray data, QString result, ScreenshotFile sf) { requestlogging::RequestContext ctx; ctx.reply = reply; ctx.response = data; ctx.result = result; - ctx.filename = filename; + ctx.screenshotFile = sf; requestlogging::addEntry(ctx); } diff --git a/src/io/ioutils.hpp b/src/io/ioutils.hpp index 6066a6d..bb36dc1 100644 --- a/src/io/ioutils.hpp +++ b/src/io/ioutils.hpp @@ -6,10 +6,11 @@ #include #include #include +#include namespace ioutils { extern QNetworkAccessManager networkManager; - void addLogEntry(QNetworkReply* reply, QByteArray data, QString result, QString filename); + void addLogEntry(QNetworkReply* reply, QByteArray data, QString result, ScreenshotFile sf); void getJson(QUrl target, QList> headers, std::function callback); diff --git a/src/logs/requestlogging.cpp b/src/logs/requestlogging.cpp index c6626bc..ce5b9f5 100644 --- a/src/logs/requestlogging.cpp +++ b/src/logs/requestlogging.cpp @@ -2,6 +2,7 @@ #include #include #include +#include #include #include "mainwindow.hpp" @@ -37,10 +38,13 @@ void requestlogging::addEntry(RequestContext context) { responseFile.write("\n\n" + context.response); responseFile.close(); + ScreenshotFile sf = context.screenshotFile; + QTextStream(&requestFile) << ioutils::methodString(context.reply->operation()) << " " // $type << context.reply->url().toString().replace(" ", "%20") << " " // $url << context.result.replace(" ", "%20") << " " // $result - << context.filename.replace(" ", "_") << " " // $filename + << sf.getSubfolder().replace(" ", "_") << " " // $subfolder + << sf.getFilename().replace(" ", "_") << " " // $filename << context.reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt() << " " // $status << timeNow.replace(" ", "_") << endl << flush; // $time @@ -48,7 +52,7 @@ void requestlogging::addEntry(RequestContext context) { MainWindow::inst()->addResponse( context.reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(), - context.filename, + sf, context.result, context.reply->url().toString(), timeNow.replace("_", " ")); @@ -66,14 +70,18 @@ QList requestlogging::getRequests() { while ((line = requestFile.readLine()).size() != 0) { LoggedRequest r; QTextStream stream(&line); + ScreenshotFile sf; stream >> r.type; stream >> r.url; stream >> r.result; - stream >> r.filename; + stream >> sf.subfolder; + stream >> sf.filename; stream >> r.responseCode; stream >> r.time; r.time = r.time.replace("_", " "); - r.filename = r.filename.replace("_", " "); + sf.subfolder = sf.subfolder.replace("_", " "); + sf.filename = sf.filename.replace("_", " "); + r.screenshotFile = sf; ret.append(r); } diff --git a/src/logs/requestlogging.hpp b/src/logs/requestlogging.hpp index fa386c2..8728685 100644 --- a/src/logs/requestlogging.hpp +++ b/src/logs/requestlogging.hpp @@ -5,13 +5,13 @@ #include #include #include - +#include namespace requestlogging { struct RequestContext { QByteArray response; QNetworkReply *reply; - QString filename; + ScreenshotFile screenshotFile; QString result; }; @@ -22,8 +22,8 @@ namespace requestlogging { QString getUrl() { return url; } - QString getFilename() { - return filename; + ScreenshotFile getScreenshotFile() { + return screenshotFile; } QString getType() { return type; @@ -43,7 +43,7 @@ namespace requestlogging { private: QString url; - QString filename; + ScreenshotFile screenshotFile; QString result; QString type; QString time; diff --git a/src/logs/screenshotfile.h b/src/logs/screenshotfile.h new file mode 100644 index 0000000..dea2aeb --- /dev/null +++ b/src/logs/screenshotfile.h @@ -0,0 +1,26 @@ +#ifndef SCREENSHOTFILE_H +#define SCREENSHOTFILE_H + +#include +#include +#include +#include +#include + + +class ScreenshotFile { + + public: + QString getSubfolder() { + return subfolder; + } + QString getFilename() { + return filename; + } + + QString subfolder; + QString filename; +}; + + +#endif // SCREENSHOTFILE_H diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 39ef5f9..657335d 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -26,6 +26,7 @@ #include "io/ioutils.hpp" #include #include +#include MainWindow *MainWindow::instance; @@ -143,7 +144,7 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWi QList requests = requestlogging::getRequests(); for (LoggedRequest req : requests) { - addResponse(req.getResponseCode(), req.getFilename(), req.getResult(), req.getUrl(), req.getTime()); + addResponse(req.getResponseCode(), req.getScreenshotFile(), req.getResult(), req.getUrl(), req.getTime()); } } @@ -293,9 +294,9 @@ void MainWindow::setTrayIcon(QIcon icon) { tray->setIcon(icon); } -void MainWindow::addResponse(int httpCode, QString filename, QString result, QString url, QString time) { +void MainWindow::addResponse(int httpCode, ScreenshotFile sf, QString result, QString url, QString time) { QString httpStatus = ioutils::httpString(httpCode); - QTreeWidgetItem* tw = new QTreeWidgetItem({ QString::number(httpCode) + " " + httpStatus, filename, result, url, time + " UTC" }); + QTreeWidgetItem* tw = new QTreeWidgetItem({ QString::number(httpCode) + " " + httpStatus, sf.getSubfolder() + QDir::separator() + sf.getFilename(), result, url, time + " UTC" }); if(httpCode >= 200 && httpCode < 300) { tw->setIcon(0, *(new QIcon(":/icons/checked.png"))); @@ -304,4 +305,4 @@ void MainWindow::addResponse(int httpCode, QString filename, QString result, QSt } ui->treeWidget->insertTopLevelItem(0, tw); -} \ No newline at end of file +} diff --git a/src/mainwindow.hpp b/src/mainwindow.hpp index 36e59ac..3b3d5a2 100644 --- a/src/mainwindow.hpp +++ b/src/mainwindow.hpp @@ -9,6 +9,7 @@ #include #include +#include namespace Ui { class MainWindow; @@ -39,7 +40,7 @@ public: ~MainWindow(); bool valid(); void setTrayIcon(QIcon icon); - void addResponse(int httpCode, QString filename, QString result, QString url, QString time); + void addResponse(int httpCode, ScreenshotFile sf, QString result, QString url, QString time); RecordingController *controller = new RecordingController; QSystemTrayIcon *tray; diff --git a/src/src.pro b/src/src.pro index 7fde2c4..b5f4cbf 100644 --- a/src/src.pro +++ b/src/src.pro @@ -127,7 +127,8 @@ HEADERS += mainwindow.hpp \ screenoverlay/screenoverlaysettings.hpp \ logger.hpp \ clipboard/clipboardcopy.hpp \ - systemnotification.h + systemnotification.h \ + logs/screenshotfile.h nopkg { # win32 { diff --git a/src/uploaders/customuploader.cpp b/src/uploaders/customuploader.cpp index 13f5e33..e575886 100644 --- a/src/uploaders/customuploader.cpp +++ b/src/uploaders/customuploader.cpp @@ -12,6 +12,7 @@ #include #include #include +#include using formats::normalFormatFromName; using formats::normalFormatMIME; @@ -208,7 +209,7 @@ QString parsePathspec(QJsonDocument &response, QString &pathspec) { return ""; } -void CustomUploader::parseResult(QNetworkReply *r, QJsonDocument result, QByteArray data, QString returnPathspec, QString name, QString filename) { +void CustomUploader::parseResult(QNetworkReply *r, QJsonDocument result, QByteArray data, QString returnPathspec, QString name, ScreenshotFile sf) { if (result.isObject()) { QString url = formatter::format(urlPrepend, "") + parsePathspec(result, returnPathspec) + formatter::format(urlAppend, ""); @@ -216,22 +217,22 @@ void CustomUploader::parseResult(QNetworkReply *r, QJsonDocument result, QByteAr if (!url.isEmpty()) { QApplication::clipboard()->setText(url); notifications::notify(tr("KShare Custom Uploader ") + name, tr("Copied upload link to clipboard!")); - ioutils::addLogEntry(r, data, url, filename); + ioutils::addLogEntry(r, data, url, sf); } else { notifications::notify(tr("KShare Custom Uploader ") + name, tr("Upload done, but result empty!")); QApplication::clipboard()->setText(data); - ioutils::addLogEntry(r, data, "", filename); + ioutils::addLogEntry(r, data, "", sf); } } else { notifications::playSound(notifications::Sound::ERROR); notifications::notify(tr("KShare Custom Uploader ") + name, tr("Upload done, but result is not JSON Object! Result in clipboard.")); QApplication::clipboard()->setText(data); - ioutils::addLogEntry(r, data, "", filename); + ioutils::addLogEntry(r, data, "", sf); } } -QByteArray substituteArgs(QByteArray arr, QString format, QString filename, QByteArray imgData = QByteArray()) { +QByteArray substituteArgs(QByteArray arr, QString format, ScreenshotFile sf, QByteArray imgData = QByteArray()) { QString mime = normalFormatMIME(normalFormatFromName(format)); if (mime.isEmpty()) mime = recordingFormatMIME(recordingFormatFromName(format)); if (arr.startsWith("/") && arr.endsWith("/")) { @@ -241,7 +242,7 @@ QByteArray substituteArgs(QByteArray arr, QString format, QString filename, QByt { { "format", format.toLower() }, { "FORMAT", format }, { "contenttype", mime } }) .toUtf8(); - QByteArray fA = filename.toLocal8Bit(); + QByteArray fA = sf.getFilename().toLocal8Bit(); arr.replace("%filename", fA.data()); if (imgData.isNull()) return arr; @@ -251,17 +252,17 @@ QByteArray substituteArgs(QByteArray arr, QString format, QString filename, QByt } -QJsonObject recurseAndReplace(QJsonObject &body, QByteArray &data, QString format, QString filename) { +QJsonObject recurseAndReplace(QJsonObject &body, QByteArray &data, QString format, ScreenshotFile sf) { QJsonObject o; for (QString s : body.keys()) { QJsonValue v = body[s]; if (v.isObject()) { QJsonObject vo = v.toObject(); - o.insert(s, recurseAndReplace(vo, data, format, filename)); + o.insert(s, recurseAndReplace(vo, data, format, sf)); } else if (v.isString()) { QString str = v.toString(); if (str.startsWith("/") && str.endsWith("/")) { - o.insert(s, QString::fromUtf8(substituteArgs(str.toUtf8(), format, filename, data))); + o.insert(s, QString::fromUtf8(substituteArgs(str.toUtf8(), format, sf, data))); } else o.insert(s, v); } else @@ -270,7 +271,7 @@ QJsonObject recurseAndReplace(QJsonObject &body, QByteArray &data, QString forma return o; } -void CustomUploader::doUpload(QByteArray imgData, QString format, QString filename) { +void CustomUploader::doUpload(QByteArray imgData, QString format, ScreenshotFile sf) { auto h = getHeaders(headers, format, this->rFormat); QByteArray data; if (base64) imgData = imgData.toBase64(QByteArray::Base64UrlEncoding); @@ -281,10 +282,10 @@ void CustomUploader::doUpload(QByteArray imgData, QString format, QString filena } break; case RequestFormat::JSON: { if (body.isString()) { - data = substituteArgs(body.toString().toUtf8(), format, filename, imgData); + data = substituteArgs(body.toString().toUtf8(), format, sf, imgData); } else { QJsonObject vo = body.toObject(); - data = QJsonDocument::fromVariant(recurseAndReplace(vo, imgData, format, filename).toVariantMap()).toJson(); + data = QJsonDocument::fromVariant(recurseAndReplace(vo, imgData, format, sf).toVariantMap()).toJson(); } } break; case RequestFormat::X_WWW_FORM_URLENCODED: { @@ -292,7 +293,7 @@ void CustomUploader::doUpload(QByteArray imgData, QString format, QString filena for (QString key : body.keys()) { QJsonValue val = body[key]; if (val.isString()) { - data.append(QUrl::toPercentEncoding(key)).append('=').append(substituteArgs(val.toString().toUtf8(), format, filename, imgData)); + data.append(QUrl::toPercentEncoding(key)).append('=').append(substituteArgs(val.toString().toUtf8(), format, sf, imgData)); } else { if (!data.isEmpty()) data.append('&'); data.append(QUrl::toPercentEncoding(key)) @@ -311,7 +312,7 @@ void CustomUploader::doUpload(QByteArray imgData, QString format, QString filena QHttpPart part; QJsonValue bd = valo["body"]; if (bd.isString()) { - QByteArray body = substituteArgs(bd.toString().toUtf8(), format, filename, imgData); + QByteArray body = substituteArgs(bd.toString().toUtf8(), format, sf, imgData); QByteArray *bodyHeap = new QByteArray; body.swap(*bodyHeap); QBuffer *buffer = new QBuffer(bodyHeap); @@ -321,7 +322,7 @@ void CustomUploader::doUpload(QByteArray imgData, QString format, QString filena arraysToDelete.append(bodyHeap); } else { auto bdo = bd.toObject(); - QJsonObject result = recurseAndReplace(bdo, imgData, format, filename); + QJsonObject result = recurseAndReplace(bdo, imgData, format, sf); part.setBody(QJsonDocument::fromVariant(result.toVariantMap()).toJson()); } QByteArray cdh("form-data"); @@ -329,11 +330,11 @@ void CustomUploader::doUpload(QByteArray imgData, QString format, QString filena if (headerVal.startsWith("__")) { headerVal = headerVal.mid(2); QByteArray str = valo["__" + headerVal].toString().toUtf8(); - if (str.startsWith("/") && str.endsWith("/")) str = substituteArgs(str, format, filename); + if (str.startsWith("/") && str.endsWith("/")) str = substituteArgs(str, format, sf); part.setRawHeader(headerVal.toLatin1(), str); } else if (headerVal != "body") cdh += "; " + headerVal + "=\"" - + substituteArgs(valo[headerVal].toString().toUtf8(), format, filename).replace("\"", "\\\"") + "\""; + + substituteArgs(valo[headerVal].toString().toUtf8(), format, sf).replace("\"", "\\\"") + "\""; } part.setHeader(QNetworkRequest::ContentDispositionHeader, cdh); multipart->append(part); @@ -342,8 +343,8 @@ void CustomUploader::doUpload(QByteArray imgData, QString format, QString filena case HttpMethod::POST: if (returnPathspec == "|") { ioutils::postMultipartData(target, h, multipart, - [&, buffersToDelete, arraysToDelete, filename](QByteArray result, QNetworkReply *r) { - ioutils::addLogEntry(r, result, QString::fromUtf8(result), filename); + [&, buffersToDelete, arraysToDelete, sf](QByteArray result, QNetworkReply *r) { + ioutils::addLogEntry(r, result, QString::fromUtf8(result), sf); QApplication::clipboard()->setText(QString::fromUtf8(result)); for (auto buffer : buffersToDelete) buffer->deleteLater(); for (auto arr : arraysToDelete) delete arr; @@ -353,10 +354,10 @@ void CustomUploader::doUpload(QByteArray imgData, QString format, QString filena }); } else { ioutils::postMultipart(target, h, multipart, - [&, buffersToDelete, arraysToDelete, filename](QJsonDocument result, QByteArray data, QNetworkReply *r) { + [&, buffersToDelete, arraysToDelete, sf](QJsonDocument result, QByteArray data, QNetworkReply *r) { for (auto buffer : buffersToDelete) buffer->deleteLater(); for (auto arr : arraysToDelete) delete arr; - parseResult(r, result, data, returnPathspec, name(), filename); + parseResult(r, result, data, returnPathspec, name(), sf); }); } break; @@ -372,15 +373,15 @@ void CustomUploader::doUpload(QByteArray imgData, QString format, QString filena switch (method) { case HttpMethod::POST: if (returnPathspec == "|") { - ioutils::postData(target, h, data, [&, filename](QByteArray result, QNetworkReply *r) { - ioutils::addLogEntry(r, result, QString::fromUtf8(result), filename); + ioutils::postData(target, h, data, [&, sf](QByteArray result, QNetworkReply *r) { + ioutils::addLogEntry(r, result, QString::fromUtf8(result), sf); QApplication::clipboard()->setText(QString::fromUtf8(result)); notifications::playSound(notifications::Sound::SUCCESS); notifications::notify(tr("KShare Custom Uploader ") + name(), tr("Copied upload result to clipboard!")); }); } else { - ioutils::postJson(target, h, data, [&, filename](QJsonDocument result, QByteArray data, QNetworkReply *r) { - parseResult(r, result, data, returnPathspec, name(), filename); + ioutils::postJson(target, h, data, [&, sf](QJsonDocument result, QByteArray data, QNetworkReply *r) { + parseResult(r, result, data, returnPathspec, name(), sf); }); } break; diff --git a/src/uploaders/customuploader.hpp b/src/uploaders/customuploader.hpp index 80a88b0..cea0c06 100644 --- a/src/uploaders/customuploader.hpp +++ b/src/uploaders/customuploader.hpp @@ -7,6 +7,7 @@ #include #include #include +#include enum class HttpMethod { POST }; @@ -19,7 +20,7 @@ public: CustomUploader(QString absFilePath); QString name(); QString description(); - void doUpload(QByteArray imgData, QString format, QString filename); + void doUpload(QByteArray imgData, QString format, ScreenshotFile sf); private: double limit = -1; @@ -33,7 +34,7 @@ private: bool base64 = false; QString returnPathspec; QString urlPrepend, urlAppend; - void parseResult(QNetworkReply *r, QJsonDocument result, QByteArray data, QString returnPathspec, QString name, QString filename); + void parseResult(QNetworkReply *r, QJsonDocument result, QByteArray data, QString returnPathspec, QString name, ScreenshotFile sf); }; #endif // CUSTOMUPLOADER_HPP diff --git a/src/uploaders/default/clipboarduploader.cpp b/src/uploaders/default/clipboarduploader.cpp index 25d1c12..c5422c3 100644 --- a/src/uploaders/default/clipboarduploader.cpp +++ b/src/uploaders/default/clipboarduploader.cpp @@ -6,8 +6,9 @@ #include #include #include +#include -void ClipboardUploader::doUpload(QByteArray imgData, QString format, QString filename) { +void ClipboardUploader::doUpload(QByteArray imgData, QString format, ScreenshotFile sf) { auto f = formats::recordingFormatFromName(format); if (f != formats::Recording::None) { auto data = new QMimeData(); diff --git a/src/uploaders/default/clipboarduploader.hpp b/src/uploaders/default/clipboarduploader.hpp index 6e71f7f..390dbeb 100644 --- a/src/uploaders/default/clipboarduploader.hpp +++ b/src/uploaders/default/clipboarduploader.hpp @@ -4,6 +4,7 @@ #include #include #include +#include class ClipboardUploader : public Uploader { Q_DECLARE_TR_FUNCTIONS(ClipboardUploader) @@ -15,7 +16,7 @@ public: return "Copies the image to clipboard"; } - void doUpload(QByteArray imgData, QString format, QString filename); + void doUpload(QByteArray imgData, QString format, ScreenshotFile sf); }; #endif // CLIPBOARDUPLOADER_HPP diff --git a/src/uploaders/default/imguruploader.cpp b/src/uploaders/default/imguruploader.cpp index 33e54fc..4107c3c 100644 --- a/src/uploaders/default/imguruploader.cpp +++ b/src/uploaders/default/imguruploader.cpp @@ -11,6 +11,7 @@ #include #include #include +#include struct SegfaultWorkaround { // I'm a scrub for doing this SegfaultWorkaround(QByteArray a, ImgurUploader *u, QString m) : byteArray(), dis(u), mime(m) { @@ -25,14 +26,15 @@ struct SegfaultWorkaround { // I'm a scrub for doing this QUrl("https://api.imgur.com/oauth2/token"), QList>({ QPair("Content-Type", "applicaton/json") }), QJsonDocument::fromVariant(object.toVariantMap()).toJson(), [&](QJsonDocument response, QByteArray, QNetworkReply *r) { + ScreenshotFile sf; qDebug() << response; if (r->error() != QNetworkReply::NoError || !response.isObject()) { - dis->handleSend(QStringLiteral("Client-ID 8a98f183fc895da"), mime, byteArray); + dis->handleSend(QStringLiteral("Client-ID 8a98f183fc895da"), mime, byteArray, sf); return; } QJsonObject res = response.object(); if (res.value("success").toBool()) { - dis->handleSend(QStringLiteral("Client-ID 8a98f183fc895da"), mime, byteArray); + dis->handleSend(QStringLiteral("Client-ID 8a98f183fc895da"), mime, byteArray, sf); return; } @@ -41,7 +43,7 @@ struct SegfaultWorkaround { // I'm a scrub for doing this settings::settings().setValue("imgur/refresh", res["refresh_token"].toString()); settings::settings().setValue("imgur/access", token); - dis->handleSend(token.prepend("Bearer "), mime, byteArray); + dis->handleSend(token.prepend("Bearer "), mime, byteArray, sf); QScopedPointer(this); }); } @@ -52,7 +54,7 @@ private: QString mime; }; // I feel terrible for making this. I am sorry, reader -void ImgurUploader::doUpload(QByteArray byteArray, QString format, QString filename) { +void ImgurUploader::doUpload(QByteArray byteArray, QString format, ScreenshotFile sf) { if (byteArray.size() > 1e+7) { notifications::notify(tr("KShare imgur Uploader"), tr("Failed upload! Image too big")); return; @@ -69,32 +71,32 @@ void ImgurUploader::doUpload(QByteArray byteArray, QString format, QString filen if (QDateTime::currentDateTimeUtc() > expireTime) { new SegfaultWorkaround(byteArray, this, mime); } else - handleSend("Bearer " + settings::settings().value("imgur/access").toString(), mime, byteArray, filename); + handleSend("Bearer " + settings::settings().value("imgur/access").toString(), mime, byteArray, sf); } else - handleSend(QStringLiteral("Client-ID 8a98f183fc895da"), mime, byteArray, filename); + handleSend(QStringLiteral("Client-ID 8a98f183fc895da"), mime, byteArray, sf); } void ImgurUploader::showSettings() { (new ImgurSettingsDialog())->show(); } -void ImgurUploader::handleSend(QString auth, QString mime, QByteArray byteArray, QString filename) { +void ImgurUploader::handleSend(QString auth, QString mime, QByteArray byteArray, ScreenshotFile sf) { ioutils::postJson(QUrl("https://api.imgur.com/3/image"), QList>() << QPair("Content-Type", mime.toUtf8()) << QPair("Authorization", auth), - byteArray, [byteArray, this, mime, filename](QJsonDocument res, QByteArray data, QNetworkReply *r) { + byteArray, [byteArray, this, mime, sf](QJsonDocument res, QByteArray data, QNetworkReply *r) { QString result = res.object()["data"].toObject()["link"].toString(); if (r->error() == QNetworkReply::ContentAccessDenied) { new SegfaultWorkaround(byteArray, this, mime); return; } if (!result.isEmpty()) { - ioutils::addLogEntry(r, data, result, filename); + ioutils::addLogEntry(r, data, result, sf); utils::toClipboard(result); notifications::notify(tr("KShare imgur Uploader"), tr("Uploaded to imgur!")); notifications::playSound(notifications::Sound::SUCCESS); } else { - ioutils::addLogEntry(r, data, result, filename); + ioutils::addLogEntry(r, data, result, sf); notifications::notify(tr("KShare imgur Uploader "), QString(tr("Failed upload! imgur said: HTTP %1: %2")) .arg(r->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt()) @@ -103,7 +105,3 @@ void ImgurUploader::handleSend(QString auth, QString mime, QByteArray byteArray, } }); } - -void ImgurUploader::handleSend(QString auth, QString mime, QByteArray byteArray) { - handleSend(auth, mime, byteArray); -} diff --git a/src/uploaders/default/imguruploader.hpp b/src/uploaders/default/imguruploader.hpp index c3031a8..130ba00 100644 --- a/src/uploaders/default/imguruploader.hpp +++ b/src/uploaders/default/imguruploader.hpp @@ -3,6 +3,7 @@ #include "../uploader.hpp" #include +#include class ImgurUploader : public Uploader { Q_DECLARE_TR_FUNCTIONS(ImgurUploader) @@ -15,12 +16,11 @@ public: QString description() override { return "imgur.com uploader"; } - void doUpload(QByteArray byteArray, QString, QString filename) override; + void doUpload(QByteArray byteArray, QString, ScreenshotFile sf) override; void showSettings() override; private: - void handleSend(QString auth, QString mime, QByteArray byteArray, QString filename); - void handleSend(QString auth, QString mime, QByteArray byteArray); + void handleSend(QString auth, QString mime, QByteArray byteArray, ScreenshotFile sf); }; #endif // IMGURUPLOADER_HPP diff --git a/src/uploaders/uploader.hpp b/src/uploaders/uploader.hpp index 4f1c590..39fa640 100644 --- a/src/uploaders/uploader.hpp +++ b/src/uploaders/uploader.hpp @@ -3,10 +3,11 @@ #include #include +#include class Uploader { public: - virtual void doUpload(QByteArray imgData, QString format, QString filename) = 0; + virtual void doUpload(QByteArray imgData, QString format, ScreenshotFile sf) = 0; virtual QString name() = 0; virtual QString description() = 0; virtual void showSettings() { diff --git a/src/uploaders/uploadersingleton.cpp b/src/uploaders/uploadersingleton.cpp index a554c8e..9f9589b 100644 --- a/src/uploaders/uploadersingleton.cpp +++ b/src/uploaders/uploadersingleton.cpp @@ -14,6 +14,7 @@ #include #include #include "mainwindow.hpp" +#include UploaderSingleton::UploaderSingleton() : QObject() { updateSaveSettings(); @@ -73,8 +74,7 @@ void UploaderSingleton::upload(QPixmap pixmap) { notifications::playSound(notifications::Sound::CAPTURE); pixmap.save(file, format.toLocal8Bit().constData(), settings::settings().value("imageQuality", -1).toInt()); file->seek(0); - QFileInfo fileInfo(file->fileName()); - u->doUpload(file->readAll(), format, fileInfo.fileName()); + u->doUpload(file->readAll(), format, getScreenshotFile(*file)); } else notifications::notify(tr("KShare - Failed to save picture"), file->errorString(), QSystemTrayIcon::Warning); delete file; @@ -96,9 +96,8 @@ void UploaderSingleton::upload(QByteArray img, QString format) { file->write(img); file->close(); } - QFileInfo fileInfo(file->fileName()); + uploaders.value(uploader)->doUpload(img, format, getScreenshotFile(*file)); delete file; - uploaders.value(uploader)->doUpload(img, format, fileInfo.fileName()); } void UploaderSingleton::upload(QFile &img, QString format) { @@ -108,9 +107,8 @@ void UploaderSingleton::upload(QFile &img, QString format) { formatter::format(settings::settings().value("fileFormat", "Screenshot %(yyyy-MM-dd HH-mm-ss)date.%ext").toString(), format.toLower())))) { notifications::playSound(notifications::Sound::CAPTURE); - QFileInfo fileInfo(img.fileName()); if (img.open(QFile::ReadWrite)) - uploaders.value(uploader)->doUpload(img.readAll(), format, fileInfo.fileName()); + uploaders.value(uploader)->doUpload(img.readAll(), format, getScreenshotFile(img)); else notifications::notify(tr("KShare - Failed to save picture"), img.errorString(), QSystemTrayIcon::Warning); } else @@ -120,9 +118,8 @@ void UploaderSingleton::upload(QFile &img, QString format) { void UploaderSingleton::upload(QFile &img) { updateSaveSettings(); if (img.size() <= 0) return; - QFileInfo fileInfo(img.fileName()); if (img.open(QFile::ReadWrite)) - uploaders.value(uploader)->doUpload(img.readAll(), "", fileInfo.fileName()); + uploaders.value(uploader)->doUpload(img.readAll(), "", getScreenshotFile(img)); else notifications::notify(tr("KShare - Failed to open File"), img.errorString(), QSystemTrayIcon::Warning); } @@ -159,6 +156,18 @@ QString UploaderSingleton::currentUploader() { return uploader; } +QString UploaderSingleton::getFormattedSubfolder() { + return formatter::format(settings::settings().value("folderFormat", "%(yyyy-MM)date").toString(), ""); +} + +ScreenshotFile UploaderSingleton::getScreenshotFile(QFile &f) { + ScreenshotFile sf; + sf.subfolder = getFormattedSubfolder(); + QFileInfo fi(f); + sf.filename = fi.fileName(); + return sf; +} + void UploaderSingleton::updateSaveSettings() { switch (settings::settings().value("saveLocation", 1).toInt()) { case 0: @@ -180,6 +189,8 @@ void UploaderSingleton::updateSaveSettings() { break; } + saveDir = QDir(saveDir.absolutePath() + QDir::separator() + getFormattedSubfolder()); + if (!saveDir.exists()) { if (!saveDir.mkpath(".")) { qFatal("Could not create the path %s to store images in!", saveDir.absolutePath().toLocal8Bit().constData()); diff --git a/src/uploaders/uploadersingleton.hpp b/src/uploaders/uploadersingleton.hpp index 332c838..d1212f4 100644 --- a/src/uploaders/uploadersingleton.hpp +++ b/src/uploaders/uploadersingleton.hpp @@ -4,6 +4,7 @@ #include "uploader.hpp" #include #include +#include class UploaderSingleton : public QObject { Q_OBJECT @@ -31,6 +32,8 @@ signals: private: void updateSaveSettings(); + QString getFormattedSubfolder(); + ScreenshotFile getScreenshotFile(QFile &f); QDir saveDir; bool saveImages = true; QMap uploaders;