/***************************************************************************
tdefilereplacelib . cpp - File library
- - - - - - - - - - - - - - - - - - -
begin : lun mai 3 20 : 19 : 52 CEST 1999
copyright : ( C ) 1999 by Fran <EFBFBD> ois Dupoux
( C ) 2003 Andras Mantia < amantia @ kde . org >
( C ) 2004 Emiliano Gulmini < emi_barbarossa @ yahoo . it >
email : dupoux @ dupoux . com
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/***************************************************************************
* *
* This program is free software ; you can redistribute it and / or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation ; either version 2 of the License , or *
* ( at your option ) any later version . *
* *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
//QT
# include <tqstringlist.h>
# include <tqwidget.h>
# include <tqlistview.h>
# include <tqfileinfo.h>
//KDE
# include <kdebug.h>
# include <tdemessagebox.h>
# include <tdelistview.h>
# include <kiconloader.h>
//needed for malloc/free
# include <stdlib.h>
// local
# include "tdefilereplacelib.h"
const double kilo = 1024.0 ;
const double mega = 1048576.0 ; //1024^2
const double giga = 1073741824.0 ; //1024^3
const double tera = 1099511627776.0 ; //1024^4
/**
Format a path , from a path and a filename , or another sub - path ( avoid double ' / ' risks )
Parameters : : . . . . . * basePath : fist path ( can be " / " if root , or " /usr/bin/ " or " /usr/bin " for example )
. . . . . . . . . . . . . . . . . * fileName : second path ( can be " /doc/html/ " , or " doc/html/ " or " doc/html/index.html " for example )
Return values : . . . * Full valid path ( without double " / " )
*/
TQString TDEFileReplaceLib : : formatFullPath ( const TQString & basePath , const TQString & fileName )
{
TQString fullPath = basePath ;
TQString fname = fileName ;
if ( fname . startsWith ( " / " ) ) // skip beginning '/'
fname = fname . remove ( 0 , 1 ) ;
if ( fullPath . endsWith ( " / " ) )
fullPath . append ( fname ) ;
else
fullPath . append ( " / " + fname ) ;
return fullPath ;
}
/**
Add an extension to a filename , or a filepath
Parameters : : . . . . . * fileName : filename or filepath ( it can have already the extension )
. . . . . . . . . . . . . . . . . * extension : extension to add without " . " ( ex : " html " , " kfr " )
Return values : . . . * Filename / Filepath with the extension
*/
TQString TDEFileReplaceLib : : addExtension ( const TQString & fileName , const TQString & extension )
{
TQString fullExtension = " . " ;
TQString fname = fileName ;
fullExtension . append ( extension ) ;
// filename cannot contain ".ext" ==> Add it
if ( fname . length ( ) < = fullExtension . length ( ) )
fname . append ( fullExtension ) ;
else // filename can contain ".ext"
{
if ( fname . right ( fullExtension . length ( ) ) ! = fullExtension )
fname . append ( fullExtension ) ;
}
return fname ;
}
TQString TDEFileReplaceLib : : formatFileSize ( double size )
{
TQString stringSize ;
if ( size < kilo )
{
const int asInt = ( int ) size ;
stringSize = i18n ( " 1 byte " , " %n bytes " , asInt ) ;
}
else
if ( size > = kilo & & size < mega )
{
double d = size / kilo ;
stringSize = i18n ( " %1 KB " ) . arg ( TQString : : number ( d , ' f ' , 2 ) ) ;
}
else
if ( size > = mega & & size < giga )
{
double d = size / mega ;
stringSize = i18n ( " %1 MB " ) . arg ( TQString : : number ( d , ' f ' , 2 ) ) ;
}
else
if ( size > = giga )
{
double d = size / giga ;
stringSize = i18n ( " %1 GB " ) . arg ( TQString : : number ( d , ' f ' , 2 ) ) ;
}
return stringSize ;
}
void TDEFileReplaceLib : : convertOldToNewKFRFormat ( const TQString & fileName , TDEListView * stringView )
{
//this method convert old format in new XML-based format
typedef struct
{
char pgm [ 13 ] ; // Must be "TDEFileReplace" : like MZ for EXE files
int stringNumber ; // Number of strings in file
char reserved [ 64 ] ; // Reserved for future use
} KFRHeader ;
KFRHeader head ;
FILE * f = fopen ( fileName . ascii ( ) , " rb " ) ;
int err = fread ( & head , sizeof ( KFRHeader ) , 1 , f ) ;
TQString pgm ( head . pgm ) ;
if ( ! f | | ( err ! = 1 ) | | ( pgm ! = " TDEFileReplace " ) )
{
KMessageBox : : error ( 0 , i18n ( " <qt>Cannot open the file <b>%1</b> and load the string list. This file seems not to be a valid old kfr file or it is broken.</qt> " ) . arg ( fileName ) ) ;
return ;
}
stringView - > clear ( ) ;
int oldTextSize ,
newTextSize ,
errors = 0 ,
stringSize ;
TQStringList l ;
int i ;
for ( i = 0 ; i < head . stringNumber ; i + + )
{
errors + = ( fread ( & oldTextSize , sizeof ( int ) , 1 , f ) ) ! = 1 ;
errors + = ( fread ( & newTextSize , sizeof ( int ) , 1 , f ) ) ! = 1 ;
if ( errors > 0 )
KMessageBox : : error ( 0 , i18n ( " Cannot read data. " ) ) ;
else
{
stringSize = ( ( oldTextSize > newTextSize ) ? oldTextSize : newTextSize ) + 2 ;
char * oldString = ( char * ) malloc ( stringSize + 10 ) ,
* newString = ( char * ) malloc ( stringSize + 10 ) ;
memset ( oldString , 0 , stringSize ) ;
memset ( newString , 0 , stringSize ) ;
if ( oldString = = 0 | | newString = = 0 )
KMessageBox : : error ( 0 , i18n ( " Out of memory. " ) ) ;
else
{
if ( fread ( oldString , oldTextSize , 1 , f ) ! = 1 )
KMessageBox : : error ( 0 , i18n ( " Cannot read data. " ) ) ;
else
{
if ( newTextSize > 0 ) // If there is a Replace text
{
if ( fread ( newString , newTextSize , 1 , f ) ! = 1 )
KMessageBox : : error ( 0 , i18n ( " Cannot read data. " ) ) ;
else
{
TQListViewItem * lvi = new TQListViewItem ( stringView ) ;
lvi - > setText ( 0 , oldString ) ;
lvi - > setText ( 1 , newString ) ;
if ( newString )
free ( newString ) ;
if ( oldString )
free ( oldString ) ;
}
}
}
}
}
}
fclose ( f ) ;
return ;
}
bool TDEFileReplaceLib : : isAnAccessibleFile ( const TQString & filePath , const TQString & fileName , RCOptions * info )
{
TQString bkExt = info - > m_backupExtension ;
if ( fileName = = " .. " | | fileName = = " . " | | ( ! bkExt . isEmpty ( ) & & fileName . right ( bkExt . length ( ) ) = = bkExt ) )
return false ;
TQFileInfo fi ;
if ( filePath . isEmpty ( ) )
fi . setFile ( fileName ) ;
else
fi . setFile ( filePath + " / " + fileName ) ;
if ( fi . isDir ( ) )
return true ;
int minSize = info - > m_minSize ,
maxSize = info - > m_maxSize ;
TQString minDate = info - > m_minDate ,
maxDate = info - > m_maxDate ,
dateAccess = info - > m_dateAccess ;
// Avoid files that not match access date requirements
TQString last = " unknown " ;
if ( dateAccess = = " Last Writing Access " )
last = fi . lastModified ( ) . toString ( Qt : : ISODate ) ;
if ( dateAccess = = " Last Reading Access " )
last = fi . lastRead ( ) . toString ( Qt : : ISODate ) ;
if ( last ! = " unknown " )
{
if ( minDate ! = " unknown " & & maxDate ! = " unknown " )
{ //If out of range then exit
if ( ( minDate > last ) | | ( maxDate < last ) )
return false ;
}
else
{
if ( minDate ! = " unknown " )
{ //If out of range then exit
if ( minDate > last )
return false ;
}
else
{
if ( maxDate ! = " unknown " )
//If out of range then exit
if ( maxDate < last )
return false ;
}
}
}
// Avoid files that not match size requirements
int size = fi . size ( ) ;
if ( maxSize ! = FileSizeOption & & minSize ! = FileSizeOption )
if ( size > ( maxSize * 1024 ) | | size < ( minSize * 1024 ) )
return false ;
// Avoid files that not match ownership requirements
if ( info - > m_ownerUserIsChecked )
{
TQString fileOwnerUser ;
if ( info - > m_ownerUserType = = " Name " )
fileOwnerUser = fi . owner ( ) ;
else
fileOwnerUser = TQString : : number ( fi . ownerId ( ) , 10 ) ;
if ( info - > m_ownerUserBool = = " Equals To " )
{
if ( info - > m_ownerUserValue ! = fileOwnerUser )
return false ;
}
else
{
if ( info - > m_ownerUserValue = = fileOwnerUser )
return false ;
}
}
if ( info - > m_ownerGroupIsChecked )
{
TQString fileOwnerGroup ;
if ( info - > m_ownerGroupType = = " Name " )
fileOwnerGroup = fi . group ( ) ;
else
fileOwnerGroup = TQString : : number ( fi . groupId ( ) , 10 ) ;
if ( info - > m_ownerGroupBool = = " Equals To " )
{
if ( info - > m_ownerGroupValue ! = fileOwnerGroup )
return false ;
}
else
{
if ( info - > m_ownerGroupValue = = fileOwnerGroup )
return false ;
}
}
//If we are here then all requirements have been verified
return true ;
}
void TDEFileReplaceLib : : setIconForFileEntry ( TQListViewItem * item , TQString path )
{
TQFileInfo fi ( path ) ;
TQString extension = fi . extension ( ) ,
baseName = fi . baseName ( ) ;
KeyValueMap extensionMap ;
extensionMap [ " a " ] = " application-octet-stream " ;
extensionMap [ " am " ] = " text-x-script " ;
extensionMap [ " bz " ] = " application-vnd.tde.overlay.zip " ;
extensionMap [ " bz2 " ] = " application-vnd.tde.overlay.zip " ;
extensionMap [ " c " ] = " text-x-csrc " ;
extensionMap [ " cc " ] = " text-x-c++src " ;
extensionMap [ " cpp " ] = " text-x-c++src " ;
extensionMap [ " eml " ] = " message " ;
extensionMap [ " exe " ] = " application-x-mswinurl " ;
extensionMap [ " gz " ] = " application-vnd.tde.overlay.zip " ;
extensionMap [ " h " ] = " text-x-hsrc " ;
extensionMap [ " htm " ] = " text-html " ;
extensionMap [ " html " ] = " text-html " ;
extensionMap [ " in " ] = " text-x-script " ;
extensionMap [ " java " ] = " text-x-java " ;
extensionMap [ " jpg " ] = " image-x-generic " ;
extensionMap [ " kfr " ] = " text-html " ;
extensionMap [ " kmdr " ] = " application-x-designer " ;
extensionMap [ " kwd " ] = " x-office-document " ;
extensionMap [ " log " ] = " text-x-log " ;
extensionMap [ " moc " ] = " text-x-mocsrc " ;
extensionMap [ " mp3 " ] = " audio-x-generic " ;
extensionMap [ " o " ] = " text-x-osrc " ;
extensionMap [ " pdf " ] = " application-pdf " ;
extensionMap [ " php " ] = " text-x-php " ;
extensionMap [ " py " ] = " text-x-python " ;
extensionMap [ " pl " ] = " text-x-perl " ;
extensionMap [ " p " ] = " text-x-psrc " ;
extensionMap [ " ps " ] = " application-postscript " ;
extensionMap [ " png " ] = " image-x-generic " ;
extensionMap [ " sa " ] = " application-octet-stream " ;
extensionMap [ " sh " ] = " text-x-script " ;
extensionMap [ " so " ] = " application-octet-stream " ;
extensionMap [ " tar " ] = " application-x-tar " ;
extensionMap [ " tex " ] = " text-x-tex " ;
extensionMap [ " tgz " ] = " application-x-tarz " ;
extensionMap [ " txt " ] = " text-plain " ;
extensionMap [ " ui " ] = " application-x-designer " ;
extensionMap [ " uml " ] = " umbrellofile " ;
extensionMap [ " wav " ] = " audio-x-generic " ;
extensionMap [ " xml " ] = " text-html " ;
extensionMap [ " xpm " ] = " image-x-generic " ;
KeyValueMap : : Iterator itExtensionMap ;
for ( itExtensionMap = extensionMap . begin ( ) ; itExtensionMap ! = extensionMap . end ( ) ; + + itExtensionMap )
{
if ( extension = = itExtensionMap . key ( ) )
{
item - > setPixmap ( 0 , SmallIcon ( itExtensionMap . data ( ) ) ) ;
return ;
}
}
KeyValueMap baseNameMap ;
baseNameMap [ " configure " ] = " text-x-script " ;
baseNameMap [ " core " ] = " application-x-core " ;
baseNameMap [ " makefile " ] = " text-x-makefile " ;
baseNameMap [ " readme " ] = " text-x-readme " ;
baseNameMap [ " README " ] = " text-x-readme " ;
baseNameMap [ " Readme " ] = " text-x-readme " ;
baseNameMap [ " TODO " ] = " text-plain " ;
KeyValueMap : : Iterator itBaseNameMap ;
for ( itBaseNameMap = baseNameMap . begin ( ) ; itBaseNameMap ! = baseNameMap . end ( ) ; + + itBaseNameMap )
{
if ( baseName = = itBaseNameMap . key ( ) )
{
item - > setPixmap ( 0 , SmallIcon ( itBaseNameMap . data ( ) ) ) ;
return ;
}
}
}