diff --git a/.gitignore b/.gitignore index 9f5bf40..45595c7 100644 --- a/.gitignore +++ b/.gitignore @@ -16,7 +16,7 @@ *.qbs.user *.qbs.user.* *.moc -moc_*.cpp +moc_* qrc_*.cpp ui_*.h Makefile* @@ -26,4 +26,8 @@ Makefile* #QtCtreator Qml *.qmlproject.user *.qmlproject.user.* -.vscode +.vscode/ +.kde4/ +quteqoin +quteqoin.kdev4 +build/ diff --git a/core/parsers/qqbackendparser.cpp b/core/parsers/qqbackendparser.cpp index 204734b..e254110 100644 --- a/core/parsers/qqbackendparser.cpp +++ b/core/parsers/qqbackendparser.cpp @@ -23,9 +23,9 @@ /// \param parent /// QQBackendParser::QQBackendParser(QObject *parent) : - QObject(parent), - m_lastId(0), - m_maxId(0) + QObject(parent), + m_lastId(0), + m_maxId(0) { } @@ -33,7 +33,5 @@ QQBackendParser::QQBackendParser(QObject *parent) : ////////////////////////////////////////////////////////////// /// \brief QQBackendParser::~QQBackendParser /// -QQBackendParser::~QQBackendParser() -{ +QQBackendParser::~QQBackendParser() = default; -} diff --git a/core/parsers/qqcustomxmlparser.cpp b/core/parsers/qqcustomxmlparser.cpp new file mode 100644 index 0000000..d773384 --- /dev/null +++ b/core/parsers/qqcustomxmlparser.cpp @@ -0,0 +1,133 @@ +#include "qqcustomxmlparser.h" + +#include + +constexpr static auto POST_ATTR_START_MARK = "= 0) + { + auto indexEnd = data.indexOf(POST_ATTR_END_MARK, indexStart); + if (indexEnd >= 0) + { + if(parsePost(data.mid(indexStart + strlen(POST_ATTR_START_MARK), indexEnd - (indexStart + strlen(POST_ATTR_START_MARK))))) + emit newPostReady(m_currentPost); + } + indexStart = indexEnd; + } + + m_lastId = m_maxId; + + emit finished(); + + return true; +} + +bool QQCustomXmlParser::parsePost(const QByteArray &data) +{ + m_currentPost.reset(); + + // Extract Id + auto indexStart = data.indexOf(ID_ATTR_START_MARK); + if (indexStart < 0) + return false; + indexStart += strlen(ID_ATTR_START_MARK); + + auto indexEnd = data.indexOf(ID_ATTR_END_MARK, indexStart); + if (indexEnd < 0) + return false; + auto postId = data.mid(indexStart, indexEnd - indexStart); + + bool ok = true; + qlonglong id = postId.toLongLong(&ok); + if(!ok || id <= m_lastId) + return false; + if(id > m_maxId) + m_maxId = id; + + m_currentPost.setId(postId); + + // Extract Norloge + indexStart = data.indexOf(TIME_ATTR_START_MARK); + if (indexStart < 0) + return false; + indexStart += strlen(TIME_ATTR_START_MARK); + + indexEnd = data.indexOf(TIME_ATTR_END_MARK, indexStart); + if (indexEnd < 0) + return false; + m_currentPost.setNorloge(data.mid(indexStart, indexEnd - indexStart)); + + // Extract login + indexStart = data.indexOf(LOGIN_TAG_START_MARK); + if (indexStart < 0) + return false; + indexStart += strlen(LOGIN_TAG_START_MARK); + + indexEnd = data.indexOf(LOGIN_TAG_END_MARK, indexStart); + if (indexEnd < 0) + return false; + m_currentPost.setLogin(data.mid(indexStart, indexEnd - indexStart)); + + // Extract info + indexStart = data.indexOf(INFO_TAG_START_MARK); + if (indexStart < 0) + return false; + indexStart += strlen(INFO_TAG_START_MARK); + + indexEnd = data.indexOf(INFO_TAG_END_MARK, indexStart); + if (indexEnd < 0) + return false; + m_currentPost.setUA(data.mid(indexStart, indexEnd - indexStart)); + + // Extract message + indexStart = data.indexOf(MESSAGE_TAG_START_MARK); + if (indexStart < 0) + return false; + indexStart += strlen(MESSAGE_TAG_START_MARK); + + indexEnd = data.indexOf(MESSAGE_TAG_END_MARK, indexStart); + if (indexEnd < 0) + return false; + auto rawMessage = data.mid(indexStart, indexEnd - indexStart); + + if (m_typeSlip == QQBouchot::SlipTagsEncoded) + { + m_currentPost.setMessage( + QString(rawMessage). + replace("<", "<"). + replace(">", ">"). + replace(""e;", "\""). + replace(""", "\""). + replace("&", "&") + ); + } + else + m_currentPost.setMessage(rawMessage); + + //qDebug() << Q_FUNC_INFO << m_currentPost.message(); + + return true; +} diff --git a/core/parsers/qqcustomxmlparser.h b/core/parsers/qqcustomxmlparser.h new file mode 100644 index 0000000..f8a5fb1 --- /dev/null +++ b/core/parsers/qqcustomxmlparser.h @@ -0,0 +1,27 @@ +#ifndef QQCUSTOMXMLPARSER_H +#define QQCUSTOMXMLPARSER_H + +#include + +#include "core/parsers/qqbackendparser.h" +#include "core/qqbouchot.h" + +class QQCustomXmlParser : public QQBackendParser +{ + Q_OBJECT +public: + QQCustomXmlParser(QObject *parent = 0); + + QString errorString () const; + + bool parseBackend(const QByteArray &data); + + bool parsePost(const QByteArray &data); + + void setTypeSlip(QQBouchot::TypeSlip typeSlip) { this->m_typeSlip = typeSlip; } + +private: + QQBouchot::TypeSlip m_typeSlip; +}; + +#endif // QQCUSTOMXMLPARSER_H diff --git a/core/parsers/qqtsvparser.cpp b/core/parsers/qqtsvparser.cpp index 6108c96..4fee1f9 100644 --- a/core/parsers/qqtsvparser.cpp +++ b/core/parsers/qqtsvparser.cpp @@ -3,7 +3,8 @@ #include #include -#define CHAR_SEP '\t' +constexpr char CHAR_SEP='\t'; +constexpr int TSV_STANDARD_FIELD_COUNT = 5; QQTsvParser::QQTsvParser(QObject *parent) : QQBackendParser(parent) { @@ -24,7 +25,7 @@ bool QQTsvParser::parseBackend(const QByteArray &data) QByteArray l = f.readLine(); QList fields = l.split(CHAR_SEP); - if(fields.length() == 5) + if(fields.length() == TSV_STANDARD_FIELD_COUNT) { bool ok = true; qlonglong id = fields.at(0).toLongLong(&ok); diff --git a/core/parsers/qqtsvparser.h b/core/parsers/qqtsvparser.h index b8d5100..a1cb779 100644 --- a/core/parsers/qqtsvparser.h +++ b/core/parsers/qqtsvparser.h @@ -16,11 +16,6 @@ class QQTsvParser : public QQBackendParser QString errorString () const; bool parseBackend(const QByteArray &data); - -signals: - void newPostReady(QQPost & newPost); - void finished(); - }; #endif // QQTSVPARSER_H diff --git a/core/parsers/qqxmlparser.cpp b/core/parsers/qqxmlparser.cpp index b838db7..34b0ebb 100644 --- a/core/parsers/qqxmlparser.cpp +++ b/core/parsers/qqxmlparser.cpp @@ -21,7 +21,7 @@ // QQXmlParser::QQXmlParser(QObject *parent) - : QQBackendParser(parent), QXmlDefaultHandler() + : QQBackendParser(parent) { m_currentPost.reset(); m_typeSlip = QQBouchot::SlipTagsEncoded; @@ -30,9 +30,7 @@ QQXmlParser::QQXmlParser(QObject *parent) } // -QQXmlParser::~QQXmlParser() -{ -} +QQXmlParser::~QQXmlParser() = default; QString QQXmlParser::errorString () const { @@ -162,7 +160,7 @@ bool QQXmlParser::startElement(const QString &namespaceURI, const QString &local } } - if (m_elementNames.size() > 0 && + if ((! m_elementNames.isEmpty()) && ((m_elementNames.top() == "info") || (m_elementNames.top() == "message") || (m_elementNames.top() == "login")) diff --git a/core/qqbackendupdatedevent.cpp b/core/qqbackendupdatedevent.cpp index e503437..f36a090 100644 --- a/core/qqbackendupdatedevent.cpp +++ b/core/qqbackendupdatedevent.cpp @@ -1,9 +1,11 @@ #include "qqbackendupdatedevent.h" +#include + const QEvent::Type QQBackendUpdatedEvent::BACKEND_UPDATED = (QEvent::Type)QEvent::registerEventType(); QQBackendUpdatedEvent::QQBackendUpdatedEvent(QEvent::Type type, QString group) : -QEvent(type), m_group(group) +QEvent(type), m_group(std::move(group)) { } diff --git a/core/qqbakdisplayfilter.cpp b/core/qqbakdisplayfilter.cpp index 41ea478..0ae76a4 100644 --- a/core/qqbakdisplayfilter.cpp +++ b/core/qqbakdisplayfilter.cpp @@ -10,13 +10,13 @@ /// bool QQBakDisplayFilter::filterMatch(const QQPost *post) { - if(post == NULL) + if(post == nullptr) return false; QQBouchot *b = post->bouchot(); QString login = post->login(); if(login.size() > 0) return b->isBaked(login, true); - else - return b->isBaked(post->UA(), false); + + return b->isBaked(post->UA(), false); } diff --git a/core/qqbakdisplayfilter.h b/core/qqbakdisplayfilter.h index 23c59e9..6058c77 100644 --- a/core/qqbakdisplayfilter.h +++ b/core/qqbakdisplayfilter.h @@ -9,7 +9,7 @@ class QQBakDisplayFilter : public QQPostDisplayFilter QQBakDisplayFilter() : QQPostDisplayFilter() {} virtual ~QQBakDisplayFilter() {} - virtual bool filterMatch(const QQPost *post); + virtual bool filterMatch(const QQPost *post) override; }; #endif // QQBAKDISPLAYFILTER_H diff --git a/core/qqboardstatechangeevent.cpp b/core/qqboardstatechangeevent.cpp index cc26a72..df42608 100644 --- a/core/qqboardstatechangeevent.cpp +++ b/core/qqboardstatechangeevent.cpp @@ -1,11 +1,13 @@ #include "qqboardstatechangeevent.h" +#include + const QEvent::Type QQBoardStateChangeEvent::BOARD_STATE_CHANGED = (QEvent::Type)QEvent::registerEventType(); -QQBoardStateChangeEvent::QQBoardStateChangeEvent(const QString &boardName) : +QQBoardStateChangeEvent::QQBoardStateChangeEvent(QString boardName) : QEvent(BOARD_STATE_CHANGED), - m_boardName(boardName) + m_boardName(std::move(boardName)) { } diff --git a/core/qqboardstatechangeevent.h b/core/qqboardstatechangeevent.h index e31f789..74bf005 100644 --- a/core/qqboardstatechangeevent.h +++ b/core/qqboardstatechangeevent.h @@ -9,7 +9,7 @@ class QQBoardStateChangeEvent : public QEvent public: static const QEvent::Type BOARD_STATE_CHANGED; - QQBoardStateChangeEvent(const QString &boardName); + QQBoardStateChangeEvent(QString boardName); QString boardName(); private: diff --git a/core/qqbouchot.cpp b/core/qqbouchot.cpp index fc8ba4f..06bfd0d 100644 --- a/core/qqbouchot.cpp +++ b/core/qqbouchot.cpp @@ -1,10 +1,13 @@ #include "qqbouchot.h" +#include + #include "core/qqbackendupdatedevent.h" #include "core/qqboardstatechangeevent.h" #include "core/qqpurgebouchothistoevent.h" #include "core/qqsettings.h" #include "core/parsers/qqbackendparser.h" +#include "core/parsers/qqcustomxmlparser.h" #include "core/parsers/qqtsvparser.h" #include "core/parsers/qqxmlparser.h" @@ -22,73 +25,79 @@ #include #include #include +#include -#define X_POST_ID_HEADER "X-Post-Id" +constexpr char X_POST_ID_HEADER[] = "X-Post-Id"; +constexpr unsigned int HTTP_OK = 200; -typedef struct QQBouchotDef +using QQBouchotDef = struct { - char name[16]; - char getUrl[64]; - char postUrl[64]; - char postData[64]; - char color[16]; - char alias[64]; - char cookieProto[64]; + std::string name; + std::string getUrl; + std::string postUrl; + std::string postData; + std::string color; + std::string alias; + std::string cookieProto; QQBouchot::TypeSlip typeSlip; -} QQBouchotDef; +}; //Définition des bouchots préconfigurés // tiré d'olcc by Chrisix -#define BOUCHOTS_DEF_SIZE 11 -static QQBouchotDef bouchotsDef[] = -{ - { "dlfp", "https://linuxfr.org/board/index.xml", "https://linuxfr.org/board", "board%5Bmessage%5D=%m", - "#dac0de", "linuxfr,beyrouth,passite,dapassite", "linuxfr.org_session=;remember_account_token=", QQBouchot::SlipTagsEncoded }, - { "batavie", "http://batavie.leguyader.eu/remote.xml", "http://batavie.leguyader.eu/index.php/add", "message=%m", - "#ffccaa", "llg", "", QQBouchot::SlipTagsRaw }, - { "euromussels", "http://faab.euromussels.eu/data/backend.xml", "http://faab.euromussels.eu/add.php", "message=%m", - "#d0d0ff", "euro,euroxers,eurofaab", "", QQBouchot::SlipTagsRaw }, - { "sveetch", "http://sveetch.net/tribune/remote/xml/?last=%i", "http://sveetch.net/tribune/post/xml", "content=%m", - "#ededdb", "shoop,dax", "", QQBouchot::SlipTagsRaw }, - { "moules", "http://moules.org/board/last.php?backend=tsv&id=%i&order=desc", "http://moules.org/board/add.php", "message=%m", - "#ffe3c9", "", "", QQBouchot::SlipTagsRaw }, - { "gabuzomeu", "http://gabuzomeu.fr/tribune.xml", "http://gabuzomeu.fr/tribune/post", "message=%m", - "#aaffbb", "", "", QQBouchot::SlipTagsRaw }, - { "devnewton", "https://jb3.devnewton.fr/legacy/xml?last=%i", "https://jb3.devnewton.fr/legacy/post", "message=%m", - "#666666", "", "", QQBouchot::SlipTagsEncoded }, - { "faab", "http://ratatouille.leguyader.eu/data/backend.xml", "http://ratatouille.leguyader.eu/add.php", "message=%m", - "#C5D068", "ratatouille", "", QQBouchot::SlipTagsRaw }, - { "goboard", "https://ototu.euromussels.eu/goboard/backend/tsv&last=%i", "https://ototu.euromussels.eu/goboard/post", "message=%m", - "#fffabb", "goboard", "", QQBouchot::SlipTagsEncoded }, - { "sauf.ca", "http://sauf.ca/feeds/all.tsv", "", "", - "#4aff47", "", "", QQBouchot::SlipTagsRaw }, - { "42", "http://www.miaoli.im/tribune/42/tsv", "http://www.miaoli.im/tribune/42/post", "message=%m", - "#ffd0d0", "", "", QQBouchot::SlipTagsRaw } -}; - -#define REFRESH_RATIOS_SIZE 15 -#define REFRESH_RATIOS_MID 7 -static float refreshRatiosArr[] = { - 0.1f, 0.3f, 0.5, 0.7f, 0.8f, 0.9f, +const std::array bouchotsDef = +{{ + { {"dlfp"}, {"https://linuxfr.org/board/index.xml"}, {"https://linuxfr.org/board"}, {"board%5Bmessage%5D=%m"}, + {"#dac0de"}, {"linuxfr,beyrouth,passite,dapassite"}, {"linuxfr.org_session=;remember_account_token="}, QQBouchot::SlipTagsEncoded + }, + { {"batavie"}, {"http://batavie.leguyader.eu/remote.xml"}, {"http://batavie.leguyader.eu/index.php/add"}, {"message=%m"}, + {"#ffccaa"}, {"llg"}, {""}, QQBouchot::SlipTagsRaw + }, + { {"euromussels"}, {"http://faab.euromussels.eu/data/backend.xml"}, {"http://faab.euromussels.eu/add.php"}, {"message=%m"}, + {"#d0d0ff"}, {"euro,euroxers,eurofaab"}, {""}, QQBouchot::SlipTagsRaw }, + { {"sveetch"}, {"http://sveetch.net/tribune/remote/xml/?last=%i"}, {"http://sveetch.net/tribune/post/xml"}, {"content=%m"}, + {"#ededdb"}, {"shoop,dax"}, {""}, QQBouchot::SlipTagsRaw }, + { {"moules"}, {"http://moules.org/board/last.php?backend=tsv&id=%i&order=desc"}, {"http://moules.org/board/add.php"}, {"message=%m"}, + {"#ffe3c9"}, {""}, {""}, QQBouchot::SlipTagsRaw }, + { {"gabuzomeu"}, {"http://gabuzomeu.fr/tribune.xml"}, {"http://gabuzomeu.fr/tribune/post"}, {"message=%m"}, + {"#aaffbb"}, {""}, {""}, QQBouchot::SlipTagsRaw }, + { {"devnewton"}, {"https://jb3.devnewton.fr/legacy/xml?last=%i"}, {"https://jb3.devnewton.fr/legacy/post"}, {"message=%m"}, + {"#666666"}, {""}, {""}, QQBouchot::SlipTagsEncoded }, + { {"faab"}, {"http://ratatouille.leguyader.eu/data/backend.xml"}, {"http://ratatouille.leguyader.eu/add.php"}, {"message=%m"}, + {"#C5D068"}, {"ratatouille"}, {""}, QQBouchot::SlipTagsRaw }, + { {"goboard"}, {"https://ototu.euromussels.eu/goboard/backend/tsv&last=%i"}, {"https://ototu.euromussels.eu/goboard/post"}, {"message=%m"}, + {"#fffabb"}, {"goboard"}, {""}, QQBouchot::SlipTagsEncoded }, + { {"sauf.ca"}, {"http://sauf.ca/feeds/all.tsv"}, {""}, {""}, + {"#4aff47"}, {""}, {""}, QQBouchot::SlipTagsRaw }, + { {"42"}, {"http://www.miaoli.im/tribune/42/tsv"}, {"http://www.miaoli.im/tribune/42/post"}, {"message=%m"}, + {"#ffd0d0"}, {""}, {""}, QQBouchot::SlipTagsRaw } +}}; + +constexpr int REFRESH_RATIOS_SIZE = 15; +constexpr int REFRESH_RATIOS_MID = 7; +const std::array refreshRatiosArr = { + 0.1F, 0.3F, 0.5F, 0.7F, 0.8F, 0.9F, 1.0, 1.0, 1.0, 1.5, 2.0, 3.0, 5.0, 7.0, 10.0 }; -#define REFRESH_NEW_POSTS_THRESHOLD 5 -#define QQ_MIN_REFRESH_DELAY_S 3 +constexpr int REFRESH_NEW_POSTS_THRESHOLD = 5; +constexpr unsigned int QQ_MIN_REFRESH_DELAY_S = 3; +constexpr unsigned int QQ_UINT_SEC_TO_MSEC = 1000; +constexpr unsigned long QQ_UL_HOUR_TO_SEC = 3600; ////////////////////////////////////////////////////////////// /// \brief QQBouchot::QQBouchot /// \param name /// \param parent /// -QQBouchot::QQBouchot(const QString &name, QObject *parent) : +QQBouchot::QQBouchot(QString name, QObject *parent) : QQNetworkAccessor(parent), m_hasXPostId(false), // unknown m_lastId(-1), m_lastModifiedBackend(""), - m_name(name), + m_name(std::move(name)), m_parser(nullptr), - m_deltaTimeH(-1) // unknown + m_deltaTimeH(-1), // unknown + m_state() { m_bSettings.setRefresh(DEFAULT_BOUCHOT_REFRESH); @@ -120,7 +129,7 @@ QQBouchot::~QQBouchot() void QQBouchot::postMessage(const QString &message) { //Si l'on poste on remet un refresh "normal" si en mode lent - if(currentRefreshRatio() > 1.0f) + if(currentRefreshRatio() > 1.0F) m_refreshRatioIndex = REFRESH_RATIOS_MID; QString url = m_bSettings.postUrl(); @@ -167,7 +176,8 @@ void QQBouchot::setSettings(const QQBouchotSettings &newSettings) //Set new cookies QList qlCookies; - QStringList cookies=newSettings.cookies().split(QRegularExpression("\\s*;\\s*")); + static const QRegularExpression re("\\s*;\\s*"); + QStringList cookies=newSettings.cookies().split(re); foreach (QString cookie, cookies) { QStringList splittedCookie=cookie.split("="); if(splittedCookie.size() >= 2) @@ -177,7 +187,7 @@ void QQBouchot::setSettings(const QQBouchotSettings &newSettings) qlCookies.append(c); } } - if(qlCookies.size() > 0) + if(! qlCookies.empty()) setCookiesFromUrl(qlCookies, postUrl); m_bSettings = newSettings; @@ -194,7 +204,7 @@ void QQBouchot::startRefresh() return; //Connection du signal - connect(&m_timer, SIGNAL(timeout()), this, SLOT(fetchBackend())); + connect(&m_timer, &QTimer::timeout, this, &QQBouchot::fetchBackend); //Première récuperation fetchBackend(); @@ -217,7 +227,8 @@ void QQBouchot::stopRefresh() /// int QQBouchot::currentRefreshInterval() { - return qMax(int(m_bSettings.refresh() * 1000 * currentRefreshRatio()), QQ_MIN_REFRESH_DELAY_S); + return qMax(static_cast(m_bSettings.refresh() * QQ_UINT_SEC_TO_MSEC * std::lroundf(currentRefreshRatio())), + QQ_MIN_REFRESH_DELAY_S); } ////////////////////////////////////////////////////////////// @@ -374,8 +385,8 @@ void QQBouchot::registerForEventNotification(QObject *receiver, QQBouchotEvents { if(receiver) { - connect(receiver, SIGNAL(destroyed(QObject *)), - this, SLOT(unregisterForEventNotification(QObject*))); + connect(receiver, &QObject::destroyed, + this, &QQBouchot::unregisterForEventNotification); unregisterForEventNotification(receiver); QQBouchot::EventReceiver evRcv; evRcv.acceptedEvents = events; @@ -461,11 +472,11 @@ void QQBouchot::fetchBackend() if(m_lastModifiedBackend.length() > 0) request.setRawHeader(QString::fromLatin1("If-Modified-Since").toLatin1(), m_lastModifiedBackend.toLatin1()); - if(m_bSettings.cookies().isEmpty() == false) + if(! m_bSettings.cookies().isEmpty()) request.setRawHeader(QString::fromLatin1("Cookie").toLatin1(), m_bSettings.cookies().toLatin1()); QNetworkReply *reply = httpGet(request); - connect(reply, SIGNAL(sslErrors(const QList&)), this, SLOT(slotSslErrors(const QList&))); + connect(reply, &QNetworkReply::sslErrors, this, &QQBouchot::slotSslErrors); emit refreshStarted(); m_timer.setInterval(currentRefreshInterval()); @@ -483,19 +494,19 @@ void QQBouchot::slotSslErrors(const QList &errors) foreach(QSslError err, errors) { switch (err.error()) { - case QSslError::SelfSignedCertificate: - case QSslError::SelfSignedCertificateInChain: - case QSslError::UnableToGetLocalIssuerCertificate: - case QSslError::UnableToVerifyFirstCertificate: - case QSslError::CertificateUntrusted: - if(m_bSettings.isStrictHttpsCertif() == true) + case QSslError::SelfSignedCertificate: + case QSslError::SelfSignedCertificateInChain: + case QSslError::UnableToGetLocalIssuerCertificate: + case QSslError::UnableToVerifyFirstCertificate: + case QSslError::CertificateUntrusted: + if(m_bSettings.isStrictHttpsCertif()) msgs.append(err.errorString()).append("\n"); - break; - case QSslError::NoError: - break; - default: - msgs.append(err.errorString()).append("\n"); - break; + break; + case QSslError::NoError: + break; + default: + msgs.append(err.errorString()).append("\n"); + break; } } if(msgs.length() > 0) @@ -517,8 +528,8 @@ void QQBouchot::unregisterForEventNotification(QObject *receiver) { if(i.next().receiver == receiver) { - disconnect(receiver, SIGNAL(destroyed(QObject *)), - this, SLOT(unregisterForEventNotification(QObject*))); + disconnect(receiver, &QObject::destroyed, + this, &QQBouchot::unregisterForEventNotification); i.remove(); } } @@ -541,24 +552,27 @@ void QQBouchot::requestFinishedSlot(QNetworkReply *reply) << "msg :" << reply->errorString(); switch(reply->request().attribute(QNetworkRequest::User, QQBouchot::UnknownRequest).toInt()) { - case QQBouchot::BackendRequest: - emit refreshError(errMsg); - break; - default: - qWarning() << Q_FUNC_INFO + case QQBouchot::BackendRequest: + emit refreshError(errMsg); + break; + default: + qWarning() << Q_FUNC_INFO << "Bouchot :" << m_name << "reply->request().attribute(QNetworkRequest::User).toInt() unknown :" << reply->request().attribute(QNetworkRequest::User, QQBouchot::UnknownRequest).toInt(); } + + + clearNetworkBackend(); } else { m_state.hasError = false; switch(reply->request().attribute(QNetworkRequest::User, QQBouchot::UnknownRequest).toInt()) { - case QQBouchot::PostRequest: + case QQBouchot::PostRequest: #ifndef QT_NO_DEBUG - qDebug() << Q_FUNC_INFO << reply->attribute(QNetworkRequest::HttpStatusCodeAttribute); + qDebug() << Q_FUNC_INFO << reply->attribute(QNetworkRequest::HttpStatusCodeAttribute); foreach (QByteArray ba, reply->rawHeaderList()) { qDebug() << Q_FUNC_INFO << ba << QString(reply->rawHeader(ba)); } @@ -570,25 +584,25 @@ void QQBouchot::requestFinishedSlot(QNetworkReply *reply) } #endif - if(reply->hasRawHeader(X_POST_ID_HEADER)) + if(reply->hasRawHeader(QByteArray::fromStdString(X_POST_ID_HEADER))) { m_hasXPostId = true; - m_xPostIds.append(QString(reply->rawHeader(X_POST_ID_HEADER))); + m_xPostIds.append(QString(reply->rawHeader(QByteArray::fromStdString(X_POST_ID_HEADER)))); } fetchBackend(); - break; - case QQBouchot::BackendRequest: - if(reply->hasRawHeader("Last-Modified")) + break; + case QQBouchot::BackendRequest: + if(reply->hasRawHeader("Last-Modified")) m_lastModifiedBackend = QString(reply->rawHeader("Last-Modified")); - if(reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toUInt() == 200) + if(reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toUInt() == HTTP_OK) { QString contentType = reply->header(QNetworkRequest::ContentTypeHeader).toString(); parseBackend(reply->readAll(), contentType); } emit refreshOK(); - break; + break; } } reply->deleteLater(); @@ -601,8 +615,9 @@ void QQBouchot::requestFinishedSlot(QNetworkReply *reply) void QQBouchot::parseBackend(const QByteArray &data, const QString &contentType) { if(contentType.startsWith("text/xml") || - contentType.startsWith("application/xml")) - parseBackendXML(data); + contentType.startsWith("application/xml")) + //parseBackendXML(data); + parseBackendXMLCustom(data); else if(contentType.startsWith("text/tab-separated-values")) parseBackendTSV(data); else @@ -642,16 +657,16 @@ void QQBouchot::parseBackend(const QByteArray &data, const QString &contentType) void QQBouchot::parseBackendTSV(const QByteArray &data) { - QQTsvParser *p = qobject_cast(m_parser); + auto *p = qobject_cast(m_parser); if(p == nullptr) { - if(m_parser != nullptr) - delete m_parser; + + delete m_parser; p = new QQTsvParser(this); - connect(p, SIGNAL(newPostReady(QQPost&)), this, SLOT(insertNewPost(QQPost&))); - connect(p, SIGNAL(finished()), this, SLOT(parsingFinished())); + connect(p, &QQTsvParser::newPostReady, this, &QQBouchot::insertNewPost); + connect(p, &QQTsvParser::finished, this, &QQBouchot::parsingFinished); m_parser=p; } @@ -660,18 +675,38 @@ void QQBouchot::parseBackendTSV(const QByteArray &data) p->parseBackend(data); } +void QQBouchot::parseBackendXMLCustom(const QByteArray &data) +{ + auto *p = qobject_cast(m_parser); + if(p == nullptr) + { + delete m_parser; + + p = new QQCustomXmlParser(this); + + connect(p, &QQCustomXmlParser::newPostReady, this, &QQBouchot::insertNewPost); + connect(p, &QQCustomXmlParser::finished, this, &QQBouchot::parsingFinished); + + m_parser=p; + } + + p->setTypeSlip(m_bSettings.slipType()); + p->setLastId(m_lastId); + p->parseBackend(data); +} + void QQBouchot::parseBackendXML(const QByteArray &data) { - QQXmlParser *p = qobject_cast(m_parser); + auto *p = qobject_cast(m_parser); if(p == nullptr) { - if(m_parser != nullptr) - delete m_parser; + + delete m_parser; p = new QQXmlParser(this); - connect(p, SIGNAL(newPostReady(QQPost&)), this, SLOT(insertNewPost(QQPost&))); - connect(p, SIGNAL(finished()), this, SLOT(parsingFinished())); + connect(p, &QQXmlParser::newPostReady, this, &QQBouchot::insertNewPost); + connect(p, &QQXmlParser::finished, this, &QQBouchot::parsingFinished); m_parser=p; } @@ -694,7 +729,7 @@ void QQBouchot::parseBackendXML(const QByteArray &data) /// void QQBouchot::insertNewPost(QQPost &newPost) { - QQPost * tmpNewPost = new QQPost(newPost); + auto * tmpNewPost = new QQPost(newPost); tmpNewPost->setParent(this); QString postId = tmpNewPost->id(); @@ -713,30 +748,30 @@ void QQBouchot::insertNewPost(QQPost &newPost) m_newPostHistory.prepend(tmpNewPost); } -#define MAX_TIME_USER_ACTIVE_S (30 * 60) +constexpr int MAX_TIME_USER_ACTIVE_S = 30 * 60; ////////////////////////////////////////////////////////////// /// \brief QQBouchot::parsingFinished /// void QQBouchot::parsingFinished() { - if(m_newPostHistory.size() > 0) + if(!m_newPostHistory.empty()) { if(m_newPostHistory.size() >= REFRESH_NEW_POSTS_THRESHOLD && m_refreshRatioIndex > 0) { m_refreshRatioIndex --; // faster - if(currentRefreshRatio() > 1.0f) + if(currentRefreshRatio() > 1.0F) m_refreshRatioIndex = REFRESH_RATIOS_MID; } if(m_deltaTimeH == -1 && - m_history.size() > 0) //Ne peut-etre fait sur le 1° backend recupere + !m_history.empty()) //Ne peut-etre fait sur le 1° backend recupere { //Le delta de TZ ne peut etre determine efficacement que lors d'un // refresh de backend (pas lors du chargement initial). QQPost *last = m_newPostHistory.last(); QDateTime postDateTime = QDateTime::fromString(last->norloge(), "yyyyMMddHHmmss"); - m_deltaTimeH = static_cast(postDateTime.secsTo(QDateTime::currentDateTime()) / 3600ll); //Secondes vers Heures + m_deltaTimeH = static_cast(postDateTime.secsTo(QDateTime::currentDateTime()) / QQ_UL_HOUR_TO_SEC); //Secondes vers Heures } //On s'assure qu'ils sont ranges du plus petit id au plus grand @@ -826,7 +861,7 @@ void QQBouchot::updateLastUsers() deltaTimeH = 0; // On se met sur le meme TZ que le bouchot - QDateTime currentDateTime = QDateTime::currentDateTime().addSecs( deltaTimeH * 3600 ); + QDateTime currentDateTime = QDateTime::currentDateTime().addSecs( deltaTimeH * QQ_UL_HOUR_TO_SEC ); for(int i = m_history.size() - 1; i >= 0; i--) { QQPost *post = m_history.at(i); @@ -863,7 +898,7 @@ void QQBouchot::sendBouchotEvents() { foreach (EventReceiver evRcv, m_listEventReceivers) { - if(evRcv.acceptedEvents.testFlag(NewPostsAvailable) && m_newPostHistory.size() > 0) + if(evRcv.acceptedEvents.testFlag(NewPostsAvailable) && !m_newPostHistory.empty()) { QApplication::postEvent(evRcv.receiver, new QQBackendUpdatedEvent( @@ -889,12 +924,10 @@ void QQBouchot::sendBouchotEvents() float QQBouchot::currentRefreshRatio() { if(m_refreshRatioIndex >= 0 && m_refreshRatioIndex < REFRESH_RATIOS_SIZE) - return refreshRatiosArr[m_refreshRatioIndex]; - else - { - m_refreshRatioIndex = REFRESH_RATIOS_MID; - return refreshRatiosArr[REFRESH_RATIOS_MID]; - } + return refreshRatiosArr.at(m_refreshRatioIndex); + + m_refreshRatioIndex = REFRESH_RATIOS_MID; + return refreshRatiosArr.at(REFRESH_RATIOS_MID); } @@ -912,21 +945,20 @@ QQBouchot::QQBouchotSettings QQBouchot::getBouchotDef(const QString &bouchotName QQBouchot::QQBouchotSettings settings; - int i = 0; - for(; i < BOUCHOTS_DEF_SIZE; i++) - if(QString::compare(bouchotName, QLatin1String(bouchotsDef[i].name)) == 0) - break; - - if(i < BOUCHOTS_DEF_SIZE) + for(const auto& def: bouchotsDef) { - settings.setAliasesFromString(bouchotsDef[i].alias); - settings.setBackendUrl(bouchotsDef[i].getUrl); - settings.setColorFromString(bouchotsDef[i].color); - settings.setPostData(bouchotsDef[i].postData); - settings.setPostUrl(bouchotsDef[i].postUrl); - settings.setRefresh(DEFAULT_BOUCHOT_REFRESH); - settings.setSlipType(bouchotsDef[i].typeSlip); - settings.setCookies(bouchotsDef[i].cookieProto); + if(QString::compare(bouchotName, QString::fromStdString(def.name)) == 0) + { + settings.setAliasesFromString(QString::fromStdString(def.alias)); + settings.setBackendUrl(QString::fromStdString(def.getUrl)); + settings.setColorFromString(QString::fromStdString(def.color)); + settings.setPostData(QString::fromStdString(def.postData)); + settings.setPostUrl(QString::fromStdString(def.postUrl)); + settings.setRefresh(DEFAULT_BOUCHOT_REFRESH); + settings.setSlipType(def.typeSlip); + settings.setCookies(QString::fromStdString(def.cookieProto)); + break; + } } return settings; @@ -938,10 +970,9 @@ QQBouchot::QQBouchotSettings QQBouchot::getBouchotDef(const QString &bouchotName /// QStringList QQBouchot::getBouchotDefNameList() { - int i = 0; QStringList res; - for(i = 0; i < BOUCHOTS_DEF_SIZE; i++) - res.append(QString::fromLatin1(bouchotsDef[i].name)); + for(const auto& def: bouchotsDef) + res.append(QString::fromStdString(def.name)); return res; } @@ -1011,7 +1042,7 @@ QList QQBouchot::listBouchotsGroup(const QString &groupName) QStringList QQBouchot::listGroups() { QStringList listGroups; - foreach (QQBouchot *bouchot, s_hashBouchots.values()) + for (auto bouchot : qAsConst(s_hashBouchots)) { QString group = bouchot->settings().group(); if(! listGroups.contains(group)) diff --git a/core/qqbouchot.h b/core/qqbouchot.h index 71ac803..4377980 100644 --- a/core/qqbouchot.h +++ b/core/qqbouchot.h @@ -104,7 +104,7 @@ class QQBouchot : public QQNetworkAccessor static const char Separator = ','; }; - QQBouchot(const QString &name, QObject *parent = nullptr); + QQBouchot(QString name, QObject *parent = nullptr); ~QQBouchot(); QString name() const { return m_name; } @@ -112,6 +112,7 @@ class QQBouchot : public QQNetworkAccessor void parseBackend(const QByteArray &data, const QString &contentType); void parseBackendTSV(const QByteArray &data); + void parseBackendXMLCustom(const QByteArray &data); void parseBackendXML(const QByteArray &data); void postMessage(const QString &message); @@ -161,7 +162,6 @@ public slots: void unregisterForEventNotification(QObject *receiver); signals: - void destroyed(QQBouchot *bouchot); void groupChanged(QQBouchot *bouchot, QString oldGroupName); void lastPostersUpdated(); void refreshStarted(); diff --git a/core/qqmessagetransformfilter.cpp b/core/qqmessagetransformfilter.cpp index c319ab3..7932922 100644 --- a/core/qqmessagetransformfilter.cpp +++ b/core/qqmessagetransformfilter.cpp @@ -1,5 +1,4 @@ #include "qqmessagetransformfilter.h" QQMessageTransformFilter::QQMessageTransformFilter() -{ -} += default; diff --git a/core/qqmussel.cpp b/core/qqmussel.cpp index ec6566e..463956d 100644 --- a/core/qqmussel.cpp +++ b/core/qqmussel.cpp @@ -3,8 +3,9 @@ #include "core/qqbouchot.h" #include +#include -#define SEP_CHAR '@' +const char SEP_CHAR = '@'; ////////////////////////////////////////////////////////////// /// \brief QQMussel::QQMussel @@ -13,11 +14,11 @@ /// \param isAuth /// QQMussel::QQMussel(QString name, QString board, bool isAuth) : - m_name(name), - m_board(board), - m_isAuth(isAuth), - m_isBaked(false), - m_isPlopified(false) + m_name(std::move(name)), + m_board(std::move(board)), + m_isAuth(isAuth), + m_isBaked(false), + m_isPlopified(false) { } @@ -30,8 +31,8 @@ bool QQMussel::isMe() const QQBouchot *b = QQBouchot::bouchot(m_board); if(m_isAuth) return b->settings().login() == m_name; - else - return (b->settings().login().size() == 0 && b->settings().ua() == m_name); + + return (b->settings().login().size() == 0 && b->settings().ua() == m_name); } ////////////////////////////////////////////////////////////// @@ -78,11 +79,11 @@ QString QQMussel::fullName() const /// \param mussel /// \return /// -bool QQMussel::equals(const QQMussel mussel) const +bool QQMussel::equals(const QQMussel& mussel) const { return (m_name == mussel.m_name) && - (m_board == mussel.m_board) && - (m_isAuth == mussel.m_isAuth); + (m_board == mussel.m_board) && + (m_isAuth == mussel.m_isAuth); } ////////////////////////////////////////////////////////////// @@ -93,6 +94,6 @@ uint QQMussel::hash() const { QString s(m_name); s.append("#").append(board()) - .append("#").append(m_isAuth ? "true" : "false"); + .append("#").append(m_isAuth ? "true" : "false"); return qHash(s); } diff --git a/core/qqmussel.h b/core/qqmussel.h index 491332a..d3ef89e 100644 --- a/core/qqmussel.h +++ b/core/qqmussel.h @@ -20,7 +20,7 @@ class QQMussel bool isPlopified() const { return m_isPlopified; } QString fullName() const; - bool equals(const QQMussel mussel) const; + bool equals(const QQMussel& mussel) const; bool operator== (const QQMussel mussel) const { return this->equals(mussel); } bool operator!= (const QQMussel mussel) const { return ! this->equals(mussel); } diff --git a/core/qqnetworkaccessor.cpp b/core/qqnetworkaccessor.cpp index 0187558..a192d0d 100644 --- a/core/qqnetworkaccessor.cpp +++ b/core/qqnetworkaccessor.cpp @@ -11,25 +11,25 @@ #include #include -#define NETWORK_REQUEST_TIMEOUT_MS 60000 +constexpr int NETWORK_REQUEST_TIMEOUT_MS = 60000; QQNetworkAccessor::QQNetworkAccessor(QObject *parent) : - QObject(parent) + QObject(parent) { m_qnam = new QNetworkAccessManager(this); - connect(m_qnam, SIGNAL(finished(QNetworkReply *)), - this, SLOT(requestFinishedSlot(QNetworkReply *))); + connect(m_qnam, SIGNAL(finished(QNetworkReply*)), + this, SLOT(requestFinishedSlot(QNetworkReply*))); - connect(m_qnam, SIGNAL(proxyAuthenticationRequired(QNetworkProxy, QAuthenticator *)), - this, SLOT(onProxyAuthenticationRequired(QNetworkProxy, QAuthenticator *))); + connect(m_qnam, SIGNAL(proxyAuthenticationRequired(QNetworkProxy,QAuthenticator*)), + this, SLOT(onProxyAuthenticationRequired(QNetworkProxy,QAuthenticator*))); } void QQNetworkAccessor::updateProxySettings() { QQSettings settings; - QString nMode = settings.value(SETTINGS_NETWORK_MODE, DEFAULT_NETWORK_MODE).toString(); + auto nMode = settings.value(SETTINGS_NETWORK_MODE, DEFAULT_NETWORK_MODE).toString(); if(! SETTINGS_NETWORK_MODES.contains(nMode)) { nMode = DEFAULT_NETWORK_MODE; @@ -50,9 +50,9 @@ void QQNetworkAccessor::updateProxySettings() } else //if(Mode == SETTINGS_NETWORK_MODE_MANUAL) { - QString host = settings.value(SETTINGS_NETWORK_PROXY_HOST, DEFAULT_NETWORK_PROXY_HOST).toString(); - quint16 port = settings.value(SETTINGS_NETWORK_PROXY_PORT, DEFAULT_NETWORK_PROXY_PORT).toUInt(); - bool isHttp = settings.value(SETTINGS_NETWORK_PROXY_IS_HTTP, DEFAULT_NETWORK_PROXY_IS_HTTP).toUInt(); + auto host = settings.value(SETTINGS_NETWORK_PROXY_HOST, DEFAULT_NETWORK_PROXY_HOST).toString(); + auto port = settings.value(SETTINGS_NETWORK_PROXY_PORT, DEFAULT_NETWORK_PROXY_PORT).toUInt(); + auto isHttp = settings.value(SETTINGS_NETWORK_PROXY_IS_HTTP, DEFAULT_NETWORK_PROXY_IS_HTTP).toBool(); p.setType(isHttp ? QNetworkProxy::HttpProxy : QNetworkProxy::Socks5Proxy); p.setHostName(host); @@ -125,21 +125,25 @@ int QQNetworkAccessor::name_to_month(QByteArray month_str) } // Parse : "Tue, 09 Apr 2013 11:22:22 +0200" -QDateTime QQNetworkAccessor::parseRC822(QString string) +QDateTime QQNetworkAccessor::parseRC822(const QString& string) { - int pos = string.indexOf(',') + 1; - QString minString = string.right(string.length() - pos); - QStringList fields = minString.split(" ", QString::SkipEmptyParts); + auto pos = string.indexOf(',') + 1; + auto minString = string.rightRef(string.length() - pos); +#if QT_VERSION >= QT_VERSION_CHECK(5, 15, 0) + auto fields = minString.string()->split(" ", Qt::SkipEmptyParts); +#else + auto fields = minString.string()->split(" ", QString::SkipEmptyParts); +#endif QDate date(fields[2].toInt(), name_to_month(fields[1].toLatin1()), fields[0].toInt()); - QTime time = QTime::fromString(fields[3], "hh:mm:ss"); + auto time = QTime::fromString(fields[3], "hh:mm:ss"); if(fields[4].startsWith('+')) { - QString offset = fields[4].right(4); + auto offset = fields[4].rightRef(4); time = time.addSecs(offset.left(2).toInt() * 3600 + offset.right(2).toInt() * 60); } else if(fields[4].startsWith('-')) { - QString offset = fields[4].right(4); + auto offset = fields[4].rightRef(4); time = time.addSecs(0 - (offset.left(2).toInt() * 3600 + offset.right(2).toInt() * 60)); } QDateTime datetime(date, time, Qt::UTC); @@ -148,10 +152,10 @@ QDateTime QQNetworkAccessor::parseRC822(QString string) QNetworkReply * QQNetworkAccessor::httpGet(const QNetworkRequest &request) { - QTimer *replyTimer = new QTimer(this); + auto replyTimer = new QTimer(this); replyTimer->setSingleShot(true); - QNetworkReply *reply = m_qnam->get(request); + auto reply = m_qnam->get(request); connect(replyTimer, SIGNAL(timeout()), this, SLOT(onRequestTimeout())); connect(reply, SIGNAL(finished()), replyTimer, SLOT(stop())); connect(reply, SIGNAL(downloadProgress(qint64,qint64)), replyTimer, SLOT(start())); @@ -191,8 +195,8 @@ QNetworkReply * QQNetworkAccessor::httpPut(const QNetworkRequest &request, QIODe */ void QQNetworkAccessor::clearCookiesForUrl(const QUrl &url) { - QNetworkCookieJar *cj = m_qnam->cookieJar(); - if(cj == NULL) + auto cj = m_qnam->cookieJar(); + if(cj == nullptr) return; foreach (QNetworkCookie c, cj->cookiesForUrl(url)) { @@ -200,6 +204,22 @@ void QQNetworkAccessor::clearCookiesForUrl(const QUrl &url) } } +/** + * @brief clearNetworkBackend + */ +void QQNetworkAccessor::clearNetworkBackend() +{ + m_qnam->deleteLater(); + + m_qnam = new QNetworkAccessManager(this); + + connect(m_qnam, SIGNAL(finished(QNetworkReply*)), + this, SLOT(requestFinishedSlot(QNetworkReply*))); + + connect(m_qnam, SIGNAL(proxyAuthenticationRequired(QNetworkProxy,QAuthenticator*)), + this, SLOT(onProxyAuthenticationRequired(QNetworkProxy,QAuthenticator*))); +} + /** * @brief QQNetworkAccessor::setCookieforUrl * @param cookieList @@ -208,8 +228,8 @@ void QQNetworkAccessor::clearCookiesForUrl(const QUrl &url) */ bool QQNetworkAccessor::setCookiesFromUrl(const QList &cookieList, const QUrl &url) { - QNetworkCookieJar *cj = m_qnam->cookieJar(); - if(cj == NULL) + auto cj = m_qnam->cookieJar(); + if(cj == nullptr) return false; return cj->setCookiesFromUrl(cookieList, url); @@ -226,7 +246,7 @@ void QQNetworkAccessor::onProxyAuthenticationRequired(const QNetworkProxy &proxy //Premier echec if(QQNetworkAccessor::m_proxyUser.size() != 0 && - authenticator->user() != QQNetworkAccessor::m_proxyUser) + authenticator->user() != QQNetworkAccessor::m_proxyUser) { authenticator->setUser(QQNetworkAccessor::m_proxyUser); authenticator->setPassword(QQNetworkAccessor::m_proxyPasswd); @@ -235,7 +255,7 @@ void QQNetworkAccessor::onProxyAuthenticationRequired(const QNetworkProxy &proxy { if(QQNetworkAccessor::m_proxyPopupMutex.tryLock()) { - QQProxyAuthDialog* proxyDialog = new QQProxyAuthDialog(); + auto proxyDialog = new QQProxyAuthDialog(); proxyDialog->setLogin(QQNetworkAccessor::m_proxyUser); proxyDialog->setPasswd(QQNetworkAccessor::m_proxyPasswd); if(proxyDialog->exec() == QDialog::Accepted) @@ -258,16 +278,17 @@ void QQNetworkAccessor::onProxyAuthenticationRequired(const QNetworkProxy &proxy void QQNetworkAccessor::onRemoveTimer(QObject *obj) { - QTimer *timer = m_replyTimers.take((QNetworkReply *) obj); - if(timer != NULL) - delete timer; + auto timer = m_replyTimers.take(static_cast(obj)); + + delete timer; } void QQNetworkAccessor::onRequestTimeout() { - foreach(QNetworkReply *reply, m_replyTimers.keys()) + auto replyTimersKeys = m_replyTimers.keys(); + for(auto reply : qAsConst(replyTimersKeys)) { - QTimer *timer = m_replyTimers.value(reply); + auto timer = m_replyTimers.value(reply); if(! timer->isActive()) { reply->abort(); diff --git a/core/qqnetworkaccessor.h b/core/qqnetworkaccessor.h index 40bfcb4..4712487 100644 --- a/core/qqnetworkaccessor.h +++ b/core/qqnetworkaccessor.h @@ -25,8 +25,8 @@ protected slots: virtual void requestFinishedSlot(QNetworkReply *reply) = 0; protected: - int name_to_month(QByteArray month_str); - QDateTime parseRC822(QString string); + static int name_to_month(QByteArray month_str); + static QDateTime parseRC822(const QString& string); protected: QNetworkReply *httpGet(const QNetworkRequest &request); @@ -39,12 +39,13 @@ protected slots: QIODevice *data); void clearCookiesForUrl(const QUrl &url); + void clearNetworkBackend(); bool setCookiesFromUrl(const QList &cookieList, const QUrl &url); void setNetCacheManager(QAbstractNetworkCache *networkCache) { m_qnam->setCache(networkCache); } protected slots: - void onProxyAuthenticationRequired(const QNetworkProxy &proxy, QAuthenticator *authenticator); + static void onProxyAuthenticationRequired(const QNetworkProxy &proxy, QAuthenticator *authenticator); void onRemoveTimer(QObject *obj); void onRequestTimeout(); diff --git a/core/qqnorloge.cpp b/core/qqnorloge.cpp index 1aad25b..aea2069 100644 --- a/core/qqnorloge.cpp +++ b/core/qqnorloge.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include "qqsettings.h" @@ -13,8 +14,8 @@ QQNorloge::QQNorloge() : } //m_date = QDateTime::fromString(dateh.left(14), QString::fromUtf8("yyyyMMddHHmmss(^i)?")); -QQNorloge::QQNorloge(QString bouchot, QString dateh) : - m_srcBouchot(bouchot), +QQNorloge::QQNorloge(QString bouchot, const QString& dateh) : + m_srcBouchot(std::move(bouchot)), m_dateYearPart(dateh.left(4)), m_dateMonthPart(dateh.mid(4, 2)), m_dateDayPart(dateh.mid(6, 2)), @@ -24,7 +25,11 @@ QQNorloge::QQNorloge(QString bouchot, QString dateh) : m_norlogeIndex(0), m_uniqueMinute(false) { - QStringList indexSpit = dateh.split("^", QString::SkipEmptyParts); +#if QT_VERSION >= QT_VERSION_CHECK(5, 15, 0) + auto indexSpit = dateh.split("^", Qt::SkipEmptyParts); +#else + auto indexSpit = dateh.split("^", QString::SkipEmptyParts); +#endif if(indexSpit.size() > 1) m_norlogeIndex = indexSpit[1].toInt(); } @@ -40,29 +45,30 @@ QQNorloge::QQNorloge(const QQNorloge& norloge) : m_norlogeIndex(norloge.m_norlogeIndex), m_uniqueMinute(norloge.m_uniqueMinute) { + } -QStringList QQNorloge::matchingNRefsId() const +auto QQNorloge::matchingNRefsId() const -> QStringList { QStringList rep; - QString baseHmStr = QString(m_dateHourPart).append("h").append(m_dateMinutePart).append("m"); + auto baseHmStr = QString(m_dateHourPart).append("h").append(m_dateMinutePart).append("m"); rep.append(baseHmStr); - QString baseHmsStr = QString(baseHmStr).append(m_dateSecondPart).append("s"); + auto baseHmsStr = QString(baseHmStr).append(m_dateSecondPart).append("s"); rep.append(baseHmsStr); - QString baseMDhmsStr = QString(m_dateMonthPart).append("M") + auto baseMDhmsStr = QString(m_dateMonthPart).append("M") .append(m_dateDayPart).append("D") .append(baseHmsStr); rep.append(baseMDhmsStr); - QString baseYMDhmsStr = QString(m_dateYearPart).append("Y") + auto baseYMDhmsStr = QString(m_dateYearPart).append("Y") .append(baseMDhmsStr); rep.append(baseYMDhmsStr); if(m_norlogeIndex > 0) { - QString norlogeIndexStr = QString::number(m_norlogeIndex); + auto norlogeIndexStr = QString::number(m_norlogeIndex); rep.append(baseHmsStr + QString(norlogeIndexStr).append("i")); rep.append(baseMDhmsStr + QString(norlogeIndexStr).append("i")); rep.append(baseYMDhmsStr + QString(norlogeIndexStr).append("i")); @@ -76,9 +82,9 @@ QStringList QQNorloge::matchingNRefsId() const return rep; } -QString QQNorloge::toStringPalmi() +auto QQNorloge::toStringPalmi() -> QString { - QDateTime currDateT = QDateTime::currentDateTime(); + auto currDateT = QDateTime::currentDateTime(); QString rep; bool startPrint = false; @@ -105,27 +111,27 @@ QString QQNorloge::toStringPalmi() //Mais pas toujours les secondes QQSettings settings; - if (m_uniqueMinute == false || hasDate || - settings.value(SETTINGS_PALMI_SHORT_NORLOGE_ENABLED, DEFAULT_PALMI_SHORT_NORLOGE_ENABLED).toBool() == false) + if (!m_uniqueMinute || hasDate || + !settings.value(SETTINGS_PALMI_SHORT_NORLOGE_ENABLED, DEFAULT_PALMI_SHORT_NORLOGE_ENABLED).toBool()) { rep.append(QString::fromUtf8(":")) .append(m_dateSecondPart); } switch (m_norlogeIndex) { - case 0: - break; - case 1: - rep.append(QString::fromUtf8("¹")); - break; - case 2: - rep.append(QString::fromUtf8("²")); - break; - case 3: - rep.append(QString::fromUtf8("³")); - break; - default: - rep.append(QString("^%1").arg(m_norlogeIndex)); + case 0: + break; + case 1: + rep.append(QString::fromUtf8("¹")); + break; + case 2: + rep.append(QString::fromUtf8("²")); + break; + case 3: + rep.append(QString::fromUtf8("³")); + break; + default: + rep.append(QString("^%1").arg(m_norlogeIndex)); } rep.append(QString::fromUtf8("@")).append(m_srcBouchot); diff --git a/core/qqnorloge.h b/core/qqnorloge.h index c51cf05..8072e15 100644 --- a/core/qqnorloge.h +++ b/core/qqnorloge.h @@ -9,7 +9,7 @@ class QQNorloge { public: QQNorloge(); - QQNorloge(QString bouchot, QString dateh); + QQNorloge(QString bouchot, const QString& dateh); QQNorloge(const QQNorloge& norloge); QStringList matchingNRefsId() const; diff --git a/core/qqnorlogeref.h b/core/qqnorlogeref.h index 3125183..f7a3f37 100644 --- a/core/qqnorlogeref.h +++ b/core/qqnorlogeref.h @@ -75,7 +75,7 @@ class QQNorlogeRef : public QQNorloge QString m_dstBouchot; QString m_origNRef; - int m_posInMessage; + int m_posInMessage{}; QList< QPointer > m_listPostTarget; diff --git a/core/qqpost.cpp b/core/qqpost.cpp index 64ecd66..dff3959 100644 --- a/core/qqpost.cpp +++ b/core/qqpost.cpp @@ -49,7 +49,7 @@ QQPost::QQPost(const QQPost& post) : /// \return /// QQBouchot * QQPost::bouchot() const { - return static_cast(parent()); + return dynamic_cast(parent()); } // @@ -127,9 +127,9 @@ QString QQPost::norlogeFormatee() const { QString tmp(""); tmp.append("[") - .append(m_norloge.mid(8,2)).append(":") - .append(m_norloge.mid(10,2)).append(":") - .append(m_norloge.mid(12,2)).append("]"); + .append(m_norloge.midRef(8,2)).append(":") + .append(m_norloge.midRef(10,2)).append(":") + .append(m_norloge.midRef(12,2)).append("]"); return tmp; } diff --git a/core/qqpost.h b/core/qqpost.h index 005a5a4..435f850 100644 --- a/core/qqpost.h +++ b/core/qqpost.h @@ -98,15 +98,15 @@ Q_OBJECT enum IsSelfPost { False = 0, True = 1, Unknown = 2 }; QString m_norloge; - bool m_isNorlogeMultiple; - bool m_isAloneInMinute; - int m_norlogeIndex; + bool m_isNorlogeMultiple{}; + bool m_isAloneInMinute{}; + int m_norlogeIndex{}; QString m_login; QString m_ua; IsSelfPost m_isSelfPost; - bool m_unread; + bool m_unread{}; QString m_message; QString m_id; diff --git a/core/qqsettings.cpp b/core/qqsettings.cpp index 490f8e3..b02f73f 100644 --- a/core/qqsettings.cpp +++ b/core/qqsettings.cpp @@ -9,10 +9,10 @@ #include #include -#define DEFAULT_TOTOZ_MODE QQSettings::Bald_Mode +//constexpr int DEFAULT_TOTOZ_MODE = QQSettings::Bald_Mode; QQSettings::QQSettings(QObject * parent) : - QSettings(parent) + QSettings(parent) { fillStaticPalmiShortcuts(); if(! contains(SETTINGS_PALMI_SHORCUTS)) @@ -21,9 +21,7 @@ QQSettings::QQSettings(QObject * parent) : m_userPalmiShortcuts = savedUserPalmiShortcuts(); } -QQSettings::~QQSettings() -{ -} +QQSettings::~QQSettings() = default; void QQSettings::removeBouchot(const QString &name) { @@ -56,7 +54,7 @@ QStringList QQSettings::listTotozSrvPresets() return dir.entryList(); } -QQTotozSrvPreset QQSettings::getTotozSrvPreset(QString totozSrvPreset, bool labelOnly) +QQTotozSrvPreset QQSettings::getTotozSrvPreset(const QString& totozSrvPreset, bool labelOnly) { QFile file(QString::fromLatin1(SETTINGS_TOTOZ_PRESETS_PATH) + "/" + totozSrvPreset); QQTotozSrvPreset preset; @@ -106,7 +104,11 @@ QList QQSettings::listEmojis() while (!file.atEnd()) { QString line = QString::fromUtf8(file.readLine()).trimmed(); +#if QT_VERSION >= QT_VERSION_CHECK(5, 15, 0) + QStringList fields = line.split("\t", Qt::SkipEmptyParts); +#else QStringList fields = line.split("\t", QString::SkipEmptyParts); +#endif if(fields.length() == 3) { @@ -172,7 +174,7 @@ QQBouchot * QQSettings::loadBouchot(const QString &name) // Pas d'url de backend , pas de bouchot if(! contains(SETTINGS_BOUCHOT_BACKENDURL)) - return NULL; + return nullptr; newBouchotSettings.setColorFromString(value(SETTINGS_BOUCHOT_COLOR, "").toString()); newBouchotSettings.setAliasesFromString(value(SETTINGS_BOUCHOT_ALIASES, "").toString()); @@ -191,7 +193,7 @@ QQBouchot * QQSettings::loadBouchot(const QString &name) endGroup(); //beginGroup(QString::fromLatin1("bouchot")); - QQBouchot *newBouchot = new QQBouchot(name, NULL); + auto newBouchot = new QQBouchot(name, nullptr); newBouchot->setSettings(newBouchotSettings); return newBouchot; @@ -200,8 +202,13 @@ QQBouchot * QQSettings::loadBouchot(const QString &name) QStringList QQSettings::listBouchots() { QString bouchots = value(SETTINGS_LIST_BOUCHOTS, "").toString(); +#if QT_VERSION >= QT_VERSION_CHECK(5, 15, 0) + return bouchots.split(QChar::fromLatin1(BOUCHOTS_SPLIT_CHAR), + Qt::SkipEmptyParts); +#else return bouchots.split(QChar::fromLatin1(BOUCHOTS_SPLIT_CHAR), - QString::SkipEmptyParts); + QString::SkipEmptyParts); +#endif } ////////////////////////////////////////////////////////////// @@ -223,17 +230,15 @@ bool QQSettings::setValueWithDefault(const QString &key, const QVariant &newValu return (oldValue != newValue); } -void QQSettings::setUserPalmiShorcuts(QList< QPair > userPalmiShortcuts) +void QQSettings::setUserPalmiShorcuts(const QList< QPair >& userPalmiShortcuts) { m_userPalmiShortcuts = userPalmiShortcuts; if(userPalmiShortcuts != defaultUserPalmiShortcuts()) { QStringList listShortcuts; - for(int i = 0; i < m_userPalmiShortcuts.size(); i++) - { - QPair shortcut = m_userPalmiShortcuts.at(i); + for(const auto &shortcut : qAsConst(m_userPalmiShortcuts)) listShortcuts.append(QString(shortcut.first).append(shortcut.second)); - } + setValue(SETTINGS_PALMI_SHORCUTS, listShortcuts); } else @@ -251,7 +256,7 @@ void QQSettings::fillStaticPalmiShortcuts() m_staticPalmiShortcuts.append(qMakePair(QChar('u'), QString("%s"))); } -QList< QPair > QQSettings::defaultUserPalmiShortcuts() const +QList< QPair > QQSettings::defaultUserPalmiShortcuts() { QList< QPair > shortcuts; shortcuts.append(qMakePair(QChar('j'), QString("\\o/"))); diff --git a/core/qqsettings.h b/core/qqsettings.h index be1ab6f..eebf851 100644 --- a/core/qqsettings.h +++ b/core/qqsettings.h @@ -50,23 +50,23 @@ class QQSettings : public QSettings QQBouchot * loadBouchot(const QString &name); void removeBouchot(const QString &name); - QStringList listTotozSrvPresets(); - QQTotozSrvPreset getTotozSrvPreset(QString totozSrvPreset, bool labelOnly = false); + static QStringList listTotozSrvPresets(); + static QQTotozSrvPreset getTotozSrvPreset(const QString& totozSrvPreset, bool labelOnly = false); - QList listEmojis(); + static QList listEmojis(); QStringList listBouchots(); QList< QPair > palmiShorcuts() const { return m_staticPalmiShortcuts + m_userPalmiShortcuts; } QList< QPair > staticPalmiShorcuts() const { return m_staticPalmiShortcuts; } - void setUserPalmiShorcuts(QList< QPair > userPalmiShortcuts); + void setUserPalmiShorcuts(const QList< QPair >& userPalmiShortcuts); QList< QPair > userPalmiShorcuts() const { return m_userPalmiShortcuts; } bool setValueWithDefault(const QString &key, const QVariant &newValue, const QVariant &defaultValue); private: void fillStaticPalmiShortcuts(); - QList< QPair > defaultUserPalmiShortcuts() const; + static QList< QPair > defaultUserPalmiShortcuts() ; QList< QPair > savedUserPalmiShortcuts() const; QList< QPair > m_staticPalmiShortcuts; diff --git a/core/qqsimplepostdisplayfilter.cpp b/core/qqsimplepostdisplayfilter.cpp index b1c8586..97b04a1 100644 --- a/core/qqsimplepostdisplayfilter.cpp +++ b/core/qqsimplepostdisplayfilter.cpp @@ -8,8 +8,7 @@ /// \brief QQSimplePostDisplayFilter::QQSimplePostDisplayFilter /// QQSimplePostDisplayFilter::QQSimplePostDisplayFilter() -{ -} += default; ////////////////////////////////////////////////////////////// /// \brief QQSimplePostDisplayFilter::filter @@ -44,18 +43,16 @@ bool QQSimplePostDisplayFilter::Rule::validate(QQPost *post) QString postValue = getPostValue(post); switch(type) { - case EQUALS: - return postValue == value; - case CONTAINS: - return postValue.contains(value); - case MATCHES: - { - QRegExp reg(value); - if(reg.isValid()) - return postValue.contains(reg); - else - return false; - } + case EQUALS: + return postValue == value; + case CONTAINS: + return postValue.contains(value); + case MATCHES: + { + QRegExp reg(value); + if(reg.isValid()) + return postValue.contains(reg); + } } return false; } diff --git a/core/qqtotoz.cpp b/core/qqtotoz.cpp index 8b8a28b..3ff45ef 100644 --- a/core/qqtotoz.cpp +++ b/core/qqtotoz.cpp @@ -6,7 +6,7 @@ #include #include -QQTotoz::QQTotoz() {} +QQTotoz::QQTotoz() = default; QQTotoz::QQTotoz(const QString & totozId) { @@ -32,7 +32,7 @@ QQTotoz::~QQTotoz() bool QQTotoz::cacheExists() { QFile file(QQTotoz::getPath(m_id)); - if(!file.exists(QQTotoz::getPath(m_id))) + if(!QFile::exists(QQTotoz::getPath(m_id))) return false; //Invalidation systematique au bout de 60j @@ -63,7 +63,7 @@ bool QQTotoz::isCacheExpired() return cacheExpired; } -QString QQTotoz::getPath(QString id) +QString QQTotoz::getPath(const QString& id) { #if(QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)) QDir dirCache(QStandardPaths::writableLocation(QStandardPaths::CacheLocation)); diff --git a/core/qqtotoz.h b/core/qqtotoz.h index 0882bd0..3fe3b90 100644 --- a/core/qqtotoz.h +++ b/core/qqtotoz.h @@ -46,17 +46,17 @@ public slots: private: void load(); - static QString getPath(QString id); + static QString getPath(const QString& id); QString m_id; QByteArray m_totozData; QByteArray m_totozDataContentType; QStringList m_tags; - bool m_isNSFW; + bool m_isNSFW{}; QDateTime m_cacheExpireDate; - bool m_wasmodfied; + bool m_wasmodfied{}; }; #endif // QQTOTOZ_H diff --git a/core/qqtotozdownloader.cpp b/core/qqtotozdownloader.cpp index 8769f6a..5300fbf 100644 --- a/core/qqtotozdownloader.cpp +++ b/core/qqtotozdownloader.cpp @@ -10,6 +10,8 @@ #include #include +constexpr qint64 ONE_MN_IN_S = 60; + void QQTotozDownloader::fetchTotoz(QString & totozId) { if(totozId.length() == 0) @@ -24,13 +26,11 @@ void QQTotozDownloader::fetchTotoz(QString & totozId) queryUrl.append("/") .append(settings.value(SETTINGS_TOTOZ_SERVER_BASE_IMG, DEFAULT_TOTOZ_SERVER_BASE_IMG).toString()) .append("/") - .append(totozId) + .append(QUrl::toPercentEncoding(totozId)) .append(totozIdSuffix); QUrl url(queryUrl); QNetworkRequest request(url); - request.setAttribute(QNetworkRequest::CacheLoadControlAttribute, - QNetworkRequest::PreferCache); QNetworkReply * reply = httpGet(request); m_totozIdReplyHash.insert(reply, totozId); @@ -49,10 +49,10 @@ void QQTotozDownloader::requestFinishedSlot(QNetworkReply * reply) if(!redirectedURL.isEmpty() && redirectedURL != reply->url()) { + if(redirectedURL.host().isEmpty()) // Relative redirection + redirectedURL=reply->request().url().resolved(redirectedURL); qDebug() << Q_FUNC_INFO << "Redirected to " << redirectedURL.toString(); QNetworkRequest request(redirectedURL); - request.setAttribute(QNetworkRequest::CacheLoadControlAttribute, - QNetworkRequest::PreferCache); QNetworkReply * reply = httpGet(request); m_totozIdReplyHash.insert(reply, totozId); @@ -65,7 +65,7 @@ void QQTotozDownloader::requestFinishedSlot(QNetworkReply * reply) QQTotoz totoz(totozId); totoz.setData(errString.toUtf8()); totoz.setDataContentType("Text/Plain"); - totoz.setCacheExpireDate(QDateTime::currentDateTime().addSecs(60)); + totoz.setCacheExpireDate(QDateTime::currentDateTime().addSecs(ONE_MN_IN_S)); totoz.save(); emit fetchTotozFinished(totozId, false, errString); diff --git a/core/qqwebdownloader.cpp b/core/qqwebdownloader.cpp index 7fce5db..a3e1e6e 100644 --- a/core/qqwebdownloader.cpp +++ b/core/qqwebdownloader.cpp @@ -5,19 +5,17 @@ #include #include -#define INITIAL_URL_PROPERTY "INITIAL_URL" +constexpr char INITIAL_URL_PROPERTY[] = "INITIAL_URL"; +constexpr unsigned long MAX_CACHE_SIZE_MB = 100; +constexpr unsigned long MEGABYTE = 1024 * 1024; ////////////////////////////////////////////////////////////// QQWebDownloader::QQWebDownloader(QObject *parent) : - QQNetworkAccessor(parent) + QQNetworkAccessor(parent) { - QNetworkDiskCache *diskCache = new QNetworkDiskCache(this); - diskCache->setMaximumCacheSize(100 * 1024 * 1024); // 100 Mo -#if(QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)) + auto *diskCache = new QNetworkDiskCache(this); + diskCache->setMaximumCacheSize(MAX_CACHE_SIZE_MB * MEGABYTE); // 100 Mo QDir dirCache(QStandardPaths::writableLocation(QStandardPaths::CacheLocation)); -#else - QDir dirCache(QDesktopServices::storageLocation(QDesktopServices::CacheLocation)); -#endif diskCache->setCacheDirectory(dirCache.absoluteFilePath("networkCache")); setNetCacheManager(diskCache); } @@ -34,7 +32,7 @@ void QQWebDownloader::getURL(const QUrl &url) QNetworkRequest request(url); request.setAttribute(QNetworkRequest::CacheLoadControlAttribute, - QNetworkRequest::PreferCache); + QNetworkRequest::PreferCache); httpGet(request); } else @@ -53,9 +51,12 @@ void QQWebDownloader::requestFinishedSlot(QNetworkReply *reply) QUrl redirectedURL = reply->attribute(QNetworkRequest::RedirectionTargetAttribute).toUrl(); if(!redirectedURL.isEmpty() && - redirectedURL != reply->url() && - ! m_listPendingUrl.contains(redirectedURL)) + redirectedURL != reply->url() && + ! m_listPendingUrl.contains(redirectedURL)) { + if(redirectedURL.host().isEmpty()) // Relative redirection + redirectedURL=reply->request().url().resolved(redirectedURL); + QNetworkRequest rq(redirectedURL); QNetworkReply *newReply = httpGet(rq); diff --git a/core/qutetools.cpp b/core/qutetools.cpp index dcea119..c10c318 100644 --- a/core/qutetools.cpp +++ b/core/qutetools.cpp @@ -1,10 +1,12 @@ #include "qutetools.h" #include +#if QT_VERSION >= QT_VERSION_CHECK(5, 10, 0) +#include +#endif QuteTools::QuteTools() -{ -} += default; ////////////////////////////////////////////////////////////// /// \brief checkFocusRecurse @@ -20,7 +22,7 @@ bool QuteTools::checkFocusRecurse(QWidget *parent) { if(child->isWidgetType()) { - focus = QuteTools::checkFocusRecurse(static_cast(child)); + focus = QuteTools::checkFocusRecurse(dynamic_cast(child)); if(focus) break; } @@ -37,7 +39,11 @@ bool QuteTools::checkFocusRecurse(QWidget *parent) /// int QuteTools::randInt(int low, int high) { +#if QT_VERSION >= QT_VERSION_CHECK(5, 10, 0) + return QRandomGenerator::global()->bounded(low, high); +#else return qrand() % ((high + 1) - low) + low; +#endif } ////////////////////////////////////////////////////////////// diff --git a/core/totozmanager/qqtmrequester.cpp b/core/totozmanager/qqtmrequester.cpp index 7ed51bd..75ca864 100644 --- a/core/totozmanager/qqtmrequester.cpp +++ b/core/totozmanager/qqtmrequester.cpp @@ -12,7 +12,7 @@ QQTMRequester::QQTMRequester(QObject * parent) : QQNetworkAccessor(parent) { m_currKey.clear(); - m_netReply = NULL; + m_netReply = nullptr; m_xmlParser = new QQTMXmlParser(this); connect(m_xmlParser, SIGNAL(finished()), this, SLOT(parsingFinished())); @@ -20,7 +20,7 @@ QQTMRequester::QQTMRequester(QObject * parent) : QQTMRequester::~QQTMRequester() { - if(m_netReply != NULL) + if(m_netReply != nullptr) m_netReply->abort(); delete m_xmlParser; } @@ -45,7 +45,7 @@ void QQTMRequester::requestFinishedSlot(QNetworkReply * reply) emit requestFinished(); } - m_netReply = NULL; + m_netReply = nullptr; reply->deleteLater(); } @@ -59,7 +59,7 @@ void QQTMRequester::searchTotoz(const QString & key) void QQTMRequester::cancel() { - if(m_netReply != NULL) + if(m_netReply != nullptr) m_netReply->abort(); } diff --git a/main.cpp b/main.cpp index 202ef77..54e1c76 100644 --- a/main.cpp +++ b/main.cpp @@ -2,11 +2,7 @@ #include "core/qqsettingsparams.h" #include -#if(QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)) #include -#else -#include -#endif #include #include #include @@ -14,11 +10,9 @@ #undef QML_PALMI #ifdef QML_PALMI -#if(QT_VERSION >= QT_VERSION_CHECK(5, 3, 0)) #include "qml/documenthandler.h" #include #include -#endif #endif //QML_PALMI //#define QQ_ENABLE_QML true @@ -30,12 +24,13 @@ bool removeDirRecursive(const QString &dirName) if (dir.exists(dirName)) { - Q_FOREACH(QFileInfo info, dir.entryInfoList(QDir::NoDotAndDotDot | QDir::System | QDir::Hidden | QDir::AllDirs | QDir::Files, QDir::DirsFirst)) + auto entryInfoList = dir.entryInfoList(QDir::NoDotAndDotDot | QDir::System | QDir::Hidden | QDir::AllDirs | QDir::Files, QDir::DirsFirst); + for(auto fi = entryInfoList.begin(); fi != entryInfoList.end(); ++fi) { - if (info.isDir()) - result = removeDirRecursive(info.absoluteFilePath()); + if ((*fi).isDir()) + result = removeDirRecursive((*fi).absoluteFilePath()); else - result = QFile::remove(info.absoluteFilePath()); + result = QFile::remove((*fi).absoluteFilePath()); if (!result) return result; @@ -48,17 +43,13 @@ bool removeDirRecursive(const QString &dirName) void purgeCache() { -#if(QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)) QDir dirCache(QStandardPaths::writableLocation(QStandardPaths::CacheLocation)); -#else - QDir dirCache(QDesktopServices::storageLocation(QDesktopServices::CacheLocation)); -#endif QDateTime now = QDateTime::currentDateTime(); QFileInfoList fileInfoList = dirCache.entryInfoList(); - for (int i = 0; i < fileInfoList.size(); ++i) + for (const auto &fi : fileInfoList) { - if(fileInfoList.at(i).lastModified().daysTo(now) > MAX_CACHE_AGE_DAYS) - QFile(fileInfoList.at(i).filePath()).remove(); + if(fi.lastModified().daysTo(now) > MAX_CACHE_AGE_DAYS) + QFile(fi.filePath()).remove(); } //Nettoyage du cache reseau au demarrage : QTBUG-34498 @@ -66,7 +57,6 @@ void purgeCache() } #ifdef QML_PALMI -#if(QT_VERSION >= QT_VERSION_CHECK(5, 3, 0)) void dumpRecurse(QQuickItem *rootItem) { foreach (QQuickItem *item, rootItem->childItems()) @@ -75,15 +65,14 @@ void dumpRecurse(QQuickItem *rootItem) dumpRecurse(item); } } -#endif //QT_VERSION #endif //QML_PALMI int main(int argc, char *argv[]) { QApplication a(argc, argv); - a.setOrganizationName("Moules Corp"); - a.setApplicationName(APP_NAME); - a.setApplicationVersion(GIT_VERSION); + QApplication::setOrganizationName("Moules Corp"); + QApplication::setApplicationName(APP_NAME); + QApplication::setApplicationVersion(GIT_VERSION); QSettings::setDefaultFormat(QSettings::IniFormat); purgeCache(); @@ -93,7 +82,6 @@ int main(int argc, char *argv[]) #ifdef ENABLE_QML #ifdef QT_DEBUG -#if(QT_VERSION >= QT_VERSION_CHECK(5, 3, 0)) qmlRegisterType("org.moules.quteqoin", 1, 0, "DocumentHandler"); QQmlApplicationEngine engine(QUrl("qrc:///qml/QQmlMain.qml")); QQuickWindow *qmlRoot = qobject_cast(engine.rootObjects().at(0)); @@ -112,9 +100,8 @@ int main(int argc, char *argv[]) qDebug() << Q_FUNC_INFO << "textArea found"; } */ -#endif //QT_VERSION #endif //QT_DEBUG #endif //QQ_ENABLE_QML - return a.exec(); + return QApplication::exec(); } diff --git a/mainwindow.cpp b/mainwindow.cpp index 194d126..e795034 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -29,7 +29,7 @@ #include #endif -#define MAINWINDOW_STATE_CACHE_FILE "QuteQoin_Window_State" +constexpr char MAINWINDOW_STATE_CACHE_FILE[] = "QuteQoin_Window_State"; MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), @@ -87,7 +87,7 @@ MainWindow::MainWindow(QWidget *parent) : actionBoardInfo->setShortcut(Qt::ControlModifier + Qt::Key_I); // Setup du bouton d'options - QQCmdToolButtons *cmdToolsBtn = new QQCmdToolButtons(this); + auto *cmdToolsBtn = new QQCmdToolButtons(this); cmdToolsBtn->addAction(actionBoardInfo); cmdToolsBtn->addAction(m_actionDockPalmi); cmdToolsBtn->addAction(actionTotozManager); @@ -95,8 +95,8 @@ MainWindow::MainWindow(QWidget *parent) : connect(cmdToolsBtn, &QQCmdToolButtons::showOptions, this, &MainWindow::displayOptions); // Setup du pini - QWidget *centralWidget = new QWidget(this); - QLayout *layout = new QVBoxLayout(); + auto *centralWidget = new QWidget(this); + auto *layout = new QVBoxLayout(); layout->setContentsMargins(1, 1, 1, 1); layout->setSpacing(1); @@ -120,7 +120,7 @@ MainWindow::MainWindow(QWidget *parent) : setCentralWidget(centralWidget); // Action complementaire - QAction *actionSearch = new QAction(tr("Search pini"), this); + auto *actionSearch = new QAction(tr("Search pini"), this); actionSearch->setShortcut(Qt::ControlModifier + Qt::Key_F); actionSearch->setCheckable(true); connect(actionSearch, &QAction::triggered, m_pSearchW, &QQPiniSearchWidget::setVisible); @@ -161,14 +161,16 @@ MainWindow::MainWindow(QWidget *parent) : if(settings.value(SETTINGS_GENERAL_STEALTH_MODE, DEFAULT_GENERAL_STEALTH_MODE).toBool() && QSystemTrayIcon::isSystemTrayAvailable()) { - QMenu *m = new QMenu(this); - QAction *quit = m->addAction(tr("&Quit")); + auto menu = new QMenu(this); + QAction *show = menu->addAction(tr("&Show")); + connect(show, &QAction::triggered, this, &MainWindow::show); + QAction *quit = menu->addAction(tr("&Quit")); connect(quit, &QAction::triggered, qApp, &QApplication::quit); m_trayIcon = new QSystemTrayIcon(QIcon(":/img/rubber_duck_yellow.svg"), this); connect(m_trayIcon, &QSystemTrayIcon::activated, this, &MainWindow::onTrayIconActivated); - m_trayIcon->setContextMenu(m); + m_trayIcon->setContextMenu(menu); m_trayIcon->show(); } @@ -180,15 +182,14 @@ MainWindow::MainWindow(QWidget *parent) : MainWindow::~MainWindow() { - for(QQBouchot *b: QQBouchot::listBouchots()) - disconnect(b, &QQBouchot::destroyed, nullptr, nullptr); delete m_ui; } void MainWindow::displayOptions() { - for(QQBouchot *b: QQBouchot::listBouchots()) - b->stopRefresh(); + auto listBouchots = QQBouchot::listBouchots(); + for(auto i = listBouchots.begin(); i != listBouchots.end(); ++i) + (*i)->stopRefresh(); QQSettingsManager settingsManager(this); connect(&settingsManager, &QQSettingsManager::bouchotCreated, this, &MainWindow::initBouchot); @@ -198,8 +199,9 @@ void MainWindow::displayOptions() connect(&settingsManager, &QQSettingsManager::totozSearchEnabledChanged, m_totozManager, &QQTotozManager::totozSearchEnabled); settingsManager.exec(); - for(QQBouchot *b: QQBouchot::listBouchots()) - b->startRefresh(); + listBouchots = QQBouchot::listBouchots(); + for(auto i = listBouchots.begin(); i != listBouchots.end(); ++i) + (*i)->startRefresh(); } void MainWindow::doPostMessage(const QString &bouchot, const QString &message) @@ -267,7 +269,7 @@ void MainWindow::changeEvent(QEvent *event) if((event->type() == QEvent::WindowStateChange) && (m_trayIcon != nullptr)) { - if (isMinimized() == true) + if (isMinimized()) hide(); } @@ -302,12 +304,11 @@ void MainWindow::keyPressEvent(QKeyEvent *event) { case Qt::Key_F5: { - QList bouchots = QQBouchot::listBouchots(); - for(int i = 0; i < bouchots.size(); i++) + auto listBouchots = QQBouchot::listBouchots(); + for(auto i = listBouchots.begin(); i != listBouchots.end(); ++i) { - QQBouchot *bouchot = bouchots.at(i); - bouchot->stopRefresh(); - bouchot->startRefresh(); + (*i)->stopRefresh(); + (*i)->startRefresh(); } break; } @@ -323,8 +324,13 @@ void MainWindow::keyPressEvent(QKeyEvent *event) QMainWindow::keyPressEvent(event); } -void MainWindow::bouchotDestroyed(QQBouchot *bouchot) +void MainWindow::bouchotDestroyed(QObject *bouchotObject) { + QQBouchot *bouchot = qobject_cast(bouchotObject); + + if(bouchot == nullptr) + return; + QString name = bouchot->name(); QString group = bouchot->settings().group(); @@ -335,7 +341,7 @@ void MainWindow::bouchotDestroyed(QQBouchot *bouchot) m_palmi->removeBouchot(bouchot->name()); #endif - QQBouchot::listBouchotsGroup(group).size() == 0 ? + QQBouchot::listBouchotsGroup(group).isEmpty() ? m_pini->removePiniTab(group) : m_pini->purgePiniTab(group, name); @@ -343,13 +349,12 @@ void MainWindow::bouchotDestroyed(QQBouchot *bouchot) } -void MainWindow::bouchotGroupChanged(QQBouchot *bouchot, QString oldGroupName) +void MainWindow::bouchotGroupChanged(QQBouchot *bouchot, const QString &oldGroupName) { QString name = bouchot->name(); - QString group = bouchot->settings().group(); QList bouchots = QQBouchot::listBouchotsGroup(oldGroupName); - (bouchots.size() == 0) ? + (bouchots.isEmpty()) ? m_pini->removePiniTab(oldGroupName) : m_pini->purgePiniTab(oldGroupName, name); @@ -359,8 +364,9 @@ void MainWindow::bouchotGroupChanged(QQBouchot *bouchot, QString oldGroupName) void MainWindow::doFullRepaint() { - for(QString group: QQBouchot::listGroups()) - m_pini->repaintPiniTab(group); + auto listGroups = QQBouchot::listGroups(); + for(auto i = listGroups.begin(); i < listGroups.end(); ++i) + m_pini->repaintPiniTab(*i); } void MainWindow::doNetworkSettingsChanged() @@ -386,7 +392,7 @@ void MainWindow::initBouchot(QQBouchot *bouchot) m_palmi->addBouchot(bouchot->name(), bouchot->settings().colorLight()); #endif - connect(bouchot, &QQBouchot::destroyed, this, &MainWindow::bouchotDestroyed); + connect(bouchot, &QObject::destroyed, this, &MainWindow::bouchotDestroyed); connect(bouchot, &QQBouchot::groupChanged, this, &MainWindow::bouchotGroupChanged); connect(bouchot, &QQBouchot::visibilitychanged, m_pini, &QQPinipede::bouchotVisibilityChanged); @@ -409,9 +415,10 @@ void MainWindow::initBouchots() { QQSettings settings; - for(QString name: settings.listBouchots()) + auto listBouchots = settings.listBouchots(); + for(auto i = listBouchots.begin(); i != listBouchots.end(); ++i) { - QQBouchot *bouchot = settings.loadBouchot(name); + QQBouchot *bouchot = settings.loadBouchot(*i); if(bouchot == nullptr) continue; diff --git a/mainwindow.h b/mainwindow.h index 8f7c49c..ada4d16 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -18,7 +18,7 @@ class QQuickWidget; #endif namespace Ui { - class MainWindow; + class MainWindow; } class MainWindow : public QMainWindow @@ -33,7 +33,7 @@ class MainWindow : public QMainWindow public slots: void displayOptions(); - void doPostMessage(const QString &bouchot, const QString &message); + static void doPostMessage(const QString &bouchot, const QString &message); void doPalmiStatusChanged(bool isPalmiMini, bool isPalmiDocked); void doPalmiVisibilityChanged(bool isVisible); @@ -43,10 +43,10 @@ public slots: virtual void keyPressEvent(QKeyEvent *event); protected slots: - void bouchotDestroyed(QQBouchot *bouchot); - void bouchotGroupChanged(QQBouchot *bouchot, QString oldGroupName); + void bouchotDestroyed(QObject *bouchotObject); + void bouchotGroupChanged(QQBouchot *bouchot, const QString &oldGroupName); void doFullRepaint(); - void doNetworkSettingsChanged(); + static void doNetworkSettingsChanged(); void initBouchot(QQBouchot *bouchot); void onTrayIconActivated(QSystemTrayIcon::ActivationReason reason); diff --git a/quteqoin.pro b/quteqoin.pro index 9bcaa5e..21b04a2 100644 --- a/quteqoin.pro +++ b/quteqoin.pro @@ -21,8 +21,8 @@ include($$PWD/gitversion.pri) # A Tester linux-g++ { - QMAKE_CXXFLAGS_DEBUG += -fsanitize=address -Og - QMAKE_LFLAGS_DEBUG += -fsanitize=address + QMAKE_CXXFLAGS_DEBUG += -fsanitize=address -O0 + QMAKE_LFLAGS_DEBUG += -fsanitize=address } QMAKE_CXXFLAGS_RELEASE += -O2 @@ -32,157 +32,159 @@ TEMPLATE = app SOURCES += main.cpp\ mainwindow.cpp \ - core/qqbouchot.cpp \ - core/qqpost.cpp \ - core/qqsettings.cpp \ - core/qqboardstatechangeevent.cpp \ - core/qqnorloge.cpp \ - core/qqwebdownloader.cpp \ - core/qqbakdisplayfilter.cpp \ - core/qqnorlogeref.cpp \ - core/qqtotoz.cpp \ - core/qqtotozdownloader.cpp \ - core/qqnetworkaccessor.cpp \ - core/qqmussel.cpp \ - core/qutetools.cpp \ - core/qqsimplepostdisplayfilter.cpp \ - core/qqbackendupdatedevent.cpp \ - core/qqmessagetransformfilter.cpp \ - core/qqpurgebouchothistoevent.cpp \ - core/qqbigornoitem.cpp \ - core/totozmanager/qqtmrequester.cpp \ - core/parsers/qqbackendparser.cpp \ - core/parsers/qqtsvparser.cpp \ - core/parsers/qqxmlparser.cpp \ - ui/qqmessageblockuserdata.cpp \ - ui/qqproxyauthdialog.cpp \ - ui/qqtotozmanager.cpp \ - ui/qqtotozviewer.cpp \ - ui/qqsettingsmanager.cpp \ - ui/qqpinisearchwidget.cpp \ - ui/qqboardsinfo.cpp \ - ui/qqboardinfo.cpp \ - ui/qqmusselinfo.cpp \ - ui/qqcmdtoolbuttons.cpp \ - ui/qqimageviewer.cpp \ - ui/boardinfo/qqboardinfoprogressbar.cpp \ - ui/qqpalmipede.cpp \ - ui/palmipede/qqpalmifileposter.cpp \ - ui/palmipede/qqpalmilineedit.cpp \ - ui/palmipede/qqpalmilineeditint.cpp \ - ui/palmipede/qqdockpalmi.cpp \ - ui/qqpinipede.cpp \ - ui/pinipede/qqduckpixmapitem.cpp \ - ui/pinipede/qqhuntingview.cpp \ - ui/pinipede/qqhuntpixmapitem.cpp \ - ui/pinipede/qqpinioverlay.cpp \ - ui/pinipede/qqpiniurlhelper.cpp \ - ui/pinipede/qqpostparser.cpp \ - ui/pinipede/qqtextbrowser.cpp \ - ui/pinipede/qqwebimageviewer.cpp \ - ui/settingsmanager/qqboardssettings.cpp \ - ui/settingsmanager/qqbouchotsettingsdialog.cpp \ - ui/settingsmanager/qqboardwizard.cpp \ - ui/settingsmanager/qqboardwizardnative.cpp \ - ui/settingsmanager/qqfiltersettings.cpp \ - ui/settingsmanager/qqgeneralsettings.cpp \ - ui/settingsmanager/qqhuntsettings.cpp \ - ui/settingsmanager/qqnetworksettings.cpp \ - ui/settingsmanager/qqpalmisettings.cpp \ - ui/settingsmanager/qqpalmisettingstablewidget.cpp \ - ui/settingsmanager/qqtotozsettings.cpp \ - ui/totozmanager/qqtmxmlparser.cpp \ - ui/totozmanager/qqtotozmanagerheader.cpp + core/qqbouchot.cpp \ + core/qqpost.cpp \ + core/qqsettings.cpp \ + core/qqboardstatechangeevent.cpp \ + core/qqnorloge.cpp \ + core/qqwebdownloader.cpp \ + core/qqbakdisplayfilter.cpp \ + core/qqnorlogeref.cpp \ + core/qqtotoz.cpp \ + core/qqtotozdownloader.cpp \ + core/qqnetworkaccessor.cpp \ + core/qqmussel.cpp \ + core/qutetools.cpp \ + core/qqsimplepostdisplayfilter.cpp \ + core/qqbackendupdatedevent.cpp \ + core/qqmessagetransformfilter.cpp \ + core/qqpurgebouchothistoevent.cpp \ + core/qqbigornoitem.cpp \ + core/totozmanager/qqtmrequester.cpp \ + core/parsers/qqbackendparser.cpp \ + core/parsers/qqcustomxmlparser.cpp \ + core/parsers/qqtsvparser.cpp \ + core/parsers/qqxmlparser.cpp \ + ui/qqmessageblockuserdata.cpp \ + ui/qqproxyauthdialog.cpp \ + ui/qqtotozmanager.cpp \ + ui/qqtotozviewer.cpp \ + ui/qqsettingsmanager.cpp \ + ui/qqpinisearchwidget.cpp \ + ui/qqboardsinfo.cpp \ + ui/qqboardinfo.cpp \ + ui/qqmusselinfo.cpp \ + ui/qqcmdtoolbuttons.cpp \ + ui/qqimageviewer.cpp \ + ui/boardinfo/qqboardinfoprogressbar.cpp \ + ui/qqpalmipede.cpp \ + ui/palmipede/qqpalmifileposter.cpp \ + ui/palmipede/qqpalmilineedit.cpp \ + ui/palmipede/qqpalmilineeditint.cpp \ + ui/palmipede/qqdockpalmi.cpp \ + ui/qqpinipede.cpp \ + ui/pinipede/qqduckpixmapitem.cpp \ + ui/pinipede/qqhuntingview.cpp \ + ui/pinipede/qqhuntpixmapitem.cpp \ + ui/pinipede/qqpinioverlay.cpp \ + ui/pinipede/qqpiniurlhelper.cpp \ + ui/pinipede/qqpostparser.cpp \ + ui/pinipede/qqtextbrowser.cpp \ + ui/pinipede/qqwebimageviewer.cpp \ + ui/settingsmanager/qqboardssettings.cpp \ + ui/settingsmanager/qqbouchotsettingsdialog.cpp \ + ui/settingsmanager/qqboardwizard.cpp \ + ui/settingsmanager/qqboardwizardnative.cpp \ + ui/settingsmanager/qqfiltersettings.cpp \ + ui/settingsmanager/qqgeneralsettings.cpp \ + ui/settingsmanager/qqhuntsettings.cpp \ + ui/settingsmanager/qqnetworksettings.cpp \ + ui/settingsmanager/qqpalmisettings.cpp \ + ui/settingsmanager/qqpalmisettingstablewidget.cpp \ + ui/settingsmanager/qqtotozsettings.cpp \ + ui/totozmanager/qqtmxmlparser.cpp \ + ui/totozmanager/qqtotozmanagerheader.cpp HEADERS += mainwindow.h \ core/qqsettings.h \ - core/qqbouchot.h \ - core/qqpost.h \ - core/qqnorloge.h \ - core/qqnorlogeref.h \ - core/qqtotoz.h \ - core/qqtotozdownloader.h \ - core/qqpurgebouchothistoevent.h \ - core/qqbigornoitem.h \ - core/qqnetworkaccessor.h \ - core/qqsettingsparams.h \ - core/qqmessagetransformfilter.h \ - core/qqtypes.h \ - core/qqbackendupdatedevent.h \ - core/totozmanager/qqtmrequester.h \ - core/qqwebdownloader.h \ - core/qqbakdisplayfilter.h \ - core/qqboardstatechangeevent.h \ - core/qqmussel.h \ - core/qqpostdisplayfilter.h \ - core/qqsimplepostdisplayfilter.h \ - core/qutetools.h \ - core/parsers/qqbackendparser.h \ - core/parsers/qqtsvparser.h \ - core/parsers/qqxmlparser.h \ - ui/qqmessageblockuserdata.h \ - ui/qqproxyauthdialog.h \ - ui/qqtotozmanager.h \ - ui/qqtotozviewer.h \ - ui/qqsettingsmanager.h \ - ui/qqpinisearchwidget.h \ - ui/qqboardsinfo.h \ - ui/qqboardinfo.h \ - ui/qqmusselinfo.h \ - ui/qqcmdtoolbuttons.h \ - ui/qqimageviewer.h \ - ui/boardinfo/qqboardinfoprogressbar.h \ - ui/qqpalmipede.h \ - ui/palmipede/qqpalmifileposter.h \ - ui/palmipede/qqpalmilineedit.h \ - ui/palmipede/qqpalmilineeditint.h \ - ui/palmipede/qqdockpalmi.h \ - ui/qqpinipede.h \ - ui/pinipede/qqduckpixmapitem.h \ - ui/pinipede/qqhuntingview.h \ - ui/pinipede/qqhuntpixmapitem.h \ - ui/pinipede/qqpinioverlay.h \ - ui/pinipede/qqpiniurlhelper.h \ - ui/pinipede/qqpostparser.h \ - ui/pinipede/qqtextbrowser.h \ - ui/pinipede/qqwebimageviewer.h \ - ui/settingsmanager/qqboardssettings.h \ - ui/settingsmanager/qqbouchotsettingsdialog.h \ - ui/settingsmanager/qqboardwizard.h \ - ui/settingsmanager/qqboardwizardnative.h \ - ui/settingsmanager/qqfiltersettings.h \ - ui/settingsmanager/qqgeneralsettings.h \ - ui/settingsmanager/qqhuntsettings.h \ - ui/settingsmanager/qqnetworksettings.h \ - ui/settingsmanager/qqpalmisettings.h \ - ui/settingsmanager/qqpalmisettingstablewidget.h \ - ui/settingsmanager/qqtotozsettings.h \ - ui/totozmanager/qqtmxmlparser.h \ - ui/totozmanager/qqtotozmanagerheader.h + core/qqbouchot.h \ + core/qqpost.h \ + core/qqnorloge.h \ + core/qqnorlogeref.h \ + core/qqtotoz.h \ + core/qqtotozdownloader.h \ + core/qqpurgebouchothistoevent.h \ + core/qqbigornoitem.h \ + core/qqnetworkaccessor.h \ + core/qqsettingsparams.h \ + core/qqmessagetransformfilter.h \ + core/qqtypes.h \ + core/qqbackendupdatedevent.h \ + core/totozmanager/qqtmrequester.h \ + core/qqwebdownloader.h \ + core/qqbakdisplayfilter.h \ + core/qqboardstatechangeevent.h \ + core/qqmussel.h \ + core/qqpostdisplayfilter.h \ + core/qqsimplepostdisplayfilter.h \ + core/qutetools.h \ + core/parsers/qqbackendparser.h \ + core/parsers/qqcustomxmlparser.h \ + core/parsers/qqtsvparser.h \ + core/parsers/qqxmlparser.h \ + ui/qqmessageblockuserdata.h \ + ui/qqproxyauthdialog.h \ + ui/qqtotozmanager.h \ + ui/qqtotozviewer.h \ + ui/qqsettingsmanager.h \ + ui/qqpinisearchwidget.h \ + ui/qqboardsinfo.h \ + ui/qqboardinfo.h \ + ui/qqmusselinfo.h \ + ui/qqcmdtoolbuttons.h \ + ui/qqimageviewer.h \ + ui/boardinfo/qqboardinfoprogressbar.h \ + ui/qqpalmipede.h \ + ui/palmipede/qqpalmifileposter.h \ + ui/palmipede/qqpalmilineedit.h \ + ui/palmipede/qqpalmilineeditint.h \ + ui/palmipede/qqdockpalmi.h \ + ui/qqpinipede.h \ + ui/pinipede/qqduckpixmapitem.h \ + ui/pinipede/qqhuntingview.h \ + ui/pinipede/qqhuntpixmapitem.h \ + ui/pinipede/qqpinioverlay.h \ + ui/pinipede/qqpiniurlhelper.h \ + ui/pinipede/qqpostparser.h \ + ui/pinipede/qqtextbrowser.h \ + ui/pinipede/qqwebimageviewer.h \ + ui/settingsmanager/qqboardssettings.h \ + ui/settingsmanager/qqbouchotsettingsdialog.h \ + ui/settingsmanager/qqboardwizard.h \ + ui/settingsmanager/qqboardwizardnative.h \ + ui/settingsmanager/qqfiltersettings.h \ + ui/settingsmanager/qqgeneralsettings.h \ + ui/settingsmanager/qqhuntsettings.h \ + ui/settingsmanager/qqnetworksettings.h \ + ui/settingsmanager/qqpalmisettings.h \ + ui/settingsmanager/qqpalmisettingstablewidget.h \ + ui/settingsmanager/qqtotozsettings.h \ + ui/totozmanager/qqtmxmlparser.h \ + ui/totozmanager/qqtotozmanagerheader.h FORMS += mainwindow.ui \ ui/qqboardsinfo.ui \ - ui/qqboardinfo.ui \ - ui/qqcmdtoolbuttons.ui \ - ui/qqpalmipede.ui \ - ui/qqpinisearchwidget.ui \ - ui/qqproxyauthdialog.ui \ - ui/qqsettingsmanager.ui \ - ui/qqtotozmanager.ui \ - ui/settingsmanager/qqboardssettings.ui \ - ui/settingsmanager/qqbouchotsettingsdialog.ui \ - ui/settingsmanager/qqfiltersettings.ui \ - ui/settingsmanager/qqgeneralsettings.ui \ - ui/settingsmanager/qqhuntsettings.ui \ - ui/settingsmanager/qqnetworksettings.ui \ - ui/settingsmanager/qqpalmisettings.ui \ - ui/settingsmanager/qqtotozsettings.ui \ - ui/totozmanager/qqtotozmanagerheader.ui + ui/qqboardinfo.ui \ + ui/qqcmdtoolbuttons.ui \ + ui/qqpalmipede.ui \ + ui/qqpinisearchwidget.ui \ + ui/qqproxyauthdialog.ui \ + ui/qqsettingsmanager.ui \ + ui/qqtotozmanager.ui \ + ui/settingsmanager/qqboardssettings.ui \ + ui/settingsmanager/qqbouchotsettingsdialog.ui \ + ui/settingsmanager/qqfiltersettings.ui \ + ui/settingsmanager/qqgeneralsettings.ui \ + ui/settingsmanager/qqhuntsettings.ui \ + ui/settingsmanager/qqnetworksettings.ui \ + ui/settingsmanager/qqpalmisettings.ui \ + ui/settingsmanager/qqtotozsettings.ui \ + ui/totozmanager/qqtotozmanagerheader.ui RESOURCES += \ rc/quteqoin_img.qrc \ - rc/quteqoin_defs.qrc \ - rc/quteqoin_anims.qrc + rc/quteqoin_defs.qrc \ + rc/quteqoin_anims.qrc CONFIG(QML_PALMI) { QT += quick quickwidgets @@ -196,33 +198,33 @@ CONFIG(QML_PALMI) { RESOURCES += qml/quteqoin_qml.qrc OTHER_FILES += \ - qml/QQmlMain.qml \ - qml/QQmlNetworkSettings.qml \ - qml/QQmlPinni.qml \ - qml/QQmlPalmi.qml \ - qml/QQmlGeneralSettings.qml \ - qml/QQmlSettingsEditor.qml \ - qml/QQmlSettingsItem.qml \ - qml/QQmlSettingsItemMenuBtn.qml \ - qml/QQmlTotozSettings.qml + qml/QQmlMain.qml \ + qml/QQmlNetworkSettings.qml \ + qml/QQmlPinni.qml \ + qml/QQmlPalmi.qml \ + qml/QQmlGeneralSettings.qml \ + qml/QQmlSettingsEditor.qml \ + qml/QQmlSettingsItem.qml \ + qml/QQmlSettingsItemMenuBtn.qml \ + qml/QQmlTotozSettings.qml } unix { isEmpty(PREFIX) { - PREFIX = /usr/local - } + PREFIX = /usr/local + } target.path = $$PREFIX/bin - target.files = quteqoin + target.files = quteqoin desktop.path = $$PREFIX/share/applications - desktop.files += quteqoin.desktop + desktop.files += quteqoin.desktop icon.path = $$PREFIX/share/icons/hicolor/256x256/apps/ - icon.files += QuteQoin-Icon.png + icon.files += QuteQoin-Icon.png metainfo.path = $$PREFIX/share/metainfo/ - metainfo.files += eu.ototu.quteqoin.metainfo.xml + metainfo.files += eu.ototu.quteqoin.metainfo.xml INSTALLS += target desktop icon metainfo @@ -233,8 +235,8 @@ win32 { RC_FILE = rc/quteqoin_win.rc CONFIG(debug, debug|release) { - CONFIG += console - } + CONFIG += console + } } # vim: ts=4 sw=4 sts=4 noexpandtab diff --git a/ui/boardinfo/qqboardinfoprogressbar.h b/ui/boardinfo/qqboardinfoprogressbar.h index 87503ad..48c6fa0 100644 --- a/ui/boardinfo/qqboardinfoprogressbar.h +++ b/ui/boardinfo/qqboardinfoprogressbar.h @@ -8,8 +8,6 @@ class QQBoardInfoProgressBar : public QProgressBar { Q_OBJECT - Q_PROPERTY(bool onError READ isOnError WRITE setOnError) - Q_PROPERTY(QColor color READ boardColor WRITE setBoardColor) public: explicit QQBoardInfoProgressBar(QWidget *parent = nullptr); @@ -22,6 +20,7 @@ class QQBoardInfoProgressBar : public QProgressBar bool isOnError() const { return m_onError; } void setOnError(const bool &onError); + signals: void bouchotSelected(); diff --git a/ui/palmipede/qqpalmifileposter.cpp b/ui/palmipede/qqpalmifileposter.cpp index c796738..670c836 100644 --- a/ui/palmipede/qqpalmifileposter.cpp +++ b/ui/palmipede/qqpalmifileposter.cpp @@ -132,7 +132,7 @@ void QQPalmiFilePoster::parseUpload3TerOrg(const QString &data) { QStringList strL = data.split(QChar('\n')); if(strL.size() > 0) - emit finished(QString("https://%1/f.php?h=%2&p=1").arg(FILE_SHARING_SERVICE_JIRAFEAU_EUROMUSSELS_EU).arg(strL.first())); + emit finished(QString("https://%1/f.php?h=%2&p=1").arg(FILE_SHARING_SERVICE_JIRAFEAU_EUROMUSSELS_EU, strL.first())); } /////////// diff --git a/ui/pinipede/qqduckpixmapitem.h b/ui/pinipede/qqduckpixmapitem.h index 6dc4089..b17ec34 100644 --- a/ui/pinipede/qqduckpixmapitem.h +++ b/ui/pinipede/qqduckpixmapitem.h @@ -6,7 +6,7 @@ class QQDuckPixmapItem : public QQHuntPixmapItem { Q_OBJECT - Q_PROPERTY(QPointF pos READ pos WRITE setPos) + public: explicit QQDuckPixmapItem(QString srcBouchot, QString postId, bool selfDuck, QObject *parent = 0); ~QQDuckPixmapItem() {} diff --git a/ui/pinipede/qqhuntpixmapitem.cpp b/ui/pinipede/qqhuntpixmapitem.cpp index edd9067..b505e9c 100644 --- a/ui/pinipede/qqhuntpixmapitem.cpp +++ b/ui/pinipede/qqhuntpixmapitem.cpp @@ -7,14 +7,17 @@ #include #include #include +#if QT_VERSION >= QT_VERSION_CHECK(5, 15, 0) +#include +#endif #define BASE_ANIM_PIX QString(":/anims/") QQHuntPixmapItem::QQHuntPixmapItem(QString srcBouchot, QString postId, bool selfItem, QObject *parent) : - QObject(parent), - m_srcBouchot(srcBouchot), - m_postId(postId), - m_isSelfItem(selfItem) + QObject(parent), + m_srcBouchot(srcBouchot), + m_postId(postId), + m_isSelfItem(selfItem) { setCacheMode(ItemCoordinateCache); @@ -59,7 +62,11 @@ void QQHuntPixmapItem::animate() QPointF curPos = pos(); //Calcul du nouveau vecteur vitesse +#if QT_VERSION >= QT_VERSION_CHECK(5, 10, 0) + float angle = QRandomGenerator::global()->generateDouble() * M_PI_2; +#else float angle = (((float) qrand()) / INT_MAX) * M_PI_2; +#endif angle -= M_PI_4; QQMatrix2x2 rotMatrix; @@ -82,7 +89,7 @@ void QQHuntPixmapItem::animate() m_listPixmapProp.append(pixmapProp); QQMatrix1x2 resSpeedVec = m_speedVec * ((float) SPEED_FACTOR) - * (timeMs / (float) (MAX_DURATION - MIN_DURATION)); + * (timeMs / (float) (MAX_DURATION - MIN_DURATION)); float destPosX = curPos.x() + resSpeedVec(X_VALUE); float destPosY = curPos.y() + resSpeedVec(Y_VALUE); @@ -107,7 +114,7 @@ void QQHuntPixmapItem::animate() { realtime = timeMs * xFactor; curPos = QPointF(curPos.x() + (destPosX - curPos.x()) * xFactor, - curPos.y() + (destPosY - curPos.y()) * xFactor); + curPos.y() + (destPosY - curPos.y()) * xFactor); m_speedVec(X_VALUE) = 0.0 - m_speedVec(X_VALUE); if(xFactor == yFactor) @@ -117,7 +124,7 @@ void QQHuntPixmapItem::animate() { realtime = timeMs * yFactor; curPos = QPointF(curPos.x() + (destPosX - curPos.x()) * yFactor, - curPos.y() + (destPosY - curPos.y()) * yFactor); + curPos.y() + (destPosY - curPos.y()) * yFactor); m_speedVec(Y_VALUE) = 0.0 - m_speedVec(Y_VALUE); } diff --git a/ui/pinipede/qqhuntpixmapitem.h b/ui/pinipede/qqhuntpixmapitem.h index 45fae0f..60c3c88 100644 --- a/ui/pinipede/qqhuntpixmapitem.h +++ b/ui/pinipede/qqhuntpixmapitem.h @@ -16,7 +16,6 @@ typedef QGenericMatrix<2, 2, float> QQMatrix2x2; class QQHuntPixmapItem : public QObject, public QGraphicsPixmapItem { Q_OBJECT - Q_PROPERTY(QPointF pos READ pos WRITE setPos) public: explicit QQHuntPixmapItem(QString srcBouchot, QString postId, bool selfItem, QObject *parent = 0); @@ -26,8 +25,6 @@ class QQHuntPixmapItem : public QObject, public QGraphicsPixmapItem QString postId() const { return m_postId; } bool isSelfItem() const { return m_isSelfItem; } -signals: - public slots: void animate(); void animateKill(); diff --git a/ui/pinipede/qqpinioverlay.cpp b/ui/pinipede/qqpinioverlay.cpp index eac3a3a..298cd08 100644 --- a/ui/pinipede/qqpinioverlay.cpp +++ b/ui/pinipede/qqpinioverlay.cpp @@ -141,7 +141,7 @@ QQPiniOverlay::QQPiniOverlay(QWidget *parent) : if(parent != nullptr) resize(parent->size()); - connect(m_downloader, SIGNAL(ready(QUrl &)), this, SLOT(dlReady(QUrl &))); + connect(m_downloader, SIGNAL(ready(QUrl&)), this, SLOT(dlReady(QUrl&))); } ////////////////////////////////////////////////////////////// @@ -461,7 +461,9 @@ void QQPiniOverlay::showVideo(const QUrl &url) auto player = new QMediaPlayer(this, QMediaPlayer::VideoSurface); player->setAudioRole(QAudio::VideoRole); qInfo() << "Supported audio roles:"; - for (QAudio::Role role : player->supportedAudioRoles()) + + auto audioRoles = player->supportedAudioRoles(); + for (const auto &role : qAsConst(audioRoles)) qInfo() << " " << role; player->setMuted(settings.value(SETTINGS_GENERAL_STEALTH_MODE, DEFAULT_GENERAL_STEALTH_MODE).toBool()); diff --git a/ui/pinipede/qqpiniurlhelper.cpp b/ui/pinipede/qqpiniurlhelper.cpp index f6ef8a1..6dd152a 100644 --- a/ui/pinipede/qqpiniurlhelper.cpp +++ b/ui/pinipede/qqpiniurlhelper.cpp @@ -6,20 +6,19 @@ #include #include -#if(QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)) #include #include #include #include -#endif +#include //TODO: See http://doc.qt.io/qt-5/qurl.html#topLevelDomain -#define URL_HOST_REGEXP "(]*href=\"(https?://[^/\"]+)[^\"]*\"[^>]*>)\\[(?:url|https?)\\]()" +constexpr char URL_HOST_REGEXP[] = R"((]*href="(https?://[^/"]+)[^"]*"[^>]*>)\[(?:url|https?)\]())"; -#define CONTENT_TYPE_CACHE_SIZE 500 +constexpr int CONTENT_TYPE_CACHE_SIZE = 500; -#define YT_KEY_ID "AIzaSyBCLhoklblj8GXwl1S8i6b2yRR9tbnvPbU" -#define INITIAL_URL_PROPERTY "INITIAL_URL" +constexpr char INITIAL_URL_PROPERTY[] = "INITIAL_URL"; +constexpr char VIDEO_ID[] = "VIDEO_ID"; QHash QQPiniUrlHelper::m_cache; QList QQPiniUrlHelper::m_cacheUrls; @@ -29,7 +28,7 @@ QList QQPiniUrlHelper::m_cacheUrls; /// \param parent /// QQPiniUrlHelper::QQPiniUrlHelper(QObject *parent) : - QQNetworkAccessor(parent), QQMessageTransformFilter() + QQNetworkAccessor(parent) { m_contentTypeReplies.clear(); } @@ -54,7 +53,7 @@ void QQPiniUrlHelper::getUrlInfo(QUrl &url) { // Sans doute a ameliorer si la liste grandit if(url.host().endsWith("youtube.com") || - url.host().endsWith("youtu.be")) + url.host().endsWith("youtu.be")) getYoutubeExtendedInfo(url); else if(url.host().endsWith("dailymotion.com")) getDailymotionExtendedInfo(url); @@ -77,9 +76,9 @@ void QQPiniUrlHelper::transformMessage(const QString &bouchot, QString &message) QQSettings settings; QuteQoin::QQSmartUrlFilerTransformType trType = - (QuteQoin::QQSmartUrlFilerTransformType) settings.value(SETTINGS_FILTER_SMART_URL_TRANSFORM_TYPE, DEFAULT_FILTER_SMART_URL_TRANSFORM_TYPE).toInt(); + (QuteQoin::QQSmartUrlFilerTransformType) settings.value(SETTINGS_FILTER_SMART_URL_TRANSFORM_TYPE, DEFAULT_FILTER_SMART_URL_TRANSFORM_TYPE).toInt(); - QRegExp reg(URL_HOST_REGEXP, Qt::CaseInsensitive, QRegExp::RegExp2); + QRegExp reg(QString::fromUtf8(static_cast(URL_HOST_REGEXP)), Qt::CaseInsensitive, QRegExp::RegExp2); int index = 0; while((index = message.indexOf(reg, index)) >= 0) @@ -129,16 +128,19 @@ void QQPiniUrlHelper::requestFinishedSlot(QNetworkReply *reply) QUrl redirectedURL = reply->attribute(QNetworkRequest::RedirectionTargetAttribute).toUrl(); if(!redirectedURL.isEmpty() && - redirectedURL != sourceUrl) + redirectedURL != sourceUrl) { + if(redirectedURL.host().isEmpty()) // Relative redirection + redirectedURL=reply->request().url().resolved(redirectedURL); + QNetworkRequest rq(reply->request()); rq.setUrl(redirectedURL); QNetworkReply *newReply = httpHead(rq); - if(reply->property(INITIAL_URL_PROPERTY).isValid()) - newReply->setProperty(INITIAL_URL_PROPERTY, reply->property(INITIAL_URL_PROPERTY)); + if(reply->property(static_cast(INITIAL_URL_PROPERTY)).isValid()) + newReply->setProperty(static_cast(INITIAL_URL_PROPERTY), reply->property(static_cast(INITIAL_URL_PROPERTY))); else - newReply->setProperty(INITIAL_URL_PROPERTY, sourceUrl); + newReply->setProperty(static_cast(INITIAL_URL_PROPERTY), sourceUrl); m_contentTypeReplies.append(newReply); } // Une erreur HTTP est survenue @@ -151,8 +153,8 @@ void QQPiniUrlHelper::requestFinishedSlot(QNetworkReply *reply) else { QNetworkRequest rq = reply->request(); - if(reply->property(INITIAL_URL_PROPERTY).isValid()) - sourceUrl = reply->property(INITIAL_URL_PROPERTY).toUrl(); + if(reply->property(static_cast(INITIAL_URL_PROPERTY)).isValid()) + sourceUrl = reply->property(static_cast(INITIAL_URL_PROPERTY)).toUrl(); if(rq.attribute((QNetworkRequest::Attribute) RequestContentType, false).toBool()) handleContentTypeResponse(reply->header(QNetworkRequest::ContentTypeHeader).toString(), sourceUrl); @@ -161,7 +163,7 @@ void QQPiniUrlHelper::requestFinishedSlot(QNetworkReply *reply) else if(rq.attribute((QNetworkRequest::Attribute) RequestVimeoInfo, false).toBool()) handleVimeoExtendedInfo(reply->readAll(), sourceUrl); else if(rq.attribute((QNetworkRequest::Attribute) RequestYoutubeInfo, false).toBool()) - handleYoutubeExtendedInfo(reply->readAll(), sourceUrl); + handleYoutubeExtendedInfo(reply->readAll(), sourceUrl, reply->property(static_cast(VIDEO_ID)).toString()); } } reply->deleteLater(); @@ -174,7 +176,7 @@ void QQPiniUrlHelper::requestFinishedSlot(QNetworkReply *reply) void QQPiniUrlHelper::getContentType(QUrl &url) { QQPiniUrlHelper::CacheInfo *urlInfo = m_cache[url]; - if(urlInfo == NULL) + if(urlInfo == nullptr) { QNetworkRequest r(url); r.setAttribute((QNetworkRequest::Attribute) RequestContentType, true); @@ -188,7 +190,7 @@ void QQPiniUrlHelper::getContentType(QUrl &url) emit contentTypeAvailable(reqUrl, urlInfo->contentType); if(urlInfo->contentType.startsWith("image/") || - urlInfo->contentType.startsWith("video/")) + urlInfo->contentType.startsWith("video/")) emit mmDataAvailable(url, urlInfo->contentType); } } @@ -200,16 +202,20 @@ void QQPiniUrlHelper::getContentType(QUrl &url) /// void QQPiniUrlHelper::handleContentTypeResponse(const QString &contentType, QUrl &sourceUrl) { +#if QT_VERSION >= QT_VERSION_CHECK(5, 15, 0) + QStringList contentTypeParts = contentType.split(";", Qt::SkipEmptyParts); +#else QStringList contentTypeParts = contentType.split(";", QString::SkipEmptyParts); - QString rep = (contentTypeParts.size() > 0) ? contentTypeParts.at(0) : tr("Unknown"); +#endif + QString rep = (contentTypeParts.isEmpty()) ? tr("Unknown") : contentTypeParts.at(0); - QQPiniUrlHelper::CacheInfo *info = new QQPiniUrlHelper::CacheInfo; + auto info = new QQPiniUrlHelper::CacheInfo; info->contentType = rep; addToCache(sourceUrl, info); QString cT = contentType; if(contentType.startsWith("image/") || - contentType.startsWith("video/")) + contentType.startsWith("video/")) emit mmDataAvailable(sourceUrl, cT); emit contentTypeAvailable(sourceUrl, rep); @@ -222,7 +228,7 @@ void QQPiniUrlHelper::handleContentTypeResponse(const QString &contentType, QUrl void QQPiniUrlHelper::getDailymotionExtendedInfo(QUrl &url) { QQPiniUrlHelper::CacheInfo *urlInfo = m_cache[url]; - if(urlInfo == NULL) + if(urlInfo == nullptr) { QStringList tmpList = url.path().split('/'); if(tmpList.isEmpty()) @@ -235,14 +241,15 @@ void QQPiniUrlHelper::getDailymotionExtendedInfo(QUrl &url) QString vidId = tmpList.first(); QUrl qUrl = QUrl("https://api.dailymotion.com"); - QString postData(QString("{\"call\": \"GET /video/%1\",\"args\": {\"fields\": [\"title\",\"thumbnail_url\"]}}").arg(vidId)); + QString postData(QString(R"({"call": "GET /video/%1","args": {"fields": ["title","thumbnail_url"]}})").arg(vidId)); QNetworkRequest r(qUrl); r.setHeader(QNetworkRequest::ContentTypeHeader, "Application/json"); r.setAttribute((QNetworkRequest::Attribute) RequestDailyMotionInfo, true); QNetworkReply *reply = httpPost(r, postData.toLatin1()); - reply->setProperty(INITIAL_URL_PROPERTY, url); + reply->setProperty(static_cast(INITIAL_URL_PROPERTY), url); + reply->setProperty(static_cast(VIDEO_ID), vidId); m_contentTypeReplies.append(reply); } @@ -262,41 +269,17 @@ void QQPiniUrlHelper::getDailymotionExtendedInfo(QUrl &url) /// void QQPiniUrlHelper::handleDailymotionExtendedInfo(const QByteArray &jsonInfo, QUrl &sourceUrl) { - QString thumbnailUrl, title; - QQPiniUrlHelper::CacheInfo *info = new QQPiniUrlHelper::CacheInfo; + QString thumbnailUrl; + QString title; + + auto info = new QQPiniUrlHelper::CacheInfo; //JSON seulement supporté par Qt 5 -#if(QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)) QJsonDocument d = QJsonDocument::fromJson(jsonInfo); QJsonObject o = d.object(); QJsonObject o2 = o["result"].toObject(); thumbnailUrl = o2["thumbnail_url"].toString(); title = o2["title"].toString(); -#else - - QString str = QString::fromLatin1(jsonInfo); - QRegExp r("\"thumbnail_url\":\"([^\"]*)"); - if(r.indexIn(str) > 0) - { - thumbnailUrl = r.capturedTexts().at(1); - - thumbnailUrl.replace("\\/", "/"); - } - - r = QRegExp("\"title\":\"([^\"]*)"); - - if(r.indexIn(str) > 0) - { - title = r.capturedTexts().at(1); - - int idx = -1; - while(( idx = title.indexOf("\\u") ) != -1 ) - { - int nHex = title.mid(idx + 2, 4).toInt(0, 16); - title.replace(idx, 6, QChar(nHex)); - } - } -#endif auto cached = false; if(! thumbnailUrl.isEmpty()) @@ -349,15 +332,20 @@ void QQPiniUrlHelper::getSaufCaExtendedInfo(QUrl &url) void QQPiniUrlHelper::getVimeoExtendedInfo(QUrl &url) { QQPiniUrlHelper::CacheInfo *urlInfo = m_cache[url]; - if(urlInfo == NULL) + if(urlInfo == nullptr) { +#if QT_VERSION >= QT_VERSION_CHECK(5, 15, 0) + QString vidId = url.path().split('/', Qt::SkipEmptyParts).first(); +#else QString vidId = url.path().split('/', QString::SkipEmptyParts).first(); +#endif QUrl qUrl = QUrl(QString("http://vimeo.com/api/v2/video/%1.json").arg(vidId)); QNetworkRequest r(qUrl); r.setAttribute((QNetworkRequest::Attribute) RequestVimeoInfo, true); QNetworkReply *reply = httpGet(r); - reply->setProperty(INITIAL_URL_PROPERTY, url); + reply->setProperty(static_cast(INITIAL_URL_PROPERTY), url); + reply->setProperty(static_cast(VIDEO_ID), vidId); m_contentTypeReplies.append(reply); } @@ -407,12 +395,12 @@ void QQPiniUrlHelper::getVimeoExtendedInfo(QUrl &url) */ void QQPiniUrlHelper::handleVimeoExtendedInfo(const QByteArray &jsonInfo, QUrl &sourceUrl) { - QString thumbnailUrl, title; + QString thumbnailUrl; + QString title; - QQPiniUrlHelper::CacheInfo *info = new QQPiniUrlHelper::CacheInfo; - //JSON seulement supporté par Qt 5 -#if(QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)) - QJsonParseError error; + auto info = new QQPiniUrlHelper::CacheInfo; + + QJsonParseError error{}; QJsonDocument d = QJsonDocument::fromJson(jsonInfo, &error); if(d.isEmpty()) { @@ -424,19 +412,6 @@ void QQPiniUrlHelper::handleVimeoExtendedInfo(const QByteArray &jsonInfo, QUrl & QJsonObject o = a[0].toObject(); thumbnailUrl = o["thumbnail_medium"].toString(); title = o["title"].toString(); -#else - - QString str = QString::fromUtf8(jsonInfo); - QRegExp r("\"title\": *\"([^\"]*)"); - - if(r.indexIn(str) > 0) - title = r.capturedTexts().at(1); - - r = QRegExp("\"thumbnail_medium\": *\"([^\"]*)"); - if(r.indexIn(str) > 0) - thumbnailUrl = r.capturedTexts().at(1); - -#endif auto cached = false; if(! thumbnailUrl.isEmpty()) @@ -467,36 +442,35 @@ void QQPiniUrlHelper::handleVimeoExtendedInfo(const QByteArray &jsonInfo, QUrl & void QQPiniUrlHelper::getYoutubeExtendedInfo(QUrl &url) { QQPiniUrlHelper::CacheInfo *urlInfo = m_cache[url]; - if(urlInfo == NULL) + if(urlInfo == nullptr) { QString ytId; if(url.host().endsWith("youtu.be")) { +#if QT_VERSION >= QT_VERSION_CHECK(5, 15, 0) + QStringList pathExp = url.path().split(QChar('/'), Qt::SkipEmptyParts); +#else QStringList pathExp = url.path().split(QChar('/'), QString::SkipEmptyParts); - if(pathExp.size() > 0) - ytId = pathExp.at(0); +#endif + if(! pathExp.isEmpty()) + ytId = pathExp.last(); } else { -#if(QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)) QUrlQuery urlQ(url); ytId = urlQ.queryItemValue("v"); -#else - ytId = url.queryItemValue("v"); -#endif } - if(ytId.isEmpty()) return; - QUrl qUrl = QUrl(QString("https://www.googleapis.com/youtube/v3/videos?id=%1&part=snippet&key=%2") - .arg(ytId) - .arg(YT_KEY_ID)); + QUrl qUrl = QUrl(QString("https://www.youtube.com/oembed?format=json&url=http%3A//www.youtube.com/watch?v=%1") + .arg(ytId)); QNetworkRequest r(qUrl); r.setAttribute((QNetworkRequest::Attribute) RequestYoutubeInfo, true); QNetworkReply *reply = httpGet(r); - reply->setProperty(INITIAL_URL_PROPERTY, url); + reply->setProperty(static_cast(INITIAL_URL_PROPERTY), url); + reply->setProperty(static_cast(VIDEO_ID), ytId); m_contentTypeReplies.append(reply); } @@ -509,107 +483,28 @@ void QQPiniUrlHelper::getYoutubeExtendedInfo(QUrl &url) } -////////////////////////////////////////////////////////////// -/// \brief QQPiniUrlHelper::handleYoutubeExtendedInfo -/// -/* -{ - "kind": "youtube#videoListResponse", - "etag": "\"PSjn-HSKiX6orvNhGZvglLI2lvk/jYMo11ttS70ElzF5RMZCCrXlWp8\"", - "pageInfo": { - "totalResults": 1, - "resultsPerPage": 1 - }, - "items": [ - { - "kind": "youtube#video", - "etag": "\"PSjn-HSKiX6orvNhGZvglLI2lvk/sco2Z98R6fUE9GmzFdnNuWVxhFo\"", - "id": "VPKniLU6vII", - "snippet": { - "publishedAt": "2013-08-15T07:59:09.000Z", - "channelId": "UCvGag7MyHR8H9oRm9iL9Ifw", - "title": "Glace chaude instantanée ! - [Science 2.0]", - "description": "L'expérience de la surfusion d'Acétate de Sodium, à refaire chez soi, pour une fois ! :D\n\nFabriquer de l'acétate de Sodium:\nhttp://www.chimie.ch/nuls/index.php/saison-4/48-4x09\n\n\nTwitter:\nhttp://www.twitter.com/experimentboy\nhttp://www.twitter.com/Wagique\n\nFacebook: http://www.facebook.com/ExperimentboyTV", - "thumbnails": { - "default": { - "url": "https://i.ytimg.com/vi/VPKniLU6vII/default.jpg", - "width": 120, - "height": 90 - }, - "medium": { - "url": "https://i.ytimg.com/vi/VPKniLU6vII/mqdefault.jpg", - "width": 320, - "height": 180 - }, - "high": { - "url": "https://i.ytimg.com/vi/VPKniLU6vII/hqdefault.jpg", - "width": 480, - "height": 360 - }, - "standard": { - "url": "https://i.ytimg.com/vi/VPKniLU6vII/sddefault.jpg", - "width": 640, - "height": 480 - }, - "maxres": { - "url": "https://i.ytimg.com/vi/VPKniLU6vII/maxresdefault.jpg", - "width": 1280, - "height": 720 - } - }, - "channelTitle": "Experimentboy", - "categoryId": "28", - "liveBroadcastContent": "none" - } - } - ] -} -*/ -void QQPiniUrlHelper::handleYoutubeExtendedInfo(const QByteArray &jsonInfo, QUrl &sourceUrl) +void QQPiniUrlHelper::handleYoutubeExtendedInfo(const QByteArray &jsonInfo, QUrl &sourceUrl, const QString &videoID) { - QString thumbnailUrl, title; + QString thumbnailUrl; + QString title; - QQPiniUrlHelper::CacheInfo *info = new QQPiniUrlHelper::CacheInfo; - //JSON seulement supporté par Qt 5 -#if(QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)) - QJsonParseError error; + QJsonParseError error{}; QJsonDocument d = QJsonDocument::fromJson(jsonInfo, &error); - if(d.isEmpty()) + if(d.isEmpty() || ! d.isObject()) { qDebug() << Q_FUNC_INFO << "error" << error.errorString(); - delete info; return; } QJsonObject o = d.object(); - QJsonObject items = o["items"].toArray().at(0).toObject(); - QJsonObject snippet = items["snippet"].toObject(); - title= snippet["title"].toString(); - QJsonObject thumbnails = snippet["thumbnails"].toObject(); - QJsonObject defaultThumbnail = thumbnails["default"].toObject(); - thumbnailUrl = defaultThumbnail["url"].toString(); -#else - - QString str = QString::fromUtf8(jsonInfo); - QRegExp r("\"title\": \"([^\"]*)"); - - if(r.indexIn(str) > 0) - title = r.capturedTexts().at(1); - - int offset = str.indexOf("\"thumbnails\": {"); - offset = str.indexOf("\"default\": {", offset); - r = QRegExp("\"url\": \"([^\"]*)"); - if(r.indexIn(str, offset) > 0) - thumbnailUrl = r.capturedTexts().at(1); - -#endif - info->videoThumbnailUrl = thumbnailUrl; - info->videoTitle = title; - addToCache(sourceUrl, info); + thumbnailUrl = o["thumbnail_url"].toString(); + title = o["title"].toString(); - if(! thumbnailUrl.isEmpty()) + if(! videoID.isEmpty()) { if(! title.isEmpty()) { + auto info = new QQPiniUrlHelper::CacheInfo; + info->videoThumbnailUrl = thumbnailUrl; info->videoTitle = title; addToCache(sourceUrl, info); @@ -622,6 +517,7 @@ void QQPiniUrlHelper::handleYoutubeExtendedInfo(const QByteArray &jsonInfo, QUrl if(! title.isEmpty()) emit videoTitleAvailable(sourceUrl, title); + } ////////////////////////////////////////////////////////////// @@ -636,7 +532,6 @@ void QQPiniUrlHelper::addToCache(QUrl &sourceUrl, CacheInfo *info) while(QQPiniUrlHelper::m_cacheUrls.size() > CONTENT_TYPE_CACHE_SIZE) { QQPiniUrlHelper::CacheInfo *oldInfo = QQPiniUrlHelper::m_cache.take(QQPiniUrlHelper::m_cacheUrls.takeFirst()); - if(oldInfo != NULL) - delete oldInfo; + delete oldInfo; } } diff --git a/ui/pinipede/qqpiniurlhelper.h b/ui/pinipede/qqpiniurlhelper.h index 2d5d697..b03cc5e 100644 --- a/ui/pinipede/qqpiniurlhelper.h +++ b/ui/pinipede/qqpiniurlhelper.h @@ -47,7 +47,7 @@ public slots: void getVimeoExtendedInfo(QUrl &url); void handleVimeoExtendedInfo(const QByteArray &jsonInfo, QUrl &sourceUrl); void getYoutubeExtendedInfo(QUrl &url); - void handleYoutubeExtendedInfo(const QByteArray &jsonInfo, QUrl &sourceUrl); + void handleYoutubeExtendedInfo(const QByteArray &jsonInfo, QUrl &sourceUrl, const QString &videoID); struct CacheInfo { QString contentType; @@ -55,7 +55,7 @@ public slots: QString videoTitle; }; - void addToCache(QUrl &sourceUrl, CacheInfo *info); + static void addToCache(QUrl &sourceUrl, CacheInfo *info); QList m_contentTypeReplies; static QHash m_cache; diff --git a/ui/pinipede/qqpostparser.cpp b/ui/pinipede/qqpostparser.cpp index 9c50130..f6166e5 100644 --- a/ui/pinipede/qqpostparser.cpp +++ b/ui/pinipede/qqpostparser.cpp @@ -21,7 +21,7 @@ /// \param parent /// QQPostParser::QQPostParser(QObject *parent) : - QObject(parent) + QObject(parent) { QQSettings settings; if(settings.value(SETTINGS_FILTER_SMART_URL_TRANSFORMER, DEFAULT_FILTER_SMART_URL_TRANSFORMER).toBool()) @@ -88,8 +88,7 @@ QList QQPostParser::splitMessage(const QString &message, fmt.setFontWeight(nRef.isReponse() ? QFont::DemiBold : QFont::Normal); QString nRefUrl = QString("nref://bouchot?board=%1&postId=%2&index=%3") - .arg(post->bouchot()->name()) - .arg(post->id()).arg(index); + .arg(post->bouchot()->name(), post->id(), QString::number(index)); fmt.setAnchorHref(nRefUrl); norlogeCursor.mergeCharFormat(fmt); @@ -135,7 +134,7 @@ void QQPostParser::applyMessageFragmentTransformFilters(QListbouchot()->name(); emit bigorNotify(name, callerId, - (cursor.selectedText().compare("moules<", Qt::CaseInsensitive) == 0)); + (cursor.selectedText().compare("moules<", Qt::CaseInsensitive) == 0)); } } @@ -233,16 +232,16 @@ void QQPostParser::colorizeDuck(QTextDocument &doc, QQMessageBlockUserData *user QList regexes; regexes << QRegExp(QString::fromLatin1("\\\\_").append(tete).append(QString::fromLatin1("<")), - Qt::CaseSensitive, - QRegExp::RegExp); + Qt::CaseSensitive, + QRegExp::RegExp); regexes << QRegExp(QString::fromLatin1(">").append(tete).append(QString::fromLatin1("_\\/")), - Qt::CaseSensitive, - QRegExp::RegExp); + Qt::CaseSensitive, + QRegExp::RegExp); regexes << QRegExp(QString::fromLatin1("coin ?! ?coin ?!"), - Qt::CaseSensitive, - QRegExp::RegExp); + Qt::CaseSensitive, + QRegExp::RegExp); QTextCursor cursor(&doc); @@ -258,7 +257,8 @@ void QQPostParser::colorizeDuck(QTextDocument &doc, QQMessageBlockUserData *user while(! (cursor = doc.find(reg, cursor)).isNull()) { QString duckUrl = QString("duck://bouchot?board=%1&postId=%2&self=%3") - .arg(post->bouchot()->name()).arg(post->id()).arg(post->isSelfPost()); + .arg(post->bouchot()->name(), post->id(), + post->isSelfPost() ? "true" : "false"); fmt.setAnchorHref(duckUrl); cursor.mergeCharFormat(fmt); userData->setHasDuck(); @@ -301,8 +301,8 @@ void QQPostParser::linkNorlogeRef(QQNorlogeRef *nRef) void QQPostParser::colorizeTableVolante(QTextDocument &doc, QQMessageBlockUserData *userData) { QRegExp tvReg = QRegExp(QString::fromLatin1("(?:flap ?flap)|(?:table[ _]volante)"), - Qt::CaseSensitive, - QRegExp::RegExp); + Qt::CaseSensitive, + QRegExp::RegExp); QTextCursor cursor(&doc); QTextCharFormat fmt = cursor.blockCharFormat(); @@ -313,7 +313,7 @@ void QQPostParser::colorizeTableVolante(QTextDocument &doc, QQMessageBlockUserDa while(! (cursor = doc.find(tvReg, cursor)).isNull()) { QString duckUrl = QString("tablev://bouchot?board=%1&postId=%2&self=%3") - .arg(post->bouchot()->name()).arg(post->id()).arg(post->isSelfPost()); + .arg(post->bouchot()->name(), post->id(), post->isSelfPost() ? "true" : "false"); fmt.setAnchorHref(duckUrl); cursor.mergeCharFormat(fmt); } @@ -332,8 +332,8 @@ void QQPostParser::colorizeTotoz(QTextDocument &doc, QQMessageBlockUserData *use Q_UNUSED(userData); QRegExp totozReg = QRegExp(QString::fromLatin1("(\\[\\:[^\\t\\)\\]]+\\])"), //[:[^\t\)\]] - Qt::CaseSensitive, - QRegExp::RegExp); + Qt::CaseSensitive, + QRegExp::RegExp); QTextCursor cursor(&doc); QTextCharFormat fmt = cursor.blockCharFormat(); @@ -374,19 +374,19 @@ void QQPostParser::detectLecon(QTextDocument &doc, QQMessageBlockUserData *userD { Q_UNUSED(userData) QRegExp totozReg = QRegExp(QString::fromUtf8("(le[cç]on\\s+\\d+)"), - Qt::CaseInsensitive, - QRegExp::RegExp); + Qt::CaseInsensitive, + QRegExp::RegExp); QTextCursor cursor(&doc); while(! (cursor = doc.find(totozReg, cursor)).isNull()) { QString numLesson = cursor.selectedText().split(QRegExp("\\s")).at(1); QString url = QString::fromLatin1("")) - .append(cursor.selectedText()) - .append(QString::fromLatin1("")); + .append(LECON_BASE_URL) + .append(numLesson) + .append(QString::fromLatin1("\">")) + .append(cursor.selectedText()) + .append(QString::fromLatin1("")); cursor.insertHtml(url); } } diff --git a/ui/pinipede/qqtextbrowser.cpp b/ui/pinipede/qqtextbrowser.cpp index 1f2b188..9b60d10 100644 --- a/ui/pinipede/qqtextbrowser.cpp +++ b/ui/pinipede/qqtextbrowser.cpp @@ -9,6 +9,7 @@ #include #include #include +#include #include #include #include @@ -22,14 +23,16 @@ #include #include #include -#if(QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)) #include -#endif #define TIME_UA_AREA_WIDTH_CHAR 26 // 10 + 1 + 15 Chars #define NOTIF_AREA_WIDTH 18 //Px #define ITEM_AREA_WIDTH 6 //Px +constexpr char copyLinkActionObjectName[] = "link-copy"; +constexpr char searchOnWebActionObjectName[] = "search-on-web"; +constexpr char totozAddToBookmarksActionName[] = "totoz-add-to-bookmarks"; + QQTextBrowser::QQTextBrowser(QString groupName, QQPinipede *parent) : QTextBrowser(parent), m_notifArea(new QQNotifArea(this)), @@ -124,7 +127,6 @@ void QQTextBrowser::notifAreaPaintEvent(QPaintEvent * event) { QPainter painter(m_notifArea); painter.setRenderHint(QPainter::Antialiasing, true); - painter.setRenderHint(QPainter::HighQualityAntialiasing, true); // Pour les nouveaux posts QColor newPostsBrushColor(0, 255, 0, 100); @@ -338,7 +340,7 @@ void QQTextBrowser::onAnchorHighlighted(const QUrl &link) if(link != m_shownUrl) { unHighlightNorloge(); - hideViewers(); + emit hideViewers(); m_shownUrl = link; } else @@ -418,6 +420,21 @@ void QQTextBrowser::onBakUserAction() } } +/** + * @brief QQTextBrowser::onCopyLinkLocationAction + */ +void QQTextBrowser::onCopyLinkLocationAction() +{ + auto link = QUrl::fromUserInput(m_contextMenuContextualString); + m_contextMenuContextualString.clear(); + + if(link.isValid()) + { + auto clipBoard = QApplication::clipboard(); + clipBoard->setText(link.toString()); + } +} + /** * @brief QQTextBrowser::onHideBoardAction */ @@ -527,7 +544,19 @@ void QQTextBrowser::clearViewers() void QQTextBrowser::contextMenuEvent(QContextMenuEvent * ev) { - auto menu = createStandardContextMenu(ev->pos()); + auto menu = createStandardContextMenu(); + + QAction * copyLinkLocationAction = nullptr; + auto actions = menu->actions(); + for(auto a: qAsConst(actions)) + { + if(a->objectName() == copyLinkActionObjectName) + { + copyLinkLocationAction = a; + copyLinkLocationAction->setEnabled(false); + break; + } + } auto cursor = cursorForPosition(ev->pos()); auto uData = static_cast(cursor.block().userData()); @@ -543,6 +572,7 @@ void QQTextBrowser::contextMenuEvent(QContextMenuEvent * ev) if(cursor.hasSelection()) { auto action = menu->addAction(tr("&Search on web")); + action->setObjectName(searchOnWebActionObjectName); connect(action, &QAction::triggered, this, &QQTextBrowser::onWebSearchAction); } @@ -550,27 +580,21 @@ void QQTextBrowser::contextMenuEvent(QContextMenuEvent * ev) if(anchor.size() > 0) { QUrl anchorUrl(anchor); - QString anchorUrlScheme = anchorUrl.scheme(); - auto copyLinkLocationAction = menu->actions().at(1); + auto anchorUrlScheme = anchorUrl.scheme(); if(anchorUrlScheme == "totoz") // Un [:totoz] { m_contextMenuContextualString = anchorUrl.path().remove(0, 1); // Le / initial - QAction *action = menu->addAction(tr("Add to &bookmarks")); + QAction *action = menu->addAction(tr("&Bookmark totoz")); + action->setObjectName(totozAddToBookmarksActionName); connect(action, &QAction::triggered, this, &QQTextBrowser::onAddTotozToBookmarksAction); - - //Suppression du Copy Link Location - copyLinkLocationAction->setVisible(false); } else if((anchorUrlScheme == "msl") || // Une moule (anchorUrlScheme == "duck") || // Un canard (anchorUrlScheme == "tablev") || // Une table volante (anchorUrlScheme == "nref")) // Une norloge { - //Suppression du Copy Link Location - copyLinkLocationAction->setVisible(false); - if(anchorUrlScheme == "msl") { QUrlQuery anchorUrlQuery(anchorUrl); @@ -601,7 +625,14 @@ void QQTextBrowser::contextMenuEvent(QContextMenuEvent * ev) } } else - copyLinkLocationAction->setEnabled(true); + { + if(copyLinkLocationAction != nullptr) + { + m_contextMenuContextualString = anchorUrl.toString(); + connect(copyLinkLocationAction, &QAction::triggered, this, &QQTextBrowser::onCopyLinkLocationAction); + copyLinkLocationAction->setEnabled(true); + } + } } menu->exec(QCursor::pos()); @@ -695,7 +726,6 @@ void QQTextBrowser::paintEvent(QPaintEvent * event) // Pour le bigorno QPainter bigornoPainter(viewport()); bigornoPainter.setRenderHint(QPainter::Antialiasing, true); - bigornoPainter.setRenderHint(QPainter::HighQualityAntialiasing, true); QColor bigornoBrushColor(60, 0, 0, 100); bigornoPainter.setBrush(QBrush(bigornoBrushColor)); QColor bigornoPenColor(150, 0, 0); diff --git a/ui/pinipede/qqtextbrowser.h b/ui/pinipede/qqtextbrowser.h index 62b6863..68c5a7b 100644 --- a/ui/pinipede/qqtextbrowser.h +++ b/ui/pinipede/qqtextbrowser.h @@ -59,6 +59,7 @@ protected slots: void onAnchorClicked(const QUrl &link); void onAnchorHighlighted(const QUrl &link); void onBakUserAction(); + void onCopyLinkLocationAction(); void onHideBoardAction(); void onExtendedInfoAvailable(QUrl &url, QString &contentType); void onPlopifyUserAction(); diff --git a/ui/qqimageviewer.cpp b/ui/qqimageviewer.cpp index 5ca8d91..6ec57f7 100644 --- a/ui/qqimageviewer.cpp +++ b/ui/qqimageviewer.cpp @@ -65,9 +65,6 @@ void QQImageViewer::displayMovie() setStyleSheet("QLabel { background-color : rgba(255, 255, 255, 0); color : black; }"); m_imgMovie.disconnect(SIGNAL(finished())); - if(m_imgMovie.frameCount() > 1) - connect(&m_imgMovie, SIGNAL(finished()), &m_imgMovie, SLOT(start())); - m_imgMovie.jumpToFrame(0); setMovie(&m_imgMovie); @@ -107,6 +104,7 @@ bool QQImageViewer::updateImg(const QByteArray &imgData, const QSize &maxSize) if(maxSize.isValid()) imgSize.scale(imgSize.boundedTo(maxSize), Qt::KeepAspectRatio); + m_imgMovie.stop(); m_imgMovie.setDevice(&m_imgDataBuffer); if(m_imgMovie.isValid()) { diff --git a/ui/qqimageviewer.h b/ui/qqimageviewer.h index 6c153df..1a74f22 100644 --- a/ui/qqimageviewer.h +++ b/ui/qqimageviewer.h @@ -8,7 +8,6 @@ class QQImageViewer : public QLabel { Q_OBJECT - Q_PROPERTY(bool showAtMousePos READ showAtMousePos WRITE setShowAtMousePos) public: explicit QQImageViewer(QWidget *parent = 0); diff --git a/ui/qqmessageblockuserdata.cpp b/ui/qqmessageblockuserdata.cpp index 199f65a..39e8e9b 100644 --- a/ui/qqmessageblockuserdata.cpp +++ b/ui/qqmessageblockuserdata.cpp @@ -3,24 +3,23 @@ #include QQMessageBlockUserData::QQMessageBlockUserData() : - QTextBlockUserData(), - m_wasParsed(false), - m_hasDuck(false), - m_hasTableV(false), - m_post(QPointer()) + QTextBlockUserData(), + m_wasParsed(false), + m_hasDuck(false), + m_hasTableV(false), + m_post(QPointer()) { } QQMessageBlockUserData::QQMessageBlockUserData(const QQMessageBlockUserData & userData) : - QTextBlockUserData((QTextBlockUserData) userData), - m_listNRef(userData.m_listNRef), - m_listBigorno(userData.m_listBigorno), - m_mapTableV(userData.m_mapTableV), - m_wasParsed(userData.m_wasParsed), - m_hasDuck(userData.m_hasDuck), - m_hasTableV(userData.m_hasTableV), - m_ranges(userData.m_ranges), - m_post(userData.m_post) + QTextBlockUserData((QTextBlockUserData) userData), + m_listNRef(userData.m_listNRef), + m_listBigorno(userData.m_listBigorno), + m_wasParsed(userData.m_wasParsed), + m_hasDuck(userData.m_hasDuck), + m_hasTableV(userData.m_hasTableV), + m_ranges(userData.m_ranges), + m_post(userData.m_post) { } @@ -42,23 +41,3 @@ bool QQMessageBlockUserData::hasNRefToSelfPost() const } return false; } - -QPair QQMessageBlockUserData::stringForIndex(int index, const QMap & map) const -{ - QList startIndexes = map.uniqueKeys(); - int i = 0; - while(i < startIndexes.size()) - { - int startIndex = startIndexes[i]; - if(isIndexInString(index, startIndex, map[startIndex])) - return qMakePair(startIndex, map[startIndex]); - - i++; - } - return qMakePair(-1, QString::fromLatin1("")); -} - -bool QQMessageBlockUserData::isIndexInString(int index, int stringIndexStart, const QString & string) const -{ - return (index >= stringIndexStart && index < stringIndexStart + string.length()); -} diff --git a/ui/qqmessageblockuserdata.h b/ui/qqmessageblockuserdata.h index a41def1..8a63b2f 100644 --- a/ui/qqmessageblockuserdata.h +++ b/ui/qqmessageblockuserdata.h @@ -6,7 +6,6 @@ #include #include -#include #include #include #include @@ -56,12 +55,8 @@ class QQMessageBlockUserData : public QTextBlockUserData bool isValid() const { return m_ranges.size() > 0; } private: - QPair stringForIndex(int index, const QMap &map) const; - bool isIndexInString(int index, int stringIndex, const QString &string) const; - QList m_listNRef; QList m_listBigorno; - QMap m_mapTableV; bool m_wasParsed; bool m_hasDuck; diff --git a/ui/qqmusselinfo.h b/ui/qqmusselinfo.h index 8810bd5..8f841d0 100644 --- a/ui/qqmusselinfo.h +++ b/ui/qqmusselinfo.h @@ -7,23 +7,23 @@ class QQMusselInfo : public QLabel { - Q_OBJECT + Q_OBJECT public: explicit QQMusselInfo(QQMussel mussel, QWidget *parent = 0); - bool selected() { return m_selected; } - void setSelected() { m_selected = true; emit selected(m_mussel); } + bool selected() { return m_selected; } + void setSelected() { m_selected = true; emit musselSelected(m_mussel); } void setUnselected() { m_selected = false; } signals: - void selected(QQMussel mussel); + void musselSelected(QQMussel mussel); public slots: void toggleBak(bool baked); void togglePlopify(bool plopified); protected: - virtual void mouseReleaseEvent(QMouseEvent *event); + virtual void mouseReleaseEvent(QMouseEvent *event); virtual void contextMenuEvent(QContextMenuEvent *event); protected slots: diff --git a/ui/qqpalmipede.cpp b/ui/qqpalmipede.cpp index fbdcf27..52d3c80 100644 --- a/ui/qqpalmipede.cpp +++ b/ui/qqpalmipede.cpp @@ -143,14 +143,14 @@ void QQPalmipede::changeNorloges(const QString & bouchot) { if(firstIndex > 0) { - destText.append(text.left(firstIndex)); + destText.append(text.leftRef(firstIndex)); text.remove(0, firstIndex); } QString norloge = text.left(norlogeReg.matchedLength()); if(norloge.contains(bouchotRemoverReg)) - destText.append(norloge.left(norloge.length() - bouchotRemoverReg.matchedLength())); + destText.append(norloge.leftRef(norloge.length() - bouchotRemoverReg.matchedLength())); else if(! norloge.contains(bouchotAdderReg) && bouchot != m_oldBouchot) destText.append(norloge).append(QString::fromLatin1("@")).append(m_oldBouchot); else diff --git a/ui/qqpinipede.cpp b/ui/qqpinipede.cpp index e29a27b..25c0327 100644 --- a/ui/qqpinipede.cpp +++ b/ui/qqpinipede.cpp @@ -90,13 +90,13 @@ QQPinipede::~QQPinipede() delete m_totozDownloader; QList listTabs = m_listPostsTabMap.keys(); - for(QString tab : listTabs) + for(const QString &tab : qAsConst(listTabs)) { for(int i = 0; i < listTabs.size(); i++) delete m_listPostsTabMap.take(tab); } - for(QQPostDisplayFilter *df : m_listpostDisplayFilters) + for(QQPostDisplayFilter *df : qAsConst(m_listpostDisplayFilters)) { if(df != nullptr) delete df; @@ -354,7 +354,7 @@ void QQPinipede::purgePinitabHistory(const QString & groupName) } // Purge de l'historique interne des bouchots - for(QString boardName : purgedBoards) + for(const QString &boardName : purgedBoards) { QQBouchot * board = QQBouchot::bouchot(boardName); QApplication::postEvent(board, new QQPurgeBouchotHistoEvent()); @@ -390,7 +390,7 @@ void QQPinipede::tabEventsAcknowledged(const QString& groupName) setTabText(indexOf(textBrowser), groupName); QList listBouchots = QQBouchot::listBouchotsGroup(groupName); - for(QQBouchot *b : listBouchots) + for(QQBouchot *b : qAsConst(listBouchots)) b->resetStatus(); } @@ -415,9 +415,9 @@ void QQPinipede::bigorNotify(QString &srcBouchot, QString &poster, bool global) { QString msg; if(global) - msg = QString(tr("%1 called everyone on %2 board")).arg(poster).arg(srcBouchot); + msg = QString(tr("%1 called everyone on %2 board")).arg(poster, srcBouchot); else - msg = QString(tr("%1 called you on %2 board")).arg(poster).arg(srcBouchot); + msg = QString(tr("%1 called you on %2 board")).arg(poster, srcBouchot); QList argumentList; argumentList << NOTIF_APP_NAME;// app_name @@ -452,7 +452,8 @@ void QQPinipede::searchText(const QString &text, bool forward) QQSettings settings; QColor color(settings.value(SETTINGS_GENERAL_HIGHLIGHT_COLOR, DEFAULT_GENERAL_HIGHLIGHT_COLOR).toString()); - for(QQTextBrowser *textBrowser : m_textBrowserHash.values()) + auto textBrowsers = m_textBrowserHash.values(); + for(QQTextBrowser *textBrowser : qAsConst(textBrowsers)) { if(! textBrowser->isVisible()) continue; @@ -460,9 +461,12 @@ void QQPinipede::searchText(const QString &text, bool forward) QTextDocument *doc = textBrowser->document(); QTextCursor cursor = textBrowser->textCursor(); +#if QT_VERSION >= QT_VERSION_CHECK(5, 15, 0) + QTextDocument::FindFlags flags; +#else QTextDocument::FindFlags flags = nullptr; - if(! forward) - flags |= QTextDocument::FindBackward; +#endif + flags.setFlag(QTextDocument::FindBackward, ! forward); QTextCursor findCursor = doc->find(text, cursor, flags); @@ -559,7 +563,8 @@ void QQPinipede::duckKilled(QString board, QString postId) { QQBouchot *bouchotDest = QQBouchot::bouchot(board); QString message; - for(QQPost *post : bouchotDest->postsHistory()) + auto posts = bouchotDest->postsHistory(); + for(QQPost *post : qAsConst(posts)) { if(post->id() == postId) { @@ -853,7 +858,8 @@ void QQPinipede::norlogeRefHovered(QQNorlogeRef norlogeRef) void QQPinipede::unHighlight(QQTextBrowser *tBrowser) { m_hiddenPostViewerLabel->hide(); - for(QTextEdit::ExtraSelection extra : tBrowser->extraSelections()) + auto extraSelections = tBrowser->extraSelections(); + for(QTextEdit::ExtraSelection extra : qAsConst(extraSelections)) { if(! extra.cursor.hasSelection()) //fulll block { @@ -897,7 +903,7 @@ void QQPinipede::setTotozManager(QQTotozManager * ttManager) if(m_totozManager != nullptr) { - for(QQTextBrowser *tb : m_textBrowserHash.values()) + for(QQTextBrowser *tb : qAsConst(m_textBrowserHash)) { connect(tb, SIGNAL(totozBookmarkAct(QString,QQTotoz::TotozBookmarkAction)), m_totozManager, SLOT(totozBookmarkDo(QString,QQTotoz::TotozBookmarkAction))); @@ -931,7 +937,7 @@ bool QQPinipede::applyPostDisplayFilters(QQPost *post) if(! post->bouchot()->isVisible()) return false; - for(QQPostDisplayFilter *filter : m_listpostDisplayFilters) + for(QQPostDisplayFilter *filter : qAsConst(m_listpostDisplayFilters)) { if(filter->filterMatch(post)) return false; @@ -981,7 +987,8 @@ void QQPinipede::newPostsAvailable(QString groupName) QQTextBrowser *textBrowser = m_textBrowserHash.value(groupName); QQListPostPtr newPosts; - for(QQBouchot *b : QQBouchot::listBouchotsGroup(groupName)) + auto bouchots = QQBouchot::listBouchotsGroup(groupName); + for(QQBouchot *b : qAsConst(bouchots)) { QQListPostPtr newPostsBouchot = b->takeNewPosts(); if(newPostsBouchot.size() > 0) @@ -1195,8 +1202,7 @@ bool QQPinipede::printPostAtCursor(QTextCursor &cursor, QQPost *post) QQNorlogeRef nRef = QQNorlogeRef(*post); int index = data->appendNorlogeRef(nRef); QString nRefUrl = QString("nref://bouchot?board=%1&postId=%2&index=%3") - .arg(post->bouchot()->name()) - .arg(post->id()).arg(index); + .arg(post->bouchot()->name(), post->id(), QString::number(index)); norlogeFormat.setAnchorHref(nRefUrl); QString txt = post->norlogeFormatee(); diff --git a/ui/qqsettingsmanager.cpp b/ui/qqsettingsmanager.cpp index 194cf22..3c7961e 100644 --- a/ui/qqsettingsmanager.cpp +++ b/ui/qqsettingsmanager.cpp @@ -473,7 +473,7 @@ void QQSettingsManager::savePalmiSettings(QQSettings &settings) bool palmiDockedStatusChanged = (oldState != isPalmiDocked); if(palmiMinimizedStatusChanged || palmiDockedStatusChanged) - palmiStatusChanged(isPalmiMini, isPalmiDocked); + emit palmiStatusChanged(isPalmiMini, isPalmiDocked); //Palmi short norlogeds bool isShortNorlogesEnabled = m_palmiSettingsW->isShortNorlogesEnabled(); diff --git a/ui/qqsettingsmanager.ui b/ui/qqsettingsmanager.ui index cb1c706..dde97b3 100644 --- a/ui/qqsettingsmanager.ui +++ b/ui/qqsettingsmanager.ui @@ -17,7 +17,7 @@ - Dialog + Quteqoin settings diff --git a/ui/qqtotozmanager.cpp b/ui/qqtotozmanager.cpp index cef9b50..c662ca2 100644 --- a/ui/qqtotozmanager.cpp +++ b/ui/qqtotozmanager.cpp @@ -517,14 +517,19 @@ void QQTotozManager::updateEmojiViewer(const QList &emojis) QVBoxLayout *layout = new QVBoxLayout(widget); layout->setContentsMargins(0, 0, 0, 0); + QQSettings settings; + QFont piniFont; + piniFont.fromString(settings.value(SETTINGS_GENERAL_DEFAULT_FONT, DEFAULT_GENERAL_DEFAULT_FONT).toString()); + foreach (QQEmojiDef d, emojis) { QPushButton *b = new QPushButton(widget); b->setFlat(true); - b->setStyleSheet("QPushButton {text-align: left; font-size: 12px}"); + b->setStyleSheet("QPushButton {text-align: left}"); b->setProperty(EMOJI_SYMBOL, d.symbol); b->setProperty(EMOJI_IS_CAT, d.type == CAT); b->setText(QString(d.symbol).append(" ").append(d.name)); + b->setFont(piniFont); connect(b, SIGNAL(clicked(bool)), this, SLOT(emojiSelected())); layout->addWidget(b); } diff --git a/ui/qqtotozviewer.cpp b/ui/qqtotozviewer.cpp index 9a8cc60..2cb4b03 100644 --- a/ui/qqtotozviewer.cpp +++ b/ui/qqtotozviewer.cpp @@ -126,8 +126,8 @@ void QQTotozViewer::handleInvalidTotozData() { m_hasfailed = true; // to prevent infinite loops - connect(m_downloader, SIGNAL(fetchTotozFinished(QString &, bool, QString &)), - this, SLOT(totozAvailable(QString &, bool, QString &))); + connect(m_downloader, SIGNAL(fetchTotozFinished(QString&,bool,QString&)), + this, SLOT(totozAvailable(QString&,bool,QString&))); m_downloader->fetchTotoz(m_totozId); } else diff --git a/ui/settingsmanager/qqboardssettings.cpp b/ui/settingsmanager/qqboardssettings.cpp index 8ad97d2..85b572b 100644 --- a/ui/settingsmanager/qqboardssettings.cpp +++ b/ui/settingsmanager/qqboardssettings.cpp @@ -8,11 +8,11 @@ #include QQBoardsSettings::QQBoardsSettings(QWidget *parent) : - QWidget(parent), - ui(new Ui::QQBoardsSettings) + QWidget(parent), + ui(new Ui::QQBoardsSettings) { ui->setupUi(this); - ui->bouchotListView->setModel(new QStringListModel()); + ui->bouchotListView->setModel(new QStringListModel(this)); ui->bouchotListView->setEditTriggers(QAbstractItemView::NoEditTriggers); #ifndef Q_OS_UNIX diff --git a/ui/settingsmanager/qqgeneralsettings.cpp b/ui/settingsmanager/qqgeneralsettings.cpp index 44b2164..dd6151f 100644 --- a/ui/settingsmanager/qqgeneralsettings.cpp +++ b/ui/settingsmanager/qqgeneralsettings.cpp @@ -16,8 +16,8 @@ QQGeneralSettings::QQGeneralSettings(QWidget *parent) : QValidator *validator = new QIntValidator(1, INT_MAX, this); ui->maxHistLineEdit->setValidator(validator); - connect(ui->fontFamComboB, SIGNAL(currentFontChanged(const QFont &)), - this, SLOT(fontChanged(const QFont &))); + connect(ui->fontFamComboB, SIGNAL(currentFontChanged(QFont)), + this, SLOT(fontChanged(QFont))); connect(ui->fontSizeComboB, SIGNAL(activated(int)), this, SLOT(fontSizeChanged(int))); connect(ui->colorChooserPB, SIGNAL(clicked(bool)), diff --git a/ui/settingsmanager/qqgeneralsettings.h b/ui/settingsmanager/qqgeneralsettings.h index 51e48be..2cd8a52 100644 --- a/ui/settingsmanager/qqgeneralsettings.h +++ b/ui/settingsmanager/qqgeneralsettings.h @@ -10,7 +10,6 @@ class QQGeneralSettings; class QQGeneralSettings : public QWidget { Q_OBJECT - Q_PROPERTY(QFont m_defaultFont READ defaultFont WRITE setDefaultFont) public: explicit QQGeneralSettings(QWidget *parent = 0); diff --git a/ui/settingsmanager/qqpalmisettingstablewidget.cpp b/ui/settingsmanager/qqpalmisettingstablewidget.cpp index 8497163..59b241a 100644 --- a/ui/settingsmanager/qqpalmisettingstablewidget.cpp +++ b/ui/settingsmanager/qqpalmisettingstablewidget.cpp @@ -21,7 +21,7 @@ ///////////////////////////////////////////////////////////////////////////////////////////// /// QQKeyboardShortcutInput::QQKeyboardShortcutInput(QWidget *parent) : - QWidget(parent) + QWidget(parent) { setupUi(); } @@ -105,7 +105,7 @@ void QQKeyboardShortcutDataItem::setData(int role, const QVariant &value) value.canConvert()) { QString oldEditRoleData = m_editRoleData; - m_editRoleData = value.toString().left(1); + m_editRoleData = value.toString().at(0); QString longStr = QString(SHORTCUT_PREFIX); if(m_editRoleData == QString(" ")) longStr.append("Space"); @@ -137,7 +137,7 @@ QVariant QQKeyboardShortcutDataItem::data(int role) const ///////////////////////////////////////////////////////////////////////////////////////////// QQPalmiSettingsTableWidget::QQPalmiSettingsTableWidget(QWidget *parent) : - QTableWidget(parent) + QTableWidget(parent) { m_hasLastLine = false; m_mmapKeys.clear(); @@ -165,9 +165,9 @@ void QQPalmiSettingsTableWidget::appendStaticRow(const QChar &key, const QString kbSItem->setData(Qt::DisplayRole, QString(SHORTCUT_PREFIX).append(key)); kbSItem->setData(Qt::ToolTipRole, QString(SHORTCUT_PREFIX).append(key)); kbSItem->setFlags( - kbSItem->flags() - & ~Qt::ItemIsEnabled - & ~Qt::ItemIsTristate); + kbSItem->flags() + & ~Qt::ItemIsEnabled + & ~Qt::ItemIsTristate); m_mmapKeys.insert(key, kbSItem); setItem(currRow, SHORTCUT_COLUMN, kbSItem); @@ -176,9 +176,9 @@ void QQPalmiSettingsTableWidget::appendStaticRow(const QChar &key, const QString item->setData(Qt::DisplayRole, value); item->setData(Qt::ToolTipRole, value); item->setFlags( - item->flags() - & ~Qt::ItemIsEnabled - & ~Qt::ItemIsTristate); + item->flags() + & ~Qt::ItemIsEnabled + & ~Qt::ItemIsTristate); setItem(currRow, TEXT_COLUMN, item); } @@ -243,30 +243,30 @@ int QQPalmiSettingsTableWidget::appendEmptyUserRow() // 2nd Col QQKeyboardShortcutDataItem *kbSItem = new QQKeyboardShortcutDataItem(); kbSItem->setFlags( - kbSItem->flags() - | Qt::ItemIsDragEnabled - | Qt::ItemIsEditable - | Qt::ItemIsSelectable - | Qt::ItemIsEditable - | Qt::ItemIsEnabled); + kbSItem->flags() + | Qt::ItemIsDragEnabled + | Qt::ItemIsEditable + | Qt::ItemIsSelectable + | Qt::ItemIsEditable + | Qt::ItemIsEnabled); kbSItem->setFlags( - kbSItem->flags() - & ~Qt::ItemIsTristate - & ~Qt::ItemIsUserCheckable); + kbSItem->flags() + & ~Qt::ItemIsTristate + & ~Qt::ItemIsUserCheckable); setItem(currRow, SHORTCUT_COLUMN, kbSItem); // 3nd Col QTableWidgetItem *twItem = new QTableWidgetItem(""); twItem->setFlags( - twItem->flags() - | Qt::ItemIsDragEnabled - | Qt::ItemIsSelectable - | Qt::ItemIsEditable - | Qt::ItemIsEnabled); + twItem->flags() + | Qt::ItemIsDragEnabled + | Qt::ItemIsSelectable + | Qt::ItemIsEditable + | Qt::ItemIsEnabled); twItem->setFlags( - twItem->flags() - & ~Qt::ItemIsTristate - & ~Qt::ItemIsUserCheckable); + twItem->flags() + & ~Qt::ItemIsTristate + & ~Qt::ItemIsUserCheckable); setItem(currRow, TEXT_COLUMN, twItem); return currRow; @@ -296,7 +296,7 @@ void QQPalmiSettingsTableWidget::handleRemoveRowClicked() m_mmapKeys.remove(key, (QQKeyboardShortcutDataItem *) twItem); if(m_mmapKeys.count(key) == 1) //It was a multiple occurence, but not anymore { - QTableWidgetItem *tItem = m_mmapKeys.values(key).at(0); + QTableWidgetItem *tItem = m_mmapKeys.values(key).constFirst(); if(tItem->flags() & Qt::ItemIsEnabled) tItem->setForeground(Qt::black); } @@ -310,7 +310,7 @@ void QQPalmiSettingsTableWidget::keyChanged(QChar oldKey, QChar newKey, QTableWi m_mmapKeys.remove(oldKey, (QQKeyboardShortcutDataItem *) item); if(m_mmapKeys.count(oldKey) == 1) //It was a multiple occurence, but not anymore { - QTableWidgetItem *tItem = m_mmapKeys.values(oldKey).at(0); + QTableWidgetItem *tItem = m_mmapKeys.values(oldKey).constFirst(); if(tItem->flags() & Qt::ItemIsEnabled) tItem->setForeground(Qt::black); } diff --git a/ui/settingsmanager/qqtotozsettings.h b/ui/settingsmanager/qqtotozsettings.h index b865bdb..c2ca4f2 100644 --- a/ui/settingsmanager/qqtotozsettings.h +++ b/ui/settingsmanager/qqtotozsettings.h @@ -10,13 +10,6 @@ class QQTotozSettings; class QQTotozSettings : public QWidget { Q_OBJECT - Q_PROPERTY(QString m_totozServerURL READ totozServerURL WRITE setTotozServerURL) - Q_PROPERTY(QString m_totozBaseImgUrl READ totozBaseImgUrl WRITE setTotozBaseImgUrl) - Q_PROPERTY(QString m_totozNameSuffix READ totozNameSuffix WRITE setTotozNameSuffix) - Q_PROPERTY(bool m_totozAllowSearch READ totozAllowSearch WRITE setTotozAllowSearch) - Q_PROPERTY(QString m_totozQueryPattern READ totozQueryPattern WRITE setTotozQueryPattern) - Q_PROPERTY(QString m_totozVisualMode READ totozVisualMode WRITE setTotozVisualMode) - public: explicit QQTotozSettings(QWidget *parent = 0); diff --git a/ui/settingsmanager/qqtotozsettings.ui b/ui/settingsmanager/qqtotozsettings.ui index ff86921..a67e253 100644 --- a/ui/settingsmanager/qqtotozsettings.ui +++ b/ui/settingsmanager/qqtotozsettings.ui @@ -6,8 +6,8 @@ 0 0 - 400 - 300 + 427 + 403 @@ -56,8 +56,15 @@ 0 - - + + + + Totoz server : + + + + + @@ -66,13 +73,19 @@ - - + + + + + - + Totoz name Suffix ; + + + @@ -80,26 +93,13 @@ - - - - - - - Totoz server : - - - - - + + - Totoz name Suffix ; + - - - @@ -110,53 +110,23 @@ - - - - - - - 4 - - - 0 - - - Qt::Horizontal - - - - - - - - 0 - 0 - - - - - 0 - - - 0 - - - 0 - - - 0 - - - + + - Use preset : + Use Preset : - + + + + + Qt::Horizontal + + + @@ -174,52 +144,46 @@ - - - - 0 - 0 - - + - Display mode + Display mode : - - - 6 - - - 6 - + - 0 + 3 - 0 + 3 - 0 + 3 - 0 + 3 - - + + - + 0 0 - - - - Totoz visual mode : + + + + + 0 + 0 + + + +