⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 krquery.cpp

📁 LINUX 下, 以 QT/KDE 写的档案管理员
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/***************************************************************************                                 krquery.cpp                             -------------------    copyright            : (C) 2001 by Shie Erlich & Rafi Yanai    email                : krusader@users.sourceforge.net    web site             : http://krusader.sourceforge.net ---------------------------------------------------------------------------  Description ***************************************************************************  A     db   dD d8888b. db    db .d8888.  .d8b.  d8888b. d88888b d8888b.     88 ,8P' 88  `8D 88    88 88'  YP d8' `8b 88  `8D 88'     88  `8D     88,8P   88oobY' 88    88 `8bo.   88ooo88 88   88 88ooooo 88oobY'     88`8b   88`8b   88    88   `Y8b. 88~~~88 88   88 88~~~~~ 88`8b     88 `88. 88 `88. 88b  d88 db   8D 88   88 88  .8D 88.     88 `88.     YP   YD 88   YD ~Y8888P' `8888Y' YP   YP Y8888D' Y88888P 88   YD                                                     S o u r c e    F i l e *************************************************************************** *                                                                         * *   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.                                   * *                                                                         * ***************************************************************************/#include "krquery.h"#include "../krusader.h"#include "../resources.h"#include "vfs.h"#include "krarchandler.h"#include "krpermhandler.h"#include <qtextstream.h>#include <qtextcodec.h>#include <qregexp.h>#include <klargefile.h>#include <klocale.h>#include <kmimetype.h>#include <qfile.h>#include <kurlcompletion.h>#include <kio/job.h>#include <kfileitem.h>#define  STATUS_SEND_DELAY     250#define  MAX_LINE_LEN          500// set the defaultsKRQuery::KRQuery(): QObject(), matchesCaseSensitive(true), bNull( true ),                    contain(QString::null),containCaseSensetive(true),                    containWholeWord(false),containOnRemote(false),                    minSize(0),maxSize(0),newerThen(0),olderThen(0),                    owner(QString::null),group(QString::null),perm(QString::null),                    type(QString::null),inArchive(false),recurse(true),                    followLinksP(true), receivedBuffer( 0 ), processEventsConnected(0)  {}// set the defaultsKRQuery::KRQuery( const QString &name, bool matchCase ) : QObject(),                    bNull( true ),contain(QString::null),containCaseSensetive(true),                    containWholeWord(false), containOnRemote(false),                    minSize(0),maxSize(0),newerThen(0),olderThen(0),                    owner(QString::null),group(QString::null),perm(QString::null),                    type(QString::null),inArchive(false),recurse(true),                    followLinksP(true), receivedBuffer( 0 ), processEventsConnected(0) {  setNameFilter( name, matchCase );}KRQuery::KRQuery( const KRQuery & that ) : QObject(), receivedBuffer( 0 ), processEventsConnected(0) {  *this = that;}KRQuery::~KRQuery() {  if( receivedBuffer )    delete []receivedBuffer;  receivedBuffer = 0;}KRQuery& KRQuery::operator=(const KRQuery &old) {  matches = old.matches;  excludes = old.excludes;  includedDirs = old.includedDirs;  excludedDirs = old.excludedDirs;  matchesCaseSensitive = old.matchesCaseSensitive;  bNull = old.bNull;  contain = old.contain;  containCaseSensetive = old.containCaseSensetive;  containWholeWord = old.containWholeWord;  containOnRemote = old.containOnRemote;  minSize = old.minSize;  maxSize = old.maxSize;  newerThen = old.newerThen;  olderThen = old.olderThen;  owner = old.owner;  group = old.group;  perm = old.perm;  type = old.type;  customType = old.customType;  inArchive = old.inArchive;  recurse = old.recurse;  followLinksP = old.followLinksP;  whereToSearch = old.whereToSearch;  whereNotToSearch = old.whereNotToSearch;  origFilter = old.origFilter;    return *this;}void KRQuery::connectNotify ( const char * signal ) {  QString signalString  = QString( signal ).replace( " ", "" );  QString processString = QString( SIGNAL( processEvents( bool & ) ) ).replace( " ", "" );  if( signalString == processString )    processEventsConnected++;}void KRQuery::disconnectNotify ( const char * signal ) {  QString signalString  = QString( signal ).replace( " ", "" );  QString processString = QString( SIGNAL( processEvents( bool & ) ) ).replace( " ", "" );  if( signalString == processString )    processEventsConnected--;}bool KRQuery::checkPerm( QString filePerm ) const{  for ( int i = 0; i < 9; ++i )    if ( perm[ i ] != '?' && perm[ i ] != filePerm[ i + 1 ] ) return false;  return true;}bool KRQuery::checkType( QString mime ) const{  if ( type == mime ) return true;  if ( type == i18n( "Archives" ) ) return KRarcHandler::arcSupported( mime.right( 4 ) );  if ( type == i18n( "Directories" ) ) return mime.contains( "directory" );  if ( type == i18n( "Image Files" ) ) return mime.contains( "image/" );  if ( type == i18n( "Text Files" ) ) return mime.contains( "text/" );  if ( type == i18n( "Video Files" ) ) return mime.contains( "video/" );  if ( type == i18n( "Audio Files" ) ) return mime.contains( "audio/" );  if ( type == i18n( "Custom" ) ) return customType.contains( mime );  return false;}bool KRQuery::match( const QString & name ) const {  return matchCommon( name, matches, excludes );}bool KRQuery::matchDirName( const QString & name ) const {  return matchCommon( name, includedDirs, excludedDirs );}bool KRQuery::matchCommon( const QString &nameIn, const QStringList &matchList, const QStringList &excludeList ) const{  if( excludeList.count() == 0 && matchList.count() == 0 ) /* true if there's no match condition */    return true;  QString name( nameIn );  int ndx = nameIn.findRev( '/' ); // virtual filenames may contain '/'  if( ndx != -1 )                  // but the end of the filename is OK    name = nameIn.mid( ndx + 1 );  unsigned int len;  for ( unsigned int i = 0; i < excludeList.count(); ++i )  {    QRegExp( *excludeList.at( i ), matchesCaseSensitive, true ).match( name, 0, ( int* ) & len );    if ( len == name.length() ) return false;  }  if( matchList.count() == 0 )    return true;  for ( unsigned int i = 0; i < matchList.count(); ++i )  {    QRegExp( *matchList.at( i ), matchesCaseSensitive, true ).match( name, 0, ( int* ) & len );    if ( len == name.length() ) return true;  }  return false;}bool KRQuery::match( vfile *vf ) const{  if( vf->vfile_isDir() && !matchDirName( vf->vfile_getName() ) ) return false;  // see if the name matches  if ( !match( vf->vfile_getName() ) ) return false;  // checking the mime  if( !type.isEmpty() && !checkType( vf->vfile_getMime( true ) ) ) return false;  // check that the size fit  KIO::filesize_t size = vf->vfile_getSize();  if ( minSize && size < minSize ) return false;  if ( maxSize && size > maxSize ) return false;  // check the time frame  time_t mtime = vf->vfile_getTime_t();  if ( olderThen && mtime > olderThen ) return false;  if ( newerThen && mtime < newerThen ) return false;  // check owner name  if ( !owner.isEmpty() && vf->vfile_getOwner() != owner ) return false;  // check group name  if ( !group.isEmpty() && vf->vfile_getGroup() != group ) return false;  //check permission  if ( !perm.isEmpty() && !checkPerm( vf->vfile_getPerm() ) ) return false;  if ( !contain.isEmpty() )  {    if( (totalBytes = vf->vfile_getSize()) == 0 )      totalBytes++; // sanity    receivedBytes = 0;    if( receivedBuffer ) {      delete []receivedBuffer;      receivedBuffer = 0;    }    fileName = vf->vfile_getName();    timer.start();    if( vf->vfile_getUrl().isLocalFile() )    {      if( !containsContent( vf->vfile_getUrl().path() ) ) return false;    }    else    {      if( containOnRemote ) {        if( processEventsConnected == 0 ) return false;        if( !containsContent( vf->vfile_getUrl() ) ) return false;      }    }  }  return true;}bool KRQuery::match( KFileItem *kfi ) const {  mode_t mode = kfi->mode() | kfi->permissions();  QString perm = KRpermHandler::mode2QString( mode );  if ( kfi->isDir() )     perm[ 0 ] = 'd';  vfile temp( kfi->text(), kfi->size(), perm, kfi->time( KIO::UDS_MODIFICATION_TIME ),              kfi->isLink(), kfi->user(), kfi->group(), kfi->user(),               kfi->mimetype(), kfi->linkDest(), mode );  return match( &temp );}// takes the string and adds BOLD to it, so that when it is displayed,// the grepped text will be boldvoid fixFoundTextForDisplay(QString& haystack, int start, int length) {  QString before = haystack.left( start );  QString text = haystack.mid( start, length );  QString after = haystack.mid( start + length );  before.replace( '&', "&amp;" );  before.replace( '<', "&lt;" );  before.replace( '>', "&gt;" );  text.replace( '&', "&amp;" );  text.replace( '<', "&lt;" );  text.replace( '>', "&gt;" );  after.replace( '&', "&amp;" );  after.replace( '<', "&lt;" );  after.replace( '>', "&gt;" );  haystack = ("<qt>"+before+"<b>"+text+"</b>"+after+"</qt>" );}bool KRQuery::checkBuffer( const char *buf, int len ) const {  if( len == 0 )  { // last block?    if( receivedBuffer ) {      bool result = checkLines( receivedBuffer, receivedBufferLen );      delete []receivedBuffer;      receivedBuffer = 0;      return result;    }    return false;  }  int after = len;  while( buf[ after-1 ] != '\n' && buf[ after-1 ] != 0 ) {    after--;    if( after <= 0 || after <= len - MAX_LINE_LEN ) {      after = len;  // if there's no <ENTER> in MAX_LINE_LEN, we break the line      break;        // breaking the line causes problems at Unicode characters    }  }  if( receivedBuffer ) {    int previous = 0;    while( previous < after && previous < MAX_LINE_LEN && buf[previous] != '\n' && buf[previous] != 0 )      previous++;    char * str = new char[ receivedBufferLen + previous ];    memcpy( str, receivedBuffer, receivedBufferLen );    delete []receivedBuffer;    receivedBuffer = 0;    memcpy( str + receivedBufferLen, buf, previous );    if( checkLines( str, receivedBufferLen+previous ) ) {      delete []str;      return true;    }    delete []str;    if( after > previous && checkLines( buf+previous, after-previous ) )      return true;   } else if( checkLines( buf, after ) )      return true;  if( after < len ) {    receivedBufferLen = len-after;    receivedBuffer = new char [ receivedBufferLen ];    memcpy( receivedBuffer, buf+after, receivedBufferLen );  }  return false;}bool KRQuery::checkLines( const char * buf, int len ) const{  QStringList list;  int start = 0;  int k = 0;  while( k < len )  {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -