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 Andrey Esin <gmlastik@gmail.com> 0005 0006 SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL 0007 0008 */ 0009 0010 #include "twitgoo.h" 0011 0012 #include <QDebug> 0013 #include <QJsonDocument> 0014 0015 #include <KIO/StoredTransferJob> 0016 #include <KPluginFactory> 0017 0018 #include "accountmanager.h" 0019 #include "mediamanager.h" 0020 #include "passwordmanager.h" 0021 0022 #include "twitterapiaccount.h" 0023 #include "twitterapimicroblog.h" 0024 0025 #include "twitgoosettings.h" 0026 0027 K_PLUGIN_CLASS_WITH_JSON(Twitgoo, "choqok_twitgoo.json") 0028 0029 Twitgoo::Twitgoo(QObject *parent, const QList<QVariant> &) 0030 : Choqok::Uploader(QLatin1String("choqok_twitgoo"), parent) 0031 { 0032 } 0033 0034 Twitgoo::~Twitgoo() 0035 { 0036 } 0037 0038 void Twitgoo::upload(const QUrl &localUrl, const QByteArray &medium, const QByteArray &mediumType) 0039 { 0040 TwitgooSettings::self()->load(); 0041 QString alias = TwitgooSettings::alias(); 0042 if (alias.isEmpty()) { 0043 qCritical() << "No account to use"; 0044 Q_EMIT uploadingFailed(localUrl, i18n("There is no Twitter account configured to use.")); 0045 return; 0046 } 0047 TwitterApiAccount *acc = qobject_cast<TwitterApiAccount *> (Choqok::AccountManager::self()->findAccount(alias)); 0048 if (!acc) { 0049 return; 0050 } 0051 0052 QUrl url(QLatin1String("http://twitgoo.com/api/upload")); 0053 0054 QMap<QString, QByteArray> formdata; 0055 formdata[QLatin1String("source")] = QCoreApplication::applicationName().toLatin1(); 0056 formdata[QLatin1String("format")] = "json"; 0057 0058 QMap<QString, QByteArray> mediafile; 0059 mediafile[QLatin1String("name")] = "media"; 0060 mediafile[QLatin1String("filename")] = localUrl.fileName().toUtf8(); 0061 mediafile[QLatin1String("mediumType")] = mediumType; 0062 mediafile[QLatin1String("medium")] = medium; 0063 QList< QMap<QString, QByteArray> > listMediafiles; 0064 listMediafiles.append(mediafile); 0065 0066 QByteArray data = Choqok::MediaManager::createMultipartFormData(formdata, listMediafiles); 0067 0068 KIO::StoredTransferJob *job = KIO::storedHttpPost(data, url, KIO::HideProgressInfo) ; 0069 job->addMetaData(QStringLiteral("customHTTPHeader"), 0070 QStringLiteral("X-Auth-Service-Provider: https://api.twitter.com/1/account/verify_credentials.json")); 0071 QUrl requrl(QLatin1String("https://api.twitter.com/1/account/verify_credentials.json")); 0072 QByteArray credentials = acc->oauthInterface()->authorizationHeader(requrl, QNetworkAccessManager::GetOperation); 0073 job->addMetaData(QStringLiteral("customHTTPHeader"), 0074 QStringLiteral("X-Verify-Credentials-Authorization: ") + QLatin1String(credentials)); 0075 if (!job) { 0076 qCritical() << "Cannot create a http POST request!"; 0077 return; 0078 } 0079 job->addMetaData(QStringLiteral("content-type"), 0080 QStringLiteral("Content-Type: multipart/form-data; boundary=AaB03x")); 0081 mUrlMap[job] = localUrl; 0082 connect(job, &KIO::StoredTransferJob::result, this, &Twitgoo::slotUpload); 0083 job->start(); 0084 } 0085 0086 void Twitgoo::slotUpload(KJob *job) 0087 { 0088 QUrl localUrl = mUrlMap.take(job); 0089 if (job->error()) { 0090 qCritical() << "Job Error:" << job->errorString(); 0091 Q_EMIT uploadingFailed(localUrl, job->errorString()); 0092 return; 0093 } else { 0094 KIO::StoredTransferJob *stj = qobject_cast<KIO::StoredTransferJob *>(job); 0095 //qDebug() << stj->data(); 0096 const QJsonDocument json = QJsonDocument::fromJson(stj->data()); 0097 if (!json.isNull()) { 0098 QVariantMap map = json.toVariant().toMap(); 0099 if (map.value(QLatin1String("status")) == QLatin1String("fail")) { 0100 QVariantMap err = map.value(QLatin1String("err")).toMap(); 0101 Q_EMIT uploadingFailed(localUrl, err.value(QLatin1String("err_msg")).toString()); 0102 } else if (map.value(QLatin1String("status")) == QLatin1String("ok")) { 0103 TwitgooSettings::self()->load(); 0104 QString val = TwitgooSettings::directLink() ? QLatin1String("imageurl") : QLatin1String("mediaurl"); 0105 Q_EMIT mediumUploaded(localUrl, map.value(val).toString()); 0106 } 0107 } else { 0108 Q_EMIT uploadingFailed(localUrl, i18n("Malformed response")); 0109 qWarning() << "Parse error:" << stj->data(); 0110 } 0111 } 0112 } 0113 0114 #include "moc_twitgoo.cpp" 0115 #include "twitgoo.moc"