MainWindow does now handle only the dialog.
m_situareService = new SituareService(this);
// build FacebookAuthenticator
- m_facebookAuthenticator = new FacebookAuthentication(this);
+ m_facebookAuthenticator = new FacebookAuthentication(m_ui, this);
// build routing service
m_routingService = new RoutingService(this); // create this when needed, not in constructor!
m_geocodingService->requestLocation(location);
}
-void SituareEngine::loggedIn()
-{
- qWarning() << __PRETTY_FUNCTION__;
-
- m_ui->destroyFacebookLoginBrowser();
-
- loginOk();
-}
-
void SituareEngine::loginActionPressed()
{
qDebug() << __PRETTY_FUNCTION__;
connect(m_facebookAuthenticator, SIGNAL(error(int, int)),
this, SLOT(error(int, int)));
- connect(m_facebookAuthenticator, SIGNAL(buildLoginBrowser()),
- m_ui, SLOT(buildFacebookLoginBrowser()));
-
connect(m_facebookAuthenticator, SIGNAL(loggedIn(QString)),
m_situareService, SLOT(updateSession(QString)));
connect(m_facebookAuthenticator, SIGNAL(loggedIn(QString)),
- this, SLOT(loggedIn()));
+ this, SLOT(loginOk()));
}
void SituareEngine::signalsFromGeocodingService()
connect(m_ui, SIGNAL(loginActionPressed()),
this, SLOT(loginActionPressed()));
- connect(m_ui, SIGNAL(loginBrowserCreated(FacebookLoginBrowser*)),
- m_facebookAuthenticator, SLOT(setBrowser(FacebookLoginBrowser*)));
-
// signals from map view
connect(m_ui, SIGNAL(mapViewScrolled(SceneCoordinate)),
m_mapEngine, SLOT(setCenterPosition(SceneCoordinate)));
*/
void imageReady(User *user);
- void loggedIn();
-
/**
* @brief Requests automatic update.
*
#include "network/networkcookiejar.h"
#include "situareservice/situarecommon.h"
#include "ui/facebookloginbrowser.h"
+#include "ui/mainwindow.h"
#include "facebookauthentication.h"
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__;
}
{
qWarning() << __PRETTY_FUNCTION__;
- ///< @todo (HIGH) Is newer called!
-
m_browser = 0;
}
{
qWarning() << __PRETTY_FUNCTION__;
- emit buildLoginBrowser();
+ if (!m_browser)
+ m_browser = new FacebookLoginBrowser(m_mainWindow);
+
+ 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(QObject*)),
+ this, SLOT(browserDestroyed()));
+
+ connect(m_browser->page()->networkAccessManager(), SIGNAL(finished(QNetworkReply*)),
+ this, SLOT(networkReplyHandler(QNetworkReply*)));
+
+ 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));
+ }
}
void FacebookAuthentication::networkReplyHandler(QNetworkReply *reply)
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(QObject*)),
- this, SLOT(browserDestroyed()));
-
- connect(m_browser->page()->networkAccessManager(), SIGNAL(finished(QNetworkReply*)),
- this, SLOT(networkReplyHandler(QNetworkReply*)));
-
- 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));
- }
-}
-
void FacebookAuthentication::urlChanged(const QUrl &url)
{
qWarning() << __PRETTY_FUNCTION__ << url.toString();
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();
+ 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()) {
+ m_mainWindow->destroyLoginDialog();
+ m_browser->deleteLater();
emit loggedIn(session);
+ }
}
else {
qWarning() << __PRETTY_FUNCTION__ << "credentials accepted, getting the access_token";
class QNetworkReply;
class FacebookLoginBrowser;
+class MainWindow;
/**
-* @brief FacebookAuthentication class takes care of parsing and handling of credentials for
-* Facebook. Other components of Situare application needs credentials to communicate with
-* facebook.
+* @brief FacebookAuthentication class takes care of Facebook login process. It creates
+ FacebookLoginBrowser instance and tries to login with cookies using hidden browser.
+ If failed, then visible login browser dialog is invoked. Class also does parse the
+ accuired credentials.
*
* @author Ville Tiensuu
+* @author Sami Rämö - sami.ramo (at) ixonos.com
*/
class FacebookAuthentication : public QObject
{
*
* -Checks if there is valid credentials stored on the file. If there is emits signal.
*
+ * @param mainWindow MainWindow instance
* @param parent instance of parent
*/
- FacebookAuthentication(QObject *parent = 0);
+ FacebookAuthentication(MainWindow *mainWindow, QObject *parent = 0);
/*******************************************************************************
* MEMBER FUNCTIONS AND SLOTS
*/
void clearAccountInformation(bool keepUsername = false);
- void setBrowser(FacebookLoginBrowser *browser);
-
private:
QString parseSession(const QUrl &url);
* SIGNALS
******************************************************************************/
signals:
- void buildLoginBrowser();
-
/**
* @brief Signals error
*
******************************************************************************/
private:
FacebookLoginBrowser *m_browser;
+ MainWindow *m_mainWindow;
};
#endif // FACEBOOKAUTHENTICATION_H
{
qWarning() << __PRETTY_FUNCTION__;
- setWindowFlags(Qt::Dialog);
- setWindowTitle(tr("Login"));
-
page()->networkAccessManager()->setCookieJar(new NetworkCookieJar());
}
#include "common.h"
#include "error.h"
#include "facebookloginbrowser.h"
-#include "facebookservice/facebookauthentication.h"
#include "friendlistpanel.h"
#include "fullscreenbutton.h"
#include "indicatorbuttonpanel.h"
m_refresh(false),
m_mapCenterHorizontalShifting(0),
m_progressIndicatorCount(0),
+ m_loginDialog(0),
m_crosshair(0),
m_email(), ///< @todo WTF?!?!?!?
m_password(),
- m_facebookLoginBrowser(0),
m_fullScreenButton(0),
m_indicatorButtonPanel(0),
m_mapScale(0)
this, SLOT(mapCenterHorizontalShiftingChanged(int)));
}
-void MainWindow::buildFacebookLoginBrowser()
-{
- qWarning() << __PRETTY_FUNCTION__;
-
- if (!m_facebookLoginBrowser)
- m_facebookLoginBrowser = new FacebookLoginBrowser(this);
-
- emit loginBrowserCreated(m_facebookLoginBrowser);
-}
-
void MainWindow::buildFriendListPanel()
{
qDebug() << __PRETTY_FUNCTION__;
this, SIGNAL(searchHistoryItemClicked(QString)));
}
+void MainWindow::buildLoginDialog(FacebookLoginBrowser *browser)
+{
+ qWarning() << __PRETTY_FUNCTION__;
+
+ if (!m_loginDialog) {
+ m_loginDialog = new QDialog(this);
+ if (m_loginDialog) {
+ m_loginDialog->setWindowTitle(tr("Login"));
+ m_loginDialog->setLayout(new QVBoxLayout());
+ m_loginDialog->layout()->addWidget(browser);
+ m_loginDialog->layout()->setContentsMargins(QMargins()); // zero margins
+ connect(m_loginDialog, SIGNAL(rejected()), this, SLOT(destroyLoginDialog()));
+ }
+ }
+
+ if (m_loginDialog)
+ m_loginDialog->show();
+}
+
void MainWindow::buildMap()
{
qDebug() << __PRETTY_FUNCTION__;
m_viewMenu->setObjectName(tr("Menu"));
}
-void MainWindow::destroyFacebookLoginBrowser()
+void MainWindow::destroyLoginDialog()
{
qWarning() << __PRETTY_FUNCTION__;
- m_facebookLoginBrowser->hide();
- m_facebookLoginBrowser->deleteLater();
- m_facebookLoginBrowser = 0;
+ if (m_loginDialog) {
+ m_loginDialog->hide();
+ m_loginDialog->deleteLater();
+ m_loginDialog = 0;
+ }
}
void MainWindow::dialogFinished(int status)
#include "network/networkcookiejar.h"
+class QDialog;
class QGraphicsScene;
class QLabel;
class QMessageBox;
class QToolButton;
class QWebView;
-class FacebookAuthentication;
class FacebookLoginBrowser;
class FriendListPanel;
class FullScreenButton;
* MEMBER FUNCTIONS AND SLOTS
******************************************************************************/
public:
+ void buildLoginDialog(FacebookLoginBrowser *browser);
+
/**
* @brief
*
const QString username();
public slots:
- void buildFacebookLoginBrowser();
-
- void destroyFacebookLoginBrowser();
-
/**
* @brief Builds information box with message.
*
*/
void buildInformationBox(const QString &message, bool modal=false);
+ void destroyLoginDialog();
+
/**
* @brief Slot for failed login
*/
*/
void loginActionPressed();
- void loginBrowserCreated(FacebookLoginBrowser *);
-
/**
* @brief MapView has been resized
*
QAction *m_loginAct; ///< Action to Login/Logout
QAction *m_toSettingsAct; ///< Action to trigger switch to settings dialog
+ QDialog *m_loginDialog; ///< Login dialog
+
QLabel *m_crosshair; ///< Label for center point crosshair
QLabel *m_osmLicense; ///< Label for Open Street Map license
QString m_email; ///< Placeholder for email
QString m_password; ///< Placeholder for password
- FacebookLoginBrowser *m_facebookLoginBrowser;
FriendListPanel *m_friendsListPanel; ///< Instance of friends list panel
FullScreenButton *m_fullScreenButton; ///< Instance of the fullscreen toggle button
IndicatorButtonPanel *m_indicatorButtonPanel; ///< Instance of direction indicator button