You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
kiosktool/kiosktool/desktopComponent.cpp

240 lines
6.5 KiB

/*
* desktopComponent.cpp
*
* Copyright (C) 2004 Waldo Bastian <bastian@kde.org>
*
* 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 <tdetempfile.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, TQ_SIGNAL(timeout()), this, TQ_SLOT(slotSetupStarted()));
}
void
DesktopComponent::slotSetupStarted()
{
TQString desktop = KioskRun::self()->desktopPath();
TQFileInfo info(desktop);
if (info.exists())
{
disconnect(&m_timer, TQ_SIGNAL(timeout()), this, TQ_SLOT(slotSetupStarted()));
connect(&m_timer, TQ_SIGNAL(timeout()), this, TQ_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, TQ_SIGNAL(timeout()), this, TQ_SLOT(slotSetupStarted()));
disconnect(&m_timer, TQ_SIGNAL(timeout()), this, TQ_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"