[kgraphviewer-devel] [KGraphViewer/libkgraphviz] 3b23ff3: Fix loading dot files with external program

Kevin Funk krf at electrostorm.net
Tue Dec 21 16:40:27 CET 2010


commit 3b23ff3a07b44de5539d9ca074f31164fdd2f04a
branch libkgraphviz
Author: Kevin Funk <krf at electrostorm.net>
Date:   Tue Dec 21 16:39:00 2010 +0100

    Fix loading dot files with external program
    
    * Add some TODOs in GraphIO
    * Also fix graph re-layouting

diff --git a/src/kgraphviz/dotgraph.cpp b/src/kgraphviz/dotgraph.cpp
index 2e6b522..5e61dd3 100644
--- a/src/kgraphviz/dotgraph.cpp
+++ b/src/kgraphviz/dotgraph.cpp
@@ -72,13 +72,29 @@ DotGraphPrivate::DotGraphPrivate(DotGraph* parent) :
   AGINIT();
 
   Q_Q(DotGraph);
-  q->connect(&m_graphIO, SIGNAL(finished()), q, SIGNAL(readyToDisplay()));
+  q->connect(&m_graphIO, SIGNAL(finished()), SLOT(graphIOFinished()));
+  q->connect(&m_graphIO, SIGNAL(error(QString)), SLOT(graphIOError(QString)));
 }
 
 DotGraphPrivate::~DotGraphPrivate()
 {
 }
 
+void DotGraphPrivate::graphIOFinished()
+{
+  kDebug();
+
+  Q_Q(DotGraph);
+  DotGraph* updatedGraph = m_graphIO.readData();
+  q->updateWithGraph(*updatedGraph);
+}
+
+void DotGraphPrivate::graphIOError(const QString& error)
+{
+  // TODO: add error handling here
+  kDebug() << "Error message from graph IO:" << error;
+}
+
 DotGraph::DotGraph() :
   d_ptr(new DotGraphPrivate(this))
 {
@@ -282,7 +298,7 @@ bool DotGraph::parseDot(const QString& fileName)
   kDebug() << fileName;
 
   Q_D(DotGraph);
-  d->m_graphIO.loadFromDotFile(fileName);
+  d->m_graphIO.loadFromDotFile(fileName, layoutCommand());
 
   return true;
 }
@@ -631,6 +647,7 @@ void DotGraph::updateWithGraph(const DotGraph& newGraph)
     }
   }
   kDebug() << "Done";
+  emit readyToDisplay();
   d->computeCells();
 }
 
diff --git a/src/kgraphviz/dotgraph.h b/src/kgraphviz/dotgraph.h
index 0b139d5..990f846 100644
--- a/src/kgraphviz/dotgraph.h
+++ b/src/kgraphviz/dotgraph.h
@@ -131,11 +131,11 @@ protected:
 
 private:
   Q_DECLARE_PRIVATE(DotGraph);
+
+  Q_PRIVATE_SLOT(d_func(), void graphIOFinished());
+  Q_PRIVATE_SLOT(d_func(), void graphIOError(QString));
 };
 
 }
 
 #endif
-
-
-
diff --git a/src/kgraphviz/dotgraph_p.h b/src/kgraphviz/dotgraph_p.h
index c46fcb3..2258e7e 100644
--- a/src/kgraphviz/dotgraph_p.h
+++ b/src/kgraphviz/dotgraph_p.h
@@ -59,6 +59,10 @@ public:
   bool m_useLibrary;
 
   bool m_readWrite;
+
+private:
+  void graphIOFinished();
+  void graphIOError(const QString& error);
 };
 
 }
diff --git a/src/kgraphviz/graphio.cpp b/src/kgraphviz/graphio.cpp
index 7733ea9..9223799 100644
--- a/src/kgraphviz/graphio.cpp
+++ b/src/kgraphviz/graphio.cpp
@@ -34,6 +34,7 @@
 #include <boost/spirit/include/classic_assign_actor.hpp>
 #include <boost/spirit/include/classic_confix.hpp>
 #include <boost/spirit/include/classic_distinct.hpp>
+#include <kurl.h>
 
 using namespace boost;
 using namespace boost::spirit::classic;
@@ -51,6 +52,9 @@ GraphIOPrivate::GraphIOPrivate(QObject* parent)
   connect(&m_process,
           SIGNAL(finished(int, QProcess::ExitStatus)),
           SLOT(processFinished(int, QProcess::ExitStatus)));
+  connect(&m_process,
+          SIGNAL(error(QProcess::ProcessError)),
+          SLOT(processError(QProcess::ProcessError)));
 }
 
 GraphIOPrivate::~GraphIOPrivate()
@@ -65,18 +69,37 @@ void GraphIOPrivate::reset()
   }
 }
 
+QString GraphIOPrivate::toString(QProcess::ProcessError error)
+{
+  switch (error)
+  {
+  case QProcess::FailedToStart:
+    return i18n("Unable to start process.");
+  case QProcess::Crashed:
+    return i18n("Process crashed.");
+  case QProcess::Timedout:
+    return i18n("Process timed out.");
+  case QProcess::WriteError:
+    return i18n("Was not able to write data to the process.");
+  case QProcess::ReadError:
+    return i18n("Was not able to read data from the process.");
+  default:
+    return i18n("Unknown error running the process.");
+  }
+}
+
 void GraphIOPrivate::processFinished(int exitCode, QProcess::ExitStatus exitStatus)
 {
-  qDebug() << "Exit status:" << exitStatus;
+  kDebug() << "Error message:" << toString(m_process.error()) << m_process.errorString();
 
+  // TODO: Better error handling here
+  QByteArray result = m_process.readAll();
   if (exitCode != 0) {
-    emit error(i18n("Failed to load from dot file"));
+    emit error(i18n("Failed to load from dot file: %1", result.data()));
     return;
   }
 
-  QByteArray result = m_process.readAll();
   result.replace("\\\n", "");
-
   kDebug() << "String size is:" << result.size();
   kDebug() << "String content is:" << result;
   const std::string content =  result.data();
@@ -111,6 +134,12 @@ void GraphIOPrivate::processFinished(int exitCode, QProcess::ExitStatus exitStat
   }
 }
 
+void GraphIOPrivate::processError(QProcess::ProcessError error)
+{
+  kDebug();
+  emit(toString(error));
+}
+
 GraphIO::GraphIO(QObject* parent)
   : QObject(parent)
   , d_ptr(new GraphIOPrivate)
@@ -138,16 +167,21 @@ void GraphIO::loadFromDotFile(const QString& fileName, const QString& layoutComm
 {
   Q_D(GraphIO);
 
+  // TODO: Better file handling here
+  KUrl url(fileName);
+  QString localFile = url.toLocalFile();
+
   const QString layoutCommandForFile = (layoutCommand.isEmpty()
     ? internalLayoutCommandForFile(fileName)
     : layoutCommand);
 
   QStringList args;
-  args << fileName;
+  args << "-Txdot";
+  args << localFile;
 
-  kDebug() << "Loading from" << fileName << "with" << layoutCommandForFile << "executable.";
+  kDebug() << "Running:" << qPrintable(layoutCommandForFile) << qPrintable(localFile);
   d->m_process.start(layoutCommandForFile, args, QIODevice::ReadOnly);
-  //kDebug() << "Started:" << d->m_process.waitForStarted(3000) << d->m_process.error();
+  kDebug() << "Started:" << d->m_process.waitForStarted(3000) << d->m_process.error();
 }
 
 void GraphIO::saveToDotFile(const DotGraph* dotGraph, const QString& fileName)
@@ -232,7 +266,7 @@ QString GraphIO::internalLayoutCommandForFile(const QString& fileName)
   std::string cmd = "dot";
   parse(s.c_str(),
         (
-          !(keyword_p("strict")) >> (keyword_p("graph")[assign_a(cmd,"neato")])
+          !(keyword_p("strict")) >> (keyword_p("graph")[assign_a(cmd,"dot")])
         ), (space_p|comment_p("/*", "*/")) );
 
   return QString::fromStdString(cmd); // + " -Txdot" ;
diff --git a/src/kgraphviz/graphio.h b/src/kgraphviz/graphio.h
index 72bb7b2..51d5a20 100644
--- a/src/kgraphviz/graphio.h
+++ b/src/kgraphviz/graphio.h
@@ -21,6 +21,7 @@
 #define GRAPHIO_H
 
 #include <QObject>
+#include <QProcess>
 
 #include "kgraphviz_export.h"
 
diff --git a/src/kgraphviz/graphio_p.h b/src/kgraphviz/graphio_p.h
index 01666d6..a1d7211 100644
--- a/src/kgraphviz/graphio_p.h
+++ b/src/kgraphviz/graphio_p.h
@@ -35,6 +35,8 @@ public:
 
   void reset();
 
+  static QString toString(QProcess::ProcessError error);
+
   DotGraph* m_dotGraph;
 
   QProcess m_process;
@@ -45,6 +47,7 @@ Q_SIGNALS:
 
 private Q_SLOTS:
   void processFinished(int, QProcess::ExitStatus);
+  void processError(QProcess::ProcessError);
 };
 
 #endif


More information about the kgraphviewer-devel mailing list