summaryrefslogtreecommitdiffstats
path: root/ktouch/src/ktouchlecture.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'ktouch/src/ktouchlecture.cpp')
-rw-r--r--ktouch/src/ktouchlecture.cpp300
1 files changed, 300 insertions, 0 deletions
diff --git a/ktouch/src/ktouchlecture.cpp b/ktouch/src/ktouchlecture.cpp
new file mode 100644
index 00000000..70195977
--- /dev/null
+++ b/ktouch/src/ktouchlecture.cpp
@@ -0,0 +1,300 @@
+/***************************************************************************
+ * ktouchlecture.cpp *
+ * ----------------- *
+ * Copyright (C) 2000 by Håvard Frøiland, 2003 by Andreas Nicolai *
+ * ghorwin@users.sourceforge.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 "ktouchlecture.h"
+
+#include <qfile.h>
+#include <qtextstream.h>
+#include <qstringlist.h>
+#include <qdom.h>
+
+#include <kdebug.h>
+#include <klocale.h>
+#include <ktempfile.h>
+#include <kio/netaccess.h>
+
+bool KTouchLecture::load(QWidget * window, const KURL& url) {
+ // Ok, first download the contents as usual using the KIO lib
+ // File is only downloaded if not local, otherwise it's just opened
+ QString target;
+ bool result = false;
+ if (KIO::NetAccess::download(url, target, window)) {
+ // Ok, that was successful, store the lectureURL and read the file
+ QFile infile(target);
+ if ( !infile.open( IO_ReadOnly ) ) {
+ KIO::NetAccess::removeTempFile(target);
+ return false; // Bugger it... couldn't open it...
+ }
+ QTextStream in( &infile );
+ result = readLecture(in);
+ };
+ KIO::NetAccess::removeTempFile(target);
+ return result;
+}
+// ----------------------------------------------------------------------------
+
+bool KTouchLecture::loadXML(QWidget * window, const KURL& url) {
+ // Ok, first download the contents as usual using the KIO lib
+ // File is only downloaded if not local, otherwise it's just opened
+ QString target;
+ bool result = false;
+ if (KIO::NetAccess::download(url, target, window)) {
+ // Ok, that was successful, store the lectureURL and read the file
+ QFile infile(target);
+ if ( !infile.open( IO_ReadOnly ) ) {
+ KIO::NetAccess::removeTempFile(target);
+ return false; // Bugger it... couldn't open it...
+ }
+ QDomDocument doc;
+ doc.setContent( &infile );
+ result = readLecture(doc);
+ }
+ KIO::NetAccess::removeTempFile(target);
+ return result;
+}
+// ----------------------------------------------------------------------------
+
+
+bool KTouchLecture::saveXML(QWidget * window, const KURL& url) const {
+ // create the XML document
+ QDomDocument doc;
+ writeLecture(doc);
+
+ // and save it
+ QString tmpFile;
+ KTempFile *temp=0;
+ if (url.isLocalFile())
+ tmpFile=url.path(); // for local files the path is sufficient
+ else {
+ temp=new KTempFile; // for remote files create a temporary file first
+ temp->setAutoDelete(true); // so we don't have to delete the file ourselves
+ tmpFile=temp->name();
+ }
+
+ QFile outfile(tmpFile);
+ if ( !outfile.open( IO_WriteOnly ) ) {
+ if (temp) delete temp;
+ // kdDebug() << "Error creating lecture file!" << endl;
+ return false;
+ };
+
+ QTextStream out( &outfile );
+ out << doc.toString();
+ outfile.close();
+ // if we have a temporary file, we still need to upload it
+ if (temp) {
+ KIO::NetAccess::upload(tmpFile, url, window);
+ delete temp;
+ }
+ return true;
+}
+// ----------------------------------------------------------------------------
+
+void KTouchLecture::createDefault() {
+ m_lectureData.clear(); // remove everything else
+ m_title = i18n("A default lecture...");
+ m_fontSuggestions = "Monospace";
+ KTouchLevelData miniLevel; // create the level which is by default a mini-level
+ m_lectureData.push_back( miniLevel );
+}
+// ----------------------------------------------------------------------------
+
+const KTouchLevelData& KTouchLecture::level(unsigned int levelNum) const {
+ if (levelNum>=m_lectureData.size())
+ levelNum=0;
+ return m_lectureData[levelNum];
+}
+// ----------------------------------------------------------------------------
+
+bool KTouchLecture::readLecture(QTextStream& in) {
+ //kdDebug() << "[KTouchLecture::loadLecture] Reading lecture file '" << lectureURL.url() << "'!" << endl;
+ QString line;
+ // remove everything else
+ m_lectureData.clear();
+ // now loop until end of file is reached and break down the textfile into several strings containing the levels
+ QStringList slist;
+ QString current_level = QString::null; // used to store the current level data
+ line = in.readLine();
+ bool in_level = false;
+ while (!in.atEnd() && !line.isNull()) {
+ // only consider non-empty lines
+ if (!line.isEmpty()) {
+ // lecture title?
+ if (line.find("# Title:") == 0)
+ m_title = line.right(line.length() - 8).stripWhiteSpace();
+ else if (line[0]!='#' || line.find("# Comment:")!=-1) {
+ // ok, after all those comment lines, we finally found the beginn of a level
+ in_level = true;
+ current_level += line + '\n';
+ }
+ else if (in_level) {
+ // ok, a new comment found, if we were reading a level, store it
+ slist.append(current_level);
+ current_level = QString::null;
+ in_level = false;
+ }
+ }
+ line = in.readLine();
+ };
+ if (!current_level.isEmpty() && in_level)
+ slist.append(current_level);
+
+ //kdDebug() << "Levels read = " << slist.count() << endl;
+
+ // now read all the levels
+ for (QStringList::Iterator it = slist.begin(); it!=slist.end(); ++it) {
+ // create new level
+ KTouchLevelData level;
+ QTextStream t(&(*it), IO_ReadOnly);
+ // try to read it
+ if (!level.readLevel(t)) {
+ // uh oh, error while reading level data
+ createDefault();
+ return false;
+ };
+ // add it (object will be deleted by the list)
+ m_lectureData.push_back(level);
+ }
+
+ if (m_lectureData.size()>1)
+ return true; // all ok
+ else {
+ // Hmm, no levels in the file. So we create our default mini level and report an error.
+ createDefault();
+ return false;
+ };
+}
+// ----------------------------------------------------------------------------
+
+bool KTouchLecture::readLecture(QDomDocument& doc) {
+ QString line;
+ m_lectureData.clear(); // clean current data
+ // retrieve the title
+ QDomNodeList entries = doc.elementsByTagName("Title");
+ if (entries.count() >= 1) m_title = entries.item(0).firstChild().nodeValue();
+ else m_title = i18n("untitled lecture");
+ // retrieve the comment
+ entries = doc.elementsByTagName("Comment");
+ if (entries.count() >= 1)
+ m_comment = entries.item(0).firstChild().nodeValue();
+ // retrieve the font suggestion
+ entries = doc.elementsByTagName("FontSuggestions");
+ if (entries.count() >= 1)
+ m_fontSuggestions = entries.item(0).firstChild().nodeValue();
+ // retrieve the levels
+ entries = doc.elementsByTagName("Level");
+ for (unsigned int i=0; i<entries.count(); ++i) {
+ KTouchLevelData level;
+ level.readLevel(entries.item(i));
+ m_lectureData.push_back(level);
+ }
+ if (m_lectureData.size()>0)
+ return true; // all ok
+ else {
+ // Hmm, no levels in the file. So we create our default mini level and report an error.
+ createDefault();
+ return false;
+ };
+}
+// ----------------------------------------------------------------------------
+
+void KTouchLecture::writeLecture(QDomDocument& doc) const {
+ QDomElement root = doc.createElement( "KTouchLecture" );
+ doc.appendChild(root);
+ // Store title and ensure that the file contains a title!
+ QDomElement title = doc.createElement("Title");
+ QDomText titleText;
+ if (m_title.isEmpty()) titleText = doc.createTextNode( i18n("untitled lecture") );
+ else titleText = doc.createTextNode(m_title);
+ title.appendChild(titleText);
+ root.appendChild(title);
+ // Store comment if given
+ if (!m_comment.isEmpty()) {
+ QDomElement comment = doc.createElement("Comment");
+ QDomText commentText = doc.createTextNode(m_comment);
+ comment.appendChild(commentText);
+ root.appendChild(comment);
+ }
+ // Store font suggestion if given
+ if (!m_fontSuggestions.isEmpty()) {
+ QDomElement font = doc.createElement("FontSuggestions");
+ QDomText fontText = doc.createTextNode(m_fontSuggestions);
+ font.appendChild(fontText);
+ root.appendChild(font);
+ }
+ // Store levels
+ QDomElement levels = doc.createElement("Levels");
+ root.appendChild(levels);
+ for (QValueVector<KTouchLevelData>::const_iterator it=m_lectureData.begin();
+ it!=m_lectureData.end(); ++it)
+ {
+ it->writeLevel(doc, levels);
+ }
+}
+// ----------------------------------------------------------------------------
+
+
+
+// OLD and deprecated stuff
+
+/*
+bool KTouchLecture::save(QWidget * window, const KURL& url) const {
+ QString tmpFile;
+ KTempFile *temp=0;
+ if (url.isLocalFile())
+ tmpFile=url.path(); // for local files the path is sufficient
+ else {
+ temp=new KTempFile; // for remote files create a temporary file first
+ temp->setAutoDelete(true); // so we don't have to delete the file ourselves
+ tmpFile=temp->name();
+ }
+
+ QFile outfile(tmpFile);
+ if ( !outfile.open( IO_WriteOnly ) ) {
+ if (temp) delete temp;
+ // kdDebug() << "Error creating lecture file!" << endl;
+ return false;
+ };
+ QTextStream out( &outfile );
+ writeLecture(out);
+ // TODO : check stream status to see if save worked
+ outfile.close();
+ // if we have a temporary file, we still need to upload it
+ if (temp) {
+ KIO::NetAccess::upload(tmpFile, url, window);
+ delete temp;
+ }
+ return true;
+}
+// ----------------------------------------------------------------------------
+
+void KTouchLecture::writeLecture(QTextStream& out) const {
+ out << "###################################### " << endl;
+ out << "# # " << endl;
+ out << "# Training lecture file for KTouch # " << endl;
+ out << "# # " << endl;
+ out << "###################################### " << endl << endl;
+ out << "# Title: " << m_title << endl;
+ out << endl;
+
+ int levelCounter=0;
+ for (QValueVector<KTouchLevelData>::const_iterator it=m_lectureData.begin(); it!=m_lectureData.end(); ++it) {
+ out << "################################" << endl;
+ out << "# Level: " << ++levelCounter << endl;
+ out << "# " << endl;
+ it->writeLevel(out);
+ };
+ out << endl;
+}
+// ----------------------------------------------------------------------------
+
+*/