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
00035 #include "kdesktopfile.h"
00036 #include "kdesktopfile.moc"
00037
00038 KDesktopFile::KDesktopFile(const QString &fileName, bool bReadOnly,
00039 const char * resType)
00040 : KConfig(QString::fromLatin1(""), bReadOnly, false)
00041 {
00042
00043
00044
00045 backEnd->changeFileName(fileName, resType, false);
00046 setReadOnly(bReadOnly);
00047 reparseConfiguration();
00048 setDesktopGroup();
00049 }
00050
00051 KDesktopFile::~KDesktopFile()
00052 {
00053
00054 }
00055
00056 bool KDesktopFile::isDesktopFile(const QString& path)
00057 {
00058 int len = path.length();
00059
00060 if(len > 8 && path.right(8) == QString::fromLatin1(".desktop"))
00061 return true;
00062 else if(len > 7 && path.right(7) == QString::fromLatin1(".kdelnk"))
00063 return true;
00064 else
00065 return false;
00066 }
00067
00068 bool KDesktopFile::isAuthorizedDesktopFile(const QString& path)
00069 {
00070 if (!kapp || kapp->authorize("run_desktop_files"))
00071 return true;
00072
00073 if (path.isEmpty())
00074 return false;
00075
00076 if (path[0] != '/')
00077 return true;
00078
00079 KStandardDirs *dirs = KGlobal::dirs();
00080
00081 if (dirs->relativeLocation("apps", path)[0] != '/')
00082 return true;
00083 if (dirs->relativeLocation("services", path)[0] != '/')
00084 return true;
00085 if (dirs->relativeLocation("data", path).startsWith("kdesktop/Desktop"))
00086 return true;
00087
00088 return false;
00089 }
00090
00091 QString KDesktopFile::readType() const
00092 {
00093 return readEntry("Type");
00094 }
00095
00096 QString KDesktopFile::readIcon() const
00097 {
00098 return readEntry("Icon");
00099 }
00100
00101 QString KDesktopFile::readName() const
00102 {
00103 return readEntry("Name");
00104 }
00105
00106 QString KDesktopFile::readComment() const
00107 {
00108 return readEntry("Comment");
00109 }
00110
00111 QString KDesktopFile::readGenericName() const
00112 {
00113 return readEntry("GenericName");
00114 }
00115
00116 QString KDesktopFile::readPath() const
00117 {
00118 return readPathEntry("Path");
00119 }
00120
00121 QString KDesktopFile::readDevice() const
00122 {
00123 return readEntry("Dev");
00124 }
00125
00126 QString KDesktopFile::readURL() const
00127 {
00128 if (hasDeviceType()) {
00129 QString devURL;
00130
00131
00132 QCString fstabFile;
00133 int indexDevice = 0;
00134 int indexMountPoint = 1;
00135 int indexFSType = 2;
00136 if (QFile::exists(QString::fromLatin1("/etc/fstab"))) {
00137 fstabFile = "/etc/fstab";
00138 } else if (QFile::exists(QString::fromLatin1("/etc/vfstab"))) {
00139 fstabFile = "/etc/vfstab";
00140 indexMountPoint++;
00141 indexFSType++;
00142 }
00143
00144
00145 if ( !fstabFile.isEmpty() ) {
00146 QFile f( fstabFile );
00147 f.open( IO_ReadOnly );
00148 QTextStream stream( &f );
00149 stream.setEncoding( QTextStream::Latin1 );
00150 while ( !stream.eof() ) {
00151 QString line = stream.readLine();
00152 line = line.simplifyWhiteSpace();
00153 if (!line.isEmpty() && line[0] == '/') {
00154 QStringList lst = QStringList::split( ' ', line );
00155 if ( lst[indexDevice] == readDevice() )
00156 devURL = lst[indexMountPoint];
00157 }
00158 }
00159 f.close();
00160 }
00161 return devURL;
00162
00163 } else {
00164 QString url = readPathEntry("URL");
00165 if ( !url.isEmpty() && url[0] == '/' )
00166 {
00167
00168 KURL u;
00169 u.setPath( url );
00170 return u.url();
00171 }
00172 return url;
00173 }
00174 }
00175
00176 QStringList KDesktopFile::readActions() const
00177 {
00178 return readListEntry("Actions", ';');
00179 }
00180
00181 void KDesktopFile::setActionGroup(const QString &group)
00182 {
00183 setGroup(QString::fromLatin1("Desktop Action ") + group);
00184 }
00185
00186 bool KDesktopFile::hasActionGroup(const QString &group) const
00187 {
00188 return hasGroup(QString::fromLatin1("Desktop Action ") + group);
00189 }
00190
00191 bool KDesktopFile::hasLinkType() const
00192 {
00193 return readEntry("Type") == QString::fromLatin1("Link");
00194 }
00195
00196 bool KDesktopFile::hasApplicationType() const
00197 {
00198 return readEntry("Type") == QString::fromLatin1("Application");
00199 }
00200
00201 bool KDesktopFile::hasMimeTypeType() const
00202 {
00203 return readEntry("Type") == QString::fromLatin1("MimeType");
00204 }
00205
00206 bool KDesktopFile::hasDeviceType() const
00207 {
00208 return readEntry("Type") == QString::fromLatin1("FSDev") ||
00209 readEntry("Type") == QString::fromLatin1("FSDevice");
00210 }
00211
00212 bool KDesktopFile::tryExec() const
00213 {
00214
00215 QString te = readPathEntry("TryExec");
00216
00217 if (!te.isEmpty()) {
00218 if (te[0] == '/') {
00219 if (::access(QFile::encodeName(te), R_OK | X_OK))
00220 return false;
00221 } else {
00222
00223
00224
00225 QStringList dirs = QStringList::split(':', QFile::decodeName(::getenv("PATH")));
00226 QStringList::Iterator it(dirs.begin());
00227 bool match = false;
00228 for (; it != dirs.end(); ++it) {
00229 QString fName = *it + "/" + te;
00230 if (::access(QFile::encodeName(fName), R_OK | X_OK) == 0)
00231 {
00232 match = true;
00233 break;
00234 }
00235 }
00236
00237 if (!match)
00238 return false;
00239 }
00240 }
00241 QStringList list = readListEntry("X-KDE-AuthorizeAction");
00242 if (kapp && !list.isEmpty())
00243 {
00244 for(QStringList::ConstIterator it = list.begin();
00245 it != list.end();
00246 ++it)
00247 {
00248 if (!kapp->authorize((*it).stripWhiteSpace()))
00249 return false;
00250 }
00251 }
00252
00253
00254 bool su = readBoolEntry("X-KDE-SubstituteUID");
00255 if (su)
00256 {
00257 QString user = readEntry("X-KDE-Username");
00258 if (user.isEmpty())
00259 user = ::getenv("ADMIN_ACCOUNT");
00260 if (user.isEmpty())
00261 user = "root";
00262 if (!kapp->authorize("user/"+user))
00263 return false;
00264 }
00265
00266 return true;
00267 }
00268
00272 QString
00273 KDesktopFile::fileName() const { return backEnd->fileName(); }
00274
00278 QString
00279 KDesktopFile::resource() const { return backEnd->resource(); }
00280
00281 QStringList
00282 KDesktopFile::sortOrder() const
00283 {
00284 return readListEntry("SortOrder");
00285 }
00286
00287 void KDesktopFile::virtual_hook( int id, void* data )
00288 { KConfig::virtual_hook( id, data ); }
00289
00290 QString KDesktopFile::readDocPath() const
00291 {
00292 return readPathEntry( "DocPath" );
00293 }
00294
This file is part of the documentation for kdelibs Version 3.1.5.