1 #include <QNetworkAccessManager>
2 #include <QNetworkRequest>
3 #include <QDesktopServices>
4 #include <QDebug>
5 
6 #include "tweeter.h"
7 #include "o0globals.h"
8 #include "o1requestor.h"
9 #include "o0settingsstore.h"
10 
11 const char O2_CONSUMER_KEY[] = "2vHeyIxjywIadjEhvbDpg";
12 const char O2_CONSUMER_SECRET[] = "Xfwe195Kp3ZpcCKgkYs7RKfugTm8EfpLkQvsKfX2vvs";
13 
14 const int localPort = 8888;
15 
Tweeter(QObject * parent)16 Tweeter::Tweeter(QObject *parent) :
17     QObject(parent) {
18 }
19 
doOAuth()20 void Tweeter::doOAuth() {
21     o1Twitter_ = new O1Twitter(this);
22     o1Twitter_->setClientId(O2_CONSUMER_KEY);
23     o1Twitter_->setClientSecret(O2_CONSUMER_SECRET);
24     o1Twitter_->setLocalPort(localPort);
25 
26     // Create a store object for writing the received tokens
27     O0SettingsStore *store = new O0SettingsStore(O2_ENCRYPTION_KEY);
28     store->setGroupKey("twitter");
29     o1Twitter_->setStore(store);
30 
31     // Connect signals
32     connect(o1Twitter_, SIGNAL(linkedChanged()), this, SLOT(onLinkedChanged()));
33     connect(o1Twitter_, SIGNAL(linkingFailed()), this, SIGNAL(linkingFailed()));
34     connect(o1Twitter_, SIGNAL(linkingSucceeded()), this, SLOT(onLinkingSucceeded()));
35     connect(o1Twitter_, SIGNAL(openBrowser(QUrl)), this, SLOT(onOpenBrowser(QUrl)));
36     connect(o1Twitter_, SIGNAL(closeBrowser()), this, SLOT(onCloseBrowser()));
37 
38     qDebug() << "Starting OAuth...";
39     o1Twitter_->unlink();  // For the sake of this demo
40     o1Twitter_->link();
41 }
42 
doXAuth(const QString & username,const QString & password)43 void Tweeter::doXAuth(const QString &username, const QString &password) {
44     oxTwitter_ = new OXTwitter(this);
45     oxTwitter_->setClientId(O2_CONSUMER_KEY);
46     oxTwitter_->setClientSecret(O2_CONSUMER_SECRET);
47     oxTwitter_->setLocalPort(localPort);
48 
49     oxTwitter_->setUsername(username);
50     oxTwitter_->setPassword(password);
51 
52     // Create a store object for writing the received tokens
53     O0SettingsStore *store = new O0SettingsStore(O2_ENCRYPTION_KEY);
54     store->setGroupKey("twitter");
55     oxTwitter_->setStore(store);
56 
57     connect(oxTwitter_, SIGNAL(linkedChanged()), this, SLOT(onLinkedChanged()));
58     connect(oxTwitter_, SIGNAL(linkingFailed()), this, SIGNAL(linkingFailed()));
59     connect(oxTwitter_, SIGNAL(linkingSucceeded()), this, SLOT(onLinkingSucceeded()));
60     connect(oxTwitter_, SIGNAL(openBrowser(QUrl)), this, SLOT(onOpenBrowser(QUrl)));
61     connect(oxTwitter_, SIGNAL(closeBrowser()), this, SLOT(onCloseBrowser()));
62 
63     qDebug() << "Starting XAuth...";
64     qDebug() << "Username:" << username << "Password:" << password;
65     oxTwitter_->unlink();  // For the sake of this demo
66     oxTwitter_->link();
67 }
68 
postStatusUpdate(const QString & message)69 void Tweeter::postStatusUpdate(const QString &message) {
70     if (!o1Twitter_->linked()) {
71         qWarning() << "Application is not linked to Twitter!";
72         emit statusPosted();
73         return;
74     }
75 
76     qDebug() << "Status update message:" << message.toLatin1().constData();
77 
78     QNetworkAccessManager* manager = new QNetworkAccessManager(this);
79     O1Twitter* o1 = o1Twitter_;
80     O1Requestor* requestor = new O1Requestor(manager, o1, this);
81 
82     QByteArray paramName("status");
83 
84     QList<O0RequestParameter> reqParams = QList<O0RequestParameter>();
85     reqParams << O0RequestParameter(paramName, message.toLatin1());
86 
87     QByteArray postData = O1::createQueryParameters(reqParams);
88 
89     QUrl url = QUrl("https://api.twitter.com/1.1/statuses/update.json");
90 
91     QNetworkRequest request(url);
92     request.setHeader(QNetworkRequest::ContentTypeHeader, O2_MIME_TYPE_XFORM);
93 
94     QNetworkReply *reply = requestor->post(request, reqParams, postData);
95     connect(reply, SIGNAL(finished()), this, SLOT(tweetReplyDone()));
96 }
97 
onOpenBrowser(const QUrl & url)98 void Tweeter::onOpenBrowser(const QUrl &url) {
99     qDebug() << "Opening browser with URL" << url.toString();
100     QDesktopServices::openUrl(url);
101 }
102 
onCloseBrowser()103 void Tweeter::onCloseBrowser() {
104 }
105 
onLinkedChanged()106 void Tweeter::onLinkedChanged() {
107     qDebug() << "Linked changed!";
108 }
109 
onLinkingSucceeded()110 void Tweeter::onLinkingSucceeded() {
111     O1Twitter *o1t = qobject_cast<O1Twitter *>(sender());
112     if (!o1t->linked()) {
113         return;
114     }
115     QVariantMap extraTokens = o1t->extraTokens();
116     if (!extraTokens.isEmpty()) {
117         emit extraTokensReady(extraTokens);
118         qDebug() << "Extra tokens in response:";
119         foreach (QString key, extraTokens.keys()) {
120             qDebug() << "\t" << key << ":" << (extraTokens.value(key).toString().left(3) + "...");
121         }
122     }
123     emit linkingSucceeded();
124 }
125 
tweetReplyDone()126 void Tweeter::tweetReplyDone() {
127     QNetworkReply *reply = qobject_cast<QNetworkReply *>(sender());
128     if (reply->error() != QNetworkReply::NoError) {
129         qDebug() << "ERROR:" << reply->errorString();
130         qDebug() << "Content:" << reply->readAll();
131     } else {
132         qDebug() << "Tweet posted sucessfully!";
133     }
134     emit statusPosted();
135 }
136