summaryrefslogtreecommitdiffstats
path: root/umbrello/umbrello/docgenerators/docbookgenerator.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'umbrello/umbrello/docgenerators/docbookgenerator.cpp')
-rw-r--r--umbrello/umbrello/docgenerators/docbookgenerator.cpp145
1 files changed, 145 insertions, 0 deletions
diff --git a/umbrello/umbrello/docgenerators/docbookgenerator.cpp b/umbrello/umbrello/docgenerators/docbookgenerator.cpp
new file mode 100644
index 00000000..9907d6f9
--- /dev/null
+++ b/umbrello/umbrello/docgenerators/docbookgenerator.cpp
@@ -0,0 +1,145 @@
+/***************************************************************************
+ * docbookgenerator.cpp - description *
+ * ------------------- *
+ * copyright : (C) 2006 by Gael de Chalendar (aka Kleag) *
+ * (C) 2006 Umbrello UML Modeller Authors <uml-devel@uml.sf.net> *
+ ***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include "docbookgenerator.h"
+
+#include <libxml/xmlmemory.h>
+#include <libxml/debugXML.h>
+#include <libxml/HTMLtree.h>
+#include <libxml/xmlIO.h>
+#include <libxml/xinclude.h>
+#include <libxml/catalog.h>
+#include <libxslt/xslt.h>
+#include <libxslt/xsltInternals.h>
+#include <libxslt/transform.h>
+#include <libxslt/xsltutils.h>
+
+#include <kdebug.h>
+#include <klocale.h>
+#include <ktempfile.h>
+#include <kmessagebox.h>
+#include <kio/job.h>
+#include <kstandarddirs.h>
+#include <qfile.h>
+#include <qregexp.h>
+#include <qtextstream.h>
+
+#include "uml.h"
+#include "umldoc.h"
+#include "umlviewimageexportermodel.h"
+
+extern int xmlLoadExtDtdDefaultValue;
+
+DocbookGenerator::DocbookGenerator()
+{
+}
+
+DocbookGenerator::~DocbookGenerator() {}
+
+
+bool DocbookGenerator::generateDocbookForProject()
+{
+ UMLApp *app = UMLApp::app();
+ UMLDoc* umlDoc = app->getDocument();
+ KURL url = umlDoc->URL();
+ QString fileName = url.fileName();
+ fileName.replace(QRegExp(".xmi$"),"");
+ url.setFileName(fileName);
+ kDebug() << "Exporting to directory: " << url << endl;
+ generateDocbookForProjectInto(url);
+ return true;
+}
+
+KIO::Job* DocbookGenerator::generateDocbookForProjectInto(const KURL& destDir)
+{
+ UMLApp* app = UMLApp::app();
+ UMLDoc* umlDoc = app->getDocument();
+
+ // export all views
+ umlDoc->writeToStatusBar(i18n("Exporting all views..."));
+ QStringList errors = UMLViewImageExporterModel().exportAllViews(
+ UMLViewImageExporterModel::mimeTypeToImageType("image/png"),
+ destDir, false);
+ if (!errors.empty())
+ {
+#if KDE_IS_VERSION(3,4,0)
+ KMessageBox::errorList(app, i18n("Some errors happened when exporting the images:"), errors);
+#else
+ QString errorsCaption;
+ for (QStringList::Iterator it = errors.begin(); it != errors.end(); ++it) {
+ errorsCaption += "\n" + *it;
+ }
+ KMessageBox::error(app, i18n("Some errors happened when exporting the images:") + errorsCaption);
+#endif
+ return 0;
+ }
+
+ //write the XMI model in an in-memory char* string
+ QString xmi;
+ QTextOStream xmiStream(&xmi);
+
+ KTempFile tmpfile; // we need this tmp file if we are writing to a remote file
+
+ QFile file;
+ file.setName( tmpfile.name() );
+
+ // lets open the file for writing
+ if( !file.open( IO_WriteOnly ) ) {
+ KMessageBox::error(0, i18n("There was a problem saving file: %1").arg(tmpfile.name()), i18n("Save Error"));
+ return false;
+ }
+ umlDoc->saveToXMI(file); // save the xmi stuff to it
+ file.close();
+ tmpfile.close();
+
+ xsltStylesheetPtr cur = NULL;
+ xmlDocPtr doc, res;
+
+ const char *params[16 + 1];
+ int nbparams = 0;
+ params[nbparams] = NULL;
+
+ QString xsltFile(KGlobal::dirs()->findResource("appdata","xmi2docbook.xsl"));
+
+ xmlSubstituteEntitiesDefault(1);
+ xmlLoadExtDtdDefaultValue = 1;
+ cur = xsltParseStylesheetFile((const xmlChar *)xsltFile.latin1());
+ doc = xmlParseFile((const char*)(tmpfile.name().utf8()));
+ res = xsltApplyStylesheet(cur, doc, params);
+
+ KTempFile tmpDocBook;
+ tmpDocBook.setAutoDelete(false);
+
+ xsltSaveResultToFile(tmpDocBook.fstream(), res, cur);
+ xsltFreeStylesheet(cur);
+ xmlFreeDoc(res);
+ xmlFreeDoc(doc);
+
+ xsltCleanupGlobals();
+ xmlCleanupParser();
+
+ KURL url = umlDoc->URL();
+ QString fileName = url.fileName();
+ fileName.replace(QRegExp(".xmi$"),".docbook");
+ url.setPath(destDir.path());
+ url.addPath(fileName);
+ kDebug() << "Copying result to: " << url << endl;
+ KIO::Job* job = KIO::file_copy(tmpDocBook.file()->name(),url,-1,true,false,false);
+ job->setAutoErrorHandlingEnabled(true);
+
+ return job;
+}
+
+
+#include "docbookgenerator.moc"