diff --git a/src/libs/ssh/sshchannelmanager.cpp b/src/libs/ssh/sshchannelmanager.cpp index dbae05e06c8f54bf419bd9cce6ad48b0e4b08489..792963702e04c4357929c8091ccff23d4ba58aa1 100644 --- a/src/libs/ssh/sshchannelmanager.cpp +++ b/src/libs/ssh/sshchannelmanager.cpp @@ -176,16 +176,23 @@ void SshChannelManager::insertChannel(AbstractSshChannel *priv, m_sessions.insert(priv, pub); } -int SshChannelManager::closeAllChannels() +int SshChannelManager::closeAllChannels(CloseAllMode mode) { const int count = m_channels.count(); for (ChannelIterator it = m_channels.begin(); it != m_channels.end(); ++it) it.value()->closeChannel(); - m_channels.clear(); - m_sessions.clear(); + if (mode == CloseAllAndReset) { + m_channels.clear(); + m_sessions.clear(); + } return count; } +int SshChannelManager::channelCount() const +{ + return m_channels.count(); +} + void SshChannelManager::removeChannel(ChannelIterator it) { Q_ASSERT(it != m_channels.end() && "Unexpected channel lookup failure."); diff --git a/src/libs/ssh/sshchannelmanager_p.h b/src/libs/ssh/sshchannelmanager_p.h index 29589f6da74187b058443f93a6382d8fcc4e9cee..16626eddb1843a96a5a6f881b82884027e30e8ba 100644 --- a/src/libs/ssh/sshchannelmanager_p.h +++ b/src/libs/ssh/sshchannelmanager_p.h @@ -55,7 +55,10 @@ public: QSharedPointer<SshRemoteProcess> createRemoteProcess(const QByteArray &command); QSharedPointer<SshRemoteProcess> createRemoteShell(); QSharedPointer<SftpChannel> createSftpChannel(); - int closeAllChannels(); + int channelCount() const; + + enum CloseAllMode { CloseAllRegular, CloseAllAndReset }; + int closeAllChannels(CloseAllMode mode); void handleChannelRequest(const SshIncomingPacket &packet); void handleChannelOpen(const SshIncomingPacket &packet); diff --git a/src/libs/ssh/sshconnection.cpp b/src/libs/ssh/sshconnection.cpp index 7e1a8428230cf47825ffcf9bf699ce8bbe5b7486..ebf233d3b6d946a65e8ed70d1690355ab26afee8 100644 --- a/src/libs/ssh/sshconnection.cpp +++ b/src/libs/ssh/sshconnection.cpp @@ -194,13 +194,18 @@ QSharedPointer<SftpChannel> SshConnection::createSftpChannel() int SshConnection::closeAllChannels() { try { - return d->m_channelManager->closeAllChannels(); + return d->m_channelManager->closeAllChannels(Internal::SshChannelManager::CloseAllRegular); } catch (const Botan::Exception &e) { qDebug("%s: %s", Q_FUNC_INFO, e.what()); return -1; } } +int SshConnection::channelCount() const +{ + return d->m_channelManager->channelCount(); +} + namespace Internal { SshConnectionPrivate::SshConnectionPrivate(SshConnection *conn, @@ -680,7 +685,7 @@ void SshConnectionPrivate::closeConnection(SshErrorCode sshError, m_keepAliveTimer.stop(); disconnect(&m_keepAliveTimer, 0, this, 0); try { - m_channelManager->closeAllChannels(); + m_channelManager->closeAllChannels(SshChannelManager::CloseAllAndReset); m_sendFacility.sendDisconnectPacket(sshError, serverErrorString); } catch (Botan::Exception &) {} // Nothing sensible to be done here. if (m_error != SshNoError) diff --git a/src/libs/ssh/sshconnection.h b/src/libs/ssh/sshconnection.h index 1e8d7effa82c815ada7215d7b09c5bdd50f999a5..66263c307720fd41e1db38923801276172102208 100644 --- a/src/libs/ssh/sshconnection.h +++ b/src/libs/ssh/sshconnection.h @@ -107,6 +107,8 @@ public: // -1 if an error occurred, number of channels closed otherwise. int closeAllChannels(); + int channelCount() const; + signals: void connected(); void disconnected(); diff --git a/src/libs/ssh/sshconnectionmanager.cpp b/src/libs/ssh/sshconnectionmanager.cpp index 293ac6e9d2dd2d4aa7b4187f78cf1f36bb68c245..04aa2effe18c5bb1b62fb189460295128dd26a0c 100644 --- a/src/libs/ssh/sshconnectionmanager.cpp +++ b/src/libs/ssh/sshconnectionmanager.cpp @@ -97,6 +97,8 @@ public: continue; if (connection->thread() != QThread::currentThread()) { + if (connection->channelCount() != 0) + continue; QMetaObject::invokeMethod(this, "switchToCallerThread", Qt::BlockingQueuedConnection, Q_ARG(SshConnection *, connection),