kdesktopfile.cpp
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include <stdlib.h>
00025 #include <unistd.h>
00026
00027 #include <qfile.h>
00028 #include <qtextstream.h>
00029
00030 #include "kurl.h"
00031 #include "kconfigbackend.h"
00032 #include "kapplication.h"
00033 #include "kstandarddirs.h"
00034 #include "kmountpoint.h"
00035
00036 #include "kdesktopfile.h"
00037 #include "kdesktopfile.moc"
00038
00039 KDesktopFile::KDesktopFile(const QString &fileName, bool bReadOnly,
00040 const char * resType)
00041 : KConfig(QString::fromLatin1(""), bReadOnly, false)
00042 {
00043
00044
00045
00046 backEnd->changeFileName(fileName, resType, false);
00047 setReadOnly(bReadOnly);
00048 reparseConfiguration();
00049 setDesktopGroup();
00050 }
00051
00052 KDesktopFile::~KDesktopFile()
00053 {
00054
00055 }
00056
00057 QString KDesktopFile::locateLocal(const QString &path)
00058 {
00059 QString local;
00060 if (path.endsWith(".directory"))
00061 {
00062 local = path;
00063 if (local.startsWith("/"))
00064 {
00065
00066 local = KGlobal::dirs()->relativeLocation("apps", path);
00067 }
00068
00069 if (!local.startsWith("/"))
00070 {
00071 local = ::locateLocal("apps", local);
00072 }
00073 else
00074 {
00075
00076
00077 local = KGlobal::dirs()->relativeLocation("xdgdata-dirs", local);
00078 if (local.startsWith("/"))
00079 {
00080
00081
00082 local = path.mid(path.findRev('/')+1);
00083 }
00084 local = ::locateLocal("xdgdata-dirs", local);
00085 }
00086 }
00087 else
00088 {
00089 if (!path.startsWith("/"))
00090 {
00091 local = ::locateLocal("apps", path);
00092 }
00093 else
00094 {
00095
00096
00097 local = KGlobal::dirs()->relativeLocation("xdgdata-apps", path);
00098 if (local.startsWith("/"))
00099 {
00100
00101 local = path.mid(path.findRev('/')+1);
00102 }
00103 local = ::locateLocal("xdgdata-apps", local);
00104 }
00105 }
00106 return local;
00107 }
00108
00109 bool KDesktopFile::isDesktopFile(const QString& path)
00110 {
00111 int len = path.length();
00112
00113 if(len > 8 && path.right(8) == QString::fromLatin1(".desktop"))
00114 return true;
00115 else if(len > 7 && path.right(7) == QString::fromLatin1(".kdelnk"))
00116 return true;
00117 else
00118 return false;
00119 }
00120
00121 bool KDesktopFile::isAuthorizedDesktopFile(const QString& path)
00122 {
00123 if (!kapp || kapp->authorize("run_desktop_files"))
00124 return true;
00125
00126 if (path.isEmpty())
00127 return false;
00128
00129 if (path[0] != '/')
00130 return true;
00131
00132 KStandardDirs *dirs = KGlobal::dirs();
00133 if (dirs->relativeLocation("apps", path)[0] != '/')
00134 return true;
00135 if (dirs->relativeLocation("xdgdata-apps", path)[0] != '/')
00136 return true;
00137 if (dirs->relativeLocation("services", path)[0] != '/')
00138 return true;
00139 if (dirs->relativeLocation("data", path).startsWith("kdesktop/Desktop"))
00140 return true;
00141 return false;
00142 }
00143
00144 QString KDesktopFile::readType() const
00145 {
00146 return readEntry("Type");
00147 }
00148
00149 QString KDesktopFile::readIcon() const
00150 {
00151 return readEntry("Icon");
00152 }
00153
00154 QString KDesktopFile::readName() const
00155 {
00156 return readEntry("Name");
00157 }
00158
00159 QString KDesktopFile::readComment() const
00160 {
00161 return readEntry("Comment");
00162 }
00163
00164 QString KDesktopFile::readGenericName() const
00165 {
00166 return readEntry("GenericName");
00167 }
00168
00169 QString KDesktopFile::readPath() const
00170 {
00171 return readPathEntry("Path");
00172 }
00173
00174 QString KDesktopFile::readDevice() const
00175 {
00176 return readEntry("Dev");
00177 }
00178
00179 QString KDesktopFile::readURL() const
00180 {
00181 if (hasDeviceType()) {
00182 QString device = readDevice();
00183 KMountPoint::List mountPoints = KMountPoint::possibleMountPoints();
00184
00185 for(KMountPoint::List::ConstIterator it = mountPoints.begin();
00186 it != mountPoints.end(); ++it)
00187 {
00188 KMountPoint *mp = *it;
00189 if (mp->mountedFrom() == device)
00190 {
00191 KURL u;
00192 u.setPath( mp->mountPoint() );
00193 return u.url();
00194 }
00195 }
00196 return QString::null;
00197 } else {
00198 QString url = readPathEntry("URL");
00199 if ( !url.isEmpty() && url[0] == '/' )
00200 {
00201
00202 KURL u;
00203 u.setPath( url );
00204 return u.url();
00205 }
00206 return url;
00207 }
00208 }
00209
00210 QStringList KDesktopFile::readActions() const
00211 {
00212 return readListEntry("Actions", ';');
00213 }
00214
00215 void KDesktopFile::setActionGroup(const QString &group)
00216 {
00217 setGroup(QString::fromLatin1("Desktop Action ") + group);
00218 }
00219
00220 bool KDesktopFile::hasActionGroup(const QString &group) const
00221 {
00222 return hasGroup(QString::fromLatin1("Desktop Action ") + group);
00223 }
00224
00225 bool KDesktopFile::hasLinkType() const
00226 {
00227 return readEntry("Type") == QString::fromLatin1("Link");
00228 }
00229
00230 bool KDesktopFile::hasApplicationType() const
00231 {
00232 return readEntry("Type") == QString::fromLatin1("Application");
00233 }
00234
00235 bool KDesktopFile::hasMimeTypeType() const
00236 {
00237 return readEntry("Type") == QString::fromLatin1("MimeType");
00238 }
00239
00240 bool KDesktopFile::hasDeviceType() const
00241 {
00242 return readEntry("Type") == QString::fromLatin1("FSDev") ||
00243 readEntry("Type") == QString::fromLatin1("FSDevice");
00244 }
00245
00246 bool KDesktopFile::tryExec() const
00247 {
00248
00249 QString te = readPathEntry("TryExec");
00250
00251 if (!te.isEmpty()) {
00252 if (te[0] == '/') {
00253 if (::access(QFile::encodeName(te), R_OK | X_OK))
00254 return false;
00255 } else {
00256
00257
00258
00259 QStringList dirs = QStringList::split(':', QFile::decodeName(::getenv("PATH")));
00260 QStringList::Iterator it(dirs.begin());
00261 bool match = false;
00262 for (; it != dirs.end(); ++it) {
00263 QString fName = *it + "/" + te;
00264 if (::access(QFile::encodeName(fName), R_OK | X_OK) == 0)
00265 {
00266 match = true;
00267 break;
00268 }
00269 }
00270
00271 if (!match)
00272 return false;
00273 }
00274 }
00275 QStringList list = readListEntry("X-KDE-AuthorizeAction");
00276 if (kapp && !list.isEmpty())
00277 {
00278 for(QStringList::ConstIterator it = list.begin();
00279 it != list.end();
00280 ++it)
00281 {
00282 if (!kapp->authorize((*it).stripWhiteSpace()))
00283 return false;
00284 }
00285 }
00286
00287
00288 bool su = readBoolEntry("X-KDE-SubstituteUID");
00289 if (su)
00290 {
00291 QString user = readEntry("X-KDE-Username");
00292 if (user.isEmpty())
00293 user = ::getenv("ADMIN_ACCOUNT");
00294 if (user.isEmpty())
00295 user = "root";
00296 if (!kapp->authorize("user/"+user))
00297 return false;
00298 }
00299
00300 return true;
00301 }
00302
00306 QString
00307 KDesktopFile::fileName() const { return backEnd->fileName(); }
00308
00312 QString
00313 KDesktopFile::resource() const { return backEnd->resource(); }
00314
00315 QStringList
00316 KDesktopFile::sortOrder() const
00317 {
00318 return readListEntry("SortOrder");
00319 }
00320
00321 void KDesktopFile::virtual_hook( int id, void* data )
00322 { KConfig::virtual_hook( id, data ); }
00323
00324 QString KDesktopFile::readDocPath() const
00325 {
00326 return readPathEntry( "DocPath" );
00327 }
00328
00329 KDesktopFile* KDesktopFile::copyTo(const QString &file) const
00330 {
00331 KDesktopFile *config = new KDesktopFile(QString::null, false);
00332 KConfig::copyTo(file, config);
00333 config->setDesktopGroup();
00334 return config;
00335 }
00336
00337
This file is part of the documentation for kdecore Library Version 3.3.0.