aboutsummaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
authorManjeet Dahiya <manjeetdahiya@gmail.com>2009-09-05 09:57:09 +0000
committerManjeet Dahiya <manjeetdahiya@gmail.com>2009-09-05 09:57:09 +0000
commit2d3aee65a5d59f87dcfd05b73cde6456bf504582 (patch)
tree39f6a6c9ba33a2de484115da5a822146dd0a5a93 /source
parentd2983aecee07161aba43ccd58ebbe50c9755641d (diff)
downloadqxmpp-2d3aee65a5d59f87dcfd05b73cde6456bf504582.tar.gz
Reconnection mechanism
Diffstat (limited to 'source')
-rw-r--r--source/QXmppReconnectionManager.cpp59
-rw-r--r--source/QXmppReconnectionManager.h38
2 files changed, 97 insertions, 0 deletions
diff --git a/source/QXmppReconnectionManager.cpp b/source/QXmppReconnectionManager.cpp
new file mode 100644
index 00000000..b7b07c16
--- /dev/null
+++ b/source/QXmppReconnectionManager.cpp
@@ -0,0 +1,59 @@
+#include "QXmppReconnectionManager.h"
+#include "QXmppClient.h"
+#include "utils.h"
+
+QXmppReconnectionManager::QXmppReconnectionManager(QXmppClient* client):m_timer(this),
+ m_reconnectionTries(0), m_client(client), QObject(client)
+{
+ m_timer.setSingleShot(true);
+ bool check = connect(&m_timer, SIGNAL(timeout()), SLOT(reconnect()));
+ Q_ASSERT(check);
+}
+
+void QXmppReconnectionManager::connected()
+{
+ m_reconnectionTries = 0;
+}
+
+void QXmppReconnectionManager::error(QXmppClient::Error error)
+{
+ if(m_client && error == QXmppClient::SocketError)
+ {
+ int time = getNextReconnectingInTime();
+
+ // time is in sec
+ m_timer.start(time*1000);
+ emit reconnectingIn(time);
+ }
+}
+
+int QXmppReconnectionManager::getNextReconnectingInTime()
+{
+ int reconnectingIn;
+ if(m_reconnectionTries < 5)
+ reconnectingIn = 10;
+ else if(m_reconnectionTries < 10)
+ reconnectingIn = 20;
+ else if(m_reconnectionTries < 15)
+ reconnectingIn = 40;
+ else
+ reconnectingIn = 60;
+
+ return reconnectingIn;
+}
+
+void QXmppReconnectionManager::reconnect()
+{
+ if(m_client)
+ {
+ log(QString("QXmppReconnectionManager::reconnect()"));
+ emit reconnectingNow();
+ m_client->connectToServer(m_client->getConfiguration());
+ }
+}
+
+void QXmppReconnectionManager::cancelReconnection()
+{
+ m_timer.stop();
+ m_reconnectionTries = 0;
+}
diff --git a/source/QXmppReconnectionManager.h b/source/QXmppReconnectionManager.h
new file mode 100644
index 00000000..77f0e5b6
--- /dev/null
+++ b/source/QXmppReconnectionManager.h
@@ -0,0 +1,38 @@
+#ifndef QXMPPRECONNECTIONMANAGER_H
+#define QXMPPRECONNECTIONMANAGER_H
+
+#include <QObject>
+#include <QTimer>
+#include "QXmppClient.h"
+
+class QXmppClient;
+
+class QXmppReconnectionManager : public QObject
+{
+ Q_OBJECT
+
+public:
+ QXmppReconnectionManager(QXmppClient* client);
+
+signals:
+ void reconnectingIn(int);
+ void reconnectingNow();
+
+public slots:
+ void cancelReconnection();
+
+private slots:
+ void connected();
+ void error(QXmppClient::Error);
+ void reconnect();
+
+private:
+ int getNextReconnectingInTime();
+ int m_reconnectionTries;
+ QTimer m_timer;
+
+ // reference to to client object (no ownership)
+ QXmppClient* m_client;
+};
+
+#endif // QXMPPRECONNECTIONMANAGER_H