mirror of
https://bitbucket.org/smil3y/kde-extraapps.git
synced 2025-02-24 19:02:53 +00:00
174 lines
5.1 KiB
C++
174 lines
5.1 KiB
C++
/*
|
|
* Copyright 2008 Aaron Seigo <aseigo@kde.org>
|
|
* Copyright 2012 Sebastian Kügler <sebas@kde.org>
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU Library General Public License as
|
|
* published by the Free Software Foundation; either version 2 or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details
|
|
*
|
|
* You should have received a copy of the GNU Library General Public
|
|
* License along with this program; if not, write to the
|
|
* Free Software Foundation, Inc.,
|
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
*/
|
|
|
|
#include "usersource.h"
|
|
|
|
|
|
#include <KIO/Job>
|
|
|
|
#include <qjson/parser.h>
|
|
#include <QXmlStreamReader>
|
|
|
|
class UserSourcePrivate {
|
|
|
|
public:
|
|
UserSourcePrivate()
|
|
{
|
|
}
|
|
|
|
QString user;
|
|
QString serviceBaseUrl;
|
|
};
|
|
|
|
UserSource::UserSource(const QString &who, const QString &serviceBaseUrl, QObject* parent)
|
|
: Plasma::DataContainer(parent),
|
|
m_user(who),
|
|
m_serviceBaseUrl(serviceBaseUrl)
|
|
{
|
|
d = new UserSourcePrivate();
|
|
d->user = who;
|
|
d->serviceBaseUrl = serviceBaseUrl;
|
|
setObjectName(QLatin1String("User"));
|
|
//emit loadImage(who, KUrl());
|
|
}
|
|
|
|
UserSource::~UserSource()
|
|
{
|
|
}
|
|
|
|
void UserSource::loadUserInfo(const QString &who, const QString &serviceBaseUrl)
|
|
{
|
|
if (who.isEmpty() || serviceBaseUrl.isEmpty()) {
|
|
return;
|
|
}
|
|
|
|
QString _s = serviceBaseUrl;
|
|
if (!_s.endsWith('/')) {
|
|
_s.append('/');
|
|
}
|
|
//const QString u = _s + "users/show/" + who + ".xml";
|
|
const QString u = _s + "users/show/" + who + ".json";
|
|
if (m_currentUrl == u) {
|
|
return;
|
|
}
|
|
m_currentUrl = u;
|
|
// kDebug() << "Requesting user info for " << who << " from ... " << u;
|
|
//return;
|
|
//m_runningJobs++;
|
|
// kDebug() << "NEW JOB." << who << u;
|
|
KIO::Job *job = KIO::get(u, KIO::NoReload, KIO::HideProgressInfo);
|
|
job->setAutoDelete(true);
|
|
m_jobs[job] = who;
|
|
connect(job, SIGNAL(data(KIO::Job*,QByteArray)),
|
|
this, SLOT(recv(KIO::Job*,QByteArray)));
|
|
connect(job, SIGNAL(result(KJob*)), this, SLOT(result(KJob*)));
|
|
}
|
|
|
|
void UserSource::recv(KIO::Job* job, const QByteArray& data)
|
|
{
|
|
KIO::TransferJob* kiojob = dynamic_cast<KIO::TransferJob*>(job);
|
|
if (kiojob->url().pathOrUrl() == m_currentUrl) {
|
|
// Only consider the last job started, discard others.
|
|
m_xml += data;
|
|
} else {
|
|
kDebug() << "Discarding data of job" << kiojob->url().pathOrUrl();
|
|
}
|
|
}
|
|
|
|
void UserSource::result(KJob *job)
|
|
{
|
|
if (!m_jobs.contains(job)) {
|
|
return;
|
|
}
|
|
// kDebug() << "job returned" << m_currentUrl;
|
|
KIO::TransferJob* kiojob = dynamic_cast<KIO::TransferJob*>(job);
|
|
//const QString cacheKey = who + "@" + kiojob->url().pathOrUrl();
|
|
if (kiojob->url().pathOrUrl() == m_currentUrl) {
|
|
// Only consider the last job started, discard others.
|
|
if (job->error()) {
|
|
// TODO: error handling
|
|
} else {
|
|
if (kiojob->url().pathOrUrl().contains(".json")) {
|
|
//kDebug() << "parseJson ..." << m_xml;
|
|
parse(m_xml);
|
|
} else {
|
|
// QXmlStreamReader reader(m_xml);
|
|
// parse(reader);
|
|
}
|
|
checkForUpdate();
|
|
m_xml.clear();
|
|
}
|
|
} else {
|
|
kDebug() << "Discarding results of job" << kiojob->url().pathOrUrl() << m_currentUrl;
|
|
}
|
|
m_jobs.remove(job);
|
|
m_jobData.remove(job);
|
|
checkForUpdate();
|
|
}
|
|
|
|
void UserSource::parse(const QByteArray& jsonData)
|
|
{
|
|
// kDebug() << "User parse()" << jsonData;
|
|
QJson::Parser parser;
|
|
//const QVariantList resultsList = parser.parse(data).toList();
|
|
const QVariant &user = parser.parse(jsonData);
|
|
parseJson(user);
|
|
}
|
|
|
|
void UserSource::parseJson(const QVariant &data)
|
|
{
|
|
const QVariantMap &user = data.toMap();
|
|
foreach (const QVariant &k, user.keys()) {
|
|
const QString _k = k.toString();
|
|
// Exclude last status update for now, would be a QVariantMap though
|
|
if (_k != "status") {
|
|
setData(k.toString(), user[_k]);
|
|
}
|
|
}
|
|
|
|
// compatibility with old API
|
|
setData("User", user["screen_name"]);
|
|
if (user["name"].toString().isEmpty()) {
|
|
kDebug() << "empty real name" << user["screen_name"].toString() << user;
|
|
setData("realName", user["screen_name"]);
|
|
|
|
} else {
|
|
setData("realName", user["name"]);
|
|
// kDebug() << " user: " << user["name"].toString();
|
|
|
|
}
|
|
const QString imgUrl = user["profile_image_url"].toString();
|
|
const QString userName = user["screen_name"].toString();
|
|
setData("ImageUrl", imgUrl);
|
|
if (!imgUrl.isEmpty()) {
|
|
// kDebug() << "Got image url for: " << userName << imgUrl;
|
|
emit loadImage(userName, KUrl(imgUrl));
|
|
}
|
|
checkForUpdate();
|
|
}
|
|
|
|
void UserSource::parseJsonStatus(const QVariant& data)
|
|
{
|
|
Q_UNUSED(data);
|
|
}
|
|
|
|
|
|
#include <usersource.moc>
|
|
|