Commit 4dda4853 authored by ck's avatar ck
Browse files

Maemo: Use on-demand shared Net7 object.

Task-number: QTCREATORBUG-1073
parent a62e5331
......@@ -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;
}
......
......@@ -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()));
}
......
......@@ -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;
......
/****************************************************************************
**
** 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
/****************************************************************************
**
** 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
......@@ -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 \
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment