diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemomanager.cpp b/src/plugins/qt4projectmanager/qt-maemo/maemomanager.cpp index 0578238785b93da452bf12ace333b5b1de52faff..613da082c341a1f437387cfab940e41b2c931c9b 100644 --- a/src/plugins/qt4projectmanager/qt-maemo/maemomanager.cpp +++ b/src/plugins/qt4projectmanager/qt-maemo/maemomanager.cpp @@ -37,6 +37,7 @@ #include "maemosettingspage.h" #include "maemotoolchain.h" #include "maemorunconfiguration.h" +#include "ne7sshobject.h" #include <coreplugin/actionmanager/actionmanager.h> #include <coreplugin/coreconstants.h> @@ -85,6 +86,8 @@ MaemoManager::MaemoManager() pluginManager->addObject(m_packageCreationFactory); pluginManager->addObject(m_settingsPage); pluginManager->addObject(m_gdbSettingsPage); + + Ne7SshObject::instance(); } MaemoManager::~MaemoManager() @@ -97,6 +100,7 @@ MaemoManager::~MaemoManager() pluginManager->removeObject(m_settingsPage); pluginManager->removeObject(m_gdbSettingsPage); + Ne7SshObject::removeInstance(); m_instance = 0; } diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemosshconnection.cpp b/src/plugins/qt4projectmanager/qt-maemo/maemosshconnection.cpp index 813f09333f36dee461fdaa96d4096c703ab45f2c..5058b011daf4e991bc50e3a28cc9297855aa1aac 100644 --- a/src/plugins/qt4projectmanager/qt-maemo/maemosshconnection.cpp +++ b/src/plugins/qt4projectmanager/qt-maemo/maemosshconnection.cpp @@ -42,6 +42,7 @@ #include "maemosshconnection.h" #include "maemodeviceconfigurations.h" +#include "ne7sshobject.h" #include <ne7ssh.h> @@ -55,8 +56,6 @@ namespace Qt4ProjectManager { namespace Internal { namespace { - ne7ssh ssh; - char *alloc(size_t n) { return new char[n]; @@ -67,7 +66,9 @@ namespace { MaemoSshConnection::MaemoSshConnection(const MaemoDeviceConfig &devConf, bool shell) - : m_channel(-1), m_stopRequested(false) + : ssh(Ne7SshObject::instance()->get()), + m_channel(-1), + m_stopRequested(false) { const QString *authString; int (ne7ssh::*connFunc)(const char *, int, const char *, const char *, bool, int); @@ -78,7 +79,7 @@ MaemoSshConnection::MaemoSshConnection(const MaemoDeviceConfig &devConf, authString = &devConf.keyFile; connFunc = &ne7ssh::connectWithKey; } - m_channel = (ssh.*connFunc)(devConf.host.toLatin1(), devConf.sshPort, + m_channel = (ssh.data()->*connFunc)(devConf.host.toLatin1(), devConf.sshPort, devConf.uname.toAscii(), authString->toLatin1(), shell, devConf.timeout); if (m_channel == -1) throw MaemoSshException(tr("Could not connect to host")); @@ -87,12 +88,12 @@ MaemoSshConnection::MaemoSshConnection(const MaemoDeviceConfig &devConf, MaemoSshConnection::~MaemoSshConnection() { qDebug("%s", Q_FUNC_INFO); - ssh.close(m_channel); + ssh->close(m_channel); } const char *MaemoSshConnection::lastError() { - return ssh.errors()->pop(channel()); + return ssh->errors()->pop(channel()); } void MaemoSshConnection::stop() @@ -104,7 +105,7 @@ MaemoInteractiveSshConnection::MaemoInteractiveSshConnection(const MaemoDeviceCo : MaemoSshConnection(devConf, true), m_prompt(0) { m_prompt = devConf.uname == QLatin1String("root") ? "# " : "$ "; - if (!ssh.waitFor(channel(), m_prompt, devConf.timeout)) { + if (!ssh->waitFor(channel(), m_prompt, devConf.timeout)) { const QString error = tr("Could not start remote shell: %1").arg(lastError()); throw MaemoSshException(error); @@ -113,13 +114,13 @@ MaemoInteractiveSshConnection::MaemoInteractiveSshConnection(const MaemoDeviceCo MaemoInteractiveSshConnection::~MaemoInteractiveSshConnection() { - ssh.send("exit\n", channel()); - ssh.waitFor(channel(), m_prompt, 1); + ssh->send("exit\n", channel()); + ssh->waitFor(channel(), m_prompt, 1); } void MaemoInteractiveSshConnection::runCommand(const QString &command) { - if (!ssh.send((command + QLatin1String("\n")).toLatin1().data(), + if (!ssh->send((command + QLatin1String("\n")).toLatin1().data(), channel())) { throw MaemoSshException(tr("Error running command: %1") .arg(lastError())); @@ -127,12 +128,12 @@ void MaemoInteractiveSshConnection::runCommand(const QString &command) bool done; do { - done = ssh.waitFor(channel(), m_prompt, 1); + done = ssh->waitFor(channel(), m_prompt, 1); const char * const error = lastError(); if (error) throw MaemoSshException(tr("SSH error: %1").arg(error)); QScopedPointer<char, QScopedPointerArrayDeleter<char> > - output(ssh.readAndReset(channel(), alloc)); + output(ssh->readAndReset(channel(), alloc)); if (output.data()) { emit remoteOutput(QString::fromUtf8(output.data())); if (!done) @@ -150,7 +151,7 @@ MaemoSftpConnection::MaemoSftpConnection(const MaemoDeviceConfig &devConf) : MaemoSshConnection(devConf, false), sftp(new Ne7SftpSubsystem) { - if (!ssh.initSftp(*sftp, channel()) || !sftp->setTimeout(devConf.timeout)) + if (!ssh->initSftp(*sftp, channel()) || !sftp->setTimeout(devConf.timeout)) throw MaemoSshException(tr("Error setting up SFTP subsystem: %1") .arg(lastError())); } diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemosshconnection.h b/src/plugins/qt4projectmanager/qt-maemo/maemosshconnection.h index ff13095b7bc805b9ea0a0d488b23cd043897a35b..ef9b5f8c21690838089d481ca5092331ed00a658 100644 --- a/src/plugins/qt4projectmanager/qt-maemo/maemosshconnection.h +++ b/src/plugins/qt4projectmanager/qt-maemo/maemosshconnection.h @@ -47,6 +47,7 @@ #include <QtCore/QSharedPointer> #include <QtCore/QString> +class ne7ssh; class Ne7SftpSubsystem; namespace Qt4ProjectManager { @@ -79,6 +80,7 @@ protected: bool stopRequested() const {return m_stopRequested; } const char *lastError(); + QSharedPointer<ne7ssh> ssh; private: int m_channel; volatile bool m_stopRequested; diff --git a/src/plugins/qt4projectmanager/qt-maemo/ne7sshobject.cpp b/src/plugins/qt4projectmanager/qt-maemo/ne7sshobject.cpp new file mode 100644 index 0000000000000000000000000000000000000000..943f8aeb051db580c2360586582beedb4fed0b51 --- /dev/null +++ b/src/plugins/qt4projectmanager/qt-maemo/ne7sshobject.cpp @@ -0,0 +1,81 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of Qt Creator. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "ne7sshobject.h" + +#include <QtCore/QMutexLocker> + +#include <ne7ssh.h> + +namespace Qt4ProjectManager { +namespace Internal { + +Ne7SshObject *Ne7SshObject::instance() +{ + if (!m_instance) + m_instance = new Ne7SshObject; + return m_instance; +} + +void Ne7SshObject::removeInstance() +{ + delete m_instance; +} + +QSharedPointer<ne7ssh> Ne7SshObject::get() +{ + QMutexLocker locker(&m_mutex); + QSharedPointer<ne7ssh> shared = m_weakRef.toStrongRef(); + if (!shared) { + shared = QSharedPointer<ne7ssh>(new ne7ssh); + m_weakRef = shared; + } + return shared; +} + +Ne7SshObject::Ne7SshObject() +{ +} + +Ne7SshObject *Ne7SshObject::m_instance = 0; + +} // namespace Internal +} // namespace Qt4ProjectManager diff --git a/src/plugins/qt4projectmanager/qt-maemo/ne7sshobject.h b/src/plugins/qt4projectmanager/qt-maemo/ne7sshobject.h new file mode 100644 index 0000000000000000000000000000000000000000..deaa2b35e1867def2391491eb9514c3ff1f86351 --- /dev/null +++ b/src/plugins/qt4projectmanager/qt-maemo/ne7sshobject.h @@ -0,0 +1,76 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of Qt Creator. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef NE7SSHOBJECT_H +#define NE7SSHOBJECT_H + +#include <QtCore/QMutex> +#include <QtCore/QSharedPointer> +#include <QtCore/QWeakPointer> + +class ne7ssh; + +namespace Qt4ProjectManager { +namespace Internal { + +class Ne7SshObject +{ +public: + static Ne7SshObject *instance(); + static void removeInstance(); + + QSharedPointer<ne7ssh> get(); + +private: + Ne7SshObject(); + Ne7SshObject(const Ne7SshObject &); + Ne7SshObject &operator=(const Ne7SshObject &); + + static Ne7SshObject *m_instance; + + QWeakPointer<ne7ssh> m_weakRef; + QMutex m_mutex; +}; + +} // namespace Internal +} // namespace Qt4ProjectManager + +#endif // NE7SSHOBJECT_H diff --git a/src/plugins/qt4projectmanager/qt-maemo/qt-maemo.pri b/src/plugins/qt4projectmanager/qt-maemo/qt-maemo.pri index c5118f77dedc518a9d5c58788f8c148de5959f31..b0ff93ef33f74769964f4d6bc67bdfe3bfbae08b 100644 --- a/src/plugins/qt4projectmanager/qt-maemo/qt-maemo.pri +++ b/src/plugins/qt4projectmanager/qt-maemo/qt-maemo.pri @@ -18,7 +18,8 @@ HEADERS += \ $$PWD/maemosshthread.h \ $$PWD/maemotoolchain.h \ $$PWD/maemopackagecreationstep.h \ - $$PWD/maemopackagecreationfactory.h + $$PWD/maemopackagecreationfactory.h \ + $$PWD/ne7sshobject.h SOURCES += \ $$PWD/maemoconfigtestdialog.cpp \ @@ -35,7 +36,8 @@ SOURCES += \ $$PWD/maemosshthread.cpp \ $$PWD/maemotoolchain.cpp \ $$PWD/maemopackagecreationstep.cpp \ - $$PWD/maemopackagecreationfactory.cpp + $$PWD/maemopackagecreationfactory.cpp \ + $$PWD/ne7sshobject.cpp FORMS += \ $$PWD/maemoconfigtestdialog.ui \