Files @ 7291e4c1ca28
Branch filter:

Location: libtransport.git/3rdparty/o2/examples/facebookdemo/fbdemo.cpp - annotation

Jan Kaluza
Add 3rdparty oauth 2 library
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
7291e4c1ca28
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QDesktopServices>
#include <QMetaEnum>
#include <QDebug>

#include "fbdemo.h"
#include "o2globals.h"
#include "o2settingsstore.h"

const char FB_APP_KEY[] = "227896037359072";
const char FB_APP_SECRET[] = "3d35b063872579cf7213e09e76b65ceb";

const char FB_REQUEST_URL[] = "https://www.facebook.com/dialog/oauth";
const char FB_TOKEN_URL[] = "https://graph.facebook.com/oauth/access_token";
const char FB_DEBUG_TOKEN[] = "https://graph.facebook.com/me?fields=id&access_token=%1";

const int localPort = 8888;

#define QENUM_NAME(o,e,v) \
    (o::staticMetaObject.enumerator(o::staticMetaObject.indexOfEnumerator(#e)).\
    valueToKey((v)))

#define GRANTFLOW_STR(v) QString(QENUM_NAME(O2, \
    GrantFlow, v))

FBDemo::FBDemo(QObject *parent) :
    QObject(parent) {
    o2Facebook_ = new O2Facebook(this);

    o2Facebook_->setClientId(FB_APP_KEY);
    o2Facebook_->setClientSecret(FB_APP_SECRET);
    o2Facebook_->setLocalPort(localPort);
    o2Facebook_->setRequestUrl(FB_REQUEST_URL);
    o2Facebook_->setTokenUrl(FB_TOKEN_URL);

    // Create a store object for writing the received tokens
    O2SettingsStore *store = new O2SettingsStore(O2_ENCRYPTION_KEY);
    store->setGroupKey("facebook");
    o2Facebook_->setStore(store);

    connect(o2Facebook_, SIGNAL(linkedChanged()),
            this, SLOT(onLinkedChanged()));
    connect(o2Facebook_, SIGNAL(linkingFailed()),
            this, SIGNAL(linkingFailed()));
    connect(o2Facebook_, SIGNAL(linkingSucceeded()),
            this, SLOT(onLinkingSucceeded()));
    connect(o2Facebook_, SIGNAL(openBrowser(QUrl)),
            this, SLOT(onOpenBrowser(QUrl)));
    connect(o2Facebook_, SIGNAL(closeBrowser()),
            this, SLOT(onCloseBrowser()));
}

void FBDemo::doOAuth(O2::GrantFlow grantFlowType) {
    qDebug() << "Starting OAuth 2 with grant flow type"
             << GRANTFLOW_STR(grantFlowType) << "...";
    o2Facebook_->setGrantFlow(grantFlowType);
    o2Facebook_->link();
}

void FBDemo::validateToken() {
    if (!o2Facebook_->linked()) {
        qWarning() << "ERROR: Application is not linked!";
        emit linkingFailed();
        return;
    }
    QString accessToken = o2Facebook_->token();
    QString debugUrlStr = QString(FB_DEBUG_TOKEN).arg(accessToken);

    QNetworkRequest request = QNetworkRequest(QUrl(debugUrlStr));
    QNetworkAccessManager *mgr = new QNetworkAccessManager(this);
    QNetworkReply *reply = mgr->get(request);
    connect(reply, SIGNAL(finished()), this, SLOT(onFinished()));
    qDebug() << "Validating user token. Please wait...";
}

void FBDemo::onOpenBrowser(const QUrl &url) {
    QDesktopServices::openUrl(url);
}

void FBDemo::onCloseBrowser() {
}

void FBDemo::onLinkedChanged() {
    qDebug() << "Link changed!";
}

void FBDemo::onLinkingSucceeded() {
    O2Facebook* o1t = qobject_cast<O2Facebook *>(sender());

     QVariantMap extraTokens = o1t->extraTokens();

    if (!extraTokens.isEmpty()) {
        emit extraTokensReady(extraTokens);

        qDebug() << "Extra tokens in response:";
        foreach (QString key, extraTokens.keys()) {
            qDebug() << "\t" << key << ":" << extraTokens.value(key).toString();
        }
    }
    emit linkingSucceeded();
}

void FBDemo::onFinished() {
    QNetworkReply *reply = qobject_cast<QNetworkReply *>(sender());
    if (!reply) {
        qWarning() << "NULL reply!";
        emit linkingFailed();
        return;
    }

    reply->deleteLater();

    if (reply->error() != QNetworkReply::NoError) {
        qWarning() << "Reply error:" << reply->error();
        qWarning() << "Reason:" << reply->errorString();
        emit linkingFailed();
        return;
    }

    QByteArray replyData = reply->readAll();
    bool valid = !replyData.contains("error");

    if (valid) {
        qDebug() << "Token is valid";
        emit linkingSucceeded();
    } else {
        qDebug() << "Token is invalid";
        emit linkingFailed();
    }
}