summaryrefslogtreecommitdiffstats
path: root/ksysv/IOCore.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'ksysv/IOCore.cpp')
-rw-r--r--ksysv/IOCore.cpp291
1 files changed, 291 insertions, 0 deletions
diff --git a/ksysv/IOCore.cpp b/ksysv/IOCore.cpp
new file mode 100644
index 0000000..c61dec6
--- /dev/null
+++ b/ksysv/IOCore.cpp
@@ -0,0 +1,291 @@
+/***************************************************************************
+ ksv::IO.cpp - description
+ -------------------
+ begin : Sun Oct 3 1999
+ copyright : (C) 1997-2000 by Peter Putzer
+ email : putzer@kde.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; version 2. *
+ * *
+ ***************************************************************************/
+
+
+#include <errno.h>
+#include <unistd.h>
+
+#include <qfileinfo.h>
+#include <qptrlist.h>
+#include <qvaluelist.h>
+#include <qstringlist.h>
+
+#include <kdebug.h>
+#include <kapplication.h>
+#include <klocale.h>
+#include <kmimemagic.h>
+#include <kservice.h>
+#include <kuserprofile.h>
+
+#include "Data.h"
+#include "IOCore.h"
+#include "ksvdraglist.h"
+#include "ksv_core.h"
+#include "ksv_conf.h"
+
+QString ksv::IO::relToAbs (const QString& dir, const QString& rel)
+{
+ if (rel.left(1) != "/")
+ return QDir::cleanDirPath (dir + "/" + rel);
+ else
+ return QDir::cleanDirPath (rel);
+}
+
+void ksv::IO::removeFile (const QFileInfo& info, QDir& dir, QString& rich, QString& plain)
+{
+ if (!dir.remove(info.fileName(), FALSE))
+ {
+ rich = (i18n ("<error>FAILED</error> to remove <cmd>%1</cmd> from <cmd>%2</cmd>: \"%3\"<br/>")
+ .arg(info.fileName())
+ .arg(dir.path())
+ .arg(strerror(errno)));
+ plain = (i18n ("FAILED to remove %1 from %2: \"%3\"\n")
+ .arg(info.fileName())
+ .arg(dir.path())
+ .arg(strerror(errno)));
+ }
+ else
+ {
+ rich = i18n("removed <cmd>%1</cmd> from <cmd>%2</cmd><br/>")
+ .arg(info.fileName())
+ .arg(dir.path());
+
+ plain = i18n("removed %1 from %2\n")
+ .arg(info.fileName())
+ .arg(dir.path());
+ }
+}
+
+void ksv::IO::dissectFilename (const QString& file, QString& base, int& nr)
+{
+ QString tmp = file.mid(1, file.length());
+
+ nr = tmp.left(2).toInt();
+ base = tmp.mid(2, tmp.length());
+}
+
+void ksv::IO::makeSymlink (const KSVData& data, int runlevel, bool start,
+ QString& rich, QString& plain)
+{
+ const QString symName = QString("%1%2%3").arg(start ? "S" : "K").arg(data.numberString()).arg(data.label());
+ const QString symPath = QString("%1/rc%2.d/").arg(KSVConfig::self()->runlevelPath()).arg(runlevel);
+
+ const QString symbol = symPath + symName;
+ QString target = data.filename();
+
+ if (QDir::isRelativePath(target))
+ target = ksv::IO::makeRelativePath(QDir::cleanDirPath(symPath),
+ QDir::cleanDirPath(data.path())) + data.filename();
+
+ if (symlink(target.local8Bit(), symbol.local8Bit()) == 0)
+ {
+ rich = i18n("created <cmd>%1</cmd> in <cmd>%2</cmd><br/>").arg(symName).arg(symPath);
+ plain = i18n("created %1 in %2\n").arg(symName).arg(symPath);
+ }
+ else
+ {
+ rich = i18n("<error>FAILED</error> to create <cmd>%1</cmd> in <cmd>%2</cmd>: \"%3\"<br/>")
+ .arg(symName)
+ .arg(symPath)
+ .arg(strerror(errno));
+
+ plain = i18n("FAILED to create %1 in %2: \"%3\"\n")
+ .arg(symName)
+ .arg(symPath)
+ .arg(strerror(errno));
+ }
+}
+
+QString ksv::IO::makeRelativePath (const QString& from, const QString& to)
+{
+ if (QDir::isRelativePath(from) || QDir::isRelativePath(to))
+ return QString::null;
+
+ int pos = 0;
+ const int f_length = from.length();
+
+ QStringList from_list;
+ while (pos > -1)
+ {
+ const int old = pos + 1;
+ const int res = from.find('/', old);
+
+ int length = 0;
+
+ if (res > -1)
+ length = res - old + 1;
+ else
+ length = f_length - old;
+
+ from_list.append (from.mid(old, length));
+
+ pos = res;
+ }
+
+ const int t_length = to.length();
+
+ QStringList to_list;
+ pos = 0;
+
+ while (pos > -1)
+ {
+ const int old = pos + 1;
+ const int res = to.find('/', old);
+
+ int length = 0;
+
+ if (res > -1)
+ length = res - old + 1;
+ else
+ length = t_length - old;
+
+ to_list.append (to.mid(old, length));
+
+ pos = res;
+ }
+
+ int lcp = 0; // longest common prefix
+ const int f_c = from_list.count();
+ const int t_c = to_list.count();
+
+ while (lcp < f_c && lcp < t_c
+ && *from_list.at(lcp) == *to_list.at(lcp))
+ lcp++;
+
+ QString result;
+ for (int i = f_c - lcp; i > 0; --i)
+ result += "../";
+
+ for (int i = lcp; i < t_c; ++i)
+ result += *to_list.at(i) + "/";
+
+ return result;
+}
+
+bool ksv::IO::loadSavedConfiguration (QDataStream& s,
+ QValueList<KSVData>* start,
+ QValueList<KSVData>* stop)
+{
+ QCString magic;
+ s >> magic;
+ if (magic != "KSysV")
+ return false;
+
+ Q_INT32 version = 0;
+ s >> version;
+
+ if (version != 3)
+ return false; // too old
+
+ QDateTime saveTime;
+ s >> saveTime;
+
+ for (int i = 0; i < ksv::runlevelNumber; ++i)
+ {
+ QString rlMagic;
+ QString section;
+
+ s >> rlMagic;
+ s >> section;
+
+ if (rlMagic != QString::fromLatin1("RUNLEVEL %1").arg(i))
+ return false;
+
+ if (section != "START")
+ return false;
+
+ Q_INT32 numberOfItems;
+ s >> numberOfItems;
+
+ KSVData data;
+ for (int j = 0; j < numberOfItems; ++j)
+ {
+ s >> data;
+ start[i].append (data);
+ }
+
+ s >> section;
+ if (section != "STOP")
+ return false;
+
+ s >> numberOfItems;
+ for (int j = 0; j < numberOfItems; ++j)
+ {
+ s >> data;
+ stop[i].append(data);
+ }
+ }
+
+ return true;
+}
+
+bool ksv::IO::saveConfiguration (QDataStream& s,
+ KSVDragList** start,
+ KSVDragList** stop)
+{
+ Q_INT32 version = 3;
+
+ s << QCString("KSysV")
+ << version
+ << QDateTime::currentDateTime(); // save date
+
+ for (int i = 0; i < ksv::runlevelNumber; ++i)
+ {
+ Q_INT32 numberOfItems = start[i]->childCount();
+
+ s << QString::fromLatin1 ("RUNLEVEL %1").arg (i)
+ << QString::fromLatin1 ("START")
+ << numberOfItems;
+
+ for (QListViewItemIterator it (start[i]);
+ it.current();
+ ++it)
+ {
+ s << *static_cast<KSVItem*> (it.current())->data();
+ }
+
+ numberOfItems = stop[i]->childCount();
+
+ s << QString::fromLatin1 ("STOP")
+ << numberOfItems;
+
+ for (QListViewItemIterator it (stop[i]);
+ it.current();
+ ++it)
+ {
+ s << *static_cast<KSVItem*> (it.current())->data();
+ }
+ }
+
+ return true;
+}
+
+KTrader::OfferList ksv::IO::servicesForFile (const QString& filename)
+{
+ static KTrader* trader = KTrader::self();
+ static KMimeMagic* magic = KMimeMagic::self();
+ const QString mimetype = magic->findFileType(filename)->mimeType();
+
+ return trader->query (mimetype, "Type == 'Application'");
+}
+
+KService::Ptr ksv::IO::preferredServiceForFile (const QString& filename)
+{
+ static KMimeMagic* magic = KMimeMagic::self();
+ const QString mimetype = magic->findFileType(filename)->mimeType();
+
+ return KServiceTypeProfile::preferredService (mimetype, "Application");
+}