diff options
author | tpearson <tpearson@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2010-01-10 00:18:25 +0000 |
---|---|---|
committer | tpearson <tpearson@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2010-01-10 00:18:25 +0000 |
commit | f21e5792b5084f5d008bf46f6316030c6dfb31e5 (patch) | |
tree | d51583b36aa1672bac78d98a682cdc330df27e4d /src/formatimporter.cpp | |
download | basket-f21e5792b5084f5d008bf46f6316030c6dfb31e5.tar.gz basket-f21e5792b5084f5d008bf46f6316030c6dfb31e5.zip |
Add author-abandoned basket application
git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/applications/basket@1072339 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
Diffstat (limited to 'src/formatimporter.cpp')
-rw-r--r-- | src/formatimporter.cpp | 307 |
1 files changed, 307 insertions, 0 deletions
diff --git a/src/formatimporter.cpp b/src/formatimporter.cpp new file mode 100644 index 0000000..c98ad38 --- /dev/null +++ b/src/formatimporter.cpp @@ -0,0 +1,307 @@ +/*************************************************************************** + * Copyright (C) 2003 by S�astien Laot * + * slaout@linux62.org * + * * + * 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. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * + ***************************************************************************/ + +#include <qstring.h> +#include <qstringlist.h> +#include <qdir.h> +#include <qfileinfo.h> +#include <qdom.h> +#include <kglobalsettings.h> +#include <kmessagebox.h> +#include <klocale.h> +#include <kapplication.h> + +#include <iostream> + +#include "formatimporter.h" +#include "notecontent.h" +#include "notefactory.h" +#include "bnpview.h" +#include "basket.h" +#include "global.h" +#include "xmlwork.h" +#include "tools.h" + +bool FormatImporter::shouldImportBaskets() +{ + // We should import if the application have not successfully loaded any basket... + if (Global::bnpView->firstListViewItem()) + return false; + + // ... And there is at least one folder in the save folder, with a ".basket" file inside that folder. + QDir dir(Global::savesFolder(), QString::null, QDir::Name | QDir::IgnoreCase, QDir::Dirs | QDir::NoSymLinks); + QStringList list = dir.entryList(); + for (QStringList::Iterator it = list.begin(); it != list.end(); ++it) + if (*it != "." && *it != ".." && dir.exists(Global::savesFolder() + *it + "/.basket")) + return true; + + return false; +} + +void FormatImporter::copyFolder(const QString &folder, const QString &newFolder) +{ + copyFinished = false; + KIO::CopyJob *copyJob = KIO::copyAs(KURL(folder), KURL(newFolder), /*showProgressInfo=*/false); + connect( copyJob, SIGNAL(result(KIO::Job*)), this, SLOT(slotCopyingDone(KIO::Job*)) ); + while (!copyFinished) + kapp->processEvents(); +} + +void FormatImporter::moveFolder(const QString &folder, const QString &newFolder) +{ + copyFinished = false; + KIO::CopyJob *copyJob = KIO::moveAs(KURL(folder), KURL(newFolder), /*showProgressInfo=*/false); + connect( copyJob, SIGNAL(result(KIO::Job*)), this, SLOT(slotCopyingDone(KIO::Job*)) ); + while (!copyFinished) + kapp->processEvents(); +} + +void FormatImporter::slotCopyingDone(KIO::Job *) +{ +// std::cout << "Copy finished of " + from.path() + " to " + to.path() << std::endl; + copyFinished = true; +} + +void FormatImporter::importBaskets() +{ + std::cout << "Import Baskets: Preparing..." << std::endl; + + // Some preliminary preparations (create the destination folders and the basket tree file): + QDir dirPrep; + dirPrep.mkdir(Global::savesFolder()); + dirPrep.mkdir(Global::basketsFolder()); + QDomDocument document("basketTree"); + QDomElement root = document.createElement("basketTree"); + document.appendChild(root); + + // First up, establish a list of every baskets, ensure the old order (if any), and count them. + QStringList baskets; + + // Read the 0.5.0 baskets order: + QDomDocument *doc = XMLWork::openFile("container", Global::savesFolder() + "container.baskets"); + if (doc != 0) { + QDomElement docElem = doc->documentElement(); + QDomElement basketsElem = XMLWork::getElement(docElem, "baskets"); + QDomNode n = basketsElem.firstChild(); + while (!n.isNull()) { + QDomElement e = n.toElement(); + if ((!e.isNull()) && e.tagName() == "basket") + baskets.append(e.text()); + n = n.nextSibling(); + } + } + + // Then load the baskets that weren't loaded (import < 0.5.0 ones): + QDir dir(Global::savesFolder(), QString::null, QDir::Name | QDir::IgnoreCase, QDir::Dirs | QDir::NoSymLinks); + QStringList list = dir.entryList(); + if (list.count() > 2) // Pass "." and ".." + for (QStringList::Iterator it = list.begin(); it != list.end(); ++it) // For each folder + if (*it != "." && *it != ".." && dir.exists(Global::savesFolder() + *it + "/.basket")) // If it can be a basket folder + if ( baskets.find((*it) + "/") == baskets.end() && + baskets.find(*it) == baskets.end() ) // And if it is not already in the imported baskets list + baskets.append(*it); + + std::cout << "Import Baskets: Found " << baskets.count() << " baskets to import." << std::endl; + + // Import every baskets: + int i = 0; + for (QStringList::iterator it = baskets.begin(); it != baskets.end(); ++it) { + ++i; + std::cout << "Import Baskets: Importing basket " << i << " of " << baskets.count() << "..." << std::endl; + + // Move the folder to the new repository (normal basket) or copy the folder (mirorred folder): + QString folderName = *it; + if (folderName.startsWith("/")) { // It was a folder mirror: + KMessageBox::information(0, i18n("<p>Folder mirroring is not possible anymore (see <a href='http://basket.kde.org/'>basket.kde.org</a> for more information).</p>" + "<p>The folder <b>%1</b> has been copied for the basket needs. You can either delete this folder or delete the basket, or use both. But remember that " + "modifying one will not modify the other anymore as they are now separate entities.</p>").arg(folderName), i18n("Folder Mirror Import"), + "", KMessageBox::AllowLink); + // Also modify folderName to be only the folder name and not the full path anymore: + QString newFolderName = folderName; + if (newFolderName.endsWith("/")) + newFolderName = newFolderName.left(newFolderName.length() - 1); + newFolderName = newFolderName.mid(newFolderName.findRev('/') + 1); + newFolderName = Tools::fileNameForNewFile(newFolderName, Global::basketsFolder()); + FormatImporter f; + f.copyFolder(folderName, Global::basketsFolder() + newFolderName); + folderName = newFolderName; + } else + dir.rename(Global::savesFolder() + folderName, Global::basketsFolder() + folderName); // Move the folder + + // Import the basket structure file and get the properties (to add them in the tree basket-properties cache): + QDomElement properties = importBasket(folderName); + + // Add it to the XML document: + QDomElement basketElement = document.createElement("basket"); + root.appendChild(basketElement); + basketElement.setAttribute("folderName", folderName); + basketElement.appendChild(properties); + } + + // Finalize (write to disk and delete now useless files): + std::cout << "Import Baskets: Finalizing..." << std::endl; + + QFile file(Global::basketsFolder() + "baskets.xml"); + if (file.open(IO_WriteOnly)) { + QTextStream stream(&file); + stream.setEncoding(QTextStream::UnicodeUTF8); + QString xml = document.toString(); + stream << "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n"; + stream << xml; + file.close(); + } + + Tools::deleteRecursively(Global::savesFolder() + ".tmp"); + dir.remove(Global::savesFolder() + "container.baskets"); + + std::cout << "Import Baskets: Finished." << std::endl; +} + +QDomElement FormatImporter::importBasket(const QString &folderName) +{ + // Load the XML file: + QDomDocument *document = XMLWork::openFile("basket", Global::basketsFolder() + folderName + "/.basket"); + if (!document) { + std::cout << "Import Baskets: Failed to read the basket file!" << std::endl; + return QDomElement(); + } + QDomElement docElem = document->documentElement(); + + // Import properties (change <background color=""> to <appearance backgroundColor="">, and figure out if is a checklist or not): + QDomElement properties = XMLWork::getElement(docElem, "properties"); + QDomElement background = XMLWork::getElement(properties, "background"); + QColor backgroundColor = QColor(background.attribute("color")); + if (backgroundColor.isValid() && (backgroundColor != KGlobalSettings::baseColor())) { // Use the default color if it was already that color: + QDomElement appearance = document->createElement("appearance"); + appearance.setAttribute("backgroundColor", backgroundColor.name()); + properties.appendChild(appearance); + } + QDomElement disposition = document->createElement("disposition"); + disposition.setAttribute("mindMap", "false"); + disposition.setAttribute("columnCount", "1"); + disposition.setAttribute("free", "false"); + bool isCheckList = XMLWork::trueOrFalse( XMLWork::getElementText(properties, "showCheckBoxes", false) ); + + // Insert all notes in a group (column): 1/ rename "items" to "group", 2/ add "notes" to root, 3/ move "group" into "notes" + QDomElement column = XMLWork::getElement(docElem, "items"); + column.setTagName("group"); + QDomElement notes = document->createElement("notes"); + notes.appendChild(column); + docElem.appendChild(notes); + + // Import notes from older representations: + QDomNode n = column.firstChild(); + while ( ! n.isNull() ) { + QDomElement e = n.toElement(); + if (!e.isNull()) { + e.setTagName("note"); + QDomElement content = XMLWork::getElement(e, "content"); + // Add Check tag: + if (isCheckList) { + bool isChecked = XMLWork::trueOrFalse(e.attribute("checked", "false")); + XMLWork::addElement(*document, e, "tags", (isChecked ? "todo_done" : "todo_unchecked")); + } + // Import annotations as folded groups: + QDomElement parentE = column; + QString annotations = XMLWork::getElementText(e, "annotations", ""); + if (!annotations.isEmpty()) { + QDomElement annotGroup = document->createElement("group"); + column.insertBefore(annotGroup, e); + annotGroup.setAttribute("folded", "true"); + annotGroup.appendChild(e); + parentE = annotGroup; + // Create the text note and add it to the DOM tree: + QDomElement annotNote = document->createElement("note"); + annotNote.setAttribute("type", "text"); + annotGroup.appendChild(annotNote); + QString annotFileName = Tools::fileNameForNewFile("annotations1.txt", Basket::fullPathForFolderName(folderName)); + QString annotFullPath = Basket::fullPathForFolderName(folderName) + "/" + annotFileName; + QFile file(annotFullPath); + if (file.open(IO_WriteOnly)) { + QTextStream stream(&file); + stream << annotations; + file.close(); + } + XMLWork::addElement(*document, annotNote, "content", annotFileName); + n = annotGroup; + } + // Import Launchers from 0.3.x, 0.4.0 and 0.5.0-alphas: + QString runCommand = e.attribute("runcommand"); // Keep compatibility with 0.4.0 and 0.5.0-alphas versions + runCommand = XMLWork::getElementText(e, "action", runCommand); // Keep compatibility with 0.3.x versions + if ( ! runCommand.isEmpty() ) { // An import should be done + // Prepare the launcher note: + QString title = content.attribute("title", ""); + QString icon = content.attribute("icon", ""); + if (title.isEmpty()) title = runCommand; + if (icon.isEmpty()) icon = NoteFactory::iconForCommand(runCommand); + // Import the launcher note: + // Adapted version of "QString launcherName = NoteFactory::createNoteLauncherFile(runCommand, title, icon, this)": + QString launcherContent = QString( + "[Desktop Entry]\n" + "Exec=%1\n" + "Name=%2\n" + "Icon=%3\n" + "Encoding=UTF-8\n" + "Type=Application\n").arg(runCommand, title, icon.isEmpty() ? QString("exec") : icon); + QString launcherFileName = Tools::fileNameForNewFile("launcher.desktop", Global::basketsFolder() + folderName /*+ "/"*/); + QString launcherFullPath = Global::basketsFolder() + folderName /*+ "/"*/ + launcherFileName; + QFile file(launcherFullPath); + if (file.open(IO_WriteOnly)) { + QTextStream stream(&file); + stream.setEncoding(QTextStream::UnicodeUTF8); + stream << launcherContent; + file.close(); + } + // Add the element to the DOM: + QDomElement launcherElem = document->createElement("note"); + parentE.insertBefore(launcherElem, e); + launcherElem.setAttribute("type", "launcher"); + XMLWork::addElement(*document, launcherElem, "content", launcherFileName); + } + // Import unknown ns to 0.6.0: + if (e.attribute("type") == "unknow") + e.setAttribute("type", "unknown"); + // Import links from version < 0.5.0: + if (!content.attribute("autotitle").isEmpty() && content.attribute("autoTitle").isEmpty()) + content.setAttribute("autoTitle", content.attribute("autotitle")); + if (!content.attribute("autoicon").isEmpty() && content.attribute("autoIcon").isEmpty()) + content.setAttribute("autoIcon", content.attribute("autoicon")); + } + n = n.nextSibling(); + } + + // Save the resulting XML file: + QFile file(Global::basketsFolder() + folderName + "/.basket"); + if (file.open(IO_WriteOnly)) { + QTextStream stream(&file); + stream.setEncoding(QTextStream::UnicodeUTF8); +// QString xml = document->toString(); +// stream << "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n"; +// stream << xml; + stream << document->toString(); // Document is ALREADY using UTF-8 + file.close(); + } else + std::cout << "Import Baskets: Failed to save the basket file!" << std::endl; + + // Return the newly created properties (to put in the basket tree): + return properties; +} + +#include "formatimporter.moc" |