File indexing completed on 2025-03-09 03:54:51
0001 #include <QNetworkAccessManager> 0002 #include <QNetworkRequest> 0003 #include <QDesktopServices> 0004 #include <QDebug> 0005 0006 #include "tweeter.h" 0007 #include "o0globals.h" 0008 #include "o1requestor.h" 0009 #include "o0settingsstore.h" 0010 0011 const char O2_CONSUMER_KEY[] = "2vHeyIxjywIadjEhvbDpg"; 0012 const char O2_CONSUMER_SECRET[] = "Xfwe195Kp3ZpcCKgkYs7RKfugTm8EfpLkQvsKfX2vvs"; 0013 0014 const int localPort = 8888; 0015 0016 Tweeter::Tweeter(QObject *parent) : 0017 QObject(parent) { 0018 } 0019 0020 void Tweeter::doOAuth() { 0021 o1Twitter_ = new O1Twitter(this); 0022 o1Twitter_->setClientId(O2_CONSUMER_KEY); 0023 o1Twitter_->setClientSecret(O2_CONSUMER_SECRET); 0024 o1Twitter_->setLocalPort(localPort); 0025 0026 // Create a store object for writing the received tokens 0027 O0SettingsStore *store = new O0SettingsStore(O2_ENCRYPTION_KEY); 0028 store->setGroupKey("twitter"); 0029 o1Twitter_->setStore(store); 0030 0031 // Connect signals 0032 connect(o1Twitter_, SIGNAL(linkedChanged()), this, SLOT(onLinkedChanged())); 0033 connect(o1Twitter_, SIGNAL(linkingFailed()), this, SIGNAL(linkingFailed())); 0034 connect(o1Twitter_, SIGNAL(linkingSucceeded()), this, SLOT(onLinkingSucceeded())); 0035 connect(o1Twitter_, SIGNAL(openBrowser(QUrl)), this, SLOT(onOpenBrowser(QUrl))); 0036 connect(o1Twitter_, SIGNAL(closeBrowser()), this, SLOT(onCloseBrowser())); 0037 0038 qDebug() << "Starting OAuth..."; 0039 o1Twitter_->unlink(); // For the sake of this demo 0040 o1Twitter_->link(); 0041 } 0042 0043 void Tweeter::doXAuth(const QString &username, const QString &password) { 0044 oxTwitter_ = new OXTwitter(this); 0045 oxTwitter_->setClientId(O2_CONSUMER_KEY); 0046 oxTwitter_->setClientSecret(O2_CONSUMER_SECRET); 0047 oxTwitter_->setLocalPort(localPort); 0048 0049 oxTwitter_->setUsername(username); 0050 oxTwitter_->setPassword(password); 0051 0052 // Create a store object for writing the received tokens 0053 O0SettingsStore *store = new O0SettingsStore(O2_ENCRYPTION_KEY); 0054 store->setGroupKey("twitter"); 0055 oxTwitter_->setStore(store); 0056 0057 connect(oxTwitter_, SIGNAL(linkedChanged()), this, SLOT(onLinkedChanged())); 0058 connect(oxTwitter_, SIGNAL(linkingFailed()), this, SIGNAL(linkingFailed())); 0059 connect(oxTwitter_, SIGNAL(linkingSucceeded()), this, SLOT(onLinkingSucceeded())); 0060 connect(oxTwitter_, SIGNAL(openBrowser(QUrl)), this, SLOT(onOpenBrowser(QUrl))); 0061 connect(oxTwitter_, SIGNAL(closeBrowser()), this, SLOT(onCloseBrowser())); 0062 0063 qDebug() << "Starting XAuth..."; 0064 qDebug() << "Username:" << username << "Password:" << password; 0065 oxTwitter_->unlink(); // For the sake of this demo 0066 oxTwitter_->link(); 0067 } 0068 0069 void Tweeter::postStatusUpdate(const QString &message) { 0070 if (!o1Twitter_->linked()) { 0071 qWarning() << "Application is not linked to Twitter!"; 0072 emit statusPosted(); 0073 return; 0074 } 0075 0076 qDebug() << "Status update message:" << message.toLatin1().constData(); 0077 0078 QNetworkAccessManager* manager = new QNetworkAccessManager(this); 0079 O1Twitter* o1 = o1Twitter_; 0080 O1Requestor* requestor = new O1Requestor(manager, o1, this); 0081 0082 QByteArray paramName("status"); 0083 0084 QList<O0RequestParameter> reqParams = QList<O0RequestParameter>(); 0085 reqParams << O0RequestParameter(paramName, message.toLatin1()); 0086 0087 QByteArray postData = O1::createQueryParameters(reqParams); 0088 0089 QUrl url = QUrl("https://api.twitter.com/1.1/statuses/update.json"); 0090 0091 QNetworkRequest request(url); 0092 request.setHeader(QNetworkRequest::ContentTypeHeader, O2_MIME_TYPE_XFORM); 0093 0094 QNetworkReply *reply = requestor->post(request, reqParams, postData); 0095 connect(reply, SIGNAL(finished()), this, SLOT(tweetReplyDone())); 0096 } 0097 0098 void Tweeter::onOpenBrowser(const QUrl &url) { 0099 qDebug() << "Opening browser with URL" << url.toString(); 0100 QDesktopServices::openUrl(url); 0101 } 0102 0103 void Tweeter::onCloseBrowser() { 0104 } 0105 0106 void Tweeter::onLinkedChanged() { 0107 qDebug() << "Linked changed!"; 0108 } 0109 0110 void Tweeter::onLinkingSucceeded() { 0111 O1Twitter *o1t = qobject_cast<O1Twitter *>(sender()); 0112 if (!o1t->linked()) { 0113 return; 0114 } 0115 QVariantMap extraTokens = o1t->extraTokens(); 0116 if (!extraTokens.isEmpty()) { 0117 emit extraTokensReady(extraTokens); 0118 qDebug() << "Extra tokens in response:"; 0119 foreach (QString key, extraTokens.keys()) { 0120 qDebug() << "\t" << key << ":" << (extraTokens.value(key).toString().left(3) + "..."); 0121 } 0122 } 0123 emit linkingSucceeded(); 0124 } 0125 0126 void Tweeter::tweetReplyDone() { 0127 QNetworkReply *reply = qobject_cast<QNetworkReply *>(sender()); 0128 if (reply->error() != QNetworkReply::NoError) { 0129 qDebug() << "ERROR:" << reply->errorString(); 0130 qDebug() << "Content:" << reply->readAll(); 0131 } else { 0132 qDebug() << "Tweet posted sucessfully!"; 0133 } 0134 emit statusPosted(); 0135 } 0136 0137 #include "moc_tweeter.cpp"