From c1b28a61b6e1a44ac0fe2b492ee42a60f486a5d9 Mon Sep 17 00:00:00 2001 From: tpearson Date: Tue, 4 May 2010 07:47:47 +0000 Subject: [PATCH] Fixed random filter bar crashes (some of bug 180, not all of it yet unfortunately...) git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/kdelibs@1122569 283d02a7-25f6-0310-bc7c-ecb5cbfe19da --- kdecore/kconfigbackend.cpp | 2 +- kdeui/kiconviewsearchline.cpp | 20 ++++++++++++++------ kio/kio/kfileitem.cpp | 15 +++++++++++++++ 3 files changed, 30 insertions(+), 7 deletions(-) diff --git a/kdecore/kconfigbackend.cpp b/kdecore/kconfigbackend.cpp index 153b9aa1a..2d2672282 100644 --- a/kdecore/kconfigbackend.cpp +++ b/kdecore/kconfigbackend.cpp @@ -461,7 +461,7 @@ void KConfigINIBackEnd::parseSingleConfigFile(QFile &rFile, QCString aCurrentGroup(""); - unsigned int ll = localeString.length(); + static unsigned int ll = localeString.length(); #ifdef HAVE_MMAP static volatile const char *map; diff --git a/kdeui/kiconviewsearchline.cpp b/kdeui/kiconviewsearchline.cpp index b0f26c03d..0ba5f78f7 100644 --- a/kdeui/kiconviewsearchline.cpp +++ b/kdeui/kiconviewsearchline.cpp @@ -41,6 +41,7 @@ public: iconView( 0 ), caseSensitive( DEFAULT_CASESENSITIVE ), activeSearch( false ), + hiddenItemsLockout( false ), queuedSearches( 0 ) {} QIconView *iconView; @@ -48,6 +49,7 @@ public: bool activeSearch; QString search; int queuedSearches; + bool hiddenItemsLockout; QIconViewItemList hiddenItems; }; @@ -97,8 +99,6 @@ void KIconViewSearchLine::updateSearch( const QString &s ) QString search = d->search = s.isNull() ? text() : s; - QIconViewItemList *hi = &(d->hiddenItems); - QIconViewItem *currentItem = iv->currentItem(); QIconViewItem *item = NULL; @@ -119,14 +119,16 @@ void KIconViewSearchLine::updateSearch( const QString &s ) } // Add Matching items, remove from hidden list - QIconViewItemList::iterator it = hi->begin(); - while ( it != hi->end() ) + d->hiddenItemsLockout = true; + QIconViewItemList::iterator it = d->hiddenItems.begin(); + while ( it != d->hiddenItems.end() ) { item = *it; ++it; if ( itemMatches( item, search ) ) showItem( item ); } + d->hiddenItemsLockout = false; iv->sort(); @@ -138,6 +140,7 @@ void KIconViewSearchLine::clear() { // Clear hidden list, give items back to QIconView, if it still exists QIconViewItem *item = NULL; + d->hiddenItemsLockout = true; QIconViewItemList::iterator it = d->hiddenItems.begin(); while ( it != d->hiddenItems.end() ) { @@ -156,6 +159,8 @@ void KIconViewSearchLine::clear() "hiddenItems is not empty as it should be. " << d->hiddenItems.count() << " items are still there.\n" << endl; + d->hiddenItemsLockout= false; + d->search = ""; d->queuedSearches = 0; KLineEdit::clear(); @@ -196,7 +201,8 @@ bool KIconViewSearchLine::itemMatches( const QIconViewItem *item, if ( item == NULL ) return false; - return ( item->text().find( s, 0, caseSensitive() ) >= 0 ); + QString itemtext = item->text(); + return ( itemtext.find( s, 0, caseSensitive() ) >= 0 ); } void KIconViewSearchLine::init( QIconView *iconView ) @@ -238,7 +244,9 @@ void KIconViewSearchLine::showItem( QIconViewItem *item ) return; } d->iconView->insertItem( item ); - d->hiddenItems.remove( item ); + if (d->hiddenItemsLockout == false) { + d->hiddenItems.remove( item ); + } } /****************************************************************************** diff --git a/kio/kio/kfileitem.cpp b/kio/kio/kfileitem.cpp index a6900d7ad..d06b9b083 100644 --- a/kio/kio/kfileitem.cpp +++ b/kio/kio/kfileitem.cpp @@ -191,6 +191,8 @@ void KFileItem::readUDSEntry( bool _urlIsDirectory ) // extract the mode and the filename from the KIO::UDS Entry bool UDS_URL_seen = false; + if (&m_entry == NULL) return; + KIO::UDSEntry::ConstIterator it = m_entry.begin(); for( ; it != m_entry.end(); ++it ) { switch ((*it).m_uds) { @@ -295,6 +297,8 @@ void KFileItem::setName( const QString& name ) QString KFileItem::linkDest() const { + if (&m_entry == NULL) return QString::null; + // Extract it from the KIO::UDSEntry KIO::UDSEntry::ConstIterator it = m_entry.begin(); for( ; it != m_entry.end(); ++it ) @@ -322,6 +326,8 @@ QString KFileItem::localPath() const } else { + if (&m_entry == NULL) return QString::null; + // Extract the local path from the KIO::UDSEntry KIO::UDSEntry::ConstIterator it = m_entry.begin(); const KIO::UDSEntry::ConstIterator end = m_entry.end(); @@ -339,6 +345,8 @@ KIO::filesize_t KFileItem::size(bool &exists) const if ( m_size != (KIO::filesize_t) -1 ) return m_size; + if (&m_entry == NULL) return 0L; + // Extract it from the KIO::UDSEntry KIO::UDSEntry::ConstIterator it = m_entry.begin(); for( ; it != m_entry.end(); ++it ) @@ -359,6 +367,7 @@ KIO::filesize_t KFileItem::size(bool &exists) const bool KFileItem::hasExtendedACL() const { + if (&m_entry == NULL) return false; KIO::UDSEntry::ConstIterator it = m_entry.begin(); for( ; it != m_entry.end(); it++ ) if ( (*it).m_uds == KIO::UDS_EXTENDED_ACL ) { @@ -370,6 +379,8 @@ bool KFileItem::hasExtendedACL() const KACL KFileItem::ACL() const { if ( hasExtendedACL() ) { + if (&m_entry == NULL) return KACL( m_permissions ); + // Extract it from the KIO::UDSEntry KIO::UDSEntry::ConstIterator it = m_entry.begin(); for( ; it != m_entry.end(); ++it ) @@ -382,6 +393,8 @@ KACL KFileItem::ACL() const KACL KFileItem::defaultACL() const { + if (&m_entry == NULL) return KACL(); + // Extract it from the KIO::UDSEntry KIO::UDSEntry::ConstIterator it = m_entry.begin(); for( ; it != m_entry.end(); ++it ) @@ -421,6 +434,8 @@ time_t KFileItem::time( unsigned int which, bool &hasTime ) const if ( m_time[mappedWhich] != (time_t) -1 ) return m_time[mappedWhich]; + if (&m_entry == NULL) return static_cast(0); + // Extract it from the KIO::UDSEntry KIO::UDSEntry::ConstIterator it = m_entry.begin(); for( ; it != m_entry.end(); ++it )