File indexing completed on 2024-05-12 04:57:45

0001 /*
0002     This file is part of Choqok, the KDE micro-blogging client
0003 
0004     SPDX-FileCopyrightText: 2010-2012 Mehrdad Momeny <mehrdad.momeny@gmail.com>
0005 
0006     SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0007 */
0008 
0009 #include "twitpic.h"
0010 
0011 #include <QJsonDocument>
0012 
0013 #include <KIO/StoredTransferJob>
0014 #include <KLocalizedString>
0015 #include <KPluginFactory>
0016 
0017 #include "accountmanager.h"
0018 #include "mediamanager.h"
0019 
0020 #include "twitterapiaccount.h"
0021 #include "twitterapimicroblog.h"
0022 
0023 #include "twitpicsettings.h"
0024 
0025 K_PLUGIN_CLASS_WITH_JSON(Twitpic, "choqok_twitpic.json")
0026 
0027 Twitpic::Twitpic(QObject *parent, const QList<QVariant> &)
0028     : Choqok::Uploader("choqok_twitpic", parent)
0029 {
0030 }
0031 
0032 Twitpic::~Twitpic()
0033 {
0034 }
0035 
0036 void Twitpic::upload(const QUrl &localUrl, const QByteArray &medium, const QByteArray &mediumType)
0037 {
0038     TwitpicSettings::self()->load();
0039     QString alias = TwitpicSettings::alias();
0040     if (alias.isEmpty()) {
0041         qCritical() << "No account to use";
0042         Q_EMIT uploadingFailed(localUrl, i18n("There is no Twitter account configured to use."));
0043         return;
0044     }
0045     TwitterApiAccount *acc = qobject_cast<TwitterApiAccount *>(Choqok::AccountManager::self()->findAccount(alias));
0046     if (!acc) {
0047         return;
0048     }
0049     ///Documentation: http://dev.twitpic.com/
0050     QUrl url("http://api.twitpic.com/2/upload.json");
0051 
0052     QMap<QString, QByteArray> formdata;
0053     formdata["key"] = "b66d1f2dc90b53ca1fcd75319cda0b72";
0054 
0055     QMap<QString, QByteArray> mediafile;
0056     mediafile["name"] = "media";
0057     mediafile["filename"] = localUrl.fileName().toUtf8();
0058     mediafile["mediumType"] = mediumType;
0059     mediafile["medium"] = medium;
0060     QList< QMap<QString, QByteArray> > listMediafiles;
0061     listMediafiles.append(mediafile);
0062 
0063     QByteArray data = Choqok::MediaManager::createMultipartFormData(formdata, listMediafiles);
0064 
0065     KIO::StoredTransferJob *job = KIO::storedHttpPost(data, url, KIO::HideProgressInfo) ;
0066     job->addMetaData(QStringLiteral("customHTTPHeader"),
0067                      QStringLiteral("X-Auth-Service-Provider: https://api.twitter.com/1/account/verify_credentials.json"));
0068     QOAuth::ParamMap params;
0069 //     params.insert("realm","http://api.twitter.com/");
0070     QString requrl = "https://api.twitter.com/1/account/verify_credentials.json";
0071     QByteArray credentials = acc->oauthInterface()->createParametersString(requrl,
0072                              QOAuth::GET, acc->oauthToken(),
0073                              acc->oauthTokenSecret(),
0074                              QOAuth::HMAC_SHA1,
0075                              params, QOAuth::ParseForHeaderArguments);
0076     credentials.insert(6, "realm=\"http://api.twitter.com/\",") ;
0077     //qDebug()<<credentials
0078     job->addMetaData(QStringLiteral("customHTTPHeader"),
0079                      QStringLiteral("X-Verify-Credentials-Authorization: ") +
0080                      credentials);
0081     if (!job) {
0082         qCritical() << "Cannot create a http POST request!";
0083         return;
0084     }
0085     job->addMetaData(QStringLiteral("content-type"),
0086                      QStringLiteral("Content-Type: multipart/form-data; boundary=AaB03x"));
0087     mUrlMap[job] = localUrl;
0088     connect(job, SIGNAL(result(KJob*)),
0089             SLOT(slotUpload(KJob*)));
0090     job->start();
0091 }
0092 
0093 void Twitpic::slotUpload(KJob *job)
0094 {
0095     QUrl localUrl = mUrlMap.take(job);
0096     if (job->error()) {
0097         qCritical() << "Job Error:" << job->errorString();
0098         Q_EMIT uploadingFailed(localUrl, job->errorString());
0099         return;
0100     } else {
0101         KIO::StoredTransferJob *stj = qobject_cast< KIO::StoredTransferJob * >(job);
0102         const QJsonDocument json = QJsonDocument::fromJson(stj->data());
0103         if (!json.isNull()) {
0104             const QVariantMap map = json.toVariant().toMap();
0105             if (map.contains("errors")) {
0106                 QVariantMap err = map.value("errors").toList()[0].toMap();
0107                 Q_EMIT uploadingFailed(localUrl, err.value("message").toString());
0108             } else {
0109                 Q_EMIT mediumUploaded(localUrl, map.value("url").toString());
0110             }
0111         } else {
0112             qWarning() << "Parse error:" << stj->data();
0113             Q_EMIT uploadingFailed(localUrl, i18n("Malformed response"));
0114         }
0115     }
0116 }
0117 
0118 #include "moc_twitpic.cpp"
0119 #include "twitpic.moc"