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"