vgraphvizhelper.cpp 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. #include "vgraphvizhelper.h"
  2. #include <QDebug>
  3. #include <QThread>
  4. #include "vconfigmanager.h"
  5. extern VConfigManager *g_config;
  6. #define TaskIdProperty "GraphvizTaskId"
  7. #define TaskFormatProperty "GraphvizTaskFormat"
  8. #define TaskTimeStampProperty "GraphvizTaskTimeStamp"
  9. VGraphvizHelper::VGraphvizHelper(QObject *p_parent)
  10. : QObject(p_parent)
  11. {
  12. prepareCommand(m_program, m_args);
  13. }
  14. void VGraphvizHelper::processAsync(int p_id, TimeStamp p_timeStamp, const QString &p_format, const QString &p_text)
  15. {
  16. QProcess *process = new QProcess(this);
  17. process->setProperty(TaskIdProperty, p_id);
  18. process->setProperty(TaskTimeStampProperty, p_timeStamp);
  19. process->setProperty(TaskFormatProperty, p_format);
  20. connect(process, SIGNAL(finished(int, QProcess::ExitStatus)),
  21. this, SLOT(handleProcessFinished(int, QProcess::ExitStatus)));
  22. QStringList args(m_args);
  23. args << ("-T" + p_format);
  24. qDebug() << m_program << args;
  25. process->start(m_program, args);
  26. process->write(p_text.toUtf8());
  27. process->closeWriteChannel();
  28. }
  29. void VGraphvizHelper::prepareCommand(QString &p_program, QStringList &p_args) const
  30. {
  31. const QString &dot = g_config->getGraphvizDot();
  32. if (dot.isEmpty()) {
  33. p_program = "dot";
  34. } else {
  35. p_program = dot;
  36. }
  37. p_args.clear();
  38. }
  39. void VGraphvizHelper::handleProcessFinished(int p_exitCode, QProcess::ExitStatus p_exitStatus)
  40. {
  41. QProcess *process = static_cast<QProcess *>(sender());
  42. int id = process->property(TaskIdProperty).toInt();
  43. QString format = process->property(TaskFormatProperty).toString();
  44. TimeStamp timeStamp = process->property(TaskTimeStampProperty).toULongLong();
  45. qDebug() << "process finished" << id << timeStamp << format << p_exitCode << p_exitStatus;
  46. bool failed = true;
  47. if (p_exitStatus == QProcess::NormalExit) {
  48. if (p_exitCode < 0) {
  49. qWarning() << "Graphviz fail" << p_exitCode;
  50. } else {
  51. failed = false;
  52. QByteArray outBa = process->readAllStandardOutput();
  53. if (format == "svg") {
  54. emit resultReady(id, timeStamp, format, QString::fromLocal8Bit(outBa));
  55. } else {
  56. emit resultReady(id, timeStamp, format, QString::fromLocal8Bit(outBa.toBase64()));
  57. }
  58. }
  59. } else {
  60. qWarning() << "fail to start Graphviz process" << p_exitCode << p_exitStatus;
  61. }
  62. if (failed) {
  63. QByteArray errBa = process->readAllStandardError();
  64. if (!errBa.isEmpty()) {
  65. QString errStr(QString::fromLocal8Bit(errBa));
  66. qWarning() << "Graphviz stderr:" << errStr;
  67. }
  68. emit resultReady(id, timeStamp, format, "");
  69. }
  70. process->deleteLater();
  71. }