From ce4a32fe52ef09d8f5ff1dd22c001110902b60a2 Mon Sep 17 00:00:00 2001 From: toma Date: Wed, 25 Nov 2009 17:56:58 +0000 Subject: Copy the KDE 3.5 branch to branches/trinity for new KDE 3.5 features. BUG:215923 git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/kdelibs@1054174 283d02a7-25f6-0310-bc7c-ecb5cbfe19da --- kinit/autostart.cpp | 207 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 207 insertions(+) create mode 100644 kinit/autostart.cpp (limited to 'kinit/autostart.cpp') diff --git a/kinit/autostart.cpp b/kinit/autostart.cpp new file mode 100644 index 000000000..0b39a3275 --- /dev/null +++ b/kinit/autostart.cpp @@ -0,0 +1,207 @@ +/* + * + * This file is part of the KDE libraries + * Copyright (c) 2001 Waldo Bastian + * + * $Id$ + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License version 2 as published by the Free Software Foundation. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public License + * along with this library; see the file COPYING.LIB. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + **/ + +#include "autostart.h" + +#include +#include +#include +#include + +class AutoStartItem +{ +public: + QString name; + QString service; + QString startAfter; + int phase; +}; + +class AutoStartList: public QPtrList +{ +public: + AutoStartList() { } +}; + +AutoStart::AutoStart( bool new_startup ) + : m_newStartup( new_startup ), m_phase( new_startup ? -1 : 0), m_phasedone(false) +{ + m_startList = new AutoStartList; + m_startList->setAutoDelete(true); + KGlobal::dirs()->addResourceType("autostart", "share/autostart"); +} + +AutoStart::~AutoStart() +{ + delete m_startList; +} + +void +AutoStart::setPhase(int phase) +{ + if (phase > m_phase) + { + m_phase = phase; + m_phasedone = false; + } +} + +void AutoStart::setPhaseDone() +{ + m_phasedone = true; +} + +static QString extractName(QString path) +{ + int i = path.findRev('/'); + if (i >= 0) + path = path.mid(i+1); + i = path.findRev('.'); + if (i >= 0) + path = path.left(i); + return path; +} + +static bool startCondition(const QString &condition) +{ + if (condition.isEmpty()) + return true; + + QStringList list = QStringList::split(':', condition, true); + if (list.count() < 4) + return true; + if (list[0].isEmpty() || list[2].isEmpty()) + return true; + + KConfig config(list[0], true, false); + if (!list[1].isEmpty()) + config.setGroup(list[1]); + + bool defaultValue = (list[3].lower() == "true"); + + return config.readBoolEntry(list[2], defaultValue); +} + +void +AutoStart::loadAutoStartList() +{ + QStringList files = KGlobal::dirs()->findAllResources("autostart", "*.desktop", false, true); + + for(QStringList::ConstIterator it = files.begin(); + it != files.end(); + ++it) + { + KDesktopFile config(*it, true); + if (!startCondition(config.readEntry("X-KDE-autostart-condition"))) + continue; + if (!config.tryExec()) + continue; + if (config.readBoolEntry("Hidden", false)) + continue; + + if (config.hasKey("OnlyShowIn")) + { + if (!config.readListEntry("OnlyShowIn", ';').contains("KDE")) + continue; + } + if (config.hasKey("NotShowIn")) + { + if (config.readListEntry("NotShowIn", ';').contains("KDE")) + continue; + } + + AutoStartItem *item = new AutoStartItem; + item->name = extractName(*it); + item->service = *it; + item->startAfter = config.readEntry("X-KDE-autostart-after"); + if( m_newStartup ) + { + item->phase = config.readNumEntry("X-KDE-autostart-phase", 2); + if (item->phase < 0) + item->phase = 0; + } + else + { + item->phase = config.readNumEntry("X-KDE-autostart-phase", 1); + if (item->phase < 1) + item->phase = 1; + } + m_startList->append(item); + } +} + +QString +AutoStart::startService() +{ + if (m_startList->isEmpty()) + return 0; + + while(!m_started.isEmpty()) + { + + // Check for items that depend on previously started items + QString lastItem = m_started[0]; + for(AutoStartItem *item = m_startList->first(); + item; item = m_startList->next()) + { + if (item->phase == m_phase + && item->startAfter == lastItem) + { + m_started.prepend(item->name); + QString service = item->service; + m_startList->remove(); + return service; + } + } + m_started.remove(m_started.begin()); + } + + // Check for items that don't depend on anything + AutoStartItem *item; + for(item = m_startList->first(); + item; item = m_startList->next()) + { + if (item->phase == m_phase + && item->startAfter.isEmpty()) + { + m_started.prepend(item->name); + QString service = item->service; + m_startList->remove(); + return service; + } + } + + // Just start something in this phase + for(item = m_startList->first(); + item; item = m_startList->next()) + { + if (item->phase == m_phase) + { + m_started.prepend(item->name); + QString service = item->service; + m_startList->remove(); + return service; + } + } + + return 0; +} -- cgit v1.2.1