unsigned int AbstractTool::checkVersion(bool &modified) { if(m_preferences->getSkipVersionTest()) { log("Warning: Skipping the version check this time!"); return makeRevision(0xFFF0, 0xFFF0); } QProcess process; QList<QRegExp*> patterns; QStringList cmdLine; //Init encoder-specific values checkVersion_init(patterns, cmdLine); log("Creating process:"); if(!startProcess(process, getBinaryPath(), cmdLine)) { return false; } bool bTimeout = false; bool bAborted = false; unsigned int revision = UINT_MAX; unsigned int coreVers = UINT_MAX; modified = false; while(process.state() != QProcess::NotRunning) { if(*m_abort) { process.kill(); bAborted = true; break; } if(!process.waitForReadyRead()) { if(process.state() == QProcess::Running) { process.kill(); qWarning("process timed out <-- killing!"); log("\nPROCESS TIMEOUT !!!"); bTimeout = true; break; } } PROCESS_PENDING_LINES(process, checkVersion_parseLine, patterns, coreVers, revision, modified); } if(!(bTimeout || bAborted)) { PROCESS_PENDING_LINES(process, checkVersion_parseLine, patterns, coreVers, revision, modified); } process.waitForFinished(); if(process.state() != QProcess::NotRunning) { process.kill(); process.waitForFinished(-1); } while(!patterns.isEmpty()) { QRegExp *pattern = patterns.takeFirst(); MUTILS_DELETE(pattern); } if(bTimeout || bAborted || (!checkVersion_succeeded(process.exitCode()))) { if(!(bTimeout || bAborted)) { log(tr("\nPROCESS EXITED WITH ERROR CODE: %1").arg(QString::number(process.exitCode()))); } return UINT_MAX; } if((revision == UINT_MAX) || (coreVers == UINT_MAX)) { log(tr("\nFAILED TO DETERMINE VERSION INFO !!!")); return UINT_MAX; } return makeRevision(coreVers, revision); }
bool NormalizeFilter::apply(const QString &sourceFile, const QString &outputFile, AudioFileModel_TechInfo *formatInfo, volatile bool *abortFlag) { QProcess process; QStringList args; QString eqMode = (m_equalizationMode == 0) ? "-n" : ((m_equalizationMode == 1) ? "-ne" : "-nb"); process.setWorkingDirectory(QFileInfo(outputFile).canonicalPath()); args << "-V3" << "-S"; args << "--temp" << "."; args << QDir::toNativeSeparators(sourceFile); args << QDir::toNativeSeparators(outputFile); args << "gain"; args << eqMode << QString().sprintf("%.2f", static_cast<double>(m_peakVolume) / 100.0); if(!startProcess(process, m_binary, args)) { return false; } bool bTimeout = false; bool bAborted = false; QRegExp regExp("In:(\\d+)(\\.\\d+)*%"); while(process.state() != QProcess::NotRunning) { if(*abortFlag) { process.kill(); bAborted = true; emit messageLogged("\nABORTED BY USER !!!"); break; } process.waitForReadyRead(m_processTimeoutInterval); if(!process.bytesAvailable() && process.state() == QProcess::Running) { process.kill(); qWarning("SoX process timed out <-- killing!"); emit messageLogged("\nPROCESS TIMEOUT !!!"); bTimeout = true; break; } while(process.bytesAvailable() > 0) { QByteArray line = process.readLine(); QString text = QString::fromUtf8(line.constData()).simplified(); if(regExp.lastIndexIn(text) >= 0) { bool ok = false; int progress = regExp.cap(1).toInt(&ok); if(ok) emit statusUpdated(progress); } else if(!text.isEmpty()) { emit messageLogged(text); } } } process.waitForFinished(); if(process.state() != QProcess::NotRunning) { process.kill(); process.waitForFinished(-1); } emit statusUpdated(100); emit messageLogged(QString().sprintf("\nExited with code: 0x%04X", process.exitCode())); if(bTimeout || bAborted || process.exitCode() != EXIT_SUCCESS || QFileInfo(outputFile).size() == 0) { return false; } return true; }
bool SpeexDecoder::decode(const QString &sourceFile, const QString &outputFile, volatile bool *abortFlag) { QProcess process; QStringList args; args << "-V"; args << QDir::toNativeSeparators(sourceFile); args << QDir::toNativeSeparators(outputFile); if(!startProcess(process, m_binary, args)) { return false; } bool bTimeout = false; bool bAborted = false; QRegExp regExp("Working\\.\\.\\. (.)"); while(process.state() != QProcess::NotRunning) { if(*abortFlag) { process.kill(); bAborted = true; emit messageLogged("\nABORTED BY USER !!!"); break; } process.waitForReadyRead(m_processTimeoutInterval); if(!process.bytesAvailable() && process.state() == QProcess::Running) { process.kill(); qWarning("SpeexDec process timed out <-- killing!"); emit messageLogged("\nPROCESS TIMEOUT !!!"); bTimeout = true; break; } while(process.bytesAvailable() > 0) { QByteArray line = process.readLine(); QString text = QString::fromUtf8(line.constData()).simplified(); if(regExp.lastIndexIn(text) >= 0) { /* qDebug("Status: %s", regExp.cap(1).toLatin1().constData()); */ } else if(!text.isEmpty()) { emit messageLogged(text); } } } process.waitForFinished(); if(process.state() != QProcess::NotRunning) { process.kill(); process.waitForFinished(-1); } emit statusUpdated(100); emit messageLogged(QString().sprintf("\nExited with code: 0x%04X", process.exitCode())); if(bTimeout || bAborted || process.exitCode() != EXIT_SUCCESS || QFileInfo(outputFile).size() == 0) { return false; } return true; }
void DialogEngines::onAddEngine() { QString fileName = QFileDialog::getOpenFileName(this, tr("Add UCI Engine"), this->lastAddedEnginePath, tr("UCI Engines (*)")); fileName = QString('"').append(fileName).append('"'); QDir d = QFileInfo(fileName).absoluteDir(); this->lastAddedEnginePath = d.absolutePath(); this->setEnabled(false); QProcess process; process.start(fileName,QIODevice::ReadWrite); // Wait for process to start if(!process.waitForStarted(500)) { // if process doesn't start, just ignore } else { process.write("uci\n"); process.waitForBytesWritten(); // give the engine 700 ms to respond to // the uci command this->delay(700); // read generated output QString output = QString(""); // give another 50 ms until the engine outputs info process.waitForReadyRead(50) ; output.append(process.readAllStandardOutput()); // look for engine id QString engine_name = QString(""); QRegularExpression regExpEngineName = QRegularExpression("id\\sname\\s(\\w|\\s|\\S)+"); QRegularExpressionMatch m_id = regExpEngineName.match(output); if(m_id.hasMatch()) { int len = m_id.capturedLength(0); engine_name = m_id.captured(0).mid(8,len-1).split("\n").at(0); } // attempt to quit the engine process.write("quit\n"); process.waitForBytesWritten(); process.waitForFinished(250); // if still running, kill it if(process.state() == QProcess::Running) { // if engine doesn't response, it could mean that // this is no engine _or_ (as in the case of e.g arasanx-64 // takes an extremely long time to respond to "quit". // kill it ... process.kill(); process.waitForFinished(); } // ... however even if we had to kill the engine, as // long as the engine provided us with a proper name, we // assume that we found a real uci engine if(!engine_name.isEmpty()) { Engine new_engine = Engine(); new_engine.setName(engine_name); new_engine.setPath(fileName); this->engines.append(new_engine); QListWidgetItem *item = new QListWidgetItem(new_engine.getName()); this->lstEngines->addItem(item); item->setSelected(true); this->update(); } } this->setEnabled(true); }
bool QAACEncoder::encode(const QString &sourceFile, const AudioFileModel_MetaInfo &metaInfo, const unsigned int duration, const QString &outputFile, volatile bool *abortFlag) { QProcess process; QStringList args; process.setWorkingDirectory(QFileInfo(outputFile).canonicalPath()); QProcessEnvironment env = QProcessEnvironment::systemEnvironment(); env.insert("PATH", QDir::toNativeSeparators(QString("%1;%1/QTfiles;%2").arg(QDir(QCoreApplication::applicationDirPath()).canonicalPath(), lamexp_temp_folder2()))); process.setProcessEnvironment(env); if(m_configRCMode != SettingsModel::VBRMode) { switch(m_configProfile) { case 2: case 3: args << "--he"; //Forces use of HE AAC profile (there is no explicit HEv2 switch for QAAC) break; } } switch(m_configRCMode) { case SettingsModel::CBRMode: args << "--cbr" << QString::number(qBound(8, index2bitrate(m_configBitrate), 576)); break; case SettingsModel::ABRMode: args << "--abr" << QString::number(qBound(8, index2bitrate(m_configBitrate), 576)); break; case SettingsModel::VBRMode: args << "--tvbr" << QString::number(g_qaacVBRQualityLUT[qBound(0, m_configBitrate , 14)]); break; default: THROW("Bad rate-control mode!"); break; } if(!m_configCustomParams.isEmpty()) args << m_configCustomParams.split(" ", QString::SkipEmptyParts); if(!metaInfo.title().isEmpty()) args << "--title" << cleanTag(metaInfo.title()); if(!metaInfo.artist().isEmpty()) args << "--artist" << cleanTag(metaInfo.artist()); if(!metaInfo.album().isEmpty()) args << "--album" << cleanTag(metaInfo.album()); if(!metaInfo.genre().isEmpty()) args << "--genre" << cleanTag(metaInfo.genre()); if(!metaInfo.comment().isEmpty()) args << "--comment" << cleanTag( metaInfo.comment()); if(metaInfo.year()) args << "--date" << QString::number(metaInfo.year()); if(metaInfo.position()) args << "--track" << QString::number(metaInfo.position()); if(!metaInfo.cover().isEmpty()) args << "--artwork" << metaInfo.cover(); args << "-d" << "."; args << "-o" << QDir::toNativeSeparators(outputFile); args << QDir::toNativeSeparators(sourceFile); if(!startProcess(process, m_binary_qaac, args)) { return false; } bool bTimeout = false; bool bAborted = false; int prevProgress = -1; QRegExp regExp("\\[(\\d+)\\.(\\d)%\\]"); while(process.state() != QProcess::NotRunning) { if(*abortFlag) { process.kill(); bAborted = true; emit messageLogged("\nABORTED BY USER !!!"); break; } process.waitForReadyRead(m_processTimeoutInterval); if(!process.bytesAvailable() && process.state() == QProcess::Running) { process.kill(); qWarning("QAAC process timed out <-- killing!"); emit messageLogged("\nPROCESS TIMEOUT !!!"); bTimeout = true; break; } while(process.bytesAvailable() > 0) { QByteArray line = process.readLine(); QString text = QString::fromUtf8(line.constData()).simplified(); if(regExp.lastIndexIn(text) >= 0) { bool ok = false; int progress = regExp.cap(1).toInt(&ok); if(ok && (progress > prevProgress)) { emit statusUpdated(progress); prevProgress = qMin(progress + 2, 99); } } else if(!text.isEmpty()) { emit messageLogged(text); } } } process.waitForFinished(); if(process.state() != QProcess::NotRunning) { process.kill(); process.waitForFinished(-1); } emit statusUpdated(100); emit messageLogged(QString().sprintf("\nExited with code: 0x%04X", process.exitCode())); if(bTimeout || bAborted || process.exitCode() != EXIT_SUCCESS) { return false; } return true; }
void QgsGPSPlugin::convertGPSFile( const QString& inputFileName, int convertType, const QString& outputFileName, const QString& layerName ) { // what features does the user want to import? QStringList convertStrings; switch ( convertType ) { case 0: convertStrings << QStringLiteral( "-x" ) << QStringLiteral( "transform,wpt=rte,del" ); break; case 1: convertStrings << QStringLiteral( "-x" ) << QStringLiteral( "transform,rte=wpt,del" ); break; case 2: convertStrings << QStringLiteral( "-x" ) << QStringLiteral( "transform,trk=wpt,del" ); break; case 3: convertStrings << QStringLiteral( "-x" ) << QStringLiteral( "transform,wpt=trk,del" ); break; default: QgsDebugMsg( "Illegal conversion index!" ); return; } // try to start the gpsbabel process QStringList babelArgs; babelArgs << mBabelPath << QStringLiteral( "-i" ) << QStringLiteral( "gpx" ) << QStringLiteral( "-f" ) << QStringLiteral( "\"%1\"" ).arg( inputFileName ) << convertStrings << QStringLiteral( "-o" ) << QStringLiteral( "gpx" ) << QStringLiteral( "-F" ) << QStringLiteral( "\"%1\"" ).arg( outputFileName ); QgsDebugMsg( QString( "Conversion command: " ) + babelArgs.join( "|" ) ); QProcess babelProcess; babelProcess.start( babelArgs.join( QStringLiteral( " " ) ) ); if ( !babelProcess.waitForStarted() ) { QMessageBox::warning( nullptr, tr( "Could not start process" ), tr( "Could not start GPSBabel!" ) ); return; } // wait for gpsbabel to finish (or the user to cancel) QProgressDialog progressDialog( tr( "Importing data..." ), tr( "Cancel" ), 0, 0 ); progressDialog.setWindowModality( Qt::WindowModal ); for ( int i = 0; babelProcess.state() == QProcess::Running; ++i ) { progressDialog.setValue( i / 64 ); if ( progressDialog.wasCanceled() ) return; } // did we get any data? if ( babelProcess.exitStatus() != 0 ) { QString babelError( babelProcess.readAllStandardError() ); QString errorMsg( tr( "Could not convert data from %1!\n\n" ) .arg( inputFileName ) ); errorMsg += babelError; QMessageBox::warning( nullptr, tr( "Error converting data" ), errorMsg ); return; } // add the layer switch ( convertType ) { case 0: case 3: emit drawVectorLayer( outputFileName + "?type=waypoint", layerName, QStringLiteral( "gpx" ) ); break; case 1: emit drawVectorLayer( outputFileName + "?type=route", layerName, QStringLiteral( "gpx" ) ); break; case 2: emit drawVectorLayer( outputFileName + "?type=track", layerName, QStringLiteral( "gpx" ) ); break; default: QgsDebugMsg( "Illegal conversion index!" ); return; } emit closeGui(); }
void QgsGPSPlugin::uploadToGPS( QgsVectorLayer* gpxLayer, const QString& device, const QString& port ) { const QString& source( gpxLayer->dataProvider()->dataSourceUri() ); // what kind of data does the user want to upload? QString typeArg, features; if ( source.right( 8 ) == QLatin1String( "waypoint" ) ) { typeArg = QStringLiteral( "-w" ); features = QStringLiteral( "waypoints" ); } else if ( source.right( 5 ) == QLatin1String( "route" ) ) { typeArg = QStringLiteral( "-r" ); features = QStringLiteral( "routes" ); } else if ( source.right( 5 ) == QLatin1String( "track" ) ) { typeArg = QStringLiteral( "-t" ); features = QStringLiteral( "tracks" ); } else { QgsDebugMsg( source.right( 8 ) ); assert( false ); } // try to start the gpsbabel process QStringList babelArgs = mDevices[device]->exportCommand( mBabelPath, typeArg, source.left( source.lastIndexOf( '?' ) ), port ); if ( babelArgs.isEmpty() ) { QMessageBox::warning( nullptr, tr( "Not supported" ), tr( "This device does not support uploading of %1." ) .arg( features ) ); return; } QgsDebugMsg( QString( "Upload command: " ) + babelArgs.join( "|" ) ); QProcess babelProcess; babelProcess.start( babelArgs.join( QStringLiteral( " " ) ) ); if ( !babelProcess.waitForStarted() ) { QMessageBox::warning( nullptr, tr( "Could not start process" ), tr( "Could not start GPSBabel!" ) ); return; } // wait for gpsbabel to finish (or the user to cancel) QProgressDialog progressDialog( tr( "Uploading data..." ), tr( "Cancel" ), 0, 0 ); progressDialog.setWindowModality( Qt::WindowModal ); for ( int i = 0; babelProcess.state() == QProcess::Running; ++i ) { progressDialog.setValue( i / 64 ); if ( progressDialog.wasCanceled() ) return; } // did we get an error? if ( babelProcess.exitStatus() != 0 ) { QString babelError( babelProcess.readAllStandardError() ); QString errorMsg( tr( "Error while uploading data to GPS!\n\n" ) ); errorMsg += babelError; QMessageBox::warning( nullptr, tr( "Error uploading data" ), errorMsg ); return; } // everything was OK, remember this device for next time QSettings settings; settings.setValue( QStringLiteral( "/Plugin-GPS/lastuldevice" ), device ); settings.setValue( QStringLiteral( "/Plugin-GPS/lastulport" ), port ); emit closeGui(); }
const AudioFileModel AnalyzeTask::analyzeFile(const QString &filePath, int *type) { *type = fileTypeNormal; AudioFileModel audioFile(filePath); QFile readTest(filePath); if(!readTest.open(QIODevice::ReadOnly)) { *type = fileTypeDenied; return audioFile; } if(checkFile_CDDA(readTest)) { *type = fileTypeCDDA; return audioFile; } readTest.close(); bool skipNext = false; QPair<quint32, quint32> id_val(UINT_MAX, UINT_MAX); quint32 coverType = UINT_MAX; QByteArray coverData; QStringList params; params << QString("--Inform=file://%1").arg(QDir::toNativeSeparators(m_templateFile)); params << QDir::toNativeSeparators(filePath); QProcess process; MUtils::init_process(process, QFileInfo(m_mediaInfoBin).absolutePath()); process.start(m_mediaInfoBin, params); if(!process.waitForStarted()) { qWarning("MediaInfo process failed to create!"); qWarning("Error message: \"%s\"\n", process.errorString().toLatin1().constData()); process.kill(); process.waitForFinished(-1); return audioFile; } while(process.state() != QProcess::NotRunning) { if(*m_abortFlag) { process.kill(); qWarning("Process was aborted on user request!"); break; } if(!process.waitForReadyRead()) { if(process.state() == QProcess::Running) { qWarning("MediaInfo time out. Killing process and skipping file!"); process.kill(); process.waitForFinished(-1); return audioFile; } } QByteArray data; while(process.canReadLine()) { QString line = QString::fromUtf8(process.readLine().constData()).simplified(); if(!line.isEmpty()) { //qDebug("Line:%s", MUTILS_UTF8(line)); int index = line.indexOf('='); if(index > 0) { QString key = line.left(index).trimmed(); QString val = line.mid(index+1).trimmed(); if(!key.isEmpty()) { updateInfo(audioFile, skipNext, id_val, coverType, coverData, key, val); } } } } } if(audioFile.metaInfo().title().isEmpty()) { QString baseName = QFileInfo(filePath).fileName(); int index = baseName.lastIndexOf("."); if(index >= 0) { baseName = baseName.left(index); } baseName = baseName.replace("_", " ").simplified(); index = baseName.lastIndexOf(" - "); if(index >= 0) { baseName = baseName.mid(index + 3).trimmed(); } audioFile.metaInfo().setTitle(baseName); } process.waitForFinished(); if(process.state() != QProcess::NotRunning) { process.kill(); process.waitForFinished(-1); } if((coverType != UINT_MAX) && (!coverData.isEmpty())) { retrieveCover(audioFile, coverType, coverData); } if((audioFile.techInfo().audioType().compare("PCM", Qt::CaseInsensitive) == 0) && (audioFile.techInfo().audioProfile().compare("Float", Qt::CaseInsensitive) == 0)) { if(audioFile.techInfo().audioBitdepth() == 32) audioFile.techInfo().setAudioBitdepth(AudioFileModel::BITDEPTH_IEEE_FLOAT32); } return audioFile; }
bool AnalyzeTask::analyzeAvisynthFile(const QString &filePath, AudioFileModel &info) { QProcess process; MUtils::init_process(process, QFileInfo(m_avs2wavBin).absolutePath()); process.start(m_avs2wavBin, QStringList() << QDir::toNativeSeparators(filePath) << "?"); if(!process.waitForStarted()) { qWarning("AVS2WAV process failed to create!"); qWarning("Error message: \"%s\"\n", process.errorString().toLatin1().constData()); process.kill(); process.waitForFinished(-1); return false; } bool bInfoHeaderFound = false; while(process.state() != QProcess::NotRunning) { if(*m_abortFlag) { process.kill(); qWarning("Process was aborted on user request!"); break; } if(!process.waitForReadyRead()) { if(process.state() == QProcess::Running) { qWarning("AVS2WAV time out. Killing process and skipping file!"); process.kill(); process.waitForFinished(-1); return false; } } QByteArray data; while(process.canReadLine()) { QString line = QString::fromUtf8(process.readLine().constData()).simplified(); if(!line.isEmpty()) { int index = line.indexOf(':'); if(index > 0) { QString key = line.left(index).trimmed(); QString val = line.mid(index+1).trimmed(); if(bInfoHeaderFound && !key.isEmpty() && !val.isEmpty()) { if(key.compare("TotalSeconds", Qt::CaseInsensitive) == 0) { bool ok = false; unsigned int duration = val.toUInt(&ok); if(ok) info.techInfo().setDuration(duration); } if(key.compare("SamplesPerSec", Qt::CaseInsensitive) == 0) { bool ok = false; unsigned int samplerate = val.toUInt(&ok); if(ok) info.techInfo().setAudioSamplerate (samplerate); } if(key.compare("Channels", Qt::CaseInsensitive) == 0) { bool ok = false; unsigned int channels = val.toUInt(&ok); if(ok) info.techInfo().setAudioChannels(channels); } if(key.compare("BitsPerSample", Qt::CaseInsensitive) == 0) { bool ok = false; unsigned int bitdepth = val.toUInt(&ok); if(ok) info.techInfo().setAudioBitdepth(bitdepth); } } } else { if(line.contains("[Audio Info]", Qt::CaseInsensitive)) { info.techInfo().setAudioType("Avisynth"); info.techInfo().setContainerType("Avisynth"); bInfoHeaderFound = true; } } } } } process.waitForFinished(); if(process.state() != QProcess::NotRunning) { process.kill(); process.waitForFinished(-1); } //Check exit code switch(process.exitCode()) { case 0: qDebug("Avisynth script was analyzed successfully."); return true; break; case -5: qWarning("It appears that Avisynth is not installed on the system!"); return false; break; default: qWarning("Failed to open the Avisynth script, bad AVS file?"); return false; break; } }
// Index any PDFs that are attached. Basically it turns the PDF into text and adds it the same // way as a note's body void IndexRunner::indexAttachment(qint32 lid, Resource &r) { return; ResourceTable rtable(&db->conn); qint32 reslid = rtable.getLid(r.guid); if (lid <= 0 || !keepRunning || pauseIndexing) return; QString extension = ""; if (r.__isset.attributes && r.attributes.__isset.fileName) { extension = QString::fromStdString(r.attributes.fileName); int i = extension.indexOf("."); extension = extension.mid(i); } if (extension == ".exe" || extension == ".dlL" || extension == ".zip" || extension == ".bz" || extension == ".tar.gz" || extension == ".tar") return; QString file = global.fileManager.getDbaDirPath() + QString::number(reslid) +extension; QString outFile = global.fileManager.getDbaDirPath() + QString::number(reslid) + "-index.txt"; QProcess sofficeProcess; sofficeProcess.start("soffice --headless --convert-to txt:\"text\" "+file, QIODevice::ReadWrite|QIODevice::Unbuffered); QLOG_DEBUG() << "Starting soffice " << sofficeProcess.waitForStarted(); QLOG_DEBUG() << "Stopping soffice " << sofficeProcess.waitForFinished() << " Return Code: " << sofficeProcess.state(); QLOG_DEBUG() << "soffice Errors:" << sofficeProcess.readAllStandardError(); QLOG_DEBUG() << "soffice Output:" << sofficeProcess.readAllStandardOutput(); return; QSqlQuery sql(db->conn); sql.prepare("Insert into SearchIndex (lid, weight, source, content) values (:lid, :weight, 'recognition', :content)"); sql.bindValue(":lid", lid); sql.bindValue(":weight", 100); //sql.bindValue(":content", text); sql.exec(); }
/// called after "file" set in constructor void g2m::interpret() { //success = false; QProcess toCanon; bool foundEOF; // checked at the end if (!startInterp(toCanon)) // finds rs274, reads tooltable, start interpreter return; if (!toCanon.waitForReadyRead(1000) ) { if ( toCanon.state() == QProcess::NotRunning ){ infoMsg("Interpreter died. Bad tool table?"); } else infoMsg("Interpreter timed out for an unknown reason."); std::cout << "stderr: " << (const char*)toCanon.readAllStandardError() << std::endl; std::cout << "stdout: " << (const char*)toCanon.readAllStandardOutput() << std::endl; toCanon.close(); return; } // rs274 has now started correctly, and is ready to read ngc-file qint64 lineLength; char line[260]; int fails = 0; do { if (toCanon.canReadLine()) { lineLength = toCanon.readLine(line, sizeof(line)); // read one output line from rs274 if (lineLength != -1 ) { QString l(line); emit canonLineMessage( l.left(l.size()-1) ); foundEOF = processCanonLine(line); // line is a canon-line } else { //shouldn't get here! std::cout << " ERROR: lineLength= " << lineLength << " fails="<< fails << "\n"; fails++; } } else { std::cout << " ERROR: toCanon.canReadLine() fails="<< fails << "\n"; fails++; } toCanon.waitForReadyRead(); } while ( (fails < 100) && ( (toCanon.canReadLine()) || ( toCanon.state() != QProcess::NotRunning ) ) ); if (fails > 1) { if (fails < 100) { infoMsg("Waited for interpreter over 100 times."); } else { infoMsg("Waited 100 seconds for interpreter. Giving up."); toCanon.close(); return; } } std::string s = (const char *)toCanon.readAllStandardError(); s.erase(0,s.find("executing")); if (s.size() > 10) { infoMsg("Interpreter exited with error:\n"+s.substr(10)); return; } if (!foundEOF) { infoMsg("Warning: file data not terminated correctly. If the file is terminated correctly, this indicates a problem interpreting the file."); } emit debugMessage( tr("g2m: read %1 lines of g-code which produced %2 canon-lines.").arg(gcode_lines).arg(lineVector.size()) ); return; }
bool MP3Decoder::decode(const QString &sourceFile, const QString &outputFile, volatile bool *abortFlag) { QProcess process; QStringList args; args << "-v" << "--utf8" << "-w" << QDir::toNativeSeparators(outputFile); args << QDir::toNativeSeparators(sourceFile); if(!startProcess(process, m_binary, args)) { return false; } bool bTimeout = false; bool bAborted = false; int prevProgress = -1; QRegExp regExp("\\b\\d+\\+\\d+\\s+(\\d+):(\\d+)\\.(\\d+)\\+(\\d+):(\\d+)\\.(\\d+)\\b"); while(process.state() != QProcess::NotRunning) { if(*abortFlag) { process.kill(); bAborted = true; emit messageLogged("\nABORTED BY USER !!!"); break; } process.waitForReadyRead(m_processTimeoutInterval); if(!process.bytesAvailable() && process.state() == QProcess::Running) { process.kill(); qWarning("mpg123 process timed out <-- killing!"); emit messageLogged("\nPROCESS TIMEOUT !!!"); bTimeout = true; break; } while(process.bytesAvailable() > 0) { QByteArray line = process.readLine(); QString text = QString::fromUtf8(line.constData()).simplified(); if(regExp.lastIndexIn(text) >= 0) { quint32 values[6]; if (MUtils::regexp_parse_uint32(regExp, values, 6)) { const double timeDone = (60.0 * double(values[0])) + double(values[1]) + (double(values[2]) / 100.0); const double timeLeft = (60.0 * double(values[3])) + double(values[4]) + (double(values[5]) / 100.0); if ((timeDone >= 0.005) || (timeLeft >= 0.005)) { const int newProgress = qRound((static_cast<double>(timeDone) / static_cast<double>(timeDone + timeLeft)) * 100.0); if (newProgress > prevProgress) { emit statusUpdated(newProgress); prevProgress = qMin(newProgress + 2, 99); } } } } else if(!text.isEmpty()) { emit messageLogged(text); } } } process.waitForFinished(); if(process.state() != QProcess::NotRunning) { process.kill(); process.waitForFinished(-1); } emit statusUpdated(100); emit messageLogged(QString().sprintf("\nExited with code: 0x%04X", process.exitCode())); if(bTimeout || bAborted || process.exitCode() != EXIT_SUCCESS) { return false; } return true; }
bool ProcessSocket::isDead() { QProcess *proc = qobject_cast<QProcess *>(d); Q_ASSERT(proc); return proc->state() != QProcess::Running; }
bool OpusEncoder::encode(const QString &sourceFile, const AudioFileModel_MetaInfo &metaInfo, const unsigned int duration, const QString &outputFile, volatile bool *abortFlag) { QProcess process; QStringList args; switch(m_configRCMode) { case SettingsModel::VBRMode: args << "--vbr"; break; case SettingsModel::ABRMode: args << "--cvbr"; break; case SettingsModel::CBRMode: args << "--hard-cbr"; break; default: THROW("Bad rate-control mode!"); break; } args << "--comp" << QString::number(m_configEncodeComplexity); switch(m_configFrameSize) { case 0: args << "--framesize" << "2.5"; break; case 1: args << "--framesize" << "5"; break; case 2: args << "--framesize" << "10"; break; case 3: args << "--framesize" << "20"; break; case 4: args << "--framesize" << "40"; break; case 5: args << "--framesize" << "60"; break; } args << QString("--bitrate") << QString::number(qBound(8, (m_configBitrate + 1) * 8, 256)); if(!metaInfo.title().isEmpty()) args << "--title" << cleanTag(metaInfo.title()); if(!metaInfo.artist().isEmpty()) args << "--artist" << cleanTag(metaInfo.artist()); if(!metaInfo.album().isEmpty()) args << "--album" << cleanTag(metaInfo.album()); if(!metaInfo.genre().isEmpty()) args << "--genre" << cleanTag(metaInfo.genre()); if(metaInfo.year()) args << "--date" << QString::number(metaInfo.year()); if(metaInfo.position()) args << "--comment" << QString("tracknumber=%1").arg(QString::number(metaInfo.position())); if(!metaInfo.comment().isEmpty()) args << "--comment" << QString("comment=%1").arg(cleanTag(metaInfo.comment())); if(!m_configCustomParams.isEmpty()) args << m_configCustomParams.split(" ", QString::SkipEmptyParts); args << QDir::toNativeSeparators(sourceFile); args << QDir::toNativeSeparators(outputFile); if(!startProcess(process, m_binary, args)) { return false; } bool bTimeout = false; bool bAborted = false; int prevProgress = -1; QRegExp regExp("\\((\\d+)%\\)"); while(process.state() != QProcess::NotRunning) { if(*abortFlag) { process.kill(); bAborted = true; emit messageLogged("\nABORTED BY USER !!!"); break; } process.waitForReadyRead(m_processTimeoutInterval); if(!process.bytesAvailable() && process.state() == QProcess::Running) { process.kill(); qWarning("Opus process timed out <-- killing!"); emit messageLogged("\nPROCESS TIMEOUT !!!"); bTimeout = true; break; } while(process.bytesAvailable() > 0) { QByteArray line = process.readLine(); QString text = QString::fromUtf8(line.constData()).simplified(); if(regExp.lastIndexIn(text) >= 0) { bool ok = false; int progress = regExp.cap(1).toInt(&ok); if(ok && (progress > prevProgress)) { emit statusUpdated(progress); prevProgress = qMin(progress + 2, 99); } } else if(!text.isEmpty()) { emit messageLogged(text); } } } process.waitForFinished(); if(process.state() != QProcess::NotRunning) { process.kill(); process.waitForFinished(-1); } emit statusUpdated(100); emit messageLogged(QString().sprintf("\nExited with code: 0x%04X", process.exitCode())); if(bTimeout || bAborted || process.exitCode() != EXIT_SUCCESS) { return false; } return true; }
bool DownmixFilter::apply(const QString &sourceFile, const QString &outputFile, volatile bool *abortFlag) { unsigned int channels = detectChannels(sourceFile, abortFlag); emit messageLogged(QString().sprintf("--> Number of channels is: %d\n", channels)); if((channels == 1) || (channels == 2)) { messageLogged("Skipping downmix!"); qDebug("Dowmmix not required for Mono or Stereo input, skipping!"); return false; } QProcess process; QStringList args; process.setWorkingDirectory(QFileInfo(outputFile).canonicalPath()); args << "-V3" << "-S"; args << "--guard" << "--temp" << "."; args << QDir::toNativeSeparators(sourceFile); args << QDir::toNativeSeparators(outputFile); switch(channels) { case 3: //3.0 (L/R/C) args << "remix" << "1v0.66,3v0.34" << "2v0.66,3v0.34"; break; case 4: //3.1 (L/R/C/LFE) args << "remix" << "1v0.5,3v0.25,4v0.25" << "2v0.5,3v0.25,4v0.25"; break; case 5: //5.0 (L/R/C/BL/BR) args << "remix" << "1v0.5,3v0.25,4v0.25" << "2v0.5,3v0.25,5v0.25"; break; case 6: //5.1 (L/R/C/LFE/BL/BR) args << "remix" << "1v0.4,3v0.2,4v0.2,5v0.2" << "2v0.4,3v0.2,4v0.2,6v0.2"; break; case 7: //7.0 (L/R/C/BL/BR/SL/SR) args << "remix" << "1v0.4,3v0.2,4v0.2,6v0.2" << "2v0.4,3v0.2,5v0.2,7v0.2"; break; case 8: //7.1 (L/R/C/LFE/BL/BR/SL/SR) args << "remix" << "1v0.36,3v0.16,4v0.16,5v0.16,7v0.16" << "2v0.36,3v0.16,4v0.16,6v0.16,8v0.16"; break; case 9: //8.1 (L/R/C/LFE/BL/BR/SL/SR/BC) args << "remix" << "1v0.308,3v0.154,4v0.154,5v0.154,7v0.154,9v0.076" << "2v0.308,3v0.154,4v0.154,6v0.154,8v0.154,9v0.076"; break; default: //Unknown qWarning("Downmixer: Unknown channel configuration!"); args << "channels" << "2"; break; } if(!startProcess(process, m_binary, args)) { return false; } bool bTimeout = false; bool bAborted = false; QRegExp regExp("In:(\\d+)(\\.\\d+)*%"); while(process.state() != QProcess::NotRunning) { if(*abortFlag) { process.kill(); bAborted = true; emit messageLogged("\nABORTED BY USER !!!"); break; } process.waitForReadyRead(m_processTimeoutInterval); if(!process.bytesAvailable() && process.state() == QProcess::Running) { process.kill(); qWarning("SoX process timed out <-- killing!"); emit messageLogged("\nPROCESS TIMEOUT !!!"); bTimeout = true; break; } while(process.bytesAvailable() > 0) { QByteArray line = process.readLine(); QString text = QString::fromUtf8(line.constData()).simplified(); if(regExp.lastIndexIn(text) >= 0) { bool ok = false; int progress = regExp.cap(1).toInt(&ok); if(ok) emit statusUpdated(progress); } else if(!text.isEmpty()) { emit messageLogged(text); } } } process.waitForFinished(); if(process.state() != QProcess::NotRunning) { process.kill(); process.waitForFinished(-1); } emit statusUpdated(100); emit messageLogged(QString().sprintf("\nExited with code: 0x%04X", process.exitCode())); if(bTimeout || bAborted || process.exitStatus() != QProcess::NormalExit || QFileInfo(outputFile).size() == 0) { return false; } return true; }
bool ALACDecoder::decode(const QString &sourceFile, const QString &outputFile, volatile bool *abortFlag) { QProcess process; QStringList args; args << "--decode"; args << "-o" << QDir::toNativeSeparators(outputFile); args << QDir::toNativeSeparators(sourceFile); if(!startProcess(process, m_binary, args)) { return false; } bool bTimeout = false; bool bAborted = false; int prevProgress = -1; //The ALAC Decoder doesn't actually send any status updates :-[ //emit statusUpdated(20 + (QUuid::createUuid().data1 % 60)); QRegExp regExp("\\[(\\d+)\\.(\\d)%\\]"); while(process.state() != QProcess::NotRunning) { if(*abortFlag) { process.kill(); bAborted = true; emit messageLogged("\nABORTED BY USER !!!"); break; } process.waitForReadyRead(m_processTimeoutInterval); if(!process.bytesAvailable() && process.state() == QProcess::Running) { process.kill(); qWarning("ALAC process timed out <-- killing!"); emit messageLogged("\nPROCESS TIMEOUT !!!"); bTimeout = true; break; } while(process.bytesAvailable() > 0) { QByteArray line = process.readLine(); QString text = QString::fromUtf8(line.constData()).simplified(); if(regExp.lastIndexIn(text) >= 0) { bool ok[2] = {false, false}; int intVal[2] = {0, 0}; intVal[0] = regExp.cap(1).toInt(&ok[0]); intVal[1] = regExp.cap(2).toInt(&ok[1]); if(ok[0] && ok[1]) { int progress = qRound(static_cast<double>(intVal[0]) + (static_cast<double>(intVal[1]) / 10.0)); if(progress > prevProgress) { emit statusUpdated(progress); prevProgress = qMin(progress + 2, 99); } } } else if(!text.isEmpty()) { emit messageLogged(text); } } } process.waitForFinished(); if(process.state() != QProcess::NotRunning) { process.kill(); process.waitForFinished(-1); } emit statusUpdated(100); emit messageLogged(QString().sprintf("\nExited with code: 0x%04X", process.exitCode())); if(bTimeout || bAborted || process.exitCode() != EXIT_SUCCESS || QFileInfo(outputFile).size() == 0) { return false; } return true; }
void QgsGPSPlugin::importGPSFile( const QString& inputFileName, QgsBabelFormat* importer, bool importWaypoints, bool importRoutes, bool importTracks, const QString& outputFileName, const QString& layerName ) { // what features does the user want to import? QString typeArg; if ( importWaypoints ) typeArg = QStringLiteral( "-w" ); else if ( importRoutes ) typeArg = QStringLiteral( "-r" ); else if ( importTracks ) typeArg = QStringLiteral( "-t" ); // try to start the gpsbabel process QStringList babelArgs = importer->importCommand( mBabelPath, typeArg, inputFileName, outputFileName ); QgsDebugMsg( QString( "Import command: " ) + babelArgs.join( "|" ) ); QProcess babelProcess; babelProcess.start( babelArgs.join( QStringLiteral( " " ) ) ); if ( !babelProcess.waitForStarted() ) { QMessageBox::warning( nullptr, tr( "Could not start process" ), tr( "Could not start GPSBabel!" ) ); return; } // wait for gpsbabel to finish (or the user to cancel) QProgressDialog progressDialog( tr( "Importing data..." ), tr( "Cancel" ), 0, 0 ); progressDialog.setWindowModality( Qt::WindowModal ); for ( int i = 0; babelProcess.state() == QProcess::Running; ++i ) { progressDialog.setValue( i / 64 ); if ( progressDialog.wasCanceled() ) return; } babelProcess.waitForFinished(); // did we get any data? if ( babelProcess.exitCode() != 0 ) { QString babelError( babelProcess.readAllStandardError() ); QString errorMsg( tr( "Could not import data from %1!\n\n" ) .arg( inputFileName ) ); errorMsg += babelError; QMessageBox::warning( nullptr, tr( "Error importing data" ), errorMsg ); return; } // add the layer if ( importTracks ) emit drawVectorLayer( outputFileName + "?type=track", layerName, QStringLiteral( "gpx" ) ); if ( importRoutes ) emit drawVectorLayer( outputFileName + "?type=route", layerName, QStringLiteral( "gpx" ) ); if ( importWaypoints ) emit drawVectorLayer( outputFileName + "?type=waypoint", layerName, QStringLiteral( "gpx" ) ); emit closeGui(); }
const AudioFileModel& AnalyzeTask::analyzeMediaFile(const QString &filePath, AudioFileModel &audioFile) { //bool skipNext = false; QPair<quint32, quint32> id_val(UINT_MAX, UINT_MAX); quint32 coverType = UINT_MAX; QByteArray coverData; QStringList params; params << L1S("--Language=raw") << L1S("--Output=XML") << L1S("--Full") << L1S("--Cover_Data=base64"); params << QDir::toNativeSeparators(filePath); QProcess process; MUtils::init_process(process, QFileInfo(m_mediaInfoBin).absolutePath()); process.start(m_mediaInfoBin, params); QByteArray data; data.reserve(16384); if(!process.waitForStarted()) { qWarning("MediaInfo process failed to create!"); qWarning("Error message: \"%s\"\n", process.errorString().toLatin1().constData()); process.kill(); process.waitForFinished(-1); return audioFile; } while(process.state() != QProcess::NotRunning) { if(MUTILS_BOOLIFY(m_abortFlag)) { process.kill(); qWarning("Process was aborted on user request!"); break; } if(!process.waitForReadyRead()) { if(process.state() == QProcess::Running) { qWarning("MediaInfo time out. Killing the process now!"); process.kill(); process.waitForFinished(-1); break; } } forever { const QByteArray dataNext = process.readAll(); if (dataNext.isEmpty()) { break; /*no more input data*/ } data += dataNext.trimmed(); } } process.waitForFinished(); if (process.state() != QProcess::NotRunning) { process.kill(); process.waitForFinished(-1); } while (!process.atEnd()) { const QByteArray dataNext = process.readAll(); if (dataNext.isEmpty()) { break; /*no more input data*/ } data += dataNext.trimmed(); } #if MUTILS_DEBUG qDebug("-----BEGIN MEDIAINFO-----\n%s\n-----END MEDIAINFO-----", data.constData()); #endif //MUTILS_DEBUG return parseMediaInfo(data, audioFile); }
void QgsGPSPlugin::downloadFromGPS( const QString& device, const QString& port, bool downloadWaypoints, bool downloadRoutes, bool downloadTracks, const QString& outputFileName, const QString& layerName ) { // what does the user want to download? QString typeArg, features; if ( downloadWaypoints ) { typeArg = QStringLiteral( "-w" ); features = QStringLiteral( "waypoints" ); } else if ( downloadRoutes ) { typeArg = QStringLiteral( "-r" ); features = QStringLiteral( "routes" ); } else if ( downloadTracks ) { typeArg = QStringLiteral( "-t" ); features = QStringLiteral( "tracks" ); } // try to start the gpsbabel process QStringList babelArgs = mDevices[device]->importCommand( mBabelPath, typeArg, port, outputFileName ); if ( babelArgs.isEmpty() ) { QMessageBox::warning( nullptr, tr( "Not supported" ), tr( "This device does not support downloading of %1." ) .arg( features ) ); return; } QgsDebugMsg( QString( "Download command: " ) + babelArgs.join( "|" ) ); QProcess babelProcess; babelProcess.start( babelArgs.join( QStringLiteral( " " ) ) ); if ( !babelProcess.waitForStarted() ) { QMessageBox::warning( nullptr, tr( "Could not start process" ), tr( "Could not start GPSBabel!" ) ); return; } // wait for gpsbabel to finish (or the user to cancel) QProgressDialog progressDialog( tr( "Downloading data..." ), tr( "Cancel" ), 0, 0 ); progressDialog.setWindowModality( Qt::WindowModal ); for ( int i = 0; babelProcess.state() == QProcess::Running; ++i ) { progressDialog.setValue( i / 64 ); if ( progressDialog.wasCanceled() ) return; } // did we get any data? if ( babelProcess.exitStatus() != 0 ) { QString babelError( babelProcess.readAllStandardError() ); QString errorMsg( tr( "Could not download data from GPS!\n\n" ) ); errorMsg += babelError; QMessageBox::warning( nullptr, tr( "Error downloading data" ), errorMsg ); return; } // add the layer if ( downloadWaypoints ) emit drawVectorLayer( outputFileName + "?type=waypoint", layerName, QStringLiteral( "gpx" ) ); if ( downloadRoutes ) emit drawVectorLayer( outputFileName + "?type=route", layerName, QStringLiteral( "gpx" ) ); if ( downloadTracks ) emit drawVectorLayer( outputFileName + "?type=track", layerName, QStringLiteral( "gpx" ) ); // everything was OK, remember the device and port for next time QSettings settings; settings.setValue( QStringLiteral( "/Plugin-GPS/lastdldevice" ), device ); settings.setValue( QStringLiteral( "/Plugin-GPS/lastdlport" ), port ); emit closeGui(); }
bool AnalyzeTask::analyzeAvisynthFile(const QString &filePath, AudioFileModel &info) { QProcess process; MUtils::init_process(process, QFileInfo(m_avs2wavBin).absolutePath()); process.start(m_avs2wavBin, QStringList() << QDir::toNativeSeparators(filePath) << "?"); if(!process.waitForStarted()) { qWarning("AVS2WAV process failed to create!"); qWarning("Error message: \"%s\"\n", process.errorString().toLatin1().constData()); process.kill(); process.waitForFinished(-1); return false; } bool bInfoHeaderFound = false; while(process.state() != QProcess::NotRunning) { if(MUTILS_BOOLIFY(m_abortFlag)) { process.kill(); qWarning("Process was aborted on user request!"); break; } if(!process.waitForReadyRead()) { if(process.state() == QProcess::Running) { qWarning("AVS2WAV time out. Killing process and skipping file!"); process.kill(); process.waitForFinished(-1); return false; } } while(process.canReadLine()) { const QString line = QString::fromUtf8(process.readLine().constData()).simplified(); if(!line.isEmpty()) { if(bInfoHeaderFound) { const qint32 index = line.indexOf(':'); if (index > 0) { const QString key = line.left(index).trimmed(); const QString val = line.mid(index + 1).trimmed(); if (!(key.isEmpty() || val.isEmpty())) { switch (m_avisynthIdx.value(key.toLower(), MI_propertyId_t(-1))) { case propertyId_duration: SET_OPTIONAL(quint32, parseUnsigned(val, _tmp), info.techInfo().setDuration(_tmp)); break; case propertyId_samplingrate: SET_OPTIONAL(quint32, parseUnsigned(val, _tmp), info.techInfo().setAudioSamplerate(_tmp)); break; case propertyId_channel_s_: SET_OPTIONAL(quint32, parseUnsigned(val, _tmp), info.techInfo().setAudioChannels(_tmp)); break; case propertyId_bitdepth: SET_OPTIONAL(quint32, parseUnsigned(val, _tmp), info.techInfo().setAudioBitdepth(_tmp)); break; } } } } else { if(line.contains("[Audio Info]", Qt::CaseInsensitive)) { info.techInfo().setAudioType("Avisynth"); info.techInfo().setContainerType("Avisynth"); bInfoHeaderFound = true; } } } } } process.waitForFinished(); if(process.state() != QProcess::NotRunning) { process.kill(); process.waitForFinished(-1); } //Check exit code switch(process.exitCode()) { case 0: qDebug("Avisynth script was analyzed successfully."); return true; break; case -5: qWarning("It appears that Avisynth is not installed on the system!"); return false; break; default: qWarning("Failed to open the Avisynth script, bad AVS file?"); return false; break; } }
/* Take the ENML note and transform it into HTML that WebKit will not complain about */ QByteArray EnmlFormatter::rebuildNoteEnml() { resources.clear(); QByteArray b; qint32 index; content.replace("</input>",""); // Strip off HTML header index = content.indexOf("<body"); index = content.indexOf(">", index)+1; content.remove(0,index); index = content.indexOf("</body"); content.truncate(index); b.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"); b.append("<!DOCTYPE en-note SYSTEM 'http://xml.evernote.com/pub/enml2.dtd'>\n"); b.append("<html><head><title></title></head>"); b.append("<body style=\"word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;\" >"); b.append(content); b.append("</body></html>"); content.clear(); content = b; // Run it through "tidy". It is a program which will fix any invalid HTML // and give us the results back through stdout. In a perfect world this // wouldn't be needed, but WebKit doesn't always give back good HTML. QProcess tidyProcess; tidyProcess.start("tidy -raw -asxhtml -q -m -u -utf8 ", QIODevice::ReadWrite|QIODevice::Unbuffered); QLOG_DEBUG() << "Starting tidy " << tidyProcess.waitForStarted(); tidyProcess.waitForStarted(); tidyProcess.write(content); tidyProcess.closeWriteChannel(); tidyProcess.waitForFinished(); QLOG_DEBUG() << "Stopping tidy " << tidyProcess.waitForFinished() << " Return Code: " << tidyProcess.state(); QLOG_DEBUG() << "Tidy Errors:" << tidyProcess.readAllStandardError(); content.clear(); content.append(tidyProcess.readAllStandardOutput()); if (content == "") { formattingError = true; return ""; } // Tidy puts this in place, but we don't really need it. content.replace("<form>", ""); content.replace("</form>", ""); index = content.indexOf("<body"); content.remove(0,index); content.prepend("<style>img { height:auto; width:auto; max-height:auto; max-width:100%; }</style>"); content.prepend("<head><meta http-equiv=\"content-type\" content=\"text-html; charset=utf-8\"></head>"); content.prepend("<html>"); content.append("</html>"); content = fixEncryptionTags(content); QWebPage page; QEventLoop loop; page.mainFrame()->setContent(content); QObject::connect(&page, SIGNAL(loadFinished(bool)), &loop, SLOT(quit())); QWebElement element = page.mainFrame()->documentElement(); QStringList tags = findAllTags(element); for (int i=0; i<tags.size(); i++) { QString tag = tags[i]; QWebElementCollection anchors = page.mainFrame()->findAllElements(tag); foreach (QWebElement element, anchors) { if (element.tagName().toLower() == "input") { processTodo(element); } else if (element.tagName().toLower() == "a") { fixLinkNode(element); } else if (element.tagName().toLower() == "object") { fixObjectNode(element); } else if (element.tagName().toLower() == "img") { fixImgNode(element); } else if (!isElementValid(element.tagName())) element.removeFromDocument(); } } content.clear(); content.append(element.toOuterXml()); // Strip off HTML header index = content.indexOf("<body"); index = content.indexOf(">", index)+1; content.remove(0,index); index = content.indexOf("</body"); content.truncate(index); b.clear(); b.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"); b.append("<!DOCTYPE en-note SYSTEM 'http://xml.evernote.com/pub/enml2.dtd'>"); b.append("<en-note style=\"word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;\" >"); b.append(content); b.append("</en-note>"); content.clear(); content = b; postXmlFix(); return content; }
// Function which displays a info box and restarts networking void Utils::restartNetworking() { QMessageBox infoBox; infoBox.setWindowModality(Qt::ApplicationModal); infoBox.setWindowTitle(QObject::tr("Restarting network...")); infoBox.setInformativeText(QObject::tr("Network is restarting, please wait...")); infoBox.setStandardButtons(QMessageBox::NoButton); infoBox.show(); QProcess cmd; cmd.start(QString("/etc/rc.d/netif"), QStringList() << "restart" ); while ( cmd.state() != QProcess::NotRunning ) { cmd.waitForFinished(100); QCoreApplication::processEvents(); } // Set the gateway device name QString route = getConfFileValue("/etc/rc.conf", "defaultrouter=", 1); if ( ! route.isEmpty() ) { infoBox.setInformativeText(QObject::tr("Setting default route...")); cmd.start(QString("route"), QStringList() << "delete" << "default" ); while ( cmd.state() != QProcess::NotRunning ) { cmd.waitForFinished(100); QCoreApplication::processEvents(); } cmd.start(QString("route"), QStringList() << "add" << "default" << route ); while ( cmd.state() != QProcess::NotRunning ) { cmd.waitForFinished(100); QCoreApplication::processEvents(); } } // Check for any devices to run DHCP on QStringList ifs = NetworkInterface::getInterfaces(); for ( QStringList::Iterator it = ifs.begin(); it != ifs.end(); ++it ) { QString dev = *it; // Devices we can safely skip if (dev.indexOf("lo") == 0 || dev.indexOf("fwe") == 0 || dev.indexOf("ipfw") == 0 || dev.indexOf("plip") == 0 || dev.indexOf("pfsync") == 0 || dev.indexOf("pflog") == 0 || dev.indexOf("usbus") == 0 || dev.indexOf("vboxnet") == 0 || dev.indexOf("tun") == 0) continue; // Check if this device has DHCP enabled if ( Utils::getConfFileValue( "/etc/rc.conf", "ifconfig_" + dev + "=", 1 ).indexOf("DHCP") != -1 ) { qDebug() << "Running DHCP on " << dev; infoBox.setInformativeText(QObject::tr("Running DHCP...")); cmd.start(QString("/etc/rc.d/dhclient"), QStringList() << "start" << dev ); while ( cmd.state() != QProcess::NotRunning ) { cmd.waitForFinished(100); QCoreApplication::processEvents(); } } } infoBox.close(); }
bool ResampleFilter::apply(const QString &sourceFile, const QString &outputFile, AudioFileModel_TechInfo *formatInfo, volatile bool *abortFlag) { QProcess process; QStringList args; if((m_samplingRate == formatInfo->audioSamplerate()) && (m_bitDepth == formatInfo->audioBitdepth())) { messageLogged("Skipping resample filter!"); qDebug("Resampling filter target samplerate/bitdepth is equals to the format of the input file, skipping!"); return true; } process.setWorkingDirectory(QFileInfo(outputFile).canonicalPath()); args << "-V3" << "-S"; args << "--guard" << "--temp" << "."; args << QDir::toNativeSeparators(sourceFile); if(m_bitDepth) { args << "-b" << QString::number(m_bitDepth); } args << QDir::toNativeSeparators(outputFile); if(m_samplingRate) { args << "rate"; args << ((m_bitDepth > 16) ? "-v" : "-h"); //if resampling at/to > 16 bit depth (i.e. most commonly 24-bit), use VHQ (-v), otherwise, use HQ (-h) args << ((m_samplingRate > 40000) ? "-L" : "-I"); //if resampling to < 40k, use intermediate phase (-I), otherwise use linear phase (-L) args << QString::number(m_samplingRate); } if((m_bitDepth || m_samplingRate) && (m_bitDepth <= 16)) { args << "dither" << "-s"; //if you're mastering to 16-bit, you also need to add 'dither' (and in most cases noise-shaping) after the rate } if(!startProcess(process, m_binary, args)) { return false; } bool bTimeout = false; bool bAborted = false; QRegExp regExp("In:(\\d+)(\\.\\d+)*%"); while(process.state() != QProcess::NotRunning) { if(*abortFlag) { process.kill(); bAborted = true; emit messageLogged("\nABORTED BY USER !!!"); break; } process.waitForReadyRead(m_processTimeoutInterval); if(!process.bytesAvailable() && process.state() == QProcess::Running) { process.kill(); qWarning("SoX process timed out <-- killing!"); emit messageLogged("\nPROCESS TIMEOUT !!!"); bTimeout = true; break; } while(process.bytesAvailable() > 0) { QByteArray line = process.readLine(); QString text = QString::fromUtf8(line.constData()).simplified(); if(regExp.lastIndexIn(text) >= 0) { bool ok = false; int progress = regExp.cap(1).toInt(&ok); if(ok) emit statusUpdated(progress); } else if(!text.isEmpty()) { emit messageLogged(text); } } } process.waitForFinished(); if(process.state() != QProcess::NotRunning) { process.kill(); process.waitForFinished(-1); } emit statusUpdated(100); emit messageLogged(QString().sprintf("\nExited with code: 0x%04X", process.exitCode())); if(bTimeout || bAborted || process.exitCode() != EXIT_SUCCESS || QFileInfo(outputFile).size() == 0) { return false; } if(m_samplingRate) formatInfo->setAudioSamplerate(m_samplingRate); if(m_bitDepth) formatInfo->setAudioBitdepth(m_bitDepth); return true; }
foreach (const TestConfiguration *testConfiguration, selectedTests) { QScopedPointer<TestOutputReader> outputReader; switch (testConfiguration->testType()) { case TestTypeQt: outputReader.reset(new QtTestOutputReader(futureInterface, &testProcess, testConfiguration->buildDirectory())); break; case TestTypeGTest: outputReader.reset(new GTestOutputReader(futureInterface, &testProcess, testConfiguration->buildDirectory())); break; } if (futureInterface.isCanceled()) break; if (!testConfiguration->project()) continue; QProcessEnvironment environment = testConfiguration->environment().toProcessEnvironment(); QString commandFilePath = executableFilePath(testConfiguration->targetFile(), environment); if (commandFilePath.isEmpty()) { futureInterface.reportResult(TestResultPtr(new FaultyTestResult(Result::MessageFatal, QObject::tr("Could not find command \"%1\". (%2)") .arg(testConfiguration->targetFile()) .arg(testConfiguration->displayName())))); continue; } if (testConfiguration->testType() == TestTypeQt) { QStringList argumentList(QLatin1String("-xml")); if (!metricsOption.isEmpty()) argumentList << metricsOption; if (testConfiguration->testCases().count()) argumentList << testConfiguration->testCases(); testProcess.setArguments(argumentList); } else { // TestTypeGTest QStringList argumentList; const QStringList &testSets = testConfiguration->testCases(); if (testSets.size()) { argumentList << QLatin1String("--gtest_filter=") + testSets.join(QLatin1Char(':')); } if (settings.gtestRunDisabled) argumentList << QLatin1String("--gtest_also_run_disabled_tests"); if (settings.gtestRepeat) argumentList << QString::fromLatin1("--gtest_repeat=%1").arg(settings.gtestIterations); if (settings.gtestShuffle) { argumentList << QLatin1String("--gtest_shuffle"); argumentList << QString::fromLatin1("--gtest_random_seed=%1").arg(settings.gtestSeed); } testProcess.setArguments(argumentList); } testProcess.setWorkingDirectory(testConfiguration->workingDirectory()); if (Utils::HostOsInfo::isWindowsHost()) environment.insert(QLatin1String("QT_LOGGING_TO_CONSOLE"), QLatin1String("1")); testProcess.setProcessEnvironment(environment); testProcess.setProgram(commandFilePath); testProcess.start(); bool ok = testProcess.waitForStarted(); QTime executionTimer; executionTimer.start(); bool canceledByTimeout = false; if (ok) { while (testProcess.state() == QProcess::Running) { if (executionTimer.elapsed() >= timeout) { canceledByTimeout = true; break; } if (futureInterface.isCanceled()) { testProcess.kill(); testProcess.waitForFinished(); return; } eventLoop.processEvents(); } } if (canceledByTimeout) { if (testProcess.state() != QProcess::NotRunning) { testProcess.kill(); testProcess.waitForFinished(); } futureInterface.reportResult(TestResultPtr( new FaultyTestResult(Result::MessageFatal, QObject::tr( "Test case canceled due to timeout. \nMaybe raise the timeout?")))); } }
void GRASS_EXPORT QgsGrass::init( void ) { // Warning!!! // G_set_error_routine() once called from plugin // is not valid in provider -> call it always // Set error function G_set_error_routine( &error_routine ); if ( initialized ) return; QSettings settings; // Is it active mode ? if ( getenv( "GISRC" ) ) { active = true; // Store default values defaultGisdbase = G_gisdbase(); defaultLocation = G_location(); defaultMapset = G_mapset(); } else { active = false; } // Don't use GISRC file and read/write GRASS variables (from location G_VAR_GISRC) to memory only. G_set_gisrc_mode( G_GISRC_MODE_MEMORY ); // Init GRASS libraries (required) G_no_gisinit(); // Doesn't check write permissions for mapset compare to G_gisinit("libgrass++"); // I think that mask should not be used in QGIS as it can only confuses people, // anyway, I don't think anybody is using MASK G_suppress_masking(); // Set program name G_set_program_name( "QGIS" ); // Require GISBASE to be set. This should point to the location of // the GRASS installation. The GRASS libraries use it to know // where to look for things. // Look first to see if GISBASE env var is already set. // This is set when QGIS is run from within GRASS // or when set explicitly by the user. // This value should always take precedence. #if WIN32 QString gisBase = getenv( "WINGISBASE" ) ? getenv( "WINGISBASE" ) : getenv( "GISBASE" ); gisBase = shortPath( gisBase ); #else QString gisBase = getenv( "GISBASE" ); #endif QgsDebugMsg( QString( "GRASS gisBase from GISBASE env var is: %1" ).arg( gisBase ) ); if ( !isValidGrassBaseDir( gisBase ) ) { // Look for gisbase in QSettings gisBase = settings.value( "/GRASS/gisbase", "" ).toString(); QgsDebugMsg( QString( "GRASS gisBase from QSettings is: %1" ).arg( gisBase ) ); } if ( !isValidGrassBaseDir( gisBase ) ) { // Erase gisbase from settings because it does not exists settings.setValue( "/GRASS/gisbase", "" ); #ifdef WIN32 // Use the applicationDirPath()/grass gisBase = shortPath( QCoreApplication::applicationDirPath() + "/grass" ); QgsDebugMsg( QString( "GRASS gisBase = %1" ).arg( gisBase ) ); #else // Use the location specified --with-grass during configure gisBase = GRASS_BASE; QgsDebugMsg( QString( "GRASS gisBase from configure is: %1" ).arg( gisBase ) ); #endif } bool userGisbase = false; bool valid = false; while ( !( valid = isValidGrassBaseDir( gisBase ) ) ) { // ask user if he wants to specify GISBASE QMessageBox::StandardButton res = QMessageBox::warning( 0, QObject::tr( "GRASS plugin" ), QObject::tr( "QGIS couldn't find your GRASS installation.\n" "Would you like to specify path (GISBASE) to your GRASS installation?" ), QMessageBox::Ok | QMessageBox::Cancel ); if ( res != QMessageBox::Ok ) { userGisbase = false; break; } // XXX Need to subclass this and add explantory message above to left side userGisbase = true; // For Mac, GISBASE folder may be inside GRASS bundle. Use Qt file dialog // since Mac native dialog doesn't allow user to browse inside bundles. gisBase = QFileDialog::getExistingDirectory( 0, QObject::tr( "Choose GRASS installation path (GISBASE)" ), gisBase, QFileDialog::DontUseNativeDialog ); if ( gisBase == QString::null ) { // User pressed cancel. No GRASS for you! userGisbase = false; break; } #if defined(WIN32) gisBase = shortPath( gisBase ); #endif } if ( !valid ) { // warn user QMessageBox::information( 0, QObject::tr( "GRASS plugin" ), QObject::tr( "GRASS data won't be available if GISBASE is not specified." ) ); } if ( userGisbase ) { settings.setValue( "/GRASS/gisbase", gisBase ); } QgsDebugMsg( QString( "Valid GRASS gisBase is: %1" ).arg( gisBase ) ); putEnv( "GISBASE", gisBase ); // Add path to GRASS modules #ifdef WIN32 QString sep = ";"; #else QString sep = ":"; #endif QString path = gisBase + "/bin"; path.append( sep + gisBase + "/scripts" ); path.append( sep + QgsApplication::pkgDataPath() + "/grass/scripts/" ); // On windows the GRASS libraries are in // QgsApplication::prefixPath(), we have to add them // to PATH to enable running of GRASS modules // and database drivers #ifdef WIN32 // It seems that QgsApplication::prefixPath() // is not initialized at this point path.append( sep + shortPath( QCoreApplication::applicationDirPath() ) ); // Add path to MSYS bin // Warning: MSYS sh.exe will translate this path to '/bin' if ( QFileInfo( QCoreApplication::applicationDirPath() + "/msys/bin/" ).isDir() ) path.append( sep + shortPath( QCoreApplication::applicationDirPath() + "/msys/bin/" ) ); #endif QString p = getenv( "PATH" ); path.append( sep + p ); QgsDebugMsg( QString( "set PATH: %1" ).arg( path ) ); putEnv( "PATH", path ); // Set PYTHONPATH QString pythonpath = gisBase + "/etc/python"; QString pp = getenv( "PYTHONPATH" ); pythonpath.append( sep + pp ); QgsDebugMsg( QString( "set PYTHONPATH: %1" ).arg( pythonpath ) ); putEnv( "PYTHONPATH", pythonpath ); // Set GRASS_PAGER if not set, it is necessary for some // modules printing to terminal, e.g. g.list // We use 'cat' because 'more' is not present in MSYS (Win) // and it doesn't work well in built in shell (Unix/Mac) // and 'less' is not user friendly (for example user must press // 'q' to quit which is definitely difficult for normal user) // Also scroling can be don in scrollable window in both // MSYS terminal and built in shell. if ( !getenv( "GRASS_PAGER" ) ) { QString pager; QStringList pagers; //pagers << "more" << "less" << "cat"; // se notes above pagers << "cat"; for ( int i = 0; i < pagers.size(); i++ ) { int state; QProcess p; p.start( pagers.at( i ) ); p.waitForStarted(); state = p.state(); p.write( "\004" ); // Ctrl-D p.closeWriteChannel(); p.waitForFinished( 1000 ); p.kill(); if ( state == QProcess::Running ) { pager = pagers.at( i ); break; } } if ( pager.length() > 0 ) { putEnv( "GRASS_PAGER", pager ); } } initialized = 1; }
/** * Starting point for the retracing thread. * * Overrides QThread::run(). */ void Retracer::run() { QString msg = QLatin1String("Replay finished!"); /* * Construct command line */ QString prog; QStringList arguments; switch (m_api) { case trace::API_GL: prog = QLatin1String("glretrace"); break; case trace::API_EGL: prog = QLatin1String("eglretrace"); break; case trace::API_DX: case trace::API_D3D7: case trace::API_D3D8: case trace::API_D3D9: case trace::API_DXGI: #ifdef Q_OS_WIN prog = QLatin1String("d3dretrace"); #else prog = QLatin1String("wine"); arguments << QLatin1String("d3dretrace.exe"); #endif break; default: emit finished(QLatin1String("Unsupported API")); return; } if (m_singlethread) { arguments << QLatin1String("--singlethread"); } if (m_captureState) { arguments << QLatin1String("-D"); arguments << QString::number(m_captureCall); } else if (m_captureThumbnails) { arguments << QLatin1String("-s"); // emit snapshots arguments << QLatin1String("-"); // emit to stdout } else if (isProfiling()) { if (m_profileGpu) { arguments << QLatin1String("--pgpu"); } if (m_profileCpu) { arguments << QLatin1String("--pcpu"); } if (m_profilePixels) { arguments << QLatin1String("--ppd"); } } else { if (m_doubleBuffered) { arguments << QLatin1String("--db"); } else { arguments << QLatin1String("--sb"); } if (m_benchmarking) { arguments << QLatin1String("-b"); } } arguments << m_fileName; /* * Support remote execution on a separate target. */ if (m_remoteTarget.length() != 0) { arguments.prepend(prog); arguments.prepend(m_remoteTarget); prog = QLatin1String("ssh"); } /* * Start the process. */ QProcess process; process.start(prog, arguments, QIODevice::ReadOnly); if (!process.waitForStarted(-1)) { emit finished(QLatin1String("Could not start process")); return; } /* * Process standard output */ QList<QImage> thumbnails; QVariantMap parsedJson; trace::Profile* profile = NULL; process.setReadChannel(QProcess::StandardOutput); if (process.waitForReadyRead(-1)) { BlockingIODevice io(&process); if (m_captureState) { /* * Parse JSON from the output. * * XXX: QJSON's scanner is inneficient as it abuses single * character QIODevice::peek (not cheap), instead of maintaining a * lookahead character on its own. */ bool ok = false; QJson::Parser jsonParser; // Allow Nan/Infinity jsonParser.allowSpecialNumbers(true); #if 0 parsedJson = jsonParser.parse(&io, &ok).toMap(); #else /* * XXX: QJSON expects blocking IO, and it looks like * BlockingIODevice does not work reliably in all cases. */ process.waitForFinished(-1); parsedJson = jsonParser.parse(&process, &ok).toMap(); #endif if (!ok) { msg = QLatin1String("failed to parse JSON"); } } else if (m_captureThumbnails) { /* * Parse concatenated PNM images from output. */ while (!io.atEnd()) { image::PNMInfo info; char header[512]; qint64 headerSize = 0; int headerLines = 3; // assume no optional comment line for (int headerLine = 0; headerLine < headerLines; ++headerLine) { qint64 headerRead = io.readLine(&header[headerSize], sizeof(header) - headerSize); // if header actually contains optional comment line, ... if (headerLine == 1 && header[headerSize] == '#') { ++headerLines; } headerSize += headerRead; } const char *headerEnd = image::readPNMHeader(header, headerSize, info); // if invalid PNM header was encountered, ... if (headerEnd == NULL || info.channelType != image::TYPE_UNORM8) { qDebug() << "error: invalid snapshot stream encountered"; break; } unsigned channels = info.channels; unsigned width = info.width; unsigned height = info.height; // qDebug() << "channels: " << channels << ", width: " << width << ", height: " << height"; QImage snapshot = QImage(width, height, channels == 1 ? QImage::Format_Mono : QImage::Format_RGB888); int rowBytes = channels * width; for (int y = 0; y < height; ++y) { unsigned char *scanLine = snapshot.scanLine(y); qint64 readBytes = io.read((char *) scanLine, rowBytes); Q_ASSERT(readBytes == rowBytes); (void)readBytes; } QImage thumb = thumbnail(snapshot); thumbnails.append(thumb); } Q_ASSERT(process.state() != QProcess::Running); } else if (isProfiling()) { profile = new trace::Profile(); while (!io.atEnd()) { char line[256]; qint64 lineLength; lineLength = io.readLine(line, 256); if (lineLength == -1) break; trace::Profiler::parseLine(line, profile); } } else { QByteArray output; output = process.readAllStandardOutput(); if (output.length() < 80) { msg = QString::fromUtf8(output); } } } /* * Wait for process termination */ process.waitForFinished(-1); if (process.exitStatus() != QProcess::NormalExit) { msg = QLatin1String("Process crashed"); } else if (process.exitCode() != 0) { msg = QLatin1String("Process exited with non zero exit code"); } /* * Parse errors. */ QList<ApiTraceError> errors; process.setReadChannel(QProcess::StandardError); QRegExp regexp("(^\\d+): +(\\b\\w+\\b): ([^\\r\\n]+)[\\r\\n]*$"); while (!process.atEnd()) { QString line = process.readLine(); if (regexp.indexIn(line) != -1) { ApiTraceError error; error.callIndex = regexp.cap(1).toInt(); error.type = regexp.cap(2); error.message = regexp.cap(3); errors.append(error); } else if (!errors.isEmpty()) { // Probably a multiligne message ApiTraceError &previous = errors.last(); if (line.endsWith("\n")) { line.chop(1); } previous.message.append('\n'); previous.message.append(line); } } /* * Emit signals */ if (m_captureState) { ApiTraceState *state = new ApiTraceState(parsedJson); emit foundState(state); } if (m_captureThumbnails && !thumbnails.isEmpty()) { emit foundThumbnails(thumbnails); } if (isProfiling() && profile) { emit foundProfile(profile); } if (!errors.isEmpty()) { emit retraceErrors(errors); } emit finished(msg); }
bool EProcess::exec() { se = so = ""; QMessageBox box; // We're not using a progressdialog, because we have no clue // how long things will take. QString allout; box.setWindowTitle("eln"); box.setText(winCap); box.setWindowModality(Qt::ApplicationModal); box.setStandardButtons(QMessageBox::Cancel); box.show(); QObject::connect(&box, SIGNAL(buttonClicked(QAbstractButton*)), &box, SLOT(close())); QEventLoop el; QProcess process; if (!wd.isEmpty()) process.setWorkingDirectory(wd); process.start(cmd, args); process.closeWriteChannel(); if (!process.waitForStarted()) { QString msg = msgNoStart.isEmpty() ? "Could not start command: " + cmd : msgNoStart; se += msg + "\n"; return false; } for (int ntimeouts=0; ntimeouts<10*300; ntimeouts++) { el.processEvents(); // this makes the messagebox show up if (process.waitForFinished(100)) { break; // success or failure } if (box.isHidden()) { #ifdef Q_OS_LINUX ::kill(process.pid(), SIGINT); // Killing bzr with INT produces cleaner exit than with TERM... #else process.kill(); // ... but if we don't have POSIX, we have no choice. #endif process.waitForFinished(500); // allow it some time to respond to signal break; // not good, but oh well } QString ste = process.readAllStandardError(); allout += ste; se += ste; QString sto = process.readAllStandardOutput(); allout += sto; so += sto; if (!ste.isEmpty() || !sto.isEmpty()) box.setText(winCap + "\n" + allout); } QString ste = process.readAllStandardError(); se += ste; QString sto = process.readAllStandardOutput(); so += sto; se.replace(QRegExp("\\s*Traceback.*"), ""); if (process.state()!=QProcess::NotRunning) { return false; } return process.exitStatus()==QProcess::NormalExit && process.exitCode()==0; }
unsigned int DownmixFilter::detectChannels(const QString &sourceFile, volatile bool *abortFlag) { unsigned int channels = 0; QProcess process; QStringList args; args << "--i" << sourceFile; if(!startProcess(process, m_binary, args)) { return channels; } bool bTimeout = false; bool bAborted = false; QRegExp regExp("Channels\\s*:\\s*(\\d+)", Qt::CaseInsensitive); while(process.state() != QProcess::NotRunning) { if(*abortFlag) { process.kill(); bAborted = true; emit messageLogged("\nABORTED BY USER !!!"); break; } process.waitForReadyRead(m_processTimeoutInterval); if(!process.bytesAvailable() && process.state() == QProcess::Running) { process.kill(); qWarning("SoX process timed out <-- killing!"); emit messageLogged("\nPROCESS TIMEOUT !!!"); bTimeout = true; break; } while(process.bytesAvailable() > 0) { QByteArray line = process.readLine(); QString text = QString::fromUtf8(line.constData()).simplified(); if(regExp.lastIndexIn(text) >= 0) { bool ok = false; unsigned int temp = regExp.cap(1).toUInt(&ok); if(ok) channels = temp; } if(!text.isEmpty()) { emit messageLogged(text); } } } process.waitForFinished(); if(process.state() != QProcess::NotRunning) { process.kill(); process.waitForFinished(-1); } return channels; }
bool AACEncoder::encode(const QString &sourceFile, const AudioFileModel_MetaInfo &metaInfo, const unsigned int duration, const QString &outputFile, volatile bool *abortFlag) { QProcess process; QStringList args; const QString baseName = QFileInfo(outputFile).fileName(); switch(m_configRCMode) { case SettingsModel::VBRMode: args << "-q" << QString().sprintf("%.2f", double(qBound(0, m_configBitrate * 5, 100)) / 100.0); break; case SettingsModel::ABRMode: args << "-br" << QString::number(qBound(8, index2bitrate(m_configBitrate), 400) * 1000); break; case SettingsModel::CBRMode: args << "-cbr" << QString::number(qBound(8, index2bitrate(m_configBitrate), 400) * 1000); break; default: THROW("Bad rate-control mode!"); break; } if(m_configEnable2Pass && (m_configRCMode == SettingsModel::ABRMode)) { args << "-2pass"; } switch(m_configProfile) { case 1: args << "-lc"; //Forces use of LC AAC profile break; case 2: args << "-he"; //Forces use of HE AAC profile break; case 3: args << "-hev2"; //Forces use of HEv2 AAC profile break; } if(!m_configCustomParams.isEmpty()) args << m_configCustomParams.split(" ", QString::SkipEmptyParts); args << "-if" << QDir::toNativeSeparators(sourceFile); args << "-of" << QDir::toNativeSeparators(outputFile); if(!startProcess(process, m_binary_enc, args)) { return false; } bool bTimeout = false; bool bAborted = false; int prevProgress = -1; QRegExp regExp("Processed\\s+(\\d+)\\s+seconds"); QRegExp regExp_pass1("First\\s+pass:\\s+processed\\s+(\\d+)\\s+seconds"); QRegExp regExp_pass2("Second\\s+pass:\\s+processed\\s+(\\d+)\\s+seconds"); while(process.state() != QProcess::NotRunning) { if(*abortFlag) { process.kill(); bAborted = true; emit messageLogged("\nABORTED BY USER !!!"); break; } process.waitForReadyRead(m_processTimeoutInterval); if(!process.bytesAvailable() && process.state() == QProcess::Running) { process.kill(); qWarning("NeroAacEnc process timed out <-- killing!"); emit messageLogged("\nPROCESS TIMEOUT !!!"); bTimeout = true; break; } while(process.bytesAvailable() > 0) { QByteArray line = process.readLine(); QString text = QString::fromUtf8(line.constData()).simplified(); if(regExp_pass1.lastIndexIn(text) >= 0) { bool ok = false; int progress = regExp_pass1.cap(1).toInt(&ok); if(ok && (duration > 0)) { int newProgress = qRound((static_cast<double>(progress) / static_cast<double>(duration)) * 50.0); if(newProgress > prevProgress) { emit statusUpdated(newProgress); prevProgress = qMin(newProgress + 2, 99); } } } else if(regExp_pass2.lastIndexIn(text) >= 0) { bool ok = false; int progress = regExp_pass2.cap(1).toInt(&ok); if(ok && (duration > 0)) { int newProgress = qRound((static_cast<double>(progress) / static_cast<double>(duration)) * 50.0) + 50; if(newProgress > prevProgress) { emit statusUpdated(newProgress); prevProgress = qMin(newProgress + 2, 99); } } } else if(regExp.lastIndexIn(text) >= 0) { bool ok = false; int progress = regExp.cap(1).toInt(&ok); if(ok && (duration > 0)) { int newProgress = qRound((static_cast<double>(progress) / static_cast<double>(duration)) * 100.0); if(newProgress > prevProgress) { emit statusUpdated(newProgress); prevProgress = qMin(newProgress + 2, 99); } } } else if(!text.isEmpty()) { emit messageLogged(text); } } } process.waitForFinished(); if(process.state() != QProcess::NotRunning) { process.kill(); process.waitForFinished(-1); } emit statusUpdated(100); emit messageLogged(QString().sprintf("\nExited with code: 0x%04X", process.exitCode())); if(bTimeout || bAborted || process.exitCode() != EXIT_SUCCESS) { return false; } emit messageLogged("\n-------------------------------\n"); args.clear(); args << QDir::toNativeSeparators(outputFile); if(!metaInfo.title().isEmpty()) args << QString("-meta:title=%1").arg(cleanTag(metaInfo.title())); if(!metaInfo.artist().isEmpty()) args << QString("-meta:artist=%1").arg(cleanTag(metaInfo.artist())); if(!metaInfo.album().isEmpty()) args << QString("-meta:album=%1").arg(cleanTag(metaInfo.album())); if(!metaInfo.genre().isEmpty()) args << QString("-meta:genre=%1").arg(cleanTag(metaInfo.genre())); if(!metaInfo.comment().isEmpty()) args << QString("-meta:comment=%1").arg(cleanTag(metaInfo.comment())); if(metaInfo.year()) args << QString("-meta:year=%1").arg(QString::number(metaInfo.year())); if(metaInfo.position()) args << QString("-meta:track=%1").arg(QString::number(metaInfo.position())); if(!metaInfo.cover().isEmpty()) args << QString("-add-cover:%1:%2").arg("front", metaInfo.cover()); if(!startProcess(process, m_binary_tag, args)) { return false; } bTimeout = false; while(process.state() != QProcess::NotRunning) { if(*abortFlag) { process.kill(); bAborted = true; emit messageLogged("\nABORTED BY USER !!!"); break; } process.waitForReadyRead(m_processTimeoutInterval); if(!process.bytesAvailable() && process.state() == QProcess::Running) { process.kill(); qWarning("NeroAacTag process timed out <-- killing!"); emit messageLogged("\nPROCESS TIMEOUT !!!"); bTimeout = true; break; } while(process.bytesAvailable() > 0) { QByteArray line = process.readLine(); QString text = QString::fromUtf8(line.constData()).simplified(); if(!text.isEmpty()) { emit messageLogged(text); } } } process.waitForFinished(); if(process.state() != QProcess::NotRunning) { process.kill(); process.waitForFinished(-1); } emit messageLogged(QString().sprintf("\nExited with code: 0x%04X", process.exitCode())); if(bTimeout || bAborted || process.exitCode() != EXIT_SUCCESS) { return false; } return true; }
bool AC3Encoder::encode(const QString &sourceFile, const AudioFileModel &metaInfo, const QString &outputFile, volatile bool *abortFlag) { QProcess process; QStringList args; switch(m_configRCMode) { case SettingsModel::VBRMode: args << "-q" << QString::number(qMax(0, qMin(1023, m_configBitrate * 64))); break; case SettingsModel::CBRMode: args << "-b" << QString::number(SettingsModel::ac3Bitrates[qMax(0, qMin(18, m_configBitrate))]); break; default: throw "Bad rate-control mode!"; break; } if(m_configAudioCodingMode >= 1) { args << "-acmod" << QString::number(m_configAudioCodingMode - 1); } if(m_configDynamicRangeCompression != 5) { args << "-dynrng" << QString::number(m_configDynamicRangeCompression); } if(m_configExponentSearchSize != 8) { args << "-exps" << QString::number(m_configExponentSearchSize); } if(m_configFastBitAllocation) { args << "-fba" << QString::number(1); } if(!m_configCustomParams.isEmpty()) args << m_configCustomParams.split(" ", QString::SkipEmptyParts); args << QDir::toNativeSeparators(sourceFile); args << QDir::toNativeSeparators(outputFile); if(!startProcess(process, m_binary, args)) { return false; } bool bTimeout = false; bool bAborted = false; int prevProgress = -1; QRegExp regExp("progress:(\\s+)(\\d+)%(\\s+)\\|"); while(process.state() != QProcess::NotRunning) { if(*abortFlag) { process.kill(); bAborted = true; emit messageLogged("\nABORTED BY USER !!!"); break; } process.waitForReadyRead(m_processTimeoutInterval); if(!process.bytesAvailable() && process.state() == QProcess::Running) { process.kill(); qWarning("Aften process timed out <-- killing!"); emit messageLogged("\nPROCESS TIMEOUT !!!"); bTimeout = true; break; } while(process.bytesAvailable() > 0) { QByteArray line = process.readLine(); QString text = QString::fromUtf8(line.constData()).simplified(); if(regExp.lastIndexIn(text) >= 0) { bool ok = false; int progress = regExp.cap(2).toInt(&ok); if(ok && (progress > prevProgress)) { emit statusUpdated(progress); prevProgress = qMin(progress + 2, 99); } } else if(!text.isEmpty()) { emit messageLogged(text); } } } process.waitForFinished(); if(process.state() != QProcess::NotRunning) { process.kill(); process.waitForFinished(-1); } emit statusUpdated(100); emit messageLogged(QString().sprintf("\nExited with code: 0x%04X", process.exitCode())); if(bTimeout || bAborted || process.exitStatus() != QProcess::NormalExit) { return false; } return true; }