autostart.cpp00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include "autostart.h"
00024
00025 #include <kconfig.h>
00026 #include <kdesktopfile.h>
00027 #include <kglobal.h>
00028 #include <kstandarddirs.h>
00029
00030 class AutoStartItem
00031 {
00032 public:
00033 QString name;
00034 QString service;
00035 QString startAfter;
00036 int phase;
00037 };
00038
00039 class AutoStartList: public QPtrList<AutoStartItem>
00040 {
00041 public:
00042 AutoStartList() { }
00043 };
00044
00045 AutoStart::AutoStart( bool new_startup )
00046 : m_newStartup( new_startup ), m_phase( new_startup ? -1 : 0), m_phasedone(false)
00047 {
00048 m_startList = new AutoStartList;
00049 m_startList->setAutoDelete(true);
00050 KGlobal::dirs()->addResourceType("autostart", "share/autostart");
00051 }
00052
00053 AutoStart::~AutoStart()
00054 {
00055 delete m_startList;
00056 }
00057
00058 void
00059 AutoStart::setPhase(int phase)
00060 {
00061 if (phase > m_phase)
00062 {
00063 m_phase = phase;
00064 m_phasedone = false;
00065 }
00066 }
00067
00068 void AutoStart::setPhaseDone()
00069 {
00070 m_phasedone = true;
00071 }
00072
00073 static QString extractName(QString path)
00074 {
00075 int i = path.findRev('/');
00076 if (i >= 0)
00077 path = path.mid(i+1);
00078 i = path.findRev('.');
00079 if (i >= 0)
00080 path = path.left(i);
00081 return path;
00082 }
00083
00084 static bool startCondition(const QString &condition)
00085 {
00086 if (condition.isEmpty())
00087 return true;
00088
00089 QStringList list = QStringList::split(':', condition, true);
00090 if (list.count() < 4)
00091 return true;
00092 if (list[0].isEmpty() || list[2].isEmpty())
00093 return true;
00094
00095 KConfig config(list[0], true, false);
00096 if (!list[1].isEmpty())
00097 config.setGroup(list[1]);
00098
00099 bool defaultValue = (list[3].lower() == "true");
00100
00101 return config.readBoolEntry(list[2], defaultValue);
00102 }
00103
00104 void
00105 AutoStart::loadAutoStartList()
00106 {
00107 QStringList files = KGlobal::dirs()->findAllResources("autostart", "*.desktop", false, true);
00108
00109 for(QStringList::ConstIterator it = files.begin();
00110 it != files.end();
00111 ++it)
00112 {
00113 KDesktopFile config(*it, true);
00114 if (!startCondition(config.readEntry("X-KDE-autostart-condition")))
00115 continue;
00116 if (!config.tryExec())
00117 continue;
00118 if (config.readBoolEntry("Hidden", false))
00119 continue;
00120
00121 if (config.hasKey("OnlyShowIn"))
00122 {
00123 if (!config.readListEntry("OnlyShowIn", ';').contains("KDE"))
00124 continue;
00125 }
00126 if (config.hasKey("NotShowIn"))
00127 {
00128 if (config.readListEntry("NotShowIn", ';').contains("KDE"))
00129 continue;
00130 }
00131
00132 AutoStartItem *item = new AutoStartItem;
00133 item->name = extractName(*it);
00134 item->service = *it;
00135 item->startAfter = config.readEntry("X-KDE-autostart-after");
00136 if( m_newStartup )
00137 {
00138 item->phase = config.readNumEntry("X-KDE-autostart-phase", 2);
00139 if (item->phase < 0)
00140 item->phase = 0;
00141 }
00142 else
00143 {
00144 item->phase = config.readNumEntry("X-KDE-autostart-phase", 1);
00145 if (item->phase < 1)
00146 item->phase = 1;
00147 }
00148 m_startList->append(item);
00149 }
00150 }
00151
00152 QString
00153 AutoStart::startService()
00154 {
00155 if (m_startList->isEmpty())
00156 return 0;
00157
00158 while(!m_started.isEmpty())
00159 {
00160
00161
00162 QString lastItem = m_started[0];
00163 for(AutoStartItem *item = m_startList->first();
00164 item; item = m_startList->next())
00165 {
00166 if (item->phase == m_phase
00167 && item->startAfter == lastItem)
00168 {
00169 m_started.prepend(item->name);
00170 QString service = item->service;
00171 m_startList->remove();
00172 return service;
00173 }
00174 }
00175 m_started.remove(m_started.begin());
00176 }
00177
00178
00179 AutoStartItem *item;
00180 for(item = m_startList->first();
00181 item; item = m_startList->next())
00182 {
00183 if (item->phase == m_phase
00184 && item->startAfter.isEmpty())
00185 {
00186 m_started.prepend(item->name);
00187 QString service = item->service;
00188 m_startList->remove();
00189 return service;
00190 }
00191 }
00192
00193
00194 for(item = m_startList->first();
00195 item; item = m_startList->next())
00196 {
00197 if (item->phase == m_phase)
00198 {
00199 m_started.prepend(item->name);
00200 QString service = item->service;
00201 m_startList->remove();
00202 return service;
00203 }
00204 }
00205
00206 return 0;
00207 }
|