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"