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