7#include "gravatarresolvurljob.h"
10#include "gravatar_debug.h"
11#include "misc/gravatarcache.h"
14#include <QCryptographicHash>
15#include <QNetworkInformation>
16#include <QNetworkReply>
19using namespace Gravatar;
21class Gravatar::GravatarResolvUrlJobPrivate
24 GravatarResolvUrlJobPrivate() =
default;
28 QNetworkAccessManager *mNetworkAccessManager =
nullptr;
36 int mBackends = Gravatar;
38 bool mHasGravatar =
false;
39 bool mUseDefaultPixmap =
false;
42GravatarResolvUrlJob::GravatarResolvUrlJob(
QObject *parent)
44 , d(new Gravatar::GravatarResolvUrlJobPrivate)
49GravatarResolvUrlJob::~GravatarResolvUrlJob() =
default;
51bool GravatarResolvUrlJob::canStart()
const
54 info && (info->reachability() != QNetworkInformation::Reachability::Online || info->isBehindCaptivePortal())) {
59 return !d->mEmail.trimmed().isEmpty() && (d->mEmail.contains(QLatin1Char(
'@')));
62QUrl GravatarResolvUrlJob::generateGravatarUrl(
bool useLibravatar)
64 return createUrl(useLibravatar);
67bool GravatarResolvUrlJob::hasGravatar()
const
69 return d->mHasGravatar;
72void GravatarResolvUrlJob::startNetworkManager(
const QUrl &url)
74 if (!d->mNetworkAccessManager) {
75 d->mNetworkAccessManager =
new QNetworkAccessManager(
this);
77 d->mNetworkAccessManager->setStrictTransportSecurityEnabled(
true);
78 d->mNetworkAccessManager->enableStrictTransportSecurityStore(
true);
82 QNetworkRequest req(url);
85 d->mNetworkAccessManager->get(req);
88void GravatarResolvUrlJob::start()
90 if (d->mBackends == GravatarResolvUrlJobPrivate::None) {
91 d->mBackends = GravatarResolvUrlJobPrivate::Gravatar;
94 d->mHasGravatar =
false;
98 qCDebug(GRAVATAR_LOG) <<
"Gravatar can not start";
103void GravatarResolvUrlJob::processNextBackend()
105 if (d->mHasGravatar || d->mBackends == GravatarResolvUrlJobPrivate::None) {
112 if (d->mBackends & GravatarResolvUrlJobPrivate::Libravatar) {
113 d->mBackends &= ~GravatarResolvUrlJobPrivate::Libravatar;
114 url = createUrl(
true);
115 }
else if (d->mBackends & GravatarResolvUrlJobPrivate::Gravatar) {
116 d->mBackends &= ~GravatarResolvUrlJobPrivate::Gravatar;
117 url = createUrl(
false);
122 if (!cacheLookup(d->mCalculatedHash)) {
123 startNetworkManager(url);
125 processNextBackend();
129void GravatarResolvUrlJob::slotFinishLoadPixmap(QNetworkReply *reply)
132 const QByteArray data = reply->
readAll();
133 d->mPixmap.loadFromData(data);
134 d->mHasGravatar =
true;
136 if (!d->mUseDefaultPixmap) {
137 GravatarCache::self()->saveGravatarPixmap(d->mCalculatedHash, d->mPixmap);
141 GravatarCache::self()->saveMissingGravatar(d->mCalculatedHash);
148 processNextBackend();
151QString GravatarResolvUrlJob::email()
const
156void GravatarResolvUrlJob::setEmail(
const QString &email)
161Hash GravatarResolvUrlJob::calculateHash()
163 const auto email = d->mEmail.toLower().toUtf8();
167bool GravatarResolvUrlJob::fallbackGravatar()
const
169 return d->mBackends & GravatarResolvUrlJobPrivate::Gravatar;
172void GravatarResolvUrlJob::setFallbackGravatar(
bool fallbackGravatar)
174 if (fallbackGravatar) {
175 d->mBackends |= GravatarResolvUrlJobPrivate::Gravatar;
177 d->mBackends &= ~GravatarResolvUrlJobPrivate::Gravatar;
181bool GravatarResolvUrlJob::useLibravatar()
const
183 return d->mBackends & GravatarResolvUrlJobPrivate::Libravatar;
186void GravatarResolvUrlJob::setUseLibravatar(
bool useLibravatar)
189 d->mBackends |= GravatarResolvUrlJobPrivate::Libravatar;
191 d->mBackends &= ~GravatarResolvUrlJobPrivate::Libravatar;
195bool GravatarResolvUrlJob::useDefaultPixmap()
const
197 return d->mUseDefaultPixmap;
200void GravatarResolvUrlJob::setUseDefaultPixmap(
bool useDefaultPixmap)
202 d->mUseDefaultPixmap = useDefaultPixmap;
205int GravatarResolvUrlJob::size()
const
210QPixmap GravatarResolvUrlJob::pixmap()
const
215void GravatarResolvUrlJob::setSize(
int size)
219 }
else if (size > 2048) {
225Hash GravatarResolvUrlJob::calculatedHash()
const
227 return d->mCalculatedHash;
230QUrl GravatarResolvUrlJob::createUrl(
bool useLibravatar)
233 d->mCalculatedHash = Hash();
238 if (!d->mUseDefaultPixmap) {
240 query.addQueryItem(QStringLiteral(
"d"), QStringLiteral(
"404"));
242 if (d->mSize != 80) {
247 url.
setHost(QStringLiteral(
"seccdn.libravatar.org"));
249 url.
setHost(QStringLiteral(
"secure.gravatar.com"));
251 d->mCalculatedHash = calculateHash();
252 url.
setPath(
"/avatar/"_L1 + d->mCalculatedHash.hexString());
257bool GravatarResolvUrlJob::cacheLookup(
const Hash &hash)
259 bool haveStoredPixmap =
false;
260 const QPixmap pix = GravatarCache::self()->loadGravatarPixmap(hash, haveStoredPixmap);
261 if (haveStoredPixmap && !pix.
isNull()) {
263 d->mHasGravatar =
true;
268 return haveStoredPixmap;
271#include "moc_gravatarresolvurljob.cpp"
std::optional< QSqlQuery > query(const QString &queryStatement)
QByteArray hash(QByteArrayView data, Algorithm method)
QString errorString() const const
void finished(QNetworkReply *reply)
NetworkError error() const const
QNetworkRequest request() const const
HttpPipeliningAllowedAttribute
QMetaObject::Connection connect(const QObject *sender, PointerToMemberFunction signal, Functor functor)
bool isNull() const const
QString number(double n, char format, int precision)
void setHost(const QString &host, ParsingMode mode)
void setPath(const QString &path, ParsingMode mode)
void setQuery(const QString &query, ParsingMode mode)
void setScheme(const QString &scheme)