void Oven::cook(QString inputContents, QString scriptContents) { QTemporaryFile file; QProcess process; if (file.open()) { QString filename = file.fileName(); file.write(scriptContents.toUtf8()); if (!file.error()) { file.close(); process.setProcessChannelMode(QProcess::ForwardedChannels); process.start("bash", QStringList() << filename); QTextStream inputStream(&process); inputStream << inputContents; inputStream.flush(); process.closeWriteChannel(); if (process.waitForStarted() && process.waitForFinished()) { // success! return; } } } if (file.error() != QTemporaryFile::NoError) { emit error(file.errorString()); } else { emit error(process.errorString()); } // error. return; }
QString ExportHelper::XSLTConvertString(QString input, int xsltmapid, QString &errmsg) { if (DEBUG) qDebug("ExportHelper::XSLTConvertString(%s..., %d, errmsg) entered", qPrintable(input.left(200)), xsltmapid); QString returnVal; XSqlQuery xsltq; xsltq.prepare("SELECT xsltmap_name, xsltmap_export" " FROM xsltmap" " WHERE xsltmap_id=:id;"); xsltq.bindValue(":id", xsltmapid); xsltq.exec(); if (xsltq.first()) { /* tempfile handling is messy because windows doesn't handle them as you might expect. TODO: find a simpler way */ QString xsltmap = xsltq.value("xsltmap_name").toString(); QTemporaryFile *inputfile = new QTemporaryFile(QDir::tempPath() + QDir::separator() + xsltmap + "Input.XXXXXX.xml"); inputfile->setAutoRemove(false); if (! inputfile->open()) errmsg = tr("Could not open temporary input file (%1).") .arg(inputfile->error()); else { QString inputfileName = inputfile->fileName(); inputfile->write(input.toUtf8()); inputfile->close(); delete inputfile; inputfile = 0; QTemporaryFile *outputfile = new QTemporaryFile(QDir::tempPath() + QDir::separator() + xsltmap + "Output.XXXXXX.xml"); outputfile->setAutoRemove(false); if (! outputfile->open()) errmsg = tr("Could not open temporary output file (%1).") .arg(outputfile->error()); else { QString outputfileName = outputfile->fileName(); if (DEBUG) qDebug("ExportHelper::XSLTConvertString writing from %s to %s", qPrintable(inputfileName), qPrintable(outputfileName)); if (XSLTConvertFile(inputfileName, outputfileName, xsltq.value("xsltmap_export").toString(), errmsg)) returnVal = outputfile->readAll(); outputfile->close(); delete outputfile; outputfile = 0; if (errmsg.isEmpty()) { QFile::remove(outputfileName); QFile::remove(inputfileName); } } } } else if (xsltq.lastError().type() != QSqlError::NoError) errmsg = xsltq.lastError().text(); else errmsg = tr("Could not find XSLT mapping with internal id %1.") .arg(xsltmapid); if (! errmsg.isEmpty()) qWarning("%s", qPrintable(errmsg)); return returnVal; }