static void executeXmodmap(const QString& configFileName) { if( xmodmapNotFound ) return; if( QFile(configFileName).exists() ) { if( xmodmapExe.isEmpty() ) { xmodmapExe = QStandardPaths::findExecutable(XMODMAP_EXEC); if( xmodmapExe.isEmpty() ) { xmodmapNotFound = true; qCritical() << "Can't find" << XMODMAP_EXEC << "- xmodmap files won't be run"; return; } } KProcess xmodmapProcess; xmodmapProcess << xmodmapExe; xmodmapProcess << configFileName; qCDebug(KCM_KEYBOARD) << "Executing" << xmodmapProcess.program().join(QStringLiteral(" ")); if( xmodmapProcess.execute() != 0 ) { qCritical() << "Failed to execute " << xmodmapProcess.program(); } } }
void TOC::buildCache() { KXmlGuiWindow *mainWindow = dynamic_cast<KXmlGuiWindow *>( kapp->activeWindow() ); KProcess *meinproc = new KProcess; connect( meinproc, SIGNAL( finished( int, QProcess::ExitStatus) ), this, SLOT( meinprocExited( int, QProcess::ExitStatus) ) ); *meinproc << KStandardDirs::locate("exe", "meinproc4"); *meinproc << "--stylesheet" << KStandardDirs::locate( "data", "khelpcenter/table-of-contents.xslt" ); *meinproc << "--output" << m_cacheFile; *meinproc << m_sourceFile; meinproc->setOutputChannelMode(KProcess::OnlyStderrChannel); meinproc->start(); if (!meinproc->waitForStarted()) { kError() << "could not start process" << meinproc->program(); if (mainWindow && !m_alreadyWarned) { ; // add warning message box with don't display again option // http://api.kde.org/4.0-api/kdelibs-apidocs/kdeui/html/classKDialog.html m_alreadyWarned = true; } delete meinproc; } }
void KProcessTest::test_setShellCommand() { // Condition copied from kprocess.cpp #if !defined(__linux__) && !defined(__FreeBSD__) && !defined(__NetBSD__) && !defined(__OpenBSD__) && !defined(__DragonFly__) && !defined(__GNU__) QSKIP("This test needs a free UNIX system", SkipSingle); #else KProcess p; p.setShellCommand("cat"); QCOMPARE(p.program().count(), 1); QCOMPARE(p.program().at(0), KStandardDirs::findExe("cat")); QVERIFY(p.program().at(0).endsWith("/bin/cat")); p.setShellCommand("true || false"); QCOMPARE(p.program(), QStringList() << "/bin/sh" << "-c" << "true || false"); #endif }
void TOC::meinprocExited( int exitCode, QProcess::ExitStatus exitStatus) { KProcess *meinproc = static_cast<KProcess *>(sender()); KXmlGuiWindow *mainWindow = dynamic_cast<KXmlGuiWindow *>( kapp->activeWindow() ); if ( exitStatus == QProcess::CrashExit || exitCode != 0 ) { kError() << "running" << meinproc->program() << "failed with exitCode" << exitCode; kError() << "stderr output:" << meinproc->readAllStandardError(); if (mainWindow && !m_alreadyWarned) { ; // add warning message box with don't display again option // http://api.kde.org/4.0-api/kdelibs-apidocs/kdeui/html/classKDialog.html m_alreadyWarned = true; } delete meinproc; return; } delete meinproc; // add a timestamp to the meinproc4 created xml file QFile f( m_cacheFile ); if ( !f.open( QIODevice::ReadWrite ) ) return; QDomDocument doc; if ( !doc.setContent( &f ) ) return; QDomComment timestamp = doc.createComment( QString::number( sourceFileCTime() ) ); doc.documentElement().appendChild( timestamp ); // write back updated xml content f.seek( 0 ); QTextStream stream( &f ); stream.setCodec( "UTF-8" ); #ifdef Q_WS_WIN /* the problem that on german systems umlauts are displayed as '?' for unknown (Qt'r related ?) reasons is caused by wrong encoding type conversations and has been fixed in kdelibs/kdoctools To have propper encoding tags in the xml file, QXmlDocument::save() is used. */ doc.save(stream, 1, QDomNode::EncodingFromTextStream); #else stream << doc.toString(); #endif f.close(); fillTree(); }
//TODO: make private bool XkbHelper::runConfigLayoutCommand(const QStringList& setxkbmapCommandArguments) { QTime timer; timer.start(); KProcess setxkbmapProcess; setxkbmapProcess << getSetxkbmapExe() << setxkbmapCommandArguments; int res = setxkbmapProcess.execute(); if( res == 0 ) { // restore Xmodmap mapping reset by setxkbmap qCDebug(KCM_KEYBOARD) << "Executed successfully in " << timer.elapsed() << "ms" << setxkbmapProcess.program().join(QStringLiteral(" ")); restoreXmodmap(); qCDebug(KCM_KEYBOARD) << "\t and with xmodmap" << timer.elapsed() << "ms"; return true; } else { qCritical() << "Failed to run" << setxkbmapProcess.program().join(QStringLiteral(" ")) << "return code:" << res; } return false; }
void IndexBuilder::slotProcessExited( int exitCode, QProcess::ExitStatus exitStatus ) { KProcess *proc = static_cast<KProcess *>(sender()); if ( exitStatus != QProcess::NormalExit ) { kError(1402) << "Process failed" << endl; kError(1402) << "stdout output:" << proc->readAllStandardOutput(); kError(1402) << "stderr output:" << proc->readAllStandardError(); } else if (exitCode != 0 ) { kError(1402) << "running" << proc->program() << "failed with exitCode" << exitCode; kError(1402) << "stdout output:" << proc->readAllStandardOutput(); kError(1402) << "stderr output:" << proc->readAllStandardError(); } delete proc; sendProgressSignal(); processCmdQueue(); }
bool ImageGrayScale::image2GrayScaleImageMagick(const QString& src, const QString& dest, QString& err) { KProcess process; process.clearProgram(); process << "convert"; process << "-type" << "Grayscale"; process << src + QString("[0]") << dest; kDebug( 51000 ) << "ImageMagick Command line: " << process.program() << endl; process.start(); if (!process.waitForFinished()) return false; if (process.exitStatus() != QProcess::NormalExit) return false; switch (process.exitCode()) { case 0: // Process finished successfully ! { return true; break; } case 15: // process aborted ! { return false; break; } } // Processing error ! m_stdErr = process.readAllStandardError(); err = i18n("Cannot convert to gray scale: %1", m_stdErr.replace('\n', ' ')); return false; }
ActionReply RtcWakeAction::settimer(const QVariantMap& args) { unsigned t = args["time"].toUInt(); qDebug() << "RtcWakeAction::settimer(" << t << ")"; // Find the rtcwake executable QString exe("/usr/sbin/rtcwake"); // default location FILE* wh = popen("whereis -b rtcwake", "r"); if (wh) { char buff[512] = { '\0' }; fgets(buff, sizeof(buff), wh); pclose(wh); // The string should be in the form "rtcwake: /path/rtcwake" char* start = strchr(buff, ':'); if (start) { if (*++start == ' ') ++start; char* end = strpbrk(start, " \r\n"); if (end) *end = 0; if (*start) { exe = QString::fromLocal8Bit(start); qDebug() << "RtcWakeAction::settimer:" << exe; } } } // Set the wakeup by executing the rtcwake command int result = -2; // default = command not found KProcess proc; if (!exe.isEmpty()) { // The wakeup time is set using a time from now ("-s") in preference to // an absolute time ("-t") so that if the hardware clock is not in sync // with the system clock, the alarm will still occur at the correct time. // The "-m no" option sets the wakeup time without suspending the computer. // If 't' is zero, the current wakeup is cancelled by setting a new wakeup // time 2 seconds from now, which will then expire. unsigned now = KDateTime::currentUtcDateTime().toTime_t(); proc << exe << "-m" << "no" << "-s" << QString::number(t ? t - now : 2); result = proc.execute(5000); // allow a timeout of 5 seconds } QString errmsg; switch (result) { case 0: return ActionReply::SuccessReply; case -2: errmsg = i18nc("@text/plain", "Could not run <command>%1</command> to set wake from suspend", "rtcwake"); break; default: errmsg = i18nc("@text/plain", "Error setting wake from suspend.<nl/>Command was: <command>%1</command><nl/>Error code: %2.", proc.program().join(" "), result); break; } ActionReply reply(ActionReply::HelperError); reply.setErrorCode(result); reply.setErrorDescription(errmsg); qDebug() << "RtcWakeAction::settimer: Code=" << reply.errorCode() << reply.errorDescription(); return reply; }
bool ImageRotate::rotateImageMagick(const QString& src, const QString& dest, RotateAction angle, QString& err) { KProcess process; process.clearProgram(); process << "convert"; process << "-rotate"; switch(angle) { case (Rot90): { process << "90"; break; } case (Rot180): { process << "180"; break; } case (Rot270): { process << "270"; break; } case (Rot0): { break; } default: { kError() << "ImageRotate: Nonstandard rotation angle"; err = i18n("Nonstandard rotation angle"); return false; } } process << src + QString("[0]") << dest; kDebug() << "ImageMagick Command line: " << process.program(); process.start(); if (!process.waitForFinished()) return false; if (process.exitStatus() != QProcess::NormalExit) return false; switch (process.exitCode()) { case 0: // Process finished successfully ! { return true; break; } case 15: // process aborted ! { return false; break; } } // Processing error ! m_stdErr = process.readAllStandardError(); err = i18n("Cannot rotate: %1", m_stdErr.replace('\n', ' ')); return false; }
bool Utils::updateMetadataImageMagick(const QString& src, QString& err) { QFileInfo finfo(src); if (src.isEmpty() || !finfo.isReadable()) { err = i18n("unable to open source file"); return false; } QImage img(src); QImage iptcPreview = img.scaled(1280, 1024, Qt::KeepAspectRatio, Qt::SmoothTransformation); QImage exifThumbnail = iptcPreview.scaled(160, 120, Qt::KeepAspectRatio, Qt::SmoothTransformation); KExiv2Iface::KExiv2 meta; meta.load(src); meta.setImageOrientation(KExiv2Iface::KExiv2::ORIENTATION_NORMAL); meta.setImageProgramId(QString("Kipi-plugins"), QString(kipiplugins_version)); meta.setImageDimensions(img.size()); meta.setExifThumbnail(exifThumbnail); meta.setImagePreview(iptcPreview); #if KEXIV2_VERSION >= 0x010000 QByteArray exifData = meta.getExifEncoded(true); #else QByteArray exifData = meta.getExif(true); #endif QByteArray iptcData = meta.getIptc(true); QByteArray xmpData = meta.getXmp(); KTemporaryFile exifTemp; exifTemp.setSuffix(QString("kipipluginsexif.app1")); exifTemp.setAutoRemove(true); if ( !exifTemp.open() ) { err = i18n("unable to open temp file"); return false; } QString exifFile = exifTemp.fileName(); QDataStream streamExif( &exifTemp ); streamExif.writeRawData(exifData.data(), exifData.size()); exifTemp.close(); KTemporaryFile iptcTemp; iptcTemp.setSuffix(QString("kipipluginsiptc.8bim")); iptcTemp.setAutoRemove(true); iptcTemp.open(); if ( !iptcTemp.open() ) { err = i18n("Cannot rotate: unable to open temp file"); return false; } QString iptcFile = iptcTemp.fileName(); QDataStream streamIptc( &iptcTemp ); streamIptc.writeRawData(iptcData.data(), iptcData.size()); iptcTemp.close(); KTemporaryFile xmpTemp; xmpTemp.setSuffix(QString("kipipluginsxmp.xmp")); xmpTemp.setAutoRemove(true); if ( !xmpTemp.open() ) { err = i18n("unable to open temp file"); return false; } QString xmpFile = xmpTemp.fileName(); QDataStream streamXmp( &xmpTemp ); streamXmp.writeRawData(xmpData.data(), xmpData.size()); xmpTemp.close(); KProcess process; process.clearProgram(); process << "mogrify"; process << "-profile"; process << exifFile; process << "-profile"; process << iptcFile; process << "-profile"; process << xmpFile; process << src + QString("[0]"); kDebug() << "ImageMagick Command line: " << process.program(); process.start(); if (!process.waitForFinished()) return false; if (process.exitStatus() != QProcess::NormalExit) return false; switch (process.exitCode()) { case 0: // Process finished successfully ! { return true; break; } case 15: // process aborted ! { return false; break; } } // Processing error ! m_stdErr = process.readAllStandardError(); err = i18n("Cannot update metadata: %1", m_stdErr.replace('\n', ' ')); return false; }