From a93a40053996fc2e6438504876b9c0fb59fd569b Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Fri, 27 Feb 2009 19:01:51 +0100 Subject: [PATCH] Refactored resources framework to use the new LocalResourcesProvider for scanning local directories and filling its ResourcesDB. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The ResourcesDB is responsible for writing local catalogue files. It automatically loads back the appropriate catalogue file (depending on the provider that operates on the ResourcesDB object) at initialization. Will be useful for WebResourcesProvider as well to cache metadata of online resources. All you have to do now is to create an according ResourcesProvider which will automatically setup a ResourcesDB that can be operated on by the ResourcesTreeModel. --- include/local_resources_provider.h | 34 +++- include/resources_db.h | 32 ++-- include/resources_item.h | 23 ++- include/resources_provider.h | 34 +++- include/web_resources_provider.h | 12 +- src/core/engine.cpp | 9 +- src/core/local_resources_provider.cpp | 264 ++++++++++++++++++++++++++ src/core/resources_db.cpp | 238 ++++------------------- src/core/resources_item.cpp | 39 +--- src/core/resources_provider.cpp | 70 +++++++ 10 files changed, 483 insertions(+), 272 deletions(-) create mode 100644 src/core/local_resources_provider.cpp create mode 100644 src/core/resources_provider.cpp diff --git a/include/local_resources_provider.h b/include/local_resources_provider.h index 6b7352300..88aee3a7b 100644 --- a/include/local_resources_provider.h +++ b/include/local_resources_provider.h @@ -25,24 +25,50 @@ #ifndef _LOCAL_RESOURCES_PROVIDER_H #define _LOCAL_RESOURCES_PROVIDER_H +#include +#include + #include "resources_provider.h" +#include "resources_item.h" class LocalResourcesProvider : public ResourcesProvider { + Q_OBJECT public: - LocalResourcesProvider( const QString & _url, - ResourcesItem::BaseDirectory _baseDir ); + LocalResourcesProvider( ResourcesItem::BaseDirectory _baseDir, + const QString & _dir ); virtual ~LocalResourcesProvider() { } - virtual ResourcesDB * createResourcesDB( void ); - virtual QByteArray fetchData( const ResourcesItem * _item ); + virtual QString providerName( void ) const + { + return "LocalResourcesProvider"; + } + + virtual void updateDatabase( void ); + + virtual int dataSize( const ResourcesItem * _item ) const; + virtual QByteArray fetchData( const ResourcesItem * _item, + int _maxSize = -1 ) const; + + +private slots: + void addDirectory( const QString & _path ); + void removeDirectory( const QString & _path ); + void reloadDirectory( const QString & _path ); private: + void readDir( const QString & _dir, ResourcesTreeItem * _parent ); + ResourcesItem::BaseDirectory m_baseDir; + const QString m_dir; + + QStringList m_scannedFolders; + + QFileSystemWatcher m_watcher; } ; diff --git a/include/resources_db.h b/include/resources_db.h index eca8b32c1..a41a9e9e7 100644 --- a/include/resources_db.h +++ b/include/resources_db.h @@ -26,7 +26,6 @@ #define _RESOURCES_DB_H #include -#include #include #include #include @@ -41,12 +40,13 @@ public: typedef QHash ItemList; - ResourcesDB( const QString & _db_file ); + ResourcesDB( ResourcesProvider * _provider ); ~ResourcesDB(); - void scanResources( void ); - void load( void ); - void save( void ); + void init( void ); + + void load( const QString & _file ); + void save( const QString & _file ); inline const ItemList & items( void ) const { @@ -60,37 +60,27 @@ public: const ResourcesItem * nearestMatch( const ResourcesItem & _item ); + void addItem( ResourcesItem * newItem ); -private slots: - void reloadDirectory( const QString & _path ); - - -private: - void readDir( const QString & _dir, ResourcesTreeItem * _parent, - ResourcesItem::BaseDirectory _base_dir ); - void replaceItem( ResourcesItem * newItem ); void recursiveRemoveItems( ResourcesTreeItem * parent, bool removeTopLevelParent = true ); + +private: void saveTreeItem( const ResourcesTreeItem * _i, QDomDocument & _doc, QDomElement & _de ); void loadTreeItem( ResourcesTreeItem * _i, QDomElement & _de ); - typedef QList > - FolderList; - FolderList m_folders; - QStringList m_scannedFolders; - QFileSystemWatcher m_watcher; - - QString m_dbFile; - + ResourcesProvider * m_provider; ItemList m_items; ResourcesTreeItem m_topLevelNode; signals: void itemsChanged( void ); + void directoryItemAdded( const QString & _path ); + void directoryItemRemoved( const QString & _path ); } ; diff --git a/include/resources_item.h b/include/resources_item.h index 45a941548..46ce6da4e 100644 --- a/include/resources_item.h +++ b/include/resources_item.h @@ -25,11 +25,14 @@ #ifndef _RESOURCES_ITEM_H #define _RESOURCES_ITEM_H +#include #include +#include "resources_provider.h" class ResourcesTreeItem; + class ResourcesItem { public: @@ -59,8 +62,8 @@ public: } ; typedef Types Type; - ResourcesItem(); - ResourcesItem( const QString & _name, + ResourcesItem( ResourcesProvider * _provider, + const QString & _name, Type _type, BaseDirectory _base_dir = BaseWorkingDir, const QString & _path = QString::null, @@ -70,6 +73,11 @@ public: const QDateTime & _last_mod = QDateTime() ); + const ResourcesProvider * provider( void ) const + { + return m_provider; + } + const QString & name( void ) const { return m_name; @@ -154,6 +162,16 @@ public: m_lastMod = _date; } + int realSize( void ) const + { + return m_provider->dataSize( this ); + } + + QByteArray fetchData( int _maxSize = -1 ) const + { + return m_provider->fetchData( this ); + } + void reload( void ); bool operator==( const ResourcesItem & _other ) const; @@ -169,6 +187,7 @@ public: private: void init( void ); + ResourcesProvider * m_provider; QString m_name; int m_nameHash; Type m_type; diff --git a/include/resources_provider.h b/include/resources_provider.h index d8638ef9c..00ebae9d3 100644 --- a/include/resources_provider.h +++ b/include/resources_provider.h @@ -26,31 +26,47 @@ #define _RESOURCES_PROVIDER_H #include - -#include "resources_item.h" +#include +#include class ResourcesDB; +class ResourcesItem; -class ResourcesProvider +class ResourcesProvider : public QObject { + Q_OBJECT public: - ResourcesProvider( const QString & url ) : - m_url( url ) - { - } + ResourcesProvider( const QString & _url ); + virtual ~ResourcesProvider(); - virtual ResourcesDB * createResourcesDB( void ) = 0; - virtual QByteArray fetchData( const ResourcesItem * item ) = 0; + virtual QString providerName( void ) const = 0; + virtual void updateDatabase( void ) = 0; + virtual int dataSize( const ResourcesItem * _item ) const = 0; + virtual QByteArray fetchData( const ResourcesItem * _item, + int _maxSize = -1 ) const = 0; inline const QString & url( void ) const { return m_url; } + QString localCatalogueFile( void ) const; + + ResourcesDB * database( void ) + { + return m_database; + } + private: + ResourcesDB * m_database; QString m_url; + + +signals: + void itemsChanged( void ); + } ; diff --git a/include/web_resources_provider.h b/include/web_resources_provider.h index cae9f47db..0b86bf92a 100644 --- a/include/web_resources_provider.h +++ b/include/web_resources_provider.h @@ -28,18 +28,26 @@ #include #include "resources_provider.h" +#include "resources_item.h" class WebResourcesProvider : public ResourcesProvider { public: - WebResourcesProvider( const QString & url ); + WebResourcesProvider( const QString & _url ); virtual ~WebResourcesProvider() { } virtual ResourcesDB * createResourcesDB( void ); - virtual QByteArray fetchData( const ResourcesItem * item ); + virtual int dataSize( const ResourcesItem * _item ) const + { + // asume that the size we have set before from the web + // catalogue is correct + return _item->size(); + } + virtual QByteArray fetchData( const ResourcesItem * _item, + int _maxSize = -1 ) const; private: diff --git a/src/core/engine.cpp b/src/core/engine.cpp index 2145d99bc..cfeaf9273 100644 --- a/src/core/engine.cpp +++ b/src/core/engine.cpp @@ -35,6 +35,7 @@ #include "fx_mixer.h" #include "fx_mixer_view.h" #include "ladspa_2_lmms.h" +#include "local_resources_provider.h" #include "main_window.h" #include "mixer.h" #include "pattern.h" @@ -81,9 +82,11 @@ void engine::init( const bool _has_gui ) s_projectJournal = new projectJournal; s_mixer = new mixer; s_song = new song; - s_resourcesDB = new ResourcesDB( configManager::inst()->workingDir() + - QDir::separator() + - ".resourcesdb.xml" ); + + LocalResourcesProvider * resProv = + new LocalResourcesProvider( ResourcesItem::BaseWorkingDir, QString() ); + s_resourcesDB = resProv->database(); + s_fxMixer = new fxMixer; s_bbTrackContainer = new bbTrackContainer; diff --git a/src/core/local_resources_provider.cpp b/src/core/local_resources_provider.cpp new file mode 100644 index 000000000..3c6e72ebc --- /dev/null +++ b/src/core/local_resources_provider.cpp @@ -0,0 +1,264 @@ +/* + * local_resources_provider.cpp - implementation of LocalResourcesProvider + * + * Copyright (c) 2009 Tobias Doerffel + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program (see COPYING); if not, write to the + * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301 USA. + * + */ + + +#include + +#include "local_resources_provider.h" +#include "resources_db.h" + + +LocalResourcesProvider::LocalResourcesProvider( + ResourcesItem::BaseDirectory _baseDir, + const QString & _dir ) : + ResourcesProvider( ResourcesItem::getBaseDirectory( _baseDir ) ), + m_baseDir( _baseDir ), + m_dir( _dir ), + m_watcher( this ) +{ + connect( &m_watcher, SIGNAL( directoryChanged( const QString & ) ), + this, SLOT( reloadDirectory( const QString & ) ) ); + + connect( database(), SIGNAL( directoryItemAdded( const QString & ) ), + this, SLOT( addDirectory( const QString & ) ) ); + connect( database(), SIGNAL( directoryItemRemoved( const QString & ) ), + this, SLOT( removeDirectory( const QString & ) ) ); + + database()->init(); +} + + + + +void LocalResourcesProvider::updateDatabase( void ) +{ + readDir( m_dir, database()->topLevelNode() ); +} + + + + +int LocalResourcesProvider::dataSize( const ResourcesItem * _item ) const +{ + return QFileInfo( _item->fullName() ).size(); +} + + + + +QByteArray LocalResourcesProvider::fetchData( const ResourcesItem * _item, + int _maxSize ) const +{ + QFile f( _item->fullName() ); + f.open( QFile::ReadOnly ); + + if( _maxSize == -1 ) + { + return f.readAll(); + } + + return f.read( _maxSize ); +} + + + + +void LocalResourcesProvider::addDirectory( const QString & _path ) +{ + if( QDir( _path ).exists() ) + { + m_watcher.addPath( _path ); + } +} + + + + +void LocalResourcesProvider::removeDirectory( const QString & _path ) +{ + m_watcher.removePath( _path ); +} + + + + +void LocalResourcesProvider::reloadDirectory( const QString & _path ) +{ + ResourcesTreeItem * dirTreeItem = NULL; + + foreach( ResourcesItem * it, database()->items() ) + { + if( it->type() == ResourcesItem::TypeDirectory && + it->fullPath() == _path ) + { + dirTreeItem = it->treeItem(); + } + } + + if( dirTreeItem ) + { + ResourcesItem * dirItem = dirTreeItem->item(); + if( dirItem ) + { + m_scannedFolders.clear(); + readDir( dirItem->path(), dirTreeItem->parent() ); + } + } + + emit itemsChanged(); +} + + + + +void LocalResourcesProvider::readDir( const QString & _dir, + ResourcesTreeItem * _parent ) +{ +#ifdef LMMS_BUILD_LINUX + if( _dir.startsWith( "/dev" ) || + _dir.startsWith( "/sys" ) || + _dir.startsWith( "/proc" ) ) + { + return; + } +#endif + + QDir d( ResourcesItem::getBaseDirectory( m_baseDir ) + _dir ); + m_scannedFolders << d.canonicalPath(); + + ResourcesItem * parentItem; + ResourcesTreeItem * curParent = _parent->findChild( d.dirName() + + QDir::separator(), + m_baseDir ); +printf("read dir: %s\n", d.canonicalPath().toAscii().constData() ); + if( curParent ) + { + parentItem = curParent->item(); + foreachResourcesTreeItem( curParent->children() ) + { + (*it)->setTemporaryMarker( false ); + } + } + else + { + // create new item for current dir + parentItem = new ResourcesItem( this, + d.dirName(), + ResourcesItem::TypeDirectory, + m_baseDir, + _parent->item() ? + _parent->item()->path() + d.dirName() + + QDir::separator() : + QString::null ); + parentItem->setLastMod( QFileInfo( + d.canonicalPath() ).lastModified() ); + database()->addItem( parentItem ); + curParent = new ResourcesTreeItem( _parent, parentItem ); + curParent->setTemporaryMarker( true ); + m_watcher.addPath( parentItem->fullPath() ); + } + + + QFileInfoList list = d.entryInfoList( QDir::NoDotAndDotDot | + QDir::Dirs | QDir::Files | + QDir::Readable, + QDir::Name | QDir::DirsFirst ); + foreach( QFileInfo f, list ) + { + if( f.isSymLink() ) + { + f = QFileInfo( f.symLinkTarget() ); + } + + QString fname = f.fileName(); + if( f.isDir() ) + { + fname += QDir::separator(); + } + ResourcesTreeItem * curChild = + curParent->findChild( fname, m_baseDir ); + if( curChild ) + { + curChild->setTemporaryMarker( true ); + if( f.lastModified() > curChild->item()->lastMod() ) + { + curChild->item()->setLastMod( + f.lastModified() ); + if( curChild->item()->type() == + ResourcesItem::TypeDirectory ) + { + readDir( _dir + fname, curParent ); + } + else + { + curChild->item()->reload(); + } + } + } + else + { + if( f.isDir() && + !m_scannedFolders.contains( + f.canonicalFilePath() ) ) + + { + readDir( _dir + fname, curParent ); + } + else if( f.isFile() ) + { + ResourcesItem * newItem = + new ResourcesItem( this, + f.fileName(), + ResourcesItem::TypeUnknown, + m_baseDir, _dir ); + newItem->setLastMod( f.lastModified() ); + database()->addItem( newItem ); + ResourcesTreeItem * rti = + new ResourcesTreeItem( curParent, + newItem ); + rti->setTemporaryMarker( true ); + } + } + } + + for( ResourcesTreeItemList::Iterator it = curParent->children().begin(); + it != curParent->children().end(); ) + { + if( (*it)->temporaryMarker() == false ) + { + ResourcesTreeItem * item = *it; + it = curParent->children().erase( it ); + database()->recursiveRemoveItems( item ); + } + else + { + ++it; + } + } +} + + + +#include "moc_local_resources_provider.cxx" + diff --git a/src/core/resources_db.cpp b/src/core/resources_db.cpp index dd74d71f2..ffadb4ee5 100644 --- a/src/core/resources_db.cpp +++ b/src/core/resources_db.cpp @@ -23,32 +23,20 @@ */ -#include +#include #include "resources_db.h" -#include "config_mgr.h" -#include "lmms_basics.h" +#include "resources_provider.h" #include "mmp.h" -ResourcesDB::ResourcesDB( const QString & _db_file ) : - m_watcher( this ), - m_dbFile( _db_file ) +ResourcesDB::ResourcesDB( ResourcesProvider * _provider ) : + m_provider( _provider ) { - m_folders += qMakePair( ResourcesItem::BaseDataDir, QString() ); - m_folders += qMakePair( ResourcesItem::BaseWorkingDir, QString() ); + connect( m_provider, SIGNAL( itemsChanged() ), + this, SIGNAL( itemsChanged() ) ); - if( QFile::exists( m_dbFile ) ) - { - load(); - } - // (re-) scan directories - scanResources(); - save(); - - connect( &m_watcher, SIGNAL( directoryChanged( const QString & ) ), - this, SLOT( reloadDirectory( const QString & ) ) ); } @@ -56,17 +44,32 @@ ResourcesDB::ResourcesDB( const QString & _db_file ) : ResourcesDB::~ResourcesDB() { - save(); + save( m_provider->localCatalogueFile() ); } -void ResourcesDB::load( void ) +void ResourcesDB::init( void ) { - m_items.clear(); + if( QFileInfo( m_provider->localCatalogueFile() ).exists() ) + { + load( m_provider->localCatalogueFile() ); + } - multimediaProject m( m_dbFile ); + m_provider->updateDatabase(); + + save( m_provider->localCatalogueFile() ); +} + + + + +void ResourcesDB::load( const QString & _file ) +{ + recursiveRemoveItems( topLevelNode(), false ); + + multimediaProject m( _file ); loadTreeItem( &m_topLevelNode, m.content() ); } @@ -74,12 +77,13 @@ void ResourcesDB::load( void ) -void ResourcesDB::save( void ) +void ResourcesDB::save( const QString & _file ) { multimediaProject m( multimediaProject::ResourcesDatabase ); + saveTreeItem( &m_topLevelNode, m, m.content() ); - m.writeFile( m_dbFile ); + m.writeFile( _file ); } @@ -124,7 +128,8 @@ void ResourcesDB::loadTreeItem( ResourcesTreeItem * _i, QDomElement & _de ) const QString h = e.attribute( "hash" ); if( !h.isEmpty() ) { -ResourcesItem * item = new ResourcesItem( e.attribute( "name" ), +ResourcesItem * item = new ResourcesItem( m_provider, + e.attribute( "name" ), static_cast( e.attribute( "type" ).toInt() ), static_cast( e.attribute( "basedir" ).toInt() ), @@ -133,12 +138,11 @@ ResourcesItem * item = new ResourcesItem( e.attribute( "name" ), e.attribute( "tags" ), e.attribute( "size" ).toInt(), QDateTime::fromString( e.attribute( "lastmod" ), Qt::ISODate ) ); -replaceItem( item ); +addItem( item ); ResourcesTreeItem * treeItem = new ResourcesTreeItem( _i, item ); -if( item->type() == ResourcesItem::TypeDirectory && - QFileInfo( item->fullPath() ).isDir() ) +if( item->type() == ResourcesItem::TypeDirectory ) { - m_watcher.addPath( item->fullPath() ); + emit directoryItemAdded( item->fullPath() ); } loadTreeItem( treeItem, e ); } @@ -150,18 +154,6 @@ loadTreeItem( treeItem, e ); -void ResourcesDB::scanResources( void ) -{ - for( FolderList::ConstIterator it = m_folders.begin(); - it != m_folders.end(); ++it ) - { - readDir( it->second, &m_topLevelNode, it->first ); - } -} - - - - const ResourcesItem * ResourcesDB::nearestMatch( const ResourcesItem & _item ) { if( !_item.hash().isEmpty() ) @@ -193,38 +185,7 @@ const ResourcesItem * ResourcesDB::nearestMatch( const ResourcesItem & _item ) -void ResourcesDB::reloadDirectory( const QString & _path ) -{ - ResourcesTreeItem * dirTreeItem = NULL; - - foreach( ResourcesItem * it, m_items ) - { - if( it->type() == ResourcesItem::TypeDirectory && - it->fullPath() == _path ) - { - dirTreeItem = it->treeItem(); - } - } - - if( dirTreeItem ) - { - ResourcesItem * dirItem = dirTreeItem->item(); - if( dirItem ) - { - m_scannedFolders.clear(); - readDir( dirItem->path(), dirTreeItem->parent(), - dirItem->baseDir() ); - } - } - - emit itemsChanged(); -} - - - - - -void ResourcesDB::replaceItem( ResourcesItem * newItem ) +void ResourcesDB::addItem( ResourcesItem * newItem ) { const QString hash = newItem->hash(); ResourcesItem * oldItem = m_items[hash]; @@ -238,7 +199,7 @@ void ResourcesDB::replaceItem( ResourcesItem * newItem ) } if( oldItem->type() == ResourcesItem::TypeDirectory ) { - m_watcher.removePath( oldItem->fullPath() ); + emit directoryItemRemoved( oldItem->fullPath() ); } m_items.remove( hash ); delete oldItem; @@ -266,7 +227,7 @@ void ResourcesDB::recursiveRemoveItems( ResourcesTreeItem * parent, { if( parent->item()->type() == ResourcesItem::TypeDirectory ) { - m_watcher.removePath( parent->item()->fullPath() ); + emit directoryItemRemoved( parent->item()->fullPath() ); } const QString & hash = parent->item()->hash(); if( !hash.isEmpty() ) @@ -280,132 +241,5 @@ void ResourcesDB::recursiveRemoveItems( ResourcesTreeItem * parent, -void ResourcesDB::readDir( const QString & _dir, ResourcesTreeItem * _parent, - ResourcesItem::BaseDirectory _base_dir ) -{ -#ifdef LMMS_BUILD_LINUX - if( _dir.startsWith( "/dev" ) || - _dir.startsWith( "/sys" ) || - _dir.startsWith( "/proc" ) ) - { - return; - } -#endif - - QDir d( ResourcesItem::getBaseDirectory( _base_dir ) + _dir ); - m_scannedFolders << d.canonicalPath(); - - ResourcesItem * parentItem; - ResourcesTreeItem * curParent = _parent->findChild( d.dirName() + - QDir::separator(), - _base_dir ); -printf("read dir: %s\n", d.canonicalPath().toAscii().constData() ); - if( curParent ) - { - parentItem = curParent->item(); - foreachResourcesTreeItem( curParent->children() ) - { - (*it)->setTemporaryMarker( false ); - } - } - else - { - // create new item for current dir - parentItem = new ResourcesItem( d.dirName(), - ResourcesItem::TypeDirectory, - _base_dir, - _parent->item() ? - _parent->item()->path() + d.dirName() + - QDir::separator() : - QString::null ); - parentItem->setLastMod( QFileInfo( - d.canonicalPath() ).lastModified() ); - replaceItem( parentItem ); - curParent = new ResourcesTreeItem( _parent, parentItem ); - curParent->setTemporaryMarker( true ); - m_watcher.addPath( parentItem->fullPath() ); - } - - - QFileInfoList list = d.entryInfoList( QDir::NoDotAndDotDot | - QDir::Dirs | QDir::Files | - QDir::Readable, - QDir::Name | QDir::DirsFirst ); - foreach( QFileInfo f, list ) - { - if( f.isSymLink() ) - { - f = QFileInfo( f.symLinkTarget() ); - } - - QString fname = f.fileName(); - if( f.isDir() ) - { - fname += QDir::separator(); - } - ResourcesTreeItem * curChild = - curParent->findChild( fname, _base_dir ); - if( curChild ) - { - curChild->setTemporaryMarker( true ); - if( f.lastModified() > curChild->item()->lastMod() ) - { -//printf("reload: %s\n", fname.toAscii().constData()); - curChild->item()->setLastMod( - f.lastModified() ); - if( curChild->item()->type() == - ResourcesItem::TypeDirectory ) - { - readDir( _dir + fname, curParent, - _base_dir ); - } - else - { - curChild->item()->reload(); - } - } - } - else - { - if( f.isDir() && - !m_scannedFolders.contains( - f.canonicalFilePath() ) ) - - { - readDir( _dir + fname, curParent, _base_dir ); - } - else if( f.isFile() ) - { - ResourcesItem * newItem = - new ResourcesItem( f.fileName(), - ResourcesItem::TypeUnknown, - _base_dir, _dir ); - newItem->setLastMod( f.lastModified() ); - replaceItem( newItem ); - ResourcesTreeItem * ti = - new ResourcesTreeItem( curParent, - newItem ); - ti->setTemporaryMarker( true ); - } - } - } - - for( ResourcesTreeItemList::Iterator it = curParent->children().begin(); - it != curParent->children().end(); ) - { - if( (*it)->temporaryMarker() == false ) - { - //printf("removing %d %s\n", (*it)->item(), (*it)->item()->name().toAscii().constData() ); - recursiveRemoveItems( *it ); - it = curParent->children().erase( it ); - } - else - { - ++it; - } - } -} - - #include "moc_resources_db.cxx" diff --git a/src/core/resources_item.cpp b/src/core/resources_item.cpp index f81ebecd3..871a7f58e 100644 --- a/src/core/resources_item.cpp +++ b/src/core/resources_item.cpp @@ -28,29 +28,13 @@ #include #include "resources_item.h" +#include "resources_provider.h" #include "config_mgr.h" -ResourcesItem::ResourcesItem() : - m_name(), - m_nameHash( 0 ), - m_type( TypeUnknown ), - m_baseDir( BaseRoot ), - m_path(), - m_hash(), - m_size( -1 ), - m_lastMod(), - m_tags(), - m_treeItem( NULL ) -{ - init(); -} - - - - -ResourcesItem::ResourcesItem( const QString & _name, +ResourcesItem::ResourcesItem( ResourcesProvider * _provider, + const QString & _name, Type _type, BaseDirectory _base_dir, const QString & _path, @@ -58,6 +42,7 @@ ResourcesItem::ResourcesItem( const QString & _name, const QString & _tags, int _size, const QDateTime & _last_mod ) : + m_provider( _provider ), m_name( _name ), m_nameHash( 0 ), m_type( _type ), @@ -238,21 +223,14 @@ void ResourcesItem::init( void ) { if( m_size < 0 ) { - m_size = QFileInfo( fullName() ).size(); + m_size = realSize(); } if( m_hash.isEmpty() ) { QCryptographicHash h( QCryptographicHash::Sha1 ); - QFile f( fullName() ); - f.open( QFile::ReadOnly ); - - const int chunkSize = 1024*1024; // 1 MB - for( int i = 0; i < f.size() / chunkSize; ++i ) - { - h.addData( f.read( chunkSize ) ); - } - h.addData( f.readAll() ); + // fetch at most 1 MB for creating hash + h.addData( fetchData( 1 * 1024 * 1024 ) ); m_hash = h.result().toHex(); } @@ -272,12 +250,15 @@ QString ResourcesItem::getBaseDirectory( BaseDirectory _bd ) case BaseRoot: d = QDir::rootPath(); break; + case BaseWorkingDir: d = configManager::inst()->workingDir(); break; + case BaseDataDir: d = configManager::inst()->dataDir(); break; + case BaseHome: default: d = QDir::homePath(); diff --git a/src/core/resources_provider.cpp b/src/core/resources_provider.cpp new file mode 100644 index 000000000..90a8cf0ae --- /dev/null +++ b/src/core/resources_provider.cpp @@ -0,0 +1,70 @@ +/* + * resources_provider.cpp - implementation of ResourcesProvider + * + * Copyright (c) 2009 Tobias Doerffel + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program (see COPYING); if not, write to the + * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301 USA. + * + */ + + +#include +#include + +#include "resources_provider.h" +#include "resources_db.h" +#include "config_mgr.h" + + +ResourcesProvider::ResourcesProvider( const QString & _url ) : + m_database( new ResourcesDB( this ) ), + m_url( _url ) +{ +} + + + + +ResourcesProvider::~ResourcesProvider() +{ + delete m_database; +} + + + + +QString ResourcesProvider::localCatalogueFile( void ) const +{ + const QString dir = configManager::inst()->workingDir() + + "catalogs" + QDir::separator(); + if( !QDir( dir ).exists() ) + { + QDir().mkpath( dir ); + } + + QCryptographicHash h( QCryptographicHash::Md5 ); + + h.addData( QString( providerName() + url() ).toUtf8() ); + + return dir + h.result().toHex(); +} + + + +#include "moc_resources_provider.cxx" +