7#include "gravatarresolvurljob.h"
10#include "gravatar_debug.h"
11#include "misc/gravatarcache.h"
13#include <PimCommon/NetworkManager>
15#include <QCryptographicHash>
16#include <QNetworkReply>
19using namespace Gravatar;
21class Gravatar::GravatarResolvUrlJobPrivate
24 GravatarResolvUrlJobPrivate() =
default;
31 enum Backend { None = 0x0, Libravatar = 0x1, Gravatar = 0x2 };
32 int mBackends = Gravatar;
34 bool mHasGravatar =
false;
35 bool mUseDefaultPixmap =
false;
38GravatarResolvUrlJob::GravatarResolvUrlJob(
QObject *parent)
40 , d(new Gravatar::GravatarResolvUrlJobPrivate)
44GravatarResolvUrlJob::~GravatarResolvUrlJob() =
default;
46bool GravatarResolvUrlJob::canStart()
const
48 if (PimCommon::NetworkManager::self()->isOnline()) {
50 return !d->mEmail.trimmed().isEmpty() && (d->mEmail.contains(
QLatin1Char(
'@')));
56QUrl GravatarResolvUrlJob::generateGravatarUrl(
bool useLibravatar)
58 return createUrl(useLibravatar);
61bool GravatarResolvUrlJob::hasGravatar()
const
63 return d->mHasGravatar;
66void GravatarResolvUrlJob::startNetworkManager(
const QUrl &url)
68 if (!d->mNetworkAccessManager) {
71 d->mNetworkAccessManager->setStrictTransportSecurityEnabled(
true);
72 d->mNetworkAccessManager->enableStrictTransportSecurityStore(
true);
79 d->mNetworkAccessManager->get(req);
82void GravatarResolvUrlJob::start()
84 if (d->mBackends == GravatarResolvUrlJobPrivate::None) {
85 d->mBackends = GravatarResolvUrlJobPrivate::Gravatar;
88 d->mHasGravatar =
false;
92 qCDebug(GRAVATAR_LOG) <<
"Gravatar can not start";
97void GravatarResolvUrlJob::processNextBackend()
99 if (d->mHasGravatar || d->mBackends == GravatarResolvUrlJobPrivate::None) {
106 if (d->mBackends & GravatarResolvUrlJobPrivate::Libravatar) {
107 d->mBackends &= ~GravatarResolvUrlJobPrivate::Libravatar;
108 url = createUrl(
true);
109 }
else if (d->mBackends & GravatarResolvUrlJobPrivate::Gravatar) {
110 d->mBackends &= ~GravatarResolvUrlJobPrivate::Gravatar;
111 url = createUrl(
false);
116 if (!cacheLookup(d->mCalculatedHash)) {
117 startNetworkManager(url);
119 processNextBackend();
123void GravatarResolvUrlJob::slotFinishLoadPixmap(
QNetworkReply *reply)
127 d->mPixmap.loadFromData(data);
128 d->mHasGravatar =
true;
130 if (!d->mUseDefaultPixmap) {
131 GravatarCache::self()->saveGravatarPixmap(d->mCalculatedHash, d->mPixmap);
135 GravatarCache::self()->saveMissingGravatar(d->mCalculatedHash);
142 processNextBackend();
145QString GravatarResolvUrlJob::email()
const
150void GravatarResolvUrlJob::setEmail(
const QString &email)
155Hash GravatarResolvUrlJob::calculateHash()
157 const auto email = d->mEmail.toLower().toUtf8();
161bool GravatarResolvUrlJob::fallbackGravatar()
const
163 return d->mBackends & GravatarResolvUrlJobPrivate::Gravatar;
166void GravatarResolvUrlJob::setFallbackGravatar(
bool fallbackGravatar)
168 if (fallbackGravatar) {
169 d->mBackends |= GravatarResolvUrlJobPrivate::Gravatar;
171 d->mBackends &= ~GravatarResolvUrlJobPrivate::Gravatar;
175bool GravatarResolvUrlJob::useLibravatar()
const
177 return d->mBackends & GravatarResolvUrlJobPrivate::Libravatar;
180void GravatarResolvUrlJob::setUseLibravatar(
bool useLibravatar)
183 d->mBackends |= GravatarResolvUrlJobPrivate::Libravatar;
185 d->mBackends &= ~GravatarResolvUrlJobPrivate::Libravatar;
189bool GravatarResolvUrlJob::useDefaultPixmap()
const
191 return d->mUseDefaultPixmap;
194void GravatarResolvUrlJob::setUseDefaultPixmap(
bool useDefaultPixmap)
196 d->mUseDefaultPixmap = useDefaultPixmap;
199int GravatarResolvUrlJob::size()
const
204QPixmap GravatarResolvUrlJob::pixmap()
const
209void GravatarResolvUrlJob::setSize(
int size)
213 }
else if (size > 2048) {
219Hash GravatarResolvUrlJob::calculatedHash()
const
221 return d->mCalculatedHash;
224QUrl GravatarResolvUrlJob::createUrl(
bool useLibravatar)
227 d->mCalculatedHash = Hash();
232 if (!d->mUseDefaultPixmap) {
234 query.addQueryItem(QStringLiteral(
"d"), QStringLiteral(
"404"));
236 if (d->mSize != 80) {
241 url.
setHost(QStringLiteral(
"seccdn.libravatar.org"));
243 url.
setHost(QStringLiteral(
"secure.gravatar.com"));
245 d->mCalculatedHash = calculateHash();
246 url.
setPath(
"/avatar/"_L1 + d->mCalculatedHash.hexString());
251bool GravatarResolvUrlJob::cacheLookup(
const Hash &hash)
253 bool haveStoredPixmap =
false;
254 const QPixmap pix = GravatarCache::self()->loadGravatarPixmap(hash, haveStoredPixmap);
255 if (haveStoredPixmap && !pix.
isNull()) {
257 d->mHasGravatar =
true;
262 return haveStoredPixmap;
265#include "moc_gravatarresolvurljob.cpp"
KSERVICE_EXPORT KService::List query(FilterFunc filterFunc)
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)