Merge branch 'master' into cookies_refactored
[situare] / src / ui / mainwindow.cpp
index 8b58426..6af3a8d 100644 (file)
@@ -49,6 +49,7 @@
 const int N900_APP_WIDTH = 800;
 const int N900_APP_HEIGHT = 449;
 
+
 MainWindow::MainWindow(QWidget *parent)
     : QMainWindow(parent),
     m_drawOwnLocationCrosshair(false),
@@ -56,8 +57,8 @@ MainWindow::MainWindow(QWidget *parent)
     m_refresh(false),
     m_email(),    
     m_password(),
-    m_loginUrl(),
-    m_webView(0)
+    m_webView(0),
+    m_cookieJar(0)
 {
     qDebug() << __PRETTY_FUNCTION__;
 
@@ -125,6 +126,18 @@ void MainWindow::buildFriendListPanel()
             m_friendsListPanelSidebar, SLOT(reDrawSidebar(int, int)));
 }
 
+void MainWindow::buildLoginDialog()
+{
+    qDebug() << __PRETTY_FUNCTION__;
+
+    if(!m_loginDialog) {
+        m_loginDialog = new LoginDialog(this);
+
+        connect(m_loginDialog, SIGNAL(loginDialogDone(QString,QString)),
+                this, SLOT(loginDialogDone(QString,QString)));
+    }
+}
+
 void MainWindow::buildManualLocationCrosshair()
 {
     qDebug() << __PRETTY_FUNCTION__;
@@ -219,6 +232,19 @@ void MainWindow::buildUserInfoPanel()
             m_userPanel, SLOT(screenResized(QSize)));
 }
 
+void MainWindow::buildWebView()
+{
+    qDebug() << __PRETTY_FUNCTION__;
+
+    if(!m_webView) {
+        m_webView = new QWebView;
+
+        connectWebViewSignals(true);
+
+        m_webView->hide();
+    }
+}
+
 void MainWindow::buildZoomButtonPanel()
 {
     qDebug() << __PRETTY_FUNCTION__;
@@ -244,6 +270,41 @@ void MainWindow::buildZoomButtonPanel()
             m_zoomButtonPanel, SLOT(screenResized(QSize)));
 }
 
+void MainWindow::clearCookieJar()
+{
+    qDebug() << __PRETTY_FUNCTION__;
+
+    buildWebView();
+
+    if(!m_cookieJar) {
+        m_cookieJar = new NetworkCookieJar(new QNetworkCookieJar(this));
+        qDebug() << "create cookie jar";
+    }
+    QList<QNetworkCookie> emptyList;
+    emptyList.clear();
+
+    m_cookieJar->setAllCookies(emptyList);
+    m_webView->page()->networkAccessManager()->setCookieJar(m_cookieJar);
+}
+
+void MainWindow::connectWebViewSignals(bool connectSignals)
+{
+    qDebug() << __PRETTY_FUNCTION__;
+
+    if(connectSignals) {
+        connect(m_webView, SIGNAL(urlChanged(const QUrl &)),
+                this, SIGNAL(updateCredentials(QUrl)));
+        connect(m_webView, SIGNAL(loadFinished(bool)),
+                this, SLOT(loadDone(bool)));
+    }
+    else {
+        disconnect(m_webView, SIGNAL(loadFinished(bool)),
+                   this, SLOT(loadDone(bool)));
+        disconnect(m_webView, SIGNAL(urlChanged(const QUrl &)),
+                   this, SLOT(updateCredentials(const QUrl &)));
+    }
+}
+
 void MainWindow::createMenus()
 {
     qDebug() << __PRETTY_FUNCTION__;
@@ -359,6 +420,32 @@ void MainWindow::keyPressEvent(QKeyEvent* event)
     QWidget::keyPressEvent(event);
 }
 
+void MainWindow::loadCookies()
+{
+    qDebug() << __PRETTY_FUNCTION__;
+
+    QSettings settings(DIRECTORY_NAME, FILE_NAME);
+
+    QString cookies = settings.value(COOKIES, EMPTY).toString();
+    if(!cookies.isEmpty()) {
+        QStringList list = cookies.split("|");
+        QList<QNetworkCookie> cookieList;
+
+        for(int i=0;i<list.count();i++) {
+            QNetworkCookie tmpCookie;
+            QList<QNetworkCookie> parserList = tmpCookie.parseCookies(list.at(i).toAscii());
+            cookieList.append(parserList.at(0));
+        }
+        if(!m_cookieJar) {
+            m_cookieJar = new NetworkCookieJar(new QNetworkCookieJar(this));
+            qDebug() << "create cookie jar";
+        }
+
+        m_cookieJar->setAllCookies(cookieList);
+        m_webView->page()->networkAccessManager()->setCookieJar(m_cookieJar);
+    }
+}
+
 void MainWindow::loadDone(bool done)
 {
     qDebug() << __PRETTY_FUNCTION__;
@@ -413,6 +500,13 @@ void MainWindow::loggedIn(bool logged)
         m_loginAct->setText(tr("Logout"));
     }
     else {
+        clearCookieJar();
+        m_email.clear();
+        m_password.clear();
+
+        if(m_loginDialog)
+            m_loginDialog->clearTextFields();
+
         m_loginAct->setText(tr("Login"));
     }
     showPanels(m_loggedIn);
@@ -430,8 +524,7 @@ void MainWindow::loginFailed()
 {
     qDebug() << __PRETTY_FUNCTION__;
 
-    m_email.clear();
-    m_password.clear();
+    emit fetchUsernameFromSettings();
 
     toggleProgressIndicator(false);
 
@@ -441,6 +534,8 @@ void MainWindow::loginFailed()
 
 #endif // Q_WS_MAEMO_5
 
+    buildLoginDialog();
+
     if(!m_email.isEmpty()) {
         m_loginDialog->setEmailField(m_email);
     }
@@ -449,20 +544,50 @@ void MainWindow::loginFailed()
         // if login dialog was canceled we need to stop processing webview
         // stop and disconnect m_webView;
         m_webView->stop();
-        disconnect(m_webView, SIGNAL(loadFinished(bool)),
-                   this, SLOT(loadDone(bool)));
-        disconnect(m_webView, SIGNAL(urlChanged(const QUrl &)),
-                   this, SLOT(updateCredentials(const QUrl &)));
+        connectWebViewSignals(false);
 
         emit cancelLoginProcess();
     }
     else {
         // re-load login page for webview
         toggleProgressIndicator(true);
-        m_webView->load(m_loginUrl);
+
+        // connect webview signals again since they might have been disconnected
+        connectWebViewSignals(true);
+
+        QStringList urlParts;
+        urlParts.append(FACEBOOK_LOGINBASE);
+        urlParts.append(SITUARE_PUBLIC_FACEBOOKAPI_KEY);
+        urlParts.append(INTERVAL1);
+        urlParts.append(SITUARE_LOGIN_SUCCESS);
+        urlParts.append(INTERVAL2);
+        urlParts.append(SITUARE_LOGIN_FAILURE);
+        urlParts.append(FACEBOOK_LOGIN_ENDING);
+
+        m_webView->load(QUrl(urlParts.join(EMPTY)));
     }
 }
 
+void MainWindow::loginUsingCookies()
+{
+    qDebug() << __PRETTY_FUNCTION__;
+
+    buildWebView();
+    loadCookies();
+    
+    QStringList urlParts;
+    urlParts.append(FACEBOOK_LOGINBASE);
+    urlParts.append(SITUARE_PUBLIC_FACEBOOKAPI_KEY);
+    urlParts.append(INTERVAL1);
+    urlParts.append(SITUARE_LOGIN_SUCCESS);
+    urlParts.append(INTERVAL2);
+    urlParts.append(SITUARE_LOGIN_FAILURE);
+    urlParts.append(FACEBOOK_LOGIN_ENDING);
+
+    m_webView->load(QUrl(urlParts.join(EMPTY)));
+
+}
+
 void MainWindow::openSettingsDialog()
 {
     qDebug() << __PRETTY_FUNCTION__;
@@ -474,6 +599,26 @@ void MainWindow::openSettingsDialog()
     dialog->show();
 }
 
+void MainWindow::saveCookies()
+{
+    qDebug() << __PRETTY_FUNCTION__;
+
+    if(!m_cookieJar)
+        m_cookieJar = new NetworkCookieJar(new QNetworkCookieJar(this));
+
+    QList<QNetworkCookie> cookieList = m_cookieJar->allCookies();
+    QStringList list;
+
+    for(int i=0;i<cookieList.count();i++) {
+        QNetworkCookie cookie = cookieList.at(i);
+        QByteArray byteArray = cookie.toRawForm(QNetworkCookie::Full);
+        list.append(QString(byteArray));
+    }
+    QSettings settings(DIRECTORY_NAME, FILE_NAME);
+
+    settings.setValue(COOKIES, list.join("|"));
+}
+
 void MainWindow::setAutoCenteringButtonEnabled(bool enabled)
 {
     qDebug() << __PRETTY_FUNCTION__;
@@ -560,21 +705,15 @@ void MainWindow::startLoginProcess(const QUrl &url)
 {
     qDebug() << __PRETTY_FUNCTION__;
 
-    m_loginUrl = url;
-    m_webView = new QWebView;
-    m_loginDialog = new LoginDialog(this);
-
-    connect(m_webView, SIGNAL(urlChanged(const QUrl &)),
-            this, SIGNAL(updateCredentials(QUrl)));
-    connect(m_webView, SIGNAL(loadFinished(bool)),
-            this, SLOT(loadDone(bool)));
+    buildWebView();
+    buildLoginDialog();
 
-    connect(m_loginDialog, SIGNAL(loginDialogDone(QString,QString)),
-            this, SLOT(loginDialogDone(QString,QString)));
+    emit fetchUsernameFromSettings();
 
-    m_webView->hide();
+    if(!m_cookieJar)
+        m_cookieJar = new NetworkCookieJar(new QNetworkCookieJar(this));
 
-    emit fetchUsernameFromSettings();
+    m_webView->page()->networkAccessManager()->setCookieJar(m_cookieJar);
 
     if(!m_email.isEmpty()) {
         m_loginDialog->setEmailField(m_email);
@@ -584,15 +723,15 @@ void MainWindow::startLoginProcess(const QUrl &url)
         // if login dialog was canceled we need to stop processing webview
         // stop and disconnect m_webView;
         m_webView->stop();
-        disconnect(m_webView, SIGNAL(loadFinished(bool)),
-                   this, SLOT(loadDone(bool)));
-        disconnect(m_webView, SIGNAL(urlChanged(const QUrl &)),
-                   this, SLOT(updateCredentials(const QUrl &)));
+        connectWebViewSignals(false);
 
         emit cancelLoginProcess();
     }
     else {
-        m_webView->load(m_loginUrl);
+        // connect webview signals again since they might have been disconnected
+        connectWebViewSignals(true);
+
+        m_webView->load(url);
         toggleProgressIndicator(true);
         m_refresh = true;
     }