You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdebase/kappfinder/common.cpp

159 lines
4.4 KiB

/*
KAppfinder, the KDE application finder
Copyright (c) 2002-2003 Tobias Koenig <tokoe@kde.org>
Based on code written by Matthias Hoelzer-Kluepfel <hoelzer@kde.org>
This program is free software; you can redistribute it and/or
modify it under the terms of version 2 of the GNU General Public
License as published by the Free Software Foundation.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#include <kdebug.h>
#include <kdesktopfile.h>
#include <kglobal.h>
#include <kstandarddirs.h>
#include <tqdir.h>
#include <tqfile.h>
#include <stdlib.h>
#include "common.h"
#define DBG_CODE 1213
void copyFile( const TQString &inFileName, const TQString &outFileName )
{
TQFile inFile( inFileName );
if ( inFile.open( IO_ReadOnly ) ) {
TQFile outFile( outFileName );
if ( outFile.open( IO_WriteOnly ) ) {
outFile.writeBlock( inFile.readAll() );
outFile.close();
}
inFile.close();
}
}
bool scanDesktopFile( TQPtrList<AppLnkCache> &appCache, const TQString &templ,
TQString destDir )
{
KDesktopFile desktop( templ, true );
// find out where to put the .desktop files
TQString destName;
if ( destDir.isNull() )
destDir = KGlobal::dirs()->saveLocation( "apps" );
else
destDir += "/";
// find out the name of the file to store
destName = templ;
int pos = templ.find( "kappfinder/apps/" );
if ( pos > 0 )
destName = destName.mid( pos + strlen( "kappfinder/apps/" ) );
// calculate real dir and filename
destName = destDir + destName;
pos = destName.findRev( '/' );
if ( pos > 0 ) {
destDir = destName.left( pos );
destName = destName.mid( pos + 1 );
}
// determine for which executable to look
TQString exec = desktop.readPathEntry( "TryExec" );
if ( exec.isEmpty() )
exec = desktop.readPathEntry( "Exec" );
pos = exec.find( ' ' );
if ( pos > 0 )
exec = exec.left( pos );
// try to locate the binary
TQString pexec = KGlobal::dirs()->findExe( exec,
TQString( ::getenv( "PATH" ) ) + ":/usr/X11R6/bin:/usr/games" );
if ( pexec.isEmpty() ) {
kdDebug(DBG_CODE) << "looking for " << exec.local8Bit()
<< "\t\tnot found" << endl;
return false;
}
AppLnkCache *cache = new AppLnkCache;
cache->destDir = destDir;
cache->destName = destName;
cache->templ = templ;
cache->item = 0;
appCache.append( cache );
kdDebug(DBG_CODE) << "looking for " << exec.local8Bit()
<< "\t\tfound" << endl;
return true;
}
void createDesktopFiles( TQPtrList<AppLnkCache> &appCache, int &added )
{
AppLnkCache* cache;
for ( cache = appCache.first(); cache; cache = appCache.next() ) {
if ( cache->item == 0 || ( cache->item && cache->item->isOn() ) ) {
added++;
TQString destDir = cache->destDir;
TQString destName = cache->destName;
TQString templ = cache->templ;
destDir += "/";
TQDir d;
int pos = -1;
while ( ( pos = destDir.find( '/', pos + 1 ) ) >= 0 ) {
TQString path = destDir.left( pos + 1 );
d = path;
if ( !d.exists() )
d.mkdir( path );
}
// write out the desktop file
copyFile( templ, destDir + "/" + destName );
}
}
}
void decorateDirs( TQString destDir )
{
// find out where to put the .directory files
if ( destDir.isNull() )
destDir = KGlobal::dirs()->saveLocation( "apps" );
else
destDir += "/";
TQStringList dirs = KGlobal::dirs()->findAllResources( "data", "kappfinder/apps/*.directory", true );
TQStringList::Iterator it;
for ( it = dirs.begin(); it != dirs.end(); ++it ) {
// find out the name of the file to store
TQString destName = *it;
int pos = destName.find( "kappfinder/apps/" );
if ( pos > 0 )
destName = destName.mid( pos + strlen( "kappfinder/apps/" ) );
destName = destDir + "/" + destName;
if ( !TQFile::exists( destName ) ) {
kdDebug(DBG_CODE) << "Copy " << *it << " to " << destName << endl;
copyFile( *it, destName );
}
}
}