Added progress indicator
[situare] / src / facebookservice / facebookauthentication.cpp
index 3698666..40f4309 100644 (file)
@@ -29,6 +29,7 @@
 #include <QSettings>
 #include <QStringList>
 #include <QVariantMap>
+#include <QWebView>
 
 #ifdef Q_WS_MAEMO_5
 #include <QMaemo5InformationBox>
 
 #include "common.h"
 #include "error.h"
-#include "facebookcommon.h"
-#include "ui/facebookloginbrowser.h"
+#include "network/networkcookiejar.h"
+#include "situareservice/situarecommon.h"
+#include "ui/mainwindow.h"
 
 #include "facebookauthentication.h"
 
-const QString REDIRECT_URI = "http://www.facebook.com/connect/login_success.html";
+const QString FB_LOGIN_SUCCESS_URL = "http://www.facebook.com/connect/login_success.html";
+const QString FB_LOGIN_URL = "https://www.facebook.com/login.php";
 
-FacebookAuthentication::FacebookAuthentication(QObject *parent)
+FacebookAuthentication::FacebookAuthentication(MainWindow *mainWindow, QObject *parent)
     : QObject(parent),
-      m_browser(0)
+      m_browser(0),
+      m_mainWindow(mainWindow)
 {
     qDebug() << __PRETTY_FUNCTION__;
-
 }
 
 void FacebookAuthentication::browserDestroyed()
 {
     qWarning() << __PRETTY_FUNCTION__;
 
-    ///< @todo (HIGH) Is newer called!
-
+    m_mainWindow->toggleProgressIndicator(false);
     m_browser = 0;
 }
 
@@ -65,16 +67,25 @@ void FacebookAuthentication::clearAccountInformation(bool keepUsername)
     qDebug() << __PRETTY_FUNCTION__;
 
     ///< @todo (HIGH) clear session from SituareService
-    QSettings settings(DIRECTORY_NAME, FILE_NAME);
+    QSettings settings(SETTINGS_ORGANIZATION_NAME, SETTINGS_APPLICATION_NAME);
 
     if(!keepUsername) {
         settings.remove(SETTINGS_AUTOMATIC_UPDATE_ENABLED);
         settings.remove(SETTINGS_AUTOMATIC_UPDATE_INTERVAL);
     }
 
-    settings.remove(COOKIES);
     settings.remove(USER_UNSEND_MESSAGE);
     settings.remove(USER_UNSEND_MESSAGE_PUBLISH);
+
+    NetworkCookieJar::clearCookiesSetting();
+}
+
+void FacebookAuthentication::destroyLogin()
+{
+    qWarning() << __PRETTY_FUNCTION__;
+
+    m_mainWindow->destroyLoginDialog();
+    m_browser->deleteLater();
 }
 
 void FacebookAuthentication::loadFinished(bool ok)
@@ -88,7 +99,41 @@ void FacebookAuthentication::login()
 {
     qWarning() << __PRETTY_FUNCTION__;
 
-    emit buildLoginBrowser();
+    if (!m_browser) {
+        m_browser = new QWebView(m_mainWindow);
+
+        if (m_browser) {
+            m_browser->page()->networkAccessManager()->setCookieJar(new NetworkCookieJar());
+
+            connect(m_browser, SIGNAL(loadFinished(bool)),
+                    this, SLOT(loadFinished(bool)));
+
+            connect(m_browser, SIGNAL(urlChanged(QUrl)),
+                    this, SLOT(urlChanged(QUrl)));
+
+            connect(m_browser, SIGNAL(destroyed(QObject*)),
+                    this, SLOT(browserDestroyed()));
+
+            connect(m_browser->page()->networkAccessManager(), SIGNAL(finished(QNetworkReply*)),
+                    this, SLOT(networkReplyHandler(QNetworkReply*)));
+        }
+    }
+
+    if (m_browser) {
+        QString url = FB_LOGIN_URL + "?";
+        url.append("api_key=" + API_KEY +"&");
+        url.append("display=touch&");
+        url.append("fbconnect=1&");
+        url.append("next=" + FB_LOGIN_SUCCESS_URL + "&");
+        url.append("return_session=1&");
+        url.append("session_version=3&");
+        url.append("v=1.0&");
+        url.append("req_perms=publish_stream");
+
+        m_browser->load(QUrl(url));
+
+        m_mainWindow->toggleProgressIndicator(true);
+    }
 }
 
 void FacebookAuthentication::networkReplyHandler(QNetworkReply *reply)
@@ -97,6 +142,7 @@ void FacebookAuthentication::networkReplyHandler(QNetworkReply *reply)
 
     if (reply->error() != QNetworkReply::NoError) {
         qCritical() << __PRETTY_FUNCTION__ << "error:" << reply->error() << reply->errorString();
+        destroyLogin();
         /// @todo Emit error signal
     }
 }
@@ -119,42 +165,6 @@ QString FacebookAuthentication::parseSession(const QUrl &url)
         return QString();
 }
 
-void FacebookAuthentication::setBrowser(FacebookLoginBrowser *browser)
-{
-    qWarning() << __PRETTY_FUNCTION__;
-
-    m_browser = browser;
-
-    if (m_browser) {
-        connect(m_browser, SIGNAL(loadFinished(bool)),
-                this, SLOT(loadFinished(bool)));
-
-        connect(m_browser, SIGNAL(urlChanged(QUrl)),
-                this, SLOT(urlChanged(QUrl)));
-
-        connect(m_browser, SIGNAL(destroyed()),
-                this, SLOT(browserDestroyed()));
-
-        connect(m_browser->page()->networkAccessManager(), SIGNAL(finished(QNetworkReply*)),
-                this, SLOT(networkReplyHandler(QNetworkReply*)));
-
-        //    browser->load(QUrl("https://graph.facebook.com/oauth/authorize?client_id=4197c64da2fb6b927236feaea32d7d81&redirect_uri=http://www.facebook.com/connect/login_success.html&display=touch&type=user_agent"));
-
-        QString url = "https://www.facebook.com/login.php?";
-        url.append("api_key=cf77865a5070f2c2ba3b52cbf3371579&"); ///< @todo hard coded test server api key
-        url.append("cancel_url=http://www.facebook.com/connect/login_failure.html&");
-        url.append("display=touch&");
-        url.append("fbconnect=1&");
-        url.append("next=http://www.facebook.com/connect/login_success.html&");
-        url.append("return_session=1&");
-        url.append("session_version=3&");
-        url.append("v=1.0&");
-        url.append("req_perms=publish_stream");
-
-        m_browser->load(QUrl(url));
-    }
-}
-
 void FacebookAuthentication::urlChanged(const QUrl &url)
 {
     qWarning() << __PRETTY_FUNCTION__ << url.toString();
@@ -172,13 +182,15 @@ void FacebookAuthentication::urlChanged(const QUrl &url)
     if (!url.toString().contains("session={")) {
         // url parameter doesn't contain session data, so login with cookies failed
         qWarning() << __PRETTY_FUNCTION__ << "working credentials required";
-        m_browser->show();
-    } else if (url.toString().startsWith(REDIRECT_URI)) {
+        m_mainWindow->buildLoginDialog(m_browser);
+    } else if (url.toString().startsWith(FB_LOGIN_SUCCESS_URL)) {
         // login succeeded
         const QString session = parseSession(url);
         qWarning() << __PRETTY_FUNCTION__ << "login finished, parsed session:" << session;
-        if (!session.isEmpty())
+        if (!session.isEmpty()) {
+            destroyLogin();
             emit loggedIn(session);
+        }
     }
     else {
         qWarning() << __PRETTY_FUNCTION__ << "credentials accepted, getting the access_token";