diff options
Diffstat (limited to 'kiosktool/desktopComponent.cpp')
-rw-r--r-- | kiosktool/desktopComponent.cpp | 239 |
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" |