From 9564f55a0212cc87eeabd57d8e10d4be0a37ef77 Mon Sep 17 00:00:00 2001 From: jpbl <jpbl> Date: Thu, 29 Sep 2005 15:10:31 +0000 Subject: [PATCH] better connection handling --- src/gui/official/PhoneLineManagerImpl.cpp | 17 ++++++++++++++++ src/gui/official/PhoneLineManagerImpl.hpp | 24 +++++++++++++++++++---- src/gui/official/RequesterImpl.cpp | 12 ++++++++++++ src/gui/official/RequesterImpl.hpp | 5 +++++ src/gui/official/SFLPhoneApp.cpp | 6 ++++++ src/gui/official/SFLPhoneWindow.cpp | 19 ++++++++++++++++++ src/gui/official/SFLPhoneWindow.hpp | 8 ++++++++ src/gui/official/Session.cpp | 7 +++++++ src/gui/official/Session.hpp | 5 +++++ src/gui/official/SessionIO.hpp | 3 +++ src/gui/official/TCPSessionIO.cpp | 24 ++++++++--------------- src/gui/official/TCPSessionIO.hpp | 12 ++++++++---- src/gui/official/TCPSessionIOCreator.cpp | 5 +++-- 13 files changed, 121 insertions(+), 26 deletions(-) diff --git a/src/gui/official/PhoneLineManagerImpl.cpp b/src/gui/official/PhoneLineManagerImpl.cpp index 952a365db1..9eb287e2e7 100644 --- a/src/gui/official/PhoneLineManagerImpl.cpp +++ b/src/gui/official/PhoneLineManagerImpl.cpp @@ -18,6 +18,9 @@ PhoneLineManagerImpl::PhoneLineManagerImpl() { EventFactory::instance().registerEvent< HangupEvent >("002"); EventFactory::instance().registerEvent< IncommingEvent >("001"); + QObject::connect(this, SIGNAL(connected()), + this, SLOT(startSession())); + } PhoneLineManagerImpl::~PhoneLineManagerImpl() @@ -42,6 +45,14 @@ PhoneLineManagerImpl::initialize() } } +void +PhoneLineManagerImpl::start() +{ + isInitialized(); + + mSession->connect(); +} + void PhoneLineManagerImpl::isInitialized() { QMutexLocker guard(&mIsInitializedMutex); @@ -50,6 +61,12 @@ void PhoneLineManagerImpl::isInitialized() } } +void +PhoneLineManagerImpl::connect() +{ + mSession->connect(); +} + void PhoneLineManagerImpl::startSession() { diff --git a/src/gui/official/PhoneLineManagerImpl.hpp b/src/gui/official/PhoneLineManagerImpl.hpp index fccbef4660..ee2bed5fd4 100644 --- a/src/gui/official/PhoneLineManagerImpl.hpp +++ b/src/gui/official/PhoneLineManagerImpl.hpp @@ -44,6 +44,8 @@ public: signals: void unselected(unsigned int); void selected(unsigned int); + void connected(); + void disconnected(); public slots: /** @@ -56,11 +58,18 @@ public slots: void initialize(); /** - * This will send all the command needed when a - * connection has just been established. + * This function will make the process to start. + * It will connect to the server, and start the + * event handling. */ - void startSession(); - + void start(); + + /** + * This will ask the session to connect + * to the sflphone server. + */ + void connect(); + void sendKey(Qt::Key c); /** @@ -135,6 +144,13 @@ public slots: */ PhoneLine *selectNextAvailableLine(); + private slots: + /** + * This will send all the command needed when a + * connection has just been established. + */ + void startSession(); + private: void isInitialized(); diff --git a/src/gui/official/RequesterImpl.cpp b/src/gui/official/RequesterImpl.cpp index 84ec7f08e4..d67cfc3bae 100644 --- a/src/gui/official/RequesterImpl.cpp +++ b/src/gui/official/RequesterImpl.cpp @@ -86,6 +86,18 @@ RequesterImpl::registerSession(const std::string &id, mSessions.insert(std::make_pair(id, s)); } +void +RequesterImpl::connect(const std::string &id) +{ + std::map< std::string, SessionIO * >::iterator pos = mSessions.find(id); + if(pos == mSessions.end()) { + throw std::logic_error("Trying to connect an unknown session."); + } + + pos->second->connect(); +} + + int RequesterImpl::getCodeCategory(const std::string &code) { diff --git a/src/gui/official/RequesterImpl.hpp b/src/gui/official/RequesterImpl.hpp index 232e516fef..2876c01741 100644 --- a/src/gui/official/RequesterImpl.hpp +++ b/src/gui/official/RequesterImpl.hpp @@ -79,6 +79,11 @@ class RequesterImpl */ void registerSession(const std::string &id, SessionIO *io); + /** + * Will ask the session IO with id to connect. + */ + void connect(const std::string &id); + /** * This function is used to notify that the SessionIO * input of a session is down. It means that we no longer diff --git a/src/gui/official/SFLPhoneApp.cpp b/src/gui/official/SFLPhoneApp.cpp index ca32a05c79..4e036a751a 100644 --- a/src/gui/official/SFLPhoneApp.cpp +++ b/src/gui/official/SFLPhoneApp.cpp @@ -29,6 +29,7 @@ SFLPhoneApp::SFLPhoneApp(int argc, char **argv) Requester::instance().registerObject< CallRelatedRequest >(std::string("hold")); Requester::instance().registerObject< CallRelatedRequest >(std::string("unhold")); Requester::instance().registerObject< CallRelatedRequest >(std::string("hangup")); + PhoneLineManager::instance().start(); } void @@ -62,4 +63,9 @@ SFLPhoneApp::initConnections(SFLPhoneWindow *w) &PhoneLineManager::instance(), SLOT(clear())); QObject::connect(w, SIGNAL(keyPressed(Qt::Key)), &PhoneLineManager::instance(), SLOT(sendKey(Qt::Key))); + QObject::connect(&PhoneLineManager::instance(), SIGNAL(disconnected()), + w, SLOT(askReconnect())); + QObject::connect(w, SIGNAL(reconnectAsked()), + &PhoneLineManager::instance(), SLOT(connect())); } + diff --git a/src/gui/official/SFLPhoneWindow.cpp b/src/gui/official/SFLPhoneWindow.cpp index 13cb8e160a..72496d606b 100644 --- a/src/gui/official/SFLPhoneWindow.cpp +++ b/src/gui/official/SFLPhoneWindow.cpp @@ -1,6 +1,7 @@ #include "SFLPhoneWindow.hpp" #include <QLabel> +#include <QMessageBox> #include <QPixmap> #include <QKeyEvent> #include <iostream> @@ -96,3 +97,21 @@ SFLPhoneWindow::keyPressEvent(QKeyEvent *e) { // Misc. key emit keyPressed(Qt::Key(e->key())); } + +void +SFLPhoneWindow::askReconnect() +{ + int ret = QMessageBox::critical(NULL, + tr("SFLPhone disconnected"), + tr("The link between SFLPhone and SFLPhoned is broken.\n" + "Do you want to try to reconnect? If not, the application\n" + "will close."), + QMessageBox::Retry | QMessageBox::Default, + QMessageBox::Cancel | QMessageBox::Escape); + if (ret == QMessageBox::Retry) { + emit reconnectAsked(); + } + else { + close(); + } +} diff --git a/src/gui/official/SFLPhoneWindow.hpp b/src/gui/official/SFLPhoneWindow.hpp index 4a19597011..72da6fd360 100644 --- a/src/gui/official/SFLPhoneWindow.hpp +++ b/src/gui/official/SFLPhoneWindow.hpp @@ -21,6 +21,14 @@ private: signals: void keyPressed(Qt::Key); + void reconnectAsked(); + + public slots: + /** + * This function will prompt a message box, to ask + * if the user want to reconnect to sflphoned. + */ + void askReconnect(); protected: void keyPressEvent(QKeyEvent *e); diff --git a/src/gui/official/Session.cpp b/src/gui/official/Session.cpp index 78911f02d5..29f3d7fcfb 100644 --- a/src/gui/official/Session.cpp +++ b/src/gui/official/Session.cpp @@ -49,6 +49,13 @@ Session::playTone() const return Requester::instance().send(mId, "playtone", std::list< std::string >()); } +void +Session::connect() const +{ + return Requester::instance().connect(mId); +} + + std::string Session::getEvents() const { diff --git a/src/gui/official/Session.hpp b/src/gui/official/Session.hpp index fbb3244cad..5f2c20f16c 100644 --- a/src/gui/official/Session.hpp +++ b/src/gui/official/Session.hpp @@ -49,6 +49,11 @@ class Session */ std::string getEvents() const; + /** + * This function will ask to the SessionIO + * linked to this session to connect. + */ + void connect() const; Call createCall() const; diff --git a/src/gui/official/SessionIO.hpp b/src/gui/official/SessionIO.hpp index 17862bd270..a5af83f734 100644 --- a/src/gui/official/SessionIO.hpp +++ b/src/gui/official/SessionIO.hpp @@ -35,6 +35,9 @@ class SessionIO : public QObject public: virtual ~SessionIO(){} +public slots: + virtual void connect() {} + /** * You can use this function for sending request. * The sending is non-blocking. This function will diff --git a/src/gui/official/TCPSessionIO.cpp b/src/gui/official/TCPSessionIO.cpp index f20d0e1b1b..22d9a4c497 100644 --- a/src/gui/official/TCPSessionIO.cpp +++ b/src/gui/official/TCPSessionIO.cpp @@ -18,8 +18,6 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -#include <QMessageBox> - #include "globals.h" #include "Requester.hpp" #include "TCPSessionIO.hpp" @@ -35,28 +33,22 @@ TCPSessionIO::TCPSessionIO(const QString &hostname, quint16 port) this, SLOT(sendWaitingRequests())); QObject::connect(mSocket, SIGNAL(connected()), this, SIGNAL(connected())); - QObject::connect(mSocket, SIGNAL(disconnected()), - this, SLOT(askReconnect())); QObject::connect(mSocket, SIGNAL(error(QAbstractSocket::SocketError)), - this, SLOT(askReconnect())); + this, SLOT(error())); + QObject::connect(mSocket, SIGNAL(error(QAbstractSocket::SocketError)), + this, SIGNAL(disconnected())); } TCPSessionIO::~TCPSessionIO() {} void -TCPSessionIO::askReconnect() +TCPSessionIO::error() { - _debug("TCPSessionIO: Link broken.\n"); - int ret = QMessageBox::critical(NULL, - tr("SFLPhone disconnected"), - tr("The link between SFLPhone and SFLPhoned is broken.\n" - "Do you want to try to reconnect?"), - QMessageBox::Retry | QMessageBox::Default, - QMessageBox::Cancel | QMessageBox::Escape); - if (ret == QMessageBox::Retry) { - connect(); - } + _debug("TCPSessionIO: %s. %d\n", + mSocket->errorString().toStdString().c_str(), + mSocket->state()); + mSocket->close(); } void diff --git a/src/gui/official/TCPSessionIO.hpp b/src/gui/official/TCPSessionIO.hpp index 3254558c5d..0b7c1e8818 100644 --- a/src/gui/official/TCPSessionIO.hpp +++ b/src/gui/official/TCPSessionIO.hpp @@ -42,6 +42,7 @@ public: signals: void connected(); + void disconnected(); public slots: /** @@ -57,10 +58,6 @@ public slots: virtual void send(const QString &request); virtual void send(const std::string &request); - /** - */ - void askReconnect(); - /** * This function is called when we have * incomming data on the socket. @@ -75,6 +72,13 @@ public slots: virtual void receive(std::string &answer); virtual void connect(); + private slots: + /** + * This function is called when we have an error + * on the socket. + */ + void error(); + private: QTcpSocket *mSocket; QString mHostname; diff --git a/src/gui/official/TCPSessionIOCreator.cpp b/src/gui/official/TCPSessionIOCreator.cpp index 13ea7fef09..b2f9dab8a3 100644 --- a/src/gui/official/TCPSessionIOCreator.cpp +++ b/src/gui/official/TCPSessionIOCreator.cpp @@ -12,7 +12,8 @@ TCPSessionIOCreator::create() { TCPSessionIO *t = new TCPSessionIO(mHostname, mPort); QObject::connect(t, SIGNAL(connected()), - &PhoneLineManager::instance(), SLOT(startSession())); - t->connect(); + &PhoneLineManager::instance(), SIGNAL(connected())); + QObject::connect(t, SIGNAL(disconnected()), + &PhoneLineManager::instance(), SIGNAL(disconnected())); return t; } -- GitLab