|
|
|
/*
|
|
|
|
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 );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|