summaryrefslogtreecommitdiffstats
path: root/kiosktool/desktopComponent.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kiosktool/desktopComponent.cpp')
-rw-r--r--kiosktool/desktopComponent.cpp239
1 files changed, 239 insertions, 0 deletions
diff --git a/kiosktool/desktopComponent.cpp b/kiosktool/desktopComponent.cpp
new file mode 100644
index 0000000..5456687
--- /dev/null
+++ b/kiosktool/desktopComponent.cpp
@@ -0,0 +1,239 @@
+/*
+ * desktopComponent.cpp
+ *
+ * Copyright (C) 2004 Waldo Bastian <[email protected]>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#include "desktopComponent.h"
+
+#include <tqdir.h>
+#include <tqfileinfo.h>
+
+#include <kdebug.h>
+#include <kmimetype.h>
+#include <kprocess.h>
+#include <ksimpleconfig.h>
+#include <kstandarddirs.h>
+#include <ktempfile.h>
+#include <kurl.h>
+
+#include "kioskrun.h"
+
+DesktopComponent::DesktopComponent( TQObject *parent)
+ : Component(parent)
+{
+}
+
+DesktopComponent::~DesktopComponent()
+{
+}
+
+void
+DesktopComponent::slotSetupPrepare()
+{
+ m_iconPositionsFile = KioskRun::self()->locateLocal("data", "kdesktop/IconPositions");
+ ::unlink(TQFile::encodeName(m_iconPositionsFile));
+ connect(&m_timer, TQT_SIGNAL(timeout()), this, TQT_SLOT(slotSetupStarted()));
+}
+
+void
+DesktopComponent::slotSetupStarted()
+{
+ TQString desktop = KioskRun::self()->desktopPath();
+ TQFileInfo info(desktop);
+ if (info.exists())
+ {
+ disconnect(&m_timer, TQT_SIGNAL(timeout()), this, TQT_SLOT(slotSetupStarted()));
+ connect(&m_timer, TQT_SIGNAL(timeout()), this, TQT_SLOT(slotSetupReady()));
+ m_timer.start(1000, true);
+ }
+ else
+ {
+ m_timer.start(500, true);
+ }
+}
+
+void filterFileList(const TQString &path, TQStringList *files, TQStringList *oldFiles)
+{
+ files->remove(".");
+ files->remove("..");
+
+ TQStringList::Iterator next;
+ for(TQStringList::Iterator it = files->begin();
+ it != files->end(); it = next)
+ {
+ next = it;
+ next++;
+
+ KURL u;
+ u.setPath(path+*it);
+
+ KMimeType::Ptr mime = KMimeType::findByURL(u, 0, true);
+ if (mime->name() == "application/x-desktop")
+ {
+ KSimpleConfig cfg(path+*it);
+ cfg.setDesktopGroup();
+ if (cfg.readBoolEntry("Hidden", false))
+ {
+ if (oldFiles)
+ oldFiles->append(*it);
+ files->remove(it);
+ continue;
+ }
+ }
+ }
+}
+
+void
+DesktopComponent::slotSetupReady()
+{
+ TQString desktop = KioskRun::self()->desktopPath();
+
+ TQDir dir(desktop);
+ m_origDesktopFiles = dir.entryList(TQDir::All, TQDir::Unsorted);
+
+ filterFileList(desktop, &m_origDesktopFiles, 0);
+}
+
+bool
+DesktopComponent::setupFinished()
+{
+ bool result = true;
+
+ disconnect(&m_timer, TQT_SIGNAL(timeout()), this, TQT_SLOT(slotSetupStarted()));
+ disconnect(&m_timer, TQT_SIGNAL(timeout()), this, TQT_SLOT(slotSetupReady()));
+ m_timer.stop();
+
+ KSimpleConfig newCfg(m_iconPositionsFile, true);
+
+ TQString desktop = KioskRun::self()->desktopPath();
+
+ TQDir dir(desktop);
+ TQStringList newDesktopFiles = dir.entryList(TQDir::All, TQDir::Unsorted);
+ filterFileList(desktop, &newDesktopFiles, &m_origDesktopFiles);
+
+ KTempFile positionsFile;
+ positionsFile.close();
+
+ KSimpleConfig positions(positionsFile.name());
+
+ TQStringList newGroups = newCfg.groupList();
+
+ TQString prefix = "IconPosition::";
+
+ // Save icon positions
+ for(TQStringList::Iterator it = newGroups.begin();
+ it != newGroups.end(); ++it)
+ {
+ if (!(*it).startsWith(prefix))
+ continue;
+
+ newCfg.setGroup(*it);
+ positions.setGroup(*it);
+ if (newCfg.hasKey("X"))
+ {
+ positions.writeEntry("X", newCfg.readEntry("X"));
+ positions.writeEntry("Y", newCfg.readEntry("Y"));
+ }
+ }
+
+ // Remove old icons from new list
+ TQStringList::Iterator next;
+ for(TQStringList::Iterator it = m_origDesktopFiles.begin();
+ it != m_origDesktopFiles.end(); it = next)
+ {
+ next = it;
+ next++;
+
+ if (newDesktopFiles.remove(*it))
+ {
+ m_origDesktopFiles.remove(it);
+ continue;
+ }
+
+ }
+
+ TQString installPath = KioskRun::self()->locateSave("data", "kdesktop/Desktop/");
+ TQString installPath2 = KioskRun::self()->locateSave("data", "kdesktop/DesktopLinks/");
+
+ // Remove all icons that are no longer
+ for(TQStringList::Iterator it = m_origDesktopFiles.begin();
+ it != m_origDesktopFiles.end(); ++it)
+ {
+ TQString file;
+ if (TQFile::exists(installPath + *it))
+ file = installPath + *it;
+ else if (TQFile::exists(installPath2 + *it))
+ file = installPath2 + *it;
+
+ if (!file.isEmpty())
+ {
+ result = KioskRun::self()->remove(file);
+ if (!result) return false;
+ positions.deleteGroup(prefix+*it);
+ }
+ else
+ {
+ TQString installFile = installPath + *it;
+ file = KioskRun::self()->locate("data", "kdesktop/Desktop/" + *it);
+ if (file.isEmpty())
+ {
+ installFile = installPath2 + *it;
+ file = KioskRun::self()->locate("data", "kdesktop/DesktopLinks/" + *it);
+ }
+
+ if (!file.isEmpty())
+ {
+ // Hide via "Hidden=True", not sure if this works
+ KTempFile tmp;
+ tmp.close();
+ KSimpleConfig cfg(tmp.name());
+ cfg.setDesktopGroup();
+ cfg.writeEntry("Hidden", true);
+ cfg.sync();
+ result = KioskRun::self()->install(tmp.name(), installFile);
+ if (!result) return false;
+ positions.deleteGroup(prefix+*it);
+ }
+ else
+ {
+ kdWarning() << "DesktopComponent: Can't remove " << (*it) << endl;
+ }
+ }
+ }
+ positions.sync();
+ result = KioskRun::self()->install(positionsFile.name(), KioskRun::self()->locateSave("data", "kdesktop/Desktop/.directory"));
+ if (!result) return false;
+
+ // Add all icons that have been added
+ for(TQStringList::Iterator it = newDesktopFiles.begin();
+ it != newDesktopFiles.end(); ++it)
+ {
+ TQString file = KioskRun::self()->desktopPath() + *it;
+ if (TQFile::exists(file))
+ {
+ result = KioskRun::self()->install(file, installPath + *it);
+ if (!result) return false;
+ }
+ else
+ {
+ kdWarning() << "DesktopComponent: Can't find new file " << file << endl;
+ }
+ }
+ return true;
+}
+
+#include "desktopComponent.moc"