From 18282e0de3c70d9f8c19c1c99024db34d0cbe3bd Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sat, 28 Feb 2009 17:08:33 +0100 Subject: [PATCH] Made UnifiedResourcesProvider actually pull ResourceItem's from its merged databases into its own database (and also keep them up to date). Furthermore added code to properly destroy merged databases and their providers in desctrutor. --- include/resources_db.h | 7 ++- include/unified_resources_provider.h | 19 ++++--- src/core/unified_resources_provider.cpp | 67 +++++++++++++++++++++++-- 3 files changed, 82 insertions(+), 11 deletions(-) diff --git a/include/resources_db.h b/include/resources_db.h index 556238511..cfb94797a 100644 --- a/include/resources_db.h +++ b/include/resources_db.h @@ -48,7 +48,7 @@ public: void load( const QString & _file ); void save( const QString & _file ); - ResourcesProvider * provider( void ) + inline ResourcesProvider * provider( void ) { return m_provider; } @@ -58,6 +58,11 @@ public: return m_items; } + inline ItemList & items( void ) + { + return m_items; + } + inline ResourcesTreeItem * topLevelNode( void ) { return &m_topLevelNode; diff --git a/include/unified_resources_provider.h b/include/unified_resources_provider.h index cddc8b02f..14fbac4f0 100644 --- a/include/unified_resources_provider.h +++ b/include/unified_resources_provider.h @@ -34,9 +34,7 @@ class UnifiedResourcesProvider : public ResourcesProvider Q_OBJECT public: UnifiedResourcesProvider(); - virtual ~UnifiedResourcesProvider() - { - } + virtual ~UnifiedResourcesProvider(); void addDatabase( ResourcesDB * _db ); @@ -46,6 +44,7 @@ public: } virtual void updateDatabase( void ); + virtual int dataSize( const ResourcesItem * _item ) const { if( _item->provider() != this ) @@ -54,6 +53,7 @@ public: } return 0; } + virtual QByteArray fetchData( const ResourcesItem * _item, int _maxSize = -1 ) const { @@ -64,14 +64,19 @@ public: return QByteArray(); } + virtual bool cacheDatabase( void ) const + { + return false; + } + + +private slots: + void remergeItems( void ); + private: QList m_mergedDatabases; - -signals: - void itemsChanged( void ); - } ; diff --git a/src/core/unified_resources_provider.cpp b/src/core/unified_resources_provider.cpp index 04492aba4..1028d09fd 100644 --- a/src/core/unified_resources_provider.cpp +++ b/src/core/unified_resources_provider.cpp @@ -23,8 +23,6 @@ */ -#include - #include "unified_resources_provider.h" #include "resources_db.h" @@ -38,6 +36,19 @@ UnifiedResourcesProvider::UnifiedResourcesProvider() : +UnifiedResourcesProvider::~UnifiedResourcesProvider() +{ + database()->items().clear(); + + foreach( ResourcesDB * db, m_mergedDatabases ) + { + delete db->provider(); + } +} + + + + void UnifiedResourcesProvider::addDatabase( ResourcesDB * _db ) { ResourcesTreeItem * childRoot = _db->topLevelNode()->getChild( 0 ); @@ -45,7 +56,9 @@ void UnifiedResourcesProvider::addDatabase( ResourcesDB * _db ) { m_mergedDatabases << _db; connect( _db, SIGNAL( itemsChanged() ), - this, SIGNAL( itemsChanged() ) ); + database(), SIGNAL( itemsChanged() ) ); + connect( _db, SIGNAL( itemsChanged() ), + this, SLOT( remergeItems() ) ); childRoot->setParent( database()->topLevelNode() ); database()->topLevelNode()->addChild( childRoot ); @@ -66,6 +79,54 @@ void UnifiedResourcesProvider::updateDatabase( void ) +void UnifiedResourcesProvider::remergeItems( void ) +{ + typedef QHash PointerHashMap; + PointerHashMap itemsSeen; + + ResourcesDB::ItemList & items = database()->items(); + for( ResourcesDB::ItemList::Iterator it = items.begin(); + it != items.end(); ++it ) + { + itemsSeen[*it] = *it; + } + + foreach( ResourcesDB * db, m_mergedDatabases ) + { + for( ResourcesDB::ItemList::ConstIterator it = + db->items().begin(); + it != db->items().end(); ++it ) + { + const QString & h = (*it)->hash(); + if( !items.contains( h ) ) + { + items[(*it)->hash()] = *it; + } + else + { + itemsSeen[*it] = NULL; + } + } + } + + for( ResourcesDB::ItemList::Iterator it = items.begin(); + it != items.end(); ) + { + if( itemsSeen[*it] == *it ) + { + it = items.erase( it ); + } + else + { + ++it; + } + } +} + + + + #include "moc_unified_resources_provider.cxx"