diff options
Diffstat (limited to 'kfilereplace/kfilereplacelib.cpp')
| -rw-r--r-- | kfilereplace/kfilereplacelib.cpp | 381 | 
1 files changed, 381 insertions, 0 deletions
| diff --git a/kfilereplace/kfilereplacelib.cpp b/kfilereplace/kfilereplacelib.cpp new file mode 100644 index 00000000..e57a3a84 --- /dev/null +++ b/kfilereplace/kfilereplacelib.cpp @@ -0,0 +1,381 @@ +/*************************************************************************** +                           kfilereplacelib.cpp  -  File library +                                      ------------------- +    begin                : lun mai  3 20:19:52 CEST 1999 + +    copyright            : (C) 1999 by Franç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 <qstringlist.h> +#include <qwidget.h> +#include <qlistview.h> +#include <qfileinfo.h> + +//KDE +#include <kdebug.h> +#include <kmessagebox.h> +#include <klistview.h> +#include <kiconloader.h> + +//needed for malloc/free +#include <stdlib.h> + +// local +#include "kfilereplacelib.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 "/") +*/ +QString KFileReplaceLib::formatFullPath(const QString& basePath, const QString &fileName) +{ +  QString fullPath = basePath; +  QString 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 +*/ +QString KFileReplaceLib::addExtension(const QString& fileName, const QString& extension) +{ +  QString fullExtension = "."; +  QString 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; +} + +QString KFileReplaceLib::formatFileSize(double size) +{ +  QString 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(QString::number(d,'f',2)); +    } +  else +  if(size >= mega && size < giga) +    { +      double d = size / mega; +      stringSize = i18n("%1 MB").arg(QString::number(d,'f',2)); +    } +  else +  if(size >= giga) +    { +      double d = size / giga; +      stringSize =  i18n("%1 GB").arg(QString::number(d,'f',2)); +    } +  return stringSize; +} + +void KFileReplaceLib::convertOldToNewKFRFormat(const QString& fileName, KListView* stringView) +{ + //this method convert old format in new XML-based format + typedef struct + { +   char pgm[13]; // Must be "KFileReplace" : 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); + QString pgm(head.pgm); + + if(!f || (err != 1) || (pgm != "KFileReplace")) + { +   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; +  QStringList 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 +                        { +                          QListViewItem* lvi = new QListViewItem(stringView); +                          lvi->setText(0,oldString); +                          lvi->setText(1,newString); + +                          if(newString) +                            free(newString); +                          if(oldString) +                            free(oldString); +                        } +                    } +                } +            } +        } +    } +    fclose(f); +    return ; + } + +bool KFileReplaceLib::isAnAccessibleFile(const QString& filePath, const QString& fileName, RCOptions* info) +{ +  QString bkExt = info->m_backupExtension; +  if(fileName == ".." || fileName == "." || (!bkExt.isEmpty() && fileName.right(bkExt.length()) == bkExt)) +    return false; + +  QFileInfo 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; +   QString minDate = info->m_minDate, +           maxDate = info->m_maxDate, +           dateAccess = info->m_dateAccess; + +  // Avoid files that not match access date requirements +  QString 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) +    { +      QString fileOwnerUser; +      if(info->m_ownerUserType == "Name") +        fileOwnerUser = fi.owner(); +      else +        fileOwnerUser = QString::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) +    { +      QString fileOwnerGroup; +      if(info->m_ownerGroupType == "Name") +        fileOwnerGroup = fi.group(); +      else +        fileOwnerGroup = QString::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 KFileReplaceLib::setIconForFileEntry(QListViewItem* item, QString path) +{ +  QFileInfo fi(path); +  QString extension = fi.extension(), +          baseName = fi.baseName(); + +  KeyValueMap extensionMap; + +  extensionMap["a"] = "binary"; +  extensionMap["am"] = "shellscript"; +  extensionMap["bz"] = "zip"; +  extensionMap["bz2"] = "zip"; +  extensionMap["c"] = "source_c"; +  extensionMap["cc"] = "source_cpp"; +  extensionMap["cpp"] = "source_cpp"; +  extensionMap["eml"] = "message"; +  extensionMap["exe"] = "exec_wine"; +  extensionMap["gz"] = "zip"; +  extensionMap["h"] = "source_h"; +  extensionMap["htm"] = "html"; +  extensionMap["html"] = "html"; +  extensionMap["in"] = "shellscript"; +  extensionMap["java"] = "source_java"; +  extensionMap["jpg"] = "image"; +  extensionMap["kfr"] = "html"; +  extensionMap["kmdr"] = "widget_doc"; +  extensionMap["kwd"] = "kword_kwd"; +  extensionMap["log"] = "log"; +  extensionMap["moc"] = "source_moc"; +  extensionMap["mp3"] = "sound"; +  extensionMap["o"] = "source_o"; +  extensionMap["pdf"] = "pdf"; +  extensionMap["php"] = "source_php"; +  extensionMap["py"] = "source_py"; +  extensionMap["pl"] = "source_pl"; +  extensionMap["p"] = "source_p"; +  extensionMap["ps"] = "postscript"; +  extensionMap["png"] = "image"; +  extensionMap["sa"] = "binary"; +  extensionMap["sh"] = "shellscript"; +  extensionMap["so"] = "binary"; +  extensionMap["tar"] = "tar"; +  extensionMap["tex"] = "tex"; +  extensionMap["tgz"] = "tgz"; +  extensionMap["txt"] = "txt"; +  extensionMap["ui"] = "widget_doc"; +  extensionMap["uml"] = "umbrellofile"; +  extensionMap["wav"] = "sound"; +  extensionMap["xml"] = "html"; +  extensionMap["xpm"] = "image"; + +  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"] = "shellscript"; +  baseNameMap["core"] = "core"; +  baseNameMap["makefile"] = "make"; +  baseNameMap["readme"] = "readme"; +  baseNameMap["README"] = "readme"; +  baseNameMap["Readme"] = "readme"; +  baseNameMap["TODO"] = "txt"; + +  KeyValueMap::Iterator itBaseNameMap; + +  for(itBaseNameMap = baseNameMap.begin(); itBaseNameMap != baseNameMap.end(); ++itBaseNameMap) +    { +      if(baseName == itBaseNameMap.key()) +        { +          item->setPixmap(0,SmallIcon(itBaseNameMap.data())); +          return; +        } +    } +} | 
