[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: extragear/graphics/kipi-plugins/fbexport
From: Luka Renko <lure () kubuntu ! org>
Date: 2008-12-30 17:30:28
Message-ID: 1230658228.055574.13868.nullmailer () svn ! kde ! org
[Download RAW message or body]
SVN commit 903499 by lure:
Save Facebook session key in config file for next session:
- if session is still valid, it will be reused for next export job
(no need to go to browser)
- if expired or does not work, it will go through regular login
Fix storing of current album (setting is kept between runs).
M +112 -3 fbtalker.cpp
M +13 -5 fbtalker.h
M +15 -7 fbwindow.cpp
M +2 -0 fbwindow.h
--- trunk/extragear/graphics/kipi-plugins/fbexport/fbtalker.cpp #903498:903499
@@ -61,8 +61,7 @@
FbTalker::~FbTalker()
{
- if (loggedIn())
- logout();
+ // do not logout - may reuse session for next upload
if (m_job)
m_job->kill();
@@ -73,6 +72,16 @@
return !m_sessionKey.isEmpty();
}
+QString FbTalker::getSessionKey() const
+{
+ return m_sessionKey;
+}
+
+unsigned int FbTalker::getSessionExpires() const
+{
+ return m_sessionExpires;
+}
+
QString FbTalker::getDisplayName() const
{
return m_userName;
@@ -134,8 +143,30 @@
return concat;
}
+void FbTalker::authenticate(const QString &sessionKey, unsigned int sessionExpires)
+{
+ if (!sessionKey.isEmpty() && sessionExpires > time(0) + 900)
+ {
+ // sessionKey seems to be still valid for at least 15 minutes
+ // - check if it still works
+ m_sessionKey = sessionKey;
+ m_sessionExpires = sessionExpires;
-void FbTalker::authenticate()
+ m_authProgressDlg->setLabelText(i18n("Validate previous session..."));
+ m_authProgressDlg->setMaximum(6);
+ m_authProgressDlg->setValue(1);
+
+ // get logged in user - this will check if session is still valid
+ getLoggedInUser();
+ }
+ else
+ {
+ // session expired -> get new authorization token and session
+ createToken();
+ }
+}
+
+void FbTalker::createToken()
{
if (m_job)
{
@@ -205,6 +236,41 @@
m_buffer.resize(0);
}
+void FbTalker::getLoggedInUser()
+{
+ if (m_job)
+ {
+ m_job->kill();
+ m_job = 0;
+ }
+ emit signalBusy(true);
+ m_authProgressDlg->setValue(2);
+
+ QMap<QString, QString> args;
+ args["method"] = "facebook.users.getLoggedInUser";
+ args["api_key"] = m_apiKey;
+ args["v"] = m_apiVersion;
+ args["call_id"] = QString::number(m_callID.elapsed());
+ args["session_key"] = m_sessionKey;
+ args["sig"] = getApiSig(args);
+
+ QByteArray tmp(getCallString(args).toUtf8());
+ KIO::TransferJob* job = KIO::http_post(m_apiURL, tmp, KIO::HideProgressInfo);
+ job->addMetaData("UserAgent", m_userAgent);
+ job->addMetaData("content-type",
+ "Content-Type: application/x-www-form-urlencoded");
+
+ connect(job, SIGNAL(data(KIO::Job*, const QByteArray&)),
+ this, SLOT(data(KIO::Job*, const QByteArray&)));
+
+ connect(job, SIGNAL(result(KJob*)),
+ this, SLOT(slotResult(KJob*)));
+
+ m_state = FB_GETLOGGEDINUSER;
+ m_job = job;
+ m_buffer.resize(0);
+}
+
void FbTalker::getUserInfo()
{
if (m_job)
@@ -485,6 +551,9 @@
case(FB_GETSESSION):
parseResponseGetSession(m_buffer);
break;
+ case(FB_GETLOGGEDINUSER):
+ parseResponseGetLoggedInUser(m_buffer);
+ break;
case(FB_GETUSERINFO):
parseResponseGetUserInfo(m_buffer);
break;
@@ -636,6 +705,46 @@
getUserInfo();
}
+void FbTalker::parseResponseGetLoggedInUser(const QByteArray& data)
+{
+ int errCode = -1;
+ QString errMsg;
+
+ QDomDocument doc("getLoggedInUser");
+ if (!doc.setContent(data))
+ return;
+
+ m_authProgressDlg->setValue(3);
+
+ kDebug(51000) << "Parse GetLoggedInUser response:" << endl << data;
+
+ QDomElement docElem = doc.documentElement();
+ if (docElem.tagName() == "users_getLoggedInUser_response")
+ {
+ m_uid = docElem.text().toInt();
+ errCode = 0;
+ }
+ else if (docElem.tagName() == "error_response")
+ errCode = parseErrorResponse(docElem, errMsg);
+
+ if (errCode == 0)
+ {
+ // session is still valid -> get full user info
+ getUserInfo();
+ }
+ else
+ {
+ // it seems that session expired -> create new token and session
+ m_sessionKey.clear();
+ m_sessionExpires = 0;
+ m_uid = 0;
+ m_userName.clear();
+ m_userURL.clear();
+
+ createToken();
+ }
+}
+
void FbTalker::parseResponseGetUserInfo(const QByteArray& data)
{
int errCode = -1;
--- trunk/extragear/graphics/kipi-plugins/fbexport/fbtalker.h #903498:903499
@@ -48,16 +48,15 @@
FbTalker(QWidget* parent);
~FbTalker();
+ QString getSessionKey() const;
+ unsigned int getSessionExpires() const;
+
QString getDisplayName() const;
QString getProfileURL() const;
bool loggedIn();
void cancel();
- QString getApiSig(const QMap<QString, QString>& args);
- QString getCallString(const QMap<QString, QString>& args);
- void authenticate();
- void getSession();
- void getUserInfo();
+ void authenticate(const QString& sessionKey, unsigned int sessionExpires);
void logout(); //rename
void listAlbums();
@@ -83,6 +82,7 @@
{
FB_CREATETOKEN = 0,
FB_GETSESSION,
+ FB_GETLOGGEDINUSER,
FB_GETUSERINFO,
FB_LOGOUT,
FB_LISTALBUMS,
@@ -90,10 +90,18 @@
FB_ADDPHOTO
};
+ QString getApiSig(const QMap<QString, QString>& args);
+ QString getCallString(const QMap<QString, QString>& args);
+ void createToken();
+ void getSession();
+ void getLoggedInUser();
+ void getUserInfo();
+
QString errorToText(int errCode, const QString& errMsg);
int parseErrorResponse(const QDomElement& e, QString& errMsg);
void parseResponseCreateToken(const QByteArray& data);
void parseResponseGetSession(const QByteArray& data);
+ void parseResponseGetLoggedInUser(const QByteArray& data);
void parseResponseGetUserInfo(const QByteArray& data);
void parseResponseLogout(const QByteArray& data);
void parseResponseAddPhoto(const QByteArray& data);
--- trunk/extragear/graphics/kipi-plugins/fbexport/fbwindow.cpp #903498:903499
@@ -183,7 +183,7 @@
kDebug(51000) << "Calling Login method";
buttonStateChange(m_talker->loggedIn());
- m_talker->authenticate();
+ m_talker->authenticate(m_sessionKey, m_sessionExpires);
}
FbWindow::~FbWindow()
@@ -200,7 +200,9 @@
{
KConfig config("kipirc");
KConfigGroup grp = config.group("FbExport Settings");
- m_currentAlbumID = grp.readEntry("Current Album", -1);
+ m_sessionKey = grp.readEntry("Session Key");
+ m_sessionExpires = grp.readEntry("Session Expires", 0);
+ m_currentAlbumID = grp.readEntry("Current Album", -1LL);
if (grp.readEntry("Resize", false))
{
@@ -225,6 +227,8 @@
{
KConfig config("kipirc");
KConfigGroup grp = config.group("FbExport Settings");
+ grp.writeEntry("Session Key", m_sessionKey);
+ grp.writeEntry("Session Expires", m_sessionExpires);
grp.writeEntry("Current Album", m_currentAlbumID);
grp.writeEntry("Resize", m_widget->m_resizeChB->isChecked());
grp.writeEntry("Maximum Width", m_widget->m_dimensionSpB->value());
@@ -241,9 +245,6 @@
void FbWindow::slotClose()
{
- if (m_talker->loggedIn())
- m_talker->logout();
-
writeSettings();
done(Close);
@@ -259,6 +260,9 @@
if (errCode == 0 && m_talker->loggedIn())
{
+ m_sessionKey = m_talker->getSessionKey();
+ m_sessionExpires = m_talker->getSessionExpires();
+
m_talker->listAlbums(); // get albums to fill combo box
}
else
@@ -316,10 +320,14 @@
kDebug(51000) << "Slot Change User Request";
if (m_talker->loggedIn())
+ {
m_talker->logout();
+ m_sessionKey.clear();
+ m_sessionExpires = 0;
+ }
kDebug(51000) << "Calling Login method";
- m_talker->authenticate();
+ m_talker->authenticate(m_sessionKey, m_sessionExpires);
}
void FbWindow::slotReloadAlbumsRequest()
@@ -360,7 +368,7 @@
m_uploadCount = 0;
m_progressDlg->reset();
m_currentAlbumID = m_widget->m_albumsCoB->itemData(
- m_widget->m_albumsCoB->currentIndex()).toInt();
+ m_widget->m_albumsCoB->currentIndex()).toLongLong();
kDebug(51000) << "m_currentAlbumID" << m_currentAlbumID;
uploadNextPhoto();
kDebug(51000) << "slotStartUpload done";
--- trunk/extragear/graphics/kipi-plugins/fbexport/fbwindow.h #903498:903499
@@ -101,6 +101,8 @@
QString m_tmpPath;
long long m_currentAlbumID;
+ QString m_sessionKey;
+ unsigned int m_sessionExpires;
QProgressDialog *m_progressDlg;
QProgressDialog *m_authProgressDlg;
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic