Do not use a stack allocated ne7ssh object.

Since the ne7ssh implementation starts the select thread directly inside
the constructor, we would have it polling after initializing the project
manager. Still we should apply the fix Thiago proposed for polling.

Reviewed-by: ck
This commit is contained in:
kh1
2010-04-01 10:48:43 +02:00
parent 0c380a7e70
commit 1eafca2011
2 changed files with 20 additions and 22 deletions

View File

@@ -55,8 +55,6 @@
namespace Qt4ProjectManager { namespace Qt4ProjectManager {
namespace Internal { namespace Internal {
namespace { namespace {
ne7ssh ssh;
char *alloc(size_t n) char *alloc(size_t n)
{ {
return new char[n]; return new char[n];
@@ -67,7 +65,7 @@ namespace {
MaemoSshConnection::MaemoSshConnection(const MaemoDeviceConfig &devConf, MaemoSshConnection::MaemoSshConnection(const MaemoDeviceConfig &devConf,
bool shell) bool shell)
: m_channel(-1), m_stopRequested(false) : m_channel(-1), m_stopRequested(false), ssh(new ne7ssh)
{ {
const QString *authString; const QString *authString;
int (ne7ssh::*connFunc)(const char *, int, const char *, const char *, bool, int); int (ne7ssh::*connFunc)(const char *, int, const char *, const char *, bool, int);
@@ -78,7 +76,8 @@ MaemoSshConnection::MaemoSshConnection(const MaemoDeviceConfig &devConf,
authString = &devConf.keyFile; authString = &devConf.keyFile;
connFunc = &ne7ssh::connectWithKey; 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); devConf.uname.toAscii(), authString->toLatin1(), shell, devConf.timeout);
if (m_channel == -1) if (m_channel == -1)
throw MaemoSshException(tr("Could not connect to host")); throw MaemoSshException(tr("Could not connect to host"));
@@ -87,12 +86,12 @@ MaemoSshConnection::MaemoSshConnection(const MaemoDeviceConfig &devConf,
MaemoSshConnection::~MaemoSshConnection() MaemoSshConnection::~MaemoSshConnection()
{ {
qDebug("%s", Q_FUNC_INFO); qDebug("%s", Q_FUNC_INFO);
ssh.close(m_channel); ssh->close(m_channel);
} }
const char *MaemoSshConnection::lastError() const char *MaemoSshConnection::lastError()
{ {
return ssh.errors()->pop(channel()); return ssh->errors()->pop(channel());
} }
void MaemoSshConnection::stop() void MaemoSshConnection::stop()
@@ -104,35 +103,31 @@ MaemoInteractiveSshConnection::MaemoInteractiveSshConnection(const MaemoDeviceCo
: MaemoSshConnection(devConf, true), m_prompt(0) : MaemoSshConnection(devConf, true), m_prompt(0)
{ {
m_prompt = devConf.uname == QLatin1String("root") ? "# " : "$ "; 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 throw MaemoSshException(tr("Could not start remote shell: %1").arg(lastError()));
= tr("Could not start remote shell: %1").arg(lastError());
throw MaemoSshException(error);
}
} }
MaemoInteractiveSshConnection::~MaemoInteractiveSshConnection() MaemoInteractiveSshConnection::~MaemoInteractiveSshConnection()
{ {
ssh.send("exit\n", channel()); ssh->send("exit\n", channel());
ssh.waitFor(channel(), m_prompt, 1); ssh->waitFor(channel(), m_prompt, 1);
} }
void MaemoInteractiveSshConnection::runCommand(const QString &command) void MaemoInteractiveSshConnection::runCommand(const QString &command)
{ {
if (!ssh.send((command + QLatin1String("\n")).toLatin1().data(), if (!ssh->send((command + QLatin1String("\n")).toLatin1().data(),
channel())) { channel())) {
throw MaemoSshException(tr("Error running command: %1") throw MaemoSshException(tr("Error running command: %1").arg(lastError()));
.arg(lastError()));
} }
bool done; bool done;
do { do {
done = ssh.waitFor(channel(), m_prompt, 1); done = ssh->waitFor(channel(), m_prompt, 1);
const char * const error = lastError(); const char * const error = lastError();
if (error) if (error)
throw MaemoSshException(tr("SSH error: %1").arg(error)); throw MaemoSshException(tr("SSH error: %1").arg(error));
QScopedPointer<char, QScopedPointerArrayDeleter<char> > QScopedPointer<char, QScopedPointerArrayDeleter<char> >
output(ssh.readAndReset(channel(), alloc)); output(ssh->readAndReset(channel(), alloc));
if (output.data()) { if (output.data()) {
emit remoteOutput(QString::fromUtf8(output.data())); emit remoteOutput(QString::fromUtf8(output.data()));
if (!done) if (!done)
@@ -150,14 +145,14 @@ MaemoSftpConnection::MaemoSftpConnection(const MaemoDeviceConfig &devConf)
: MaemoSshConnection(devConf, false), : MaemoSshConnection(devConf, false),
sftp(new Ne7SftpSubsystem) 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") throw MaemoSshException(tr("Error setting up SFTP subsystem: %1")
.arg(lastError())); .arg(lastError()));
}
} }
MaemoSftpConnection::~MaemoSftpConnection() MaemoSftpConnection::~MaemoSftpConnection()
{ {
} }
class FileManager class FileManager

View File

@@ -47,6 +47,7 @@
#include <QtCore/QSharedPointer> #include <QtCore/QSharedPointer>
#include <QtCore/QString> #include <QtCore/QString>
class ne7ssh;
class Ne7SftpSubsystem; class Ne7SftpSubsystem;
namespace Qt4ProjectManager { namespace Qt4ProjectManager {
@@ -79,6 +80,8 @@ protected:
bool stopRequested() const {return m_stopRequested; } bool stopRequested() const {return m_stopRequested; }
const char *lastError(); const char *lastError();
QScopedPointer<ne7ssh> ssh;
private: private:
int m_channel; int m_channel;
volatile bool m_stopRequested; volatile bool m_stopRequested;