forked from qt-creator/qt-creator
Maemo: Saner approach to remote mounting.
This commit is contained in:
@@ -330,6 +330,8 @@ void MaemoDeployStep::handleConnected()
|
|||||||
Q_ASSERT(!m_currentDeployAction);
|
Q_ASSERT(!m_currentDeployAction);
|
||||||
Q_ASSERT(!m_needsInstall);
|
Q_ASSERT(!m_needsInstall);
|
||||||
Q_ASSERT(m_filesToCopy.isEmpty());
|
Q_ASSERT(m_filesToCopy.isEmpty());
|
||||||
|
// TODO: Move this step up. We don't have to be connected to find out
|
||||||
|
// whether we need to deploy.
|
||||||
const MaemoPackageCreationStep * const pStep = packagingStep();
|
const MaemoPackageCreationStep * const pStep = packagingStep();
|
||||||
const QString hostName = m_connection->connectionParameters().host;
|
const QString hostName = m_connection->connectionParameters().host;
|
||||||
if (pStep->isPackagingEnabled()) {
|
if (pStep->isPackagingEnabled()) {
|
||||||
|
@@ -79,8 +79,7 @@ bool MaemoRemoteMounter::addMountSpecification(const MaemoMountSpecification &mo
|
|||||||
void MaemoRemoteMounter::mount()
|
void MaemoRemoteMounter::mount()
|
||||||
{
|
{
|
||||||
m_stop = false;
|
m_stop = false;
|
||||||
Q_ASSERT(m_startedUtfsServers.isEmpty());
|
Q_ASSERT(m_utfsServers.isEmpty());
|
||||||
Q_ASSERT(m_readyUtfsServers.isEmpty());
|
|
||||||
|
|
||||||
if (m_mountSpecs.isEmpty())
|
if (m_mountSpecs.isEmpty())
|
||||||
emit mounted();
|
emit mounted();
|
||||||
@@ -237,7 +236,7 @@ void MaemoRemoteMounter::startUtfsClients()
|
|||||||
const QString chmod = QString::fromLocal8Bit("%1 chmod a+r+w+x %2")
|
const QString chmod = QString::fromLocal8Bit("%1 chmod a+r+w+x %2")
|
||||||
.arg(MaemoGlobal::remoteSudo(), mountSpec.remoteMountPoint);
|
.arg(MaemoGlobal::remoteSudo(), mountSpec.remoteMountPoint);
|
||||||
QString utfsClient
|
QString utfsClient
|
||||||
= QString::fromLocal8Bit("%1 --detach -l %2 -r %2 -b %2 %4")
|
= QString::fromLocal8Bit("%1 -l %2 -r %2 -b %2 %4")
|
||||||
.arg(utfsClientOnDevice()).arg(mountInfo.remotePort)
|
.arg(utfsClientOnDevice()).arg(mountInfo.remotePort)
|
||||||
.arg(mountSpec.remoteMountPoint);
|
.arg(mountSpec.remoteMountPoint);
|
||||||
if (mountInfo.mountAsRoot)
|
if (mountInfo.mountAsRoot)
|
||||||
@@ -248,6 +247,8 @@ void MaemoRemoteMounter::startUtfsClients()
|
|||||||
emit reportProgress(tr("Starting remote UTFS clients..."));
|
emit reportProgress(tr("Starting remote UTFS clients..."));
|
||||||
m_utfsClientStderr.clear();
|
m_utfsClientStderr.clear();
|
||||||
m_mountProcess = m_connection->createRemoteProcess(remoteCall.toUtf8());
|
m_mountProcess = m_connection->createRemoteProcess(remoteCall.toUtf8());
|
||||||
|
connect(m_mountProcess.data(), SIGNAL(started()), this,
|
||||||
|
SLOT(handleUtfsClientsStarted()));
|
||||||
connect(m_mountProcess.data(), SIGNAL(closed(int)), this,
|
connect(m_mountProcess.data(), SIGNAL(closed(int)), this,
|
||||||
SLOT(handleUtfsClientsFinished(int)));
|
SLOT(handleUtfsClientsFinished(int)));
|
||||||
connect(m_mountProcess.data(), SIGNAL(errorOutputAvailable(QByteArray)),
|
connect(m_mountProcess.data(), SIGNAL(errorOutputAvailable(QByteArray)),
|
||||||
@@ -255,6 +256,12 @@ void MaemoRemoteMounter::startUtfsClients()
|
|||||||
m_mountProcess->start();
|
m_mountProcess->start();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MaemoRemoteMounter::handleUtfsClientsStarted()
|
||||||
|
{
|
||||||
|
if (!m_stop)
|
||||||
|
startUtfsServers();
|
||||||
|
}
|
||||||
|
|
||||||
void MaemoRemoteMounter::handleUtfsClientsFinished(int exitStatus)
|
void MaemoRemoteMounter::handleUtfsClientsFinished(int exitStatus)
|
||||||
{
|
{
|
||||||
if (m_stop)
|
if (m_stop)
|
||||||
@@ -262,7 +269,8 @@ void MaemoRemoteMounter::handleUtfsClientsFinished(int exitStatus)
|
|||||||
|
|
||||||
if (exitStatus == SshRemoteProcess::ExitedNormally
|
if (exitStatus == SshRemoteProcess::ExitedNormally
|
||||||
&& m_mountProcess->exitCode() == 0) {
|
&& m_mountProcess->exitCode() == 0) {
|
||||||
startUtfsServers();
|
m_utfsServerTimer->stop();
|
||||||
|
emit mounted();
|
||||||
} else {
|
} else {
|
||||||
QString errMsg = tr("Failure running UTFS client: %1")
|
QString errMsg = tr("Failure running UTFS client: %1")
|
||||||
.arg(m_mountProcess->errorString());
|
.arg(m_mountProcess->errorString());
|
||||||
@@ -288,93 +296,38 @@ void MaemoRemoteMounter::startUtfsServers()
|
|||||||
<< port << remoteSecretOpt << port << QLatin1String("-c")
|
<< port << remoteSecretOpt << port << QLatin1String("-c")
|
||||||
<< (m_connection->connectionParameters().host + QLatin1Char(':') + port)
|
<< (m_connection->connectionParameters().host + QLatin1Char(':') + port)
|
||||||
<< mountSpec.localDir;
|
<< mountSpec.localDir;
|
||||||
connect(utfsServerProc.data(), SIGNAL(readyReadStandardError()), this,
|
|
||||||
SLOT(handleUtfsServerStderr()));
|
|
||||||
connect(utfsServerProc.data(),
|
connect(utfsServerProc.data(),
|
||||||
SIGNAL(finished(int,QProcess::ExitStatus)), this,
|
SIGNAL(finished(int,QProcess::ExitStatus)), this,
|
||||||
SLOT(handleUtfsServerFinished(int,QProcess::ExitStatus)));
|
SLOT(handleUtfsServerFinished(int,QProcess::ExitStatus)));
|
||||||
connect(utfsServerProc.data(), SIGNAL(error(QProcess::ProcessError)),
|
connect(utfsServerProc.data(), SIGNAL(error(QProcess::ProcessError)),
|
||||||
this, SLOT(handleUtfsServerError(QProcess::ProcessError)));
|
this, SLOT(handleUtfsServerError(QProcess::ProcessError)));
|
||||||
m_startedUtfsServers << utfsServerProc;
|
m_utfsServers << utfsServerProc;
|
||||||
utfsServerProc->start(utfsServer(), utfsServerArgs);
|
utfsServerProc->start(utfsServer(), utfsServerArgs);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void MaemoRemoteMounter::handleUtfsServerStderr()
|
void MaemoRemoteMounter::handleUtfsServerError(QProcess::ProcessError)
|
||||||
{
|
{
|
||||||
if (m_stop)
|
if (m_stop || m_utfsServers.isEmpty())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
for (int i = 0; i < m_startedUtfsServers.count(); ++i) {
|
QProcess * const proc = static_cast<QProcess *>(sender());
|
||||||
UtfsServerInfo &info = m_startedUtfsServers[i];
|
QString errorString = proc->errorString();
|
||||||
if (info.proc.data() == sender()) {
|
const QByteArray &errorOutput = proc->readAllStandardError();
|
||||||
info.output += info.proc->readAllStandardError();
|
if (!errorOutput.isEmpty()) {
|
||||||
if (info.output.contains("utfs server is ready")) {
|
|
||||||
m_readyUtfsServers << info;
|
|
||||||
m_startedUtfsServers.removeAt(i);
|
|
||||||
if (m_startedUtfsServers.isEmpty()) {
|
|
||||||
m_utfsServerTimer->stop();
|
|
||||||
emit mounted();
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int i = 0; i < m_readyUtfsServers.count(); ++i) {
|
|
||||||
UtfsServerInfo &info = m_readyUtfsServers[i];
|
|
||||||
if (info.proc.data() == sender()) {
|
|
||||||
const QByteArray &output = info.proc->readAllStandardError();
|
|
||||||
qWarning("%s: %s", Q_FUNC_INFO, output.data());
|
|
||||||
info.output += output;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void MaemoRemoteMounter::handleUtfsServerError(QProcess::ProcessError procError)
|
|
||||||
{
|
|
||||||
if (procError != QProcess::FailedToStart)
|
|
||||||
return;
|
|
||||||
|
|
||||||
for (int i = 0; i < m_startedUtfsServers.count(); ++i) {
|
|
||||||
const UtfsServerInfo info = m_startedUtfsServers.at(i);
|
|
||||||
if (info.proc.data() == sender()) {
|
|
||||||
QString errorString = info.proc->errorString();
|
|
||||||
if (!info.output.isEmpty()) {
|
|
||||||
errorString += tr("\nstderr was: %1")
|
errorString += tr("\nstderr was: %1")
|
||||||
.arg(QString::fromLocal8Bit(info.output));
|
.arg(QString::fromLocal8Bit(errorOutput));
|
||||||
}
|
}
|
||||||
killAllUtfsServers();
|
killAllUtfsServers();
|
||||||
m_utfsServerTimer->stop();
|
m_utfsServerTimer->stop();
|
||||||
emit error(tr("Could not start UTFS server: %1").arg(errorString));
|
emit error(tr("Error running UTFS server: %1").arg(errorString));
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
qWarning("%s: Process failed to start", Q_FUNC_INFO);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MaemoRemoteMounter::handleUtfsServerFinished(int exitCode,
|
void MaemoRemoteMounter::handleUtfsServerFinished(int /* exitCode */,
|
||||||
QProcess::ExitStatus exitStatus)
|
QProcess::ExitStatus exitStatus)
|
||||||
{
|
{
|
||||||
if (exitStatus == QProcess::NormalExit && exitCode == 0)
|
if (!m_stop && exitStatus != QProcess::NormalExit)
|
||||||
return;
|
handleUtfsServerError(static_cast<QProcess *>(sender())->error());
|
||||||
|
|
||||||
for (int i = 0; i < m_startedUtfsServers.count(); ++i) {
|
|
||||||
const UtfsServerInfo info = m_startedUtfsServers.at(i);
|
|
||||||
if (info.proc.data() == sender()) {
|
|
||||||
QString errorString = info.proc->errorString();
|
|
||||||
if (!info.output.isEmpty()) {
|
|
||||||
errorString += tr("\nstderr was: %1")
|
|
||||||
.arg(QString::fromLocal8Bit(info.output));
|
|
||||||
}
|
|
||||||
killAllUtfsServers();
|
|
||||||
m_utfsServerTimer->stop();
|
|
||||||
emit error(tr("UTFS server finished unexpectedly: %1").arg(errorString));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MaemoRemoteMounter::handleUtfsClientStderr(const QByteArray &output)
|
void MaemoRemoteMounter::handleUtfsClientStderr(const QByteArray &output)
|
||||||
@@ -400,12 +353,9 @@ QString MaemoRemoteMounter::utfsServer() const
|
|||||||
|
|
||||||
void MaemoRemoteMounter::killAllUtfsServers()
|
void MaemoRemoteMounter::killAllUtfsServers()
|
||||||
{
|
{
|
||||||
foreach (const UtfsServerInfo &info, m_startedUtfsServers)
|
foreach (const ProcPtr &proc, m_utfsServers)
|
||||||
killUtfsServer(info.proc.data());
|
killUtfsServer(proc.data());
|
||||||
m_startedUtfsServers.clear();
|
m_utfsServers.clear();
|
||||||
foreach (const UtfsServerInfo &info, m_readyUtfsServers)
|
|
||||||
killUtfsServer(info.proc.data());
|
|
||||||
m_readyUtfsServers.clear();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MaemoRemoteMounter::killUtfsServer(QProcess *proc)
|
void MaemoRemoteMounter::killUtfsServer(QProcess *proc)
|
||||||
|
@@ -80,14 +80,14 @@ private slots:
|
|||||||
void handleUploaderInitialized();
|
void handleUploaderInitialized();
|
||||||
void handleUploaderInitializationFailed(const QString &reason);
|
void handleUploaderInitializationFailed(const QString &reason);
|
||||||
void handleUploadFinished(Core::SftpJobId jobId, const QString &error);
|
void handleUploadFinished(Core::SftpJobId jobId, const QString &error);
|
||||||
|
void handleUtfsClientsStarted();
|
||||||
void handleUtfsClientsFinished(int exitStatus);
|
void handleUtfsClientsFinished(int exitStatus);
|
||||||
void handleUnmountProcessFinished(int exitStatus);
|
|
||||||
void handleUtfsClientStderr(const QByteArray &output);
|
void handleUtfsClientStderr(const QByteArray &output);
|
||||||
void handleUtfsServerStderr();
|
void handleUnmountProcessFinished(int exitStatus);
|
||||||
void handleUtfsServerError(QProcess::ProcessError error);
|
void handleUmountStderr(const QByteArray &output);
|
||||||
|
void handleUtfsServerError(QProcess::ProcessError procError);
|
||||||
void handleUtfsServerFinished(int exitCode,
|
void handleUtfsServerFinished(int exitCode,
|
||||||
QProcess::ExitStatus exitStatus);
|
QProcess::ExitStatus exitStatus);
|
||||||
void handleUmountStderr(const QByteArray &output);
|
|
||||||
void handleUtfsServerTimeout();
|
void handleUtfsServerTimeout();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@@ -118,13 +118,7 @@ private:
|
|||||||
Core::SftpJobId m_uploadJobId;
|
Core::SftpJobId m_uploadJobId;
|
||||||
|
|
||||||
typedef QSharedPointer<QProcess> ProcPtr;
|
typedef QSharedPointer<QProcess> ProcPtr;
|
||||||
struct UtfsServerInfo {
|
QList<ProcPtr> m_utfsServers;
|
||||||
UtfsServerInfo(const ProcPtr &p) : proc(p) {}
|
|
||||||
ProcPtr proc;
|
|
||||||
QByteArray output;
|
|
||||||
};
|
|
||||||
QList<UtfsServerInfo> m_startedUtfsServers;
|
|
||||||
QList<UtfsServerInfo> m_readyUtfsServers;
|
|
||||||
|
|
||||||
bool m_stop;
|
bool m_stop;
|
||||||
QByteArray m_utfsClientStderr;
|
QByteArray m_utfsClientStderr;
|
||||||
|
Reference in New Issue
Block a user