diff options
| author | Manjeet Dahiya <manjeetdahiya@gmail.com> | 2009-09-05 09:57:09 +0000 |
|---|---|---|
| committer | Manjeet Dahiya <manjeetdahiya@gmail.com> | 2009-09-05 09:57:09 +0000 |
| commit | 2d3aee65a5d59f87dcfd05b73cde6456bf504582 (patch) | |
| tree | 39f6a6c9ba33a2de484115da5a822146dd0a5a93 /source | |
| parent | d2983aecee07161aba43ccd58ebbe50c9755641d (diff) | |
| download | qxmpp-2d3aee65a5d59f87dcfd05b73cde6456bf504582.tar.gz | |
Reconnection mechanism
Diffstat (limited to 'source')
| -rw-r--r-- | source/QXmppReconnectionManager.cpp | 59 | ||||
| -rw-r--r-- | source/QXmppReconnectionManager.h | 38 |
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
|
