kdecore Library API Documentation

kdesktopfile.cpp

00001 /*
00002   This file is part of the KDE libraries
00003   Copyright (c) 1999 Pietro Iglio <iglio@kde.org>
00004   Copyright (c) 1999 Preston Brown <pbrown@kde.org>
00005 
00006   This library is free software; you can redistribute it and/or
00007   modify it under the terms of the GNU Library General Public
00008   License as published by the Free Software Foundation; either
00009   version 2 of the License, or (at your option) any later version.
00010 
00011   This library is distributed in the hope that it will be useful,
00012   but WITHOUT ANY WARRANTY; without even the implied warranty of
00013   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00014   Library General Public License for more details.
00015 
00016   You should have received a copy of the GNU Library General Public License
00017   along with this library; see the file COPYING.LIB.  If not, write to
00018   the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
00019   Boston, MA 02111-1307, USA.
00020 */
00021 
00022 // $Id: kdesktopfile.cpp,v 1.33.2.4 2003/08/27 13:53:04 waba Exp $
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   // KConfigBackEnd will try to locate the filename that is provided
00043   // based on the resource type specified, _only_ if the filename
00044   // is not an absolute path.
00045   backEnd->changeFileName(fileName, resType, false);
00046   setReadOnly(bReadOnly);
00047   reparseConfiguration();
00048   setDesktopGroup();
00049 }
00050 
00051 KDesktopFile::~KDesktopFile()
00052 {
00053   // no need to do anything
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; // Empty paths are not ok.
00075   
00076   if (path[0] != '/')
00077      return true; // Relative paths are ok.
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     // in this case, we do some magic. :)
00132     QCString fstabFile;
00133     int indexDevice = 0;  // device on first column
00134     int indexMountPoint = 1; // mount point on second column
00135     int indexFSType = 2; // fstype on third column
00136     if (QFile::exists(QString::fromLatin1("/etc/fstab"))) { // Linux, ...
00137         fstabFile = "/etc/fstab";
00138     } else if (QFile::exists(QString::fromLatin1("/etc/vfstab"))) { // Solaris
00139         fstabFile = "/etc/vfstab";
00140         indexMountPoint++;
00141         indexFSType++;
00142     }
00143     // insert your favorite location for fstab here
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] == '/') { // skip comments but also
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             // Handle absolute paths as such (i.e. we need to escape them)
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   // Test for TryExec and "X-KDE-AuthorizeAction" 
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       // !!! Sergey A. Sukiyazov <corwin@micom.don.ru> !!!
00223       // Environment PATH may contain filenames in 8bit locale cpecified
00224       // encoding (Like a filenames).
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       // didn't match at all
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   // See also KService::username()
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 
KDE Logo
This file is part of the documentation for kdelibs Version 3.1.4.
Documentation copyright © 1996-2002 the KDE developers.
Generated on Sun Feb 27 22:14:46 2005 by doxygen 1.3.4 written by Dimitri van Heesch, © 1997-2001