Action::~Action() { closeSubCommands(); const QMutexLocker lock(&actionsLock); const int i = actions.indexOf(this); Q_ASSERT(i != -1); actions.remove(i); }
void Action::finish() { closeSubCommands(); emit actionFinished(this); }
void Action::start() { closeSubCommands(); if ( m_currentLine + 1 >= m_cmds.size() ) { finish(); return; } ++m_currentLine; const QList<QStringList> &cmds = m_cmds[m_currentLine]; Q_ASSERT( !cmds.isEmpty() ); QProcessEnvironment env = QProcessEnvironment::systemEnvironment(); if (m_id != -1) env.insert("COPYQ_ACTION_ID", QString::number(m_id)); if ( !m_name.isEmpty() ) env.insert("COPYQ_ACTION_NAME", m_name); for (int i = 0; i < cmds.size(); ++i) { auto process = new QProcess(this); m_processes.push_back(process); process->setProcessEnvironment(env); if ( !m_workingDirectoryPath.isEmpty() ) process->setWorkingDirectory(m_workingDirectoryPath); connectProcessError(process, this, &Action::onSubProcessError); connect( process, &QProcess::readyReadStandardError, this, &Action::onSubProcessErrorOutput ); } pipeThroughProcesses(m_processes.begin(), m_processes.end()); QProcess *lastProcess = m_processes.back(); connect( lastProcess, &QProcess::started, this, &Action::onSubProcessStarted ); connectProcessFinished( lastProcess, this, &Action::onSubProcessFinished ); connect( lastProcess, &QProcess::readyReadStandardOutput, this, &Action::onSubProcessOutput ); // Writing directly to stdin of a process on Windows can hang the app. QProcess *firstProcess = m_processes.front(); connect( firstProcess, &QProcess::started, this, &Action::writeInput, Qt::QueuedConnection ); connect( firstProcess, &QProcess::bytesWritten, this, &Action::onBytesWritten, Qt::QueuedConnection ); const bool needWrite = !m_input.isEmpty(); if (m_processes.size() == 1) { const auto mode = (needWrite && m_readOutput) ? QIODevice::ReadWrite : needWrite ? QIODevice::WriteOnly : m_readOutput ? QIODevice::ReadOnly : QIODevice::NotOpen; startProcess(firstProcess, cmds.first(), mode); } else { auto it = m_processes.begin(); auto cmdIt = cmds.constBegin(); startProcess(*it, *cmdIt, needWrite ? QIODevice::ReadWrite : QIODevice::ReadOnly); for (++it, ++cmdIt; it != m_processes.end() - 1; ++it, ++cmdIt) startProcess(*it, *cmdIt, QIODevice::ReadWrite); startProcess(lastProcess, cmds.last(), m_readOutput ? QIODevice::ReadWrite : QIODevice::WriteOnly); } }
Action::~Action() { closeSubCommands(); }