PageRenderTime 970ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 0ms

/examples/facebookdemo/fbdemo.cpp

https://gitlab.com/k1-801/o2
C++ | 119 lines | 99 code | 19 blank | 1 comment | 8 complexity | 5092d026733d2f5e85e05745309736aa MD5 | raw file
  1. #include <QNetworkAccessManager>
  2. #include <QNetworkRequest>
  3. #include <QNetworkReply>
  4. #include <QDesktopServices>
  5. #include <QMetaEnum>
  6. #include <QDebug>
  7. #include "fbdemo.h"
  8. #include "o0globals.h"
  9. #include "o0settingsstore.h"
  10. const char FB_APP_KEY[] = "227896037359072";
  11. const char FB_APP_SECRET[] = "3d35b063872579cf7213e09e76b65ceb";
  12. const char FB_REQUEST_URL[] = "https://www.facebook.com/dialog/oauth";
  13. const char FB_DEBUG_TOKEN[] = "https://graph.facebook.com/me?fields=id&access_token=%1";
  14. const int localPort = 8888;
  15. #define QENUM_NAME(o,e,v) (o::staticMetaObject.enumerator(o::staticMetaObject.indexOfEnumerator(#e)).valueToKey((v)))
  16. #define GRANTFLOW_STR(v) QString(QENUM_NAME(O2, GrantFlow, v))
  17. FBDemo::FBDemo(QObject *parent) :
  18. QObject(parent) {
  19. o2Facebook_ = new O2Facebook(this);
  20. o2Facebook_->setClientId(FB_APP_KEY);
  21. o2Facebook_->setClientSecret(FB_APP_SECRET);
  22. o2Facebook_->setLocalPort(localPort);
  23. o2Facebook_->setRequestUrl(FB_REQUEST_URL); // Use the desktop login UI
  24. // Create a store object for writing the received tokens
  25. O0SettingsStore *store = new O0SettingsStore(O2_ENCRYPTION_KEY);
  26. store->setGroupKey("facebook");
  27. o2Facebook_->setStore(store);
  28. connect(o2Facebook_, SIGNAL(linkedChanged()), this, SLOT(onLinkedChanged()));
  29. connect(o2Facebook_, SIGNAL(linkingFailed()), this, SIGNAL(linkingFailed()));
  30. connect(o2Facebook_, SIGNAL(linkingSucceeded()), this, SLOT(onLinkingSucceeded()));
  31. connect(o2Facebook_, SIGNAL(openBrowser(QUrl)), this, SLOT(onOpenBrowser(QUrl)));
  32. connect(o2Facebook_, SIGNAL(closeBrowser()), this, SLOT(onCloseBrowser()));
  33. }
  34. void FBDemo::doOAuth(O2::GrantFlow grantFlowType) {
  35. qDebug() << "Starting OAuth 2 with grant flow type" << GRANTFLOW_STR(grantFlowType) << "...";
  36. o2Facebook_->setGrantFlow(grantFlowType);
  37. o2Facebook_->unlink();
  38. o2Facebook_->link();
  39. }
  40. void FBDemo::validateToken() {
  41. if (!o2Facebook_->linked()) {
  42. qWarning() << "ERROR: Application is not linked!";
  43. emit linkingFailed();
  44. return;
  45. }
  46. QString accessToken = o2Facebook_->token();
  47. QString debugUrlStr = QString(FB_DEBUG_TOKEN).arg(accessToken);
  48. QNetworkRequest request = QNetworkRequest(QUrl(debugUrlStr));
  49. QNetworkAccessManager *mgr = new QNetworkAccessManager(this);
  50. QNetworkReply *reply = mgr->get(request);
  51. connect(reply, SIGNAL(finished()), this, SLOT(onFinished()));
  52. qDebug() << "Validating user token. Please wait...";
  53. }
  54. void FBDemo::onOpenBrowser(const QUrl &url) {
  55. QDesktopServices::openUrl(url);
  56. }
  57. void FBDemo::onCloseBrowser() {
  58. }
  59. void FBDemo::onLinkedChanged() {
  60. qDebug() << "Link changed!";
  61. }
  62. void FBDemo::onLinkingSucceeded() {
  63. O2Facebook *o1t = qobject_cast<O2Facebook *>(sender());
  64. if (!o1t->linked()) {
  65. return;
  66. }
  67. QVariantMap extraTokens = o1t->extraTokens();
  68. if (!extraTokens.isEmpty()) {
  69. emit extraTokensReady(extraTokens);
  70. qDebug() << "Extra tokens in response:";
  71. foreach (QString key, extraTokens.keys()) {
  72. qDebug() << "\t" << key << ":" << (extraTokens.value(key).toString().left(3) + "...");
  73. }
  74. }
  75. emit linkingSucceeded();
  76. }
  77. void FBDemo::onFinished() {
  78. QNetworkReply *reply = qobject_cast<QNetworkReply *>(sender());
  79. if (!reply) {
  80. qWarning() << "NULL reply!";
  81. emit linkingFailed();
  82. return;
  83. }
  84. reply->deleteLater();
  85. if (reply->error() != QNetworkReply::NoError) {
  86. qWarning() << "Reply error:" << reply->error();
  87. qWarning() << "Reason:" << reply->errorString();
  88. emit linkingFailed();
  89. return;
  90. }
  91. QByteArray replyData = reply->readAll();
  92. bool valid = !replyData.contains("error");
  93. if (valid) {
  94. qDebug() << "Token is valid";
  95. emit linkingSucceeded();
  96. } else {
  97. qDebug() << "Token is invalid";
  98. emit linkingFailed();
  99. }
  100. }