[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    Re: [Amarok] a08dfba: extensive refactoring to crash-proof
From:       Nikolaj Hald Nielsen <nhnfreespirit () gmail ! com>
Date:       2010-02-26 9:20:29
Message-ID: 9d527021002260120j43d1c2d0g3885fe7d0067f72e () mail ! gmail ! com
[Download RAW message or body]

Getting crashes in Librivox script (and some people report crashes in
Ampache service as well). Could this be related (these are based on
MemoryCollection/QueryMaker)?

Backtrace for the Librivox crash:

Thread 1 (Thread 0x7fecb79f5780 (LWP 11137)):
[KCrash Handler]
#5  0x00007fecb69ca495 in DynamicServiceQueryMaker::matchAlbums
(coll=0x41c4580, artist=...) at
/home/nhn/work/amarok/src/services/DynamicServiceQueryMaker.cpp:168
#6  0x00007fecb67bf3b5 in ScriptableServiceQueryMaker::fetchAlbums
(this=0x2e6cfc0) at
/home/nhn/work/amarok/src/services/scriptable/ScriptableServiceQueryMaker.cpp:324
#7  0x00007fecb67c0c20 in ScriptableServiceQueryMaker::qt_metacall
(this=0x2e6cfc0, _c=QMetaObject::InvokeMetaMethod, _id=3,
_a=0x7fffe7b5e120)
    at /home/nhn/work/amarok/amarok_build/src/ScriptableServiceQueryMaker.moc:81
#8  0x00007fecb5e7b95f in QMetaObject::activate(QObject*, QMetaObject
const*, int, void**) () from /usr/lib/libQtCore.so.4
#9  0x00007fecb5e8317f in ?? () from /usr/lib/libQtCore.so.4
#10 0x00007fecb5e785b3 in QObject::event(QEvent*) () from
/usr/lib/libQtCore.so.4
#11 0x00007fecb522595c in QApplicationPrivate::notify_helper(QObject*,
QEvent*) () from /usr/lib/libQtGui.so.4
#12 0x00007fecb522bf4b in QApplication::notify(QObject*, QEvent*) ()
from /usr/lib/libQtGui.so.4
#13 0x00007fecb6bd6346 in App::notify (this=0x7fffe7b5eb80,
receiver=0x355a630, event=0x7fffe7b5e880) at
/home/nhn/work/amarok/src/App.cpp:919
#14 0x00007fecb5e68bfc in QCoreApplication::notifyInternal(QObject*,
QEvent*) () from /usr/lib/libQtCore.so.4
#15 0x00007fecb5e958a2 in ?? () from /usr/lib/libQtCore.so.4
#16 0x00007fecb5e923a4 in ?? () from /usr/lib/libQtCore.so.4
#17 0x00007fecad5ff26e in g_main_context_dispatch () from
/usr/lib/libglib-2.0.so.0
#18 0x00007fecad602c28 in g_main_context_iterate () from
/usr/lib/libglib-2.0.so.0
#19 0x00007fecad602d50 in g_main_context_iteration () from
/usr/lib/libglib-2.0.so.0
#20 0x00007fecb5e92093 in
QEventDispatcherGlib::processEvents(QFlags<QEventLoop::ProcessEventsFlag>)
() from /usr/lib/libQtCore.so.4
#21 0x00007fecb52d430e in ?? () from /usr/lib/libQtGui.so.4
#22 0x00007fecb5e67522 in
QEventLoop::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) ()
from /usr/lib/libQtCore.so.4
#23 0x00007fecb5e678fc in
QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) () from
/usr/lib/libQtCore.so.4
#24 0x00007fecb5e6b63b in QCoreApplication::exec() () from
/usr/lib/libQtCore.so.4
#25 0x000000000040af52 in main (argc=1, argv=0x7fffe7b60ae8) at
/home/nhn/work/amarok/src/main.cpp:237

- Nikolaj






On Thu, Feb 25, 2010 at 9:33 PM, Maximilian Kossick
<maximilian.kossick@googlemail.com> wrote:
> commit a08dfbaf07b9355fe5021bb0f5b3c87991dfac40
> Author: Maximilian Kossick <maximilian.kossick@googlemail.com>
> Date:   Thu Feb 25 18:29:06 2010 +0100
> 
> extensive refactoring to crash-proof MemoryQueryMaker.
> 
> This commit touches a lot of code, so please review and test. The changes are \
> relatively simple, but there are a lot. 
> diff --git a/src/collection/audiocd/AudioCdCollection.cpp \
> b/src/collection/audiocd/AudioCdCollection.cpp index 3bb384b..420eea0 100644
> --- a/src/collection/audiocd/AudioCdCollection.cpp
> +++ b/src/collection/audiocd/AudioCdCollection.cpp
> @@ -142,10 +142,10 @@ AudioCdCollection::infoFetchComplete( KJob *job )
> }
> 
> AudioCdArtistPtr artistPtr = AudioCdArtistPtr( new  AudioCdArtist( artist ) );
> -        addArtist( ArtistPtr::staticCast( artistPtr ) );
> +        memoryCollection()->addArtist( ArtistPtr::staticCast( artistPtr ) );
> AudioCdAlbumPtr albumPtr = AudioCdAlbumPtr( new  AudioCdAlbum( album ) );
> albumPtr->setAlbumArtist( artistPtr );
> -        addAlbum( AlbumPtr::staticCast( albumPtr ) );
> +        memoryCollection()->addAlbum( AlbumPtr::staticCast( albumPtr ) );
> 
> 
> startIndex = cddbInfo.indexOf( "DYEAR=", 0 );
> @@ -157,7 +157,7 @@ AudioCdCollection::infoFetchComplete( KJob *job )
> }
> 
> AudioCdYearPtr yearPtr = AudioCdYearPtr( new AudioCdYear( year ) );
> -        addYear( YearPtr::staticCast( yearPtr ) );
> +        memoryCollection()->addYear( YearPtr::staticCast( yearPtr ) );
> 
> 
> startIndex = cddbInfo.indexOf( "DGENRE=", 0 );
> @@ -169,7 +169,7 @@ AudioCdCollection::infoFetchComplete( KJob *job )
> }
> 
> AudioCdGenrePtr genrePtr = AudioCdGenrePtr( new  AudioCdGenre( genre ) );
> -        addGenre( GenrePtr::staticCast( genrePtr ) );
> +        memoryCollection()->addGenre( GenrePtr::staticCast( genrePtr ) );
> 
> m_discCddbId = "unknown";
> 
> @@ -238,7 +238,7 @@ AudioCdCollection::infoFetchComplete( KJob *job )
> trackPtr->setTrackNumber( i + 1 );
> trackPtr->setFileNameBase( baseFileName );
> 
> -                addTrack( TrackPtr::staticCast( trackPtr ) );
> +                memoryCollection()->addTrack( TrackPtr::staticCast( trackPtr ) );
> 
> artistPtr->addTrack( trackPtr );
> 
> @@ -420,14 +420,14 @@ AudioCdCollection::noInfoAvailable()
> QString genre = i18n( "Unknown" );
> 
> AudioCdArtistPtr artistPtr = AudioCdArtistPtr( new  AudioCdArtist( artist ) );
> -    addArtist( ArtistPtr::staticCast( artistPtr ) );
> +    memoryCollection()->addArtist( ArtistPtr::staticCast( artistPtr ) );
> AudioCdAlbumPtr albumPtr = AudioCdAlbumPtr( new  AudioCdAlbum( album ) );
> albumPtr->setAlbumArtist( artistPtr );
> -    addAlbum( AlbumPtr::staticCast( albumPtr ) );
> +    memoryCollection()->addAlbum( AlbumPtr::staticCast( albumPtr ) );
> AudioCdYearPtr yearPtr = AudioCdYearPtr( new AudioCdYear( year ) );
> -    addYear( YearPtr::staticCast( yearPtr ) );
> +    memoryCollection()->addYear( YearPtr::staticCast( yearPtr ) );
> AudioCdGenrePtr genrePtr = AudioCdGenrePtr( new  AudioCdGenre( genre ) );
> -    addGenre( GenrePtr::staticCast( genrePtr ) );
> +    memoryCollection()->addGenre( GenrePtr::staticCast( genrePtr ) );
> 
> 
> int i = 1;
> @@ -445,7 +445,7 @@ AudioCdCollection::noInfoAvailable()
> trackPtr->setTrackNumber( i );
> trackPtr->setFileNameBase( trackName );
> 
> -        addTrack( TrackPtr::staticCast( trackPtr ) );
> +        memoryCollection()->addTrack( TrackPtr::staticCast( trackPtr ) );
> 
> artistPtr->addTrack( trackPtr );
> trackPtr->setArtist( artistPtr );
> @@ -514,7 +514,7 @@ AudioCdCollection::trackForUrl( const KUrl & url )
> 
> int trackNumber = parts.at( 1 ).toInt();
> 
> -        foreach( TrackPtr track, trackMap().values() )
> +        foreach( TrackPtr track, memoryCollection()->trackMap().values() )
> {
> if ( track->trackNumber() == trackNumber )
> return track;
> @@ -558,7 +558,7 @@ AudioCdCollection::updateProxyTracks()
> 
> const int trackNumber = parts.at( 1 ).toInt();
> 
> -        foreach( const TrackPtr &track, trackMap().values() )
> +        foreach( const TrackPtr &track, memoryCollection()->trackMap().values() )
> {
> if( track->trackNumber() == trackNumber )
> {
> diff --git a/src/collection/daap/DaapCollection.cpp \
> b/src/collection/daap/DaapCollection.cpp index 8b03885..ec07901 100644
> --- a/src/collection/daap/DaapCollection.cpp
> +++ b/src/collection/daap/DaapCollection.cpp
> @@ -214,11 +214,11 @@ DaapCollectionFactory::resolvedServiceIp( QHostInfo hostInfo \
> ) 
> DaapCollection::DaapCollection( const QString &host, const QString &ip, quint16 \
> port ) : Collection()
> -    , MemoryCollection()
> , m_host( host )
> , m_port( port )
> , m_ip( ip )
> , m_reader( 0 )
> +    , m_mc( new MemoryCollection() )
> {
> debug() << "Host: " << host << " port: " << port;
> m_reader = new Daap::Reader( this, host, port, QString(), this, "DaapReader" );
> @@ -240,7 +240,7 @@ DaapCollection::startFullScan()
> QueryMaker*
> DaapCollection::queryMaker()
> {
> -    return new MemoryQueryMaker( this, collectionId() );
> +    return new MemoryQueryMaker( m_mc.toWeakRef(), collectionId() );
> }
> 
> QString
> diff --git a/src/collection/daap/DaapCollection.h \
> b/src/collection/daap/DaapCollection.h index 068365b..02a2c0b 100644
> --- a/src/collection/daap/DaapCollection.h
> +++ b/src/collection/daap/DaapCollection.h
> @@ -28,6 +28,7 @@
> #include <QHostInfo>
> #include <QPointer>
> #include <QtGlobal>
> +#include <QSharedPointer>
> 
> #include <KIcon>
> 
> @@ -70,7 +71,7 @@ class DaapCollectionFactory : public Amarok::CollectionFactory
> QHash<int, quint16> m_lookupHash;
> };
> 
> -class DaapCollection : public Amarok::Collection, public MemoryCollection
> +class DaapCollection : public Amarok::Collection
> {
> Q_OBJECT
> public:
> @@ -86,6 +87,8 @@ class DaapCollection : public Amarok::Collection, public \
> MemoryCollection 
> void serverOffline();
> 
> +        QSharedPointer<MemoryCollection> memoryCollection() const { return m_mc; }
> +
> signals:
> void collectionReady();
> 
> @@ -103,6 +106,7 @@ class DaapCollection : public Amarok::Collection, public \
> MemoryCollection QString m_ip;
> 
> Daap::Reader *m_reader;
> +        QSharedPointer<MemoryCollection> m_mc;
> };
> 
> #endif
> diff --git a/src/collection/daap/daapreader/Reader.cpp \
> b/src/collection/daap/daapreader/Reader.cpp index 84d9455..486508e 100644
> --- a/src/collection/daap/daapreader/Reader.cpp
> +++ b/src/collection/daap/daapreader/Reader.cpp
> @@ -431,14 +431,14 @@ Reader::parseSongList( const QByteArray &data )
> 
> addTrack( itemId, title, artist, composer, comment, album, genre, year, format, \
> trackNumber, songTime ); 
> -    m_memColl->acquireWriteLock();
> -    m_memColl->setTrackMap( m_trackMap );
> -    m_memColl->setArtistMap( m_artistMap );
> -    m_memColl->setAlbumMap( m_albumMap );
> -    m_memColl->setGenreMap( m_genreMap );
> -    m_memColl->setComposerMap( m_composerMap );
> -    m_memColl->setYearMap( m_yearMap );
> -    m_memColl->releaseLock();
> +    m_memColl->memoryCollection()->acquireWriteLock();
> +    m_memColl->memoryCollection()->setTrackMap( m_trackMap );
> +    m_memColl->memoryCollection()->setArtistMap( m_artistMap );
> +    m_memColl->memoryCollection()->setAlbumMap( m_albumMap );
> +    m_memColl->memoryCollection()->setGenreMap( m_genreMap );
> +    m_memColl->memoryCollection()->setComposerMap( m_composerMap );
> +    m_memColl->memoryCollection()->setYearMap( m_yearMap );
> +    m_memColl->memoryCollection()->releaseLock();
> m_trackMap.clear();
> m_artistMap.clear();
> m_albumMap.clear();
> diff --git a/src/collection/ipodcollection/IpodCollection.cpp \
> b/src/collection/ipodcollection/IpodCollection.cpp index 0f3f455..c5e1637 100644
> --- a/src/collection/ipodcollection/IpodCollection.cpp
> +++ b/src/collection/ipodcollection/IpodCollection.cpp
> @@ -91,7 +91,7 @@ IpodCollection::trackForUrl( const KUrl &url )
> QString uid = QUrl::fromPercentEncoding( url.url().toUtf8() );
> if( uid.startsWith("file://") )
> uid = uid.remove( 0, 7 );
> -    Meta::TrackPtr ipodTrack = m_trackMap.value( uid );
> +    Meta::TrackPtr ipodTrack = memoryCollection()->trackMap().value( uid );
> return ipodTrack ? ipodTrack : Collection::trackForUrl(url);
> }
> 
> diff --git a/src/collection/ipodcollection/handler/IpodHandler.cpp \
> b/src/collection/ipodcollection/handler/IpodHandler.cpp index ddd622a..5be4638 \
>                 100644
> --- a/src/collection/ipodcollection/handler/IpodHandler.cpp
> +++ b/src/collection/ipodcollection/handler/IpodHandler.cpp
> @@ -594,7 +594,7 @@ IpodHandler::syncArtwork()
> if( !localCollection )
> return false;
> 
> -    Meta::AlbumMap albumMap = m_memColl->albumMap();
> +    Meta::AlbumMap albumMap = m_memColl->memoryCollection()->albumMap();
> 
> foreach( const Meta::AlbumPtr album, albumMap.values() )
> {
> @@ -1181,7 +1181,7 @@ IpodHandler::staleTracks()
> DEBUG_BLOCK
> Meta::TrackList tracklist;
> 
> -    Meta::TrackMap trackMap = m_memColl->trackMap();
> +    Meta::TrackMap trackMap = m_memColl->memoryCollection()->trackMap();
> 
> foreach( const Meta::TrackPtr trk, trackMap.values() )
> {
> diff --git a/src/collection/mediadevicecollection/MediaDeviceCollection.cpp \
> b/src/collection/mediadevicecollection/MediaDeviceCollection.cpp index \
>                 0fd56e9..1c66faa 100644
> --- a/src/collection/mediadevicecollection/MediaDeviceCollection.cpp
> +++ b/src/collection/mediadevicecollection/MediaDeviceCollection.cpp
> @@ -110,10 +110,10 @@ MediaDeviceCollectionFactoryBase::slotDeviceDisconnected( \
> const QString &udi ) 
> MediaDeviceCollection::MediaDeviceCollection()
> > Collection()
> -    , MemoryCollection()
> , m_ejectAction( 0 )
> , m_usedCapacity( -1 )
> , m_totalCapacity( -1 )
> +    , m_mc( new MemoryCollection() )
> {
> connect( this, SIGNAL( attemptConnectionDone(bool)),
> this, SLOT( slotAttemptConnectionDone(bool)) );
> @@ -134,7 +134,7 @@ MediaDeviceCollection::initCapacities()
> QueryMaker*
> MediaDeviceCollection::queryMaker()
> {
> -    return new MemoryQueryMaker( this, collectionId() );
> +    return new MemoryQueryMaker( m_mc.toWeakRef(), collectionId() );
> }
> 
> UserPlaylistProvider*
> diff --git a/src/collection/mediadevicecollection/MediaDeviceCollection.h \
> b/src/collection/mediadevicecollection/MediaDeviceCollection.h index \
>                 ad5062e..e55da77 100644
> --- a/src/collection/mediadevicecollection/MediaDeviceCollection.h
> +++ b/src/collection/mediadevicecollection/MediaDeviceCollection.h
> @@ -29,6 +29,7 @@
> #include <KIcon>
> 
> #include <QtGlobal>
> +#include <QSharedPointer>
> 
> class MediaDeviceCollection;
> 
> @@ -79,7 +80,7 @@ class MediaDeviceCollectionFactory : public \
> MediaDeviceCollectionFactoryBase };
> 
> 
> -class MEDIADEVICECOLLECTION_EXPORT MediaDeviceCollection : public \
> Amarok::Collection, public MemoryCollection +class MEDIADEVICECOLLECTION_EXPORT \
> MediaDeviceCollection : public Amarok::Collection {
> Q_OBJECT
> 
> @@ -137,6 +138,8 @@ class MEDIADEVICECOLLECTION_EXPORT MediaDeviceCollection : \
> public Amarok::Collec 
> virtual QAction *ejectAction() const;
> 
> +        QSharedPointer<MemoryCollection> memoryCollection() const { return m_mc; }
> +
> signals:
> void collectionReady( Amarok::Collection* );
> void collectionDisconnected( const QString &udi );
> @@ -161,6 +164,7 @@ class MEDIADEVICECOLLECTION_EXPORT MediaDeviceCollection : \
> public Amarok::Collec 
> float m_usedCapacity;
> float m_totalCapacity;
> +        QSharedPointer<MemoryCollection> m_mc;
> 
> private:
> void initCapacities();
> diff --git a/src/collection/mediadevicecollection/MediaDeviceMeta.cpp \
> b/src/collection/mediadevicecollection/MediaDeviceMeta.cpp index fba1014..37c2f1b \
>                 100644
> --- a/src/collection/mediadevicecollection/MediaDeviceMeta.cpp
> +++ b/src/collection/mediadevicecollection/MediaDeviceMeta.cpp
> @@ -418,7 +418,7 @@ MediaDeviceTrack::setAlbum( const QString &newAlbum )
> {
> MediaDeviceAlbumPtr albumPtr;
> MediaDeviceTrackPtr track( this );
> -    AlbumMap albumMap = m_collection->albumMap();
> +    AlbumMap albumMap = m_collection->memoryCollection()->albumMap();
> 
> // do cleanup of soon to be previous album
> 
> @@ -452,9 +452,9 @@ MediaDeviceTrack::setAlbum( const QString &newAlbum )
> // set track's album to the new album
> setAlbum( albumPtr );
> 
> -    m_collection->acquireWriteLock();
> -    m_collection->setAlbumMap( albumMap );
> -    m_collection->releaseLock();
> +    m_collection->memoryCollection()->acquireWriteLock();
> +    m_collection->memoryCollection()->setAlbumMap( albumMap );
> +    m_collection->memoryCollection()->releaseLock();
> }
> 
> void
> @@ -464,7 +464,7 @@ MediaDeviceTrack::setArtist( const QString &newArtist )
> 
> MediaDeviceArtistPtr artistPtr;
> MediaDeviceTrackPtr track( this );
> -    ArtistMap artistMap = m_collection->artistMap();
> +    ArtistMap artistMap = m_collection->memoryCollection()->artistMap();
> 
> // do cleanup of soon to be previous artist
> 
> @@ -498,9 +498,9 @@ MediaDeviceTrack::setArtist( const QString &newArtist )
> // set track's artist to the new artist
> setArtist( artistPtr );
> 
> -    m_collection->acquireWriteLock();
> -    m_collection->setArtistMap( artistMap );
> -    m_collection->releaseLock();
> +    m_collection->memoryCollection()->acquireWriteLock();
> +    m_collection->memoryCollection()->setArtistMap( artistMap );
> +    m_collection->memoryCollection()->releaseLock();
> }
> 
> void
> @@ -510,7 +510,7 @@ MediaDeviceTrack::setGenre( const QString &newGenre )
> 
> MediaDeviceGenrePtr genrePtr;
> MediaDeviceTrackPtr track( this );
> -    GenreMap genreMap = m_collection->genreMap();
> +    GenreMap genreMap = m_collection->memoryCollection()->genreMap();
> 
> // do cleanup of soon to be previous genre
> 
> @@ -544,9 +544,9 @@ MediaDeviceTrack::setGenre( const QString &newGenre )
> // set track's genre to the new genre
> setGenre( genrePtr );
> 
> -    m_collection->acquireWriteLock();
> -    m_collection->setGenreMap( genreMap );
> -    m_collection->releaseLock();
> +    m_collection->memoryCollection()->acquireWriteLock();
> +    m_collection->memoryCollection()->setGenreMap( genreMap );
> +    m_collection->memoryCollection()->releaseLock();
> }
> 
> void
> @@ -556,7 +556,7 @@ MediaDeviceTrack::setComposer( const QString &newComposer )
> 
> MediaDeviceComposerPtr composerPtr;
> MediaDeviceTrackPtr track( this );
> -    ComposerMap composerMap = m_collection->composerMap();
> +    ComposerMap composerMap = m_collection->memoryCollection()->composerMap();
> 
> // do cleanup of soon to be previous composer
> 
> @@ -590,9 +590,9 @@ MediaDeviceTrack::setComposer( const QString &newComposer )
> // set track's composer to the new composer
> setComposer( composerPtr );
> 
> -    m_collection->acquireWriteLock();
> -    m_collection->setComposerMap( composerMap );
> -    m_collection->releaseLock();
> +    m_collection->memoryCollection()->acquireWriteLock();
> +    m_collection->memoryCollection()->setComposerMap( composerMap );
> +    m_collection->memoryCollection()->releaseLock();
> }
> 
> void
> @@ -602,7 +602,7 @@ MediaDeviceTrack::setYear( const QString &newYear )
> 
> MediaDeviceYearPtr yearPtr;
> MediaDeviceTrackPtr track( this );
> -    YearMap yearMap = m_collection->yearMap();
> +    YearMap yearMap = m_collection->memoryCollection()->yearMap();
> 
> // do cleanup of soon to be previous year
> 
> @@ -636,9 +636,9 @@ MediaDeviceTrack::setYear( const QString &newYear )
> // set track's year to the new year
> setYear( yearPtr );
> 
> -    m_collection->acquireWriteLock();
> -    m_collection->setYearMap( yearMap );
> -    m_collection->releaseLock();
> +    m_collection->memoryCollection()->acquireWriteLock();
> +    m_collection->memoryCollection()->setYearMap( yearMap );
> +    m_collection->memoryCollection()->releaseLock();
> }
> 
> void
> diff --git a/src/collection/mediadevicecollection/handler/MediaDeviceHandler.cpp \
> b/src/collection/mediadevicecollection/handler/MediaDeviceHandler.cpp index \
>                 fe59783..c8f7fc5 100644
> --- a/src/collection/mediadevicecollection/handler/MediaDeviceHandler.cpp
> +++ b/src/collection/mediadevicecollection/handler/MediaDeviceHandler.cpp
> @@ -177,12 +177,12 @@ MediaDeviceHandler::addMediaDeviceTrackToCollection( \
> Meta::MediaDeviceTrackPtr& if( !m_rcb )
> return;
> 
> -    TrackMap trackMap = m_memColl->trackMap();
> -    ArtistMap artistMap = m_memColl->artistMap();
> -    AlbumMap albumMap = m_memColl->albumMap();
> -    GenreMap genreMap = m_memColl->genreMap();
> -    ComposerMap composerMap = m_memColl->composerMap();
> -    YearMap yearMap = m_memColl->yearMap();
> +    TrackMap trackMap = m_memColl->memoryCollection()->trackMap();
> +    ArtistMap artistMap = m_memColl->memoryCollection()->artistMap();
> +    AlbumMap albumMap = m_memColl->memoryCollection()->albumMap();
> +    GenreMap genreMap = m_memColl->memoryCollection()->genreMap();
> +    ComposerMap composerMap = m_memColl->memoryCollection()->composerMap();
> +    YearMap yearMap = m_memColl->memoryCollection()->yearMap();
> 
> /* 1-liner info retrieval */
> 
> @@ -204,25 +204,25 @@ MediaDeviceHandler::addMediaDeviceTrackToCollection( \
> Meta::MediaDeviceTrackPtr& m_titlemap.insert( track->name(), TrackPtr::staticCast( \
> track ) ); 
> // Finally, assign the created maps to the collection
> -    m_memColl->acquireWriteLock();
> -    m_memColl->setTrackMap( trackMap );
> -    m_memColl->setArtistMap( artistMap );
> -    m_memColl->setAlbumMap( albumMap );
> -    m_memColl->setGenreMap( genreMap );
> -    m_memColl->setComposerMap( composerMap );
> -    m_memColl->setYearMap( yearMap );
> -    m_memColl->releaseLock();
> +    m_memColl->memoryCollection()->acquireWriteLock();
> +    m_memColl->memoryCollection()->setTrackMap( trackMap );
> +    m_memColl->memoryCollection()->setArtistMap( artistMap );
> +    m_memColl->memoryCollection()->setAlbumMap( albumMap );
> +    m_memColl->memoryCollection()->setGenreMap( genreMap );
> +    m_memColl->memoryCollection()->setComposerMap( composerMap );
> +    m_memColl->memoryCollection()->setYearMap( yearMap );
> +    m_memColl->memoryCollection()->releaseLock();
> }
> 
> void
> MediaDeviceHandler::removeMediaDeviceTrackFromCollection( Meta::MediaDeviceTrackPtr \
> &track ) {
> -    TrackMap trackMap = m_memColl->trackMap();
> -    ArtistMap artistMap = m_memColl->artistMap();
> -    AlbumMap albumMap = m_memColl->albumMap();
> -    GenreMap genreMap = m_memColl->genreMap();
> -    ComposerMap composerMap = m_memColl->composerMap();
> -    YearMap yearMap = m_memColl->yearMap();
> +    TrackMap trackMap = m_memColl->memoryCollection()->trackMap();
> +    ArtistMap artistMap = m_memColl->memoryCollection()->artistMap();
> +    AlbumMap albumMap = m_memColl->memoryCollection()->albumMap();
> +    GenreMap genreMap = m_memColl->memoryCollection()->genreMap();
> +    ComposerMap composerMap = m_memColl->memoryCollection()->composerMap();
> +    YearMap yearMap = m_memColl->memoryCollection()->yearMap();
> 
> Meta::MediaDeviceArtistPtr artist = Meta::MediaDeviceArtistPtr::dynamicCast( \
> track->artist() ); Meta::MediaDeviceAlbumPtr album = \
> Meta::MediaDeviceAlbumPtr::dynamicCast( track->album() ); @@ -242,44 +242,44 @@ \
> MediaDeviceHandler::removeMediaDeviceTrackFromCollection( Meta::MediaDeviceTrack \
> if( artist->tracks().isEmpty() ) {
> artistMap.remove( artist->name() );
> -        m_memColl->acquireWriteLock();
> -        m_memColl->setArtistMap( artistMap );
> -        m_memColl->releaseLock();
> +        m_memColl->memoryCollection()->acquireWriteLock();
> +        m_memColl->memoryCollection()->setArtistMap( artistMap );
> +        m_memColl->memoryCollection()->releaseLock();
> }
> if( album->tracks().isEmpty() )
> {
> albumMap.remove( album->name() );
> -        m_memColl->acquireWriteLock();
> -        m_memColl->setAlbumMap( albumMap );
> -        m_memColl->releaseLock();
> +        m_memColl->memoryCollection()->acquireWriteLock();
> +        m_memColl->memoryCollection()->setAlbumMap( albumMap );
> +        m_memColl->memoryCollection()->releaseLock();
> }
> if( genre->tracks().isEmpty() )
> {
> genreMap.remove( genre->name() );
> -        m_memColl->acquireWriteLock();
> -        m_memColl->setGenreMap( genreMap );
> -        m_memColl->releaseLock();
> +        m_memColl->memoryCollection()->acquireWriteLock();
> +        m_memColl->memoryCollection()->setGenreMap( genreMap );
> +        m_memColl->memoryCollection()->releaseLock();
> }
> if( composer->tracks().isEmpty() )
> {
> composerMap.remove( composer->name() );
> -        m_memColl->acquireWriteLock();
> -        m_memColl->setComposerMap( composerMap );
> -        m_memColl->releaseLock();
> +        m_memColl->memoryCollection()->acquireWriteLock();
> +        m_memColl->memoryCollection()->setComposerMap( composerMap );
> +        m_memColl->memoryCollection()->releaseLock();
> }
> if( year->tracks().isEmpty() )
> {
> yearMap.remove( year->name() );
> -        m_memColl->acquireWriteLock();
> -        m_memColl->setYearMap( yearMap );
> -        m_memColl->releaseLock();
> +        m_memColl->memoryCollection()->acquireWriteLock();
> +        m_memColl->memoryCollection()->setYearMap( yearMap );
> +        m_memColl->memoryCollection()->releaseLock();
> }
> 
> // remove from trackmap
> trackMap.remove( track->name() );
> -    m_memColl->acquireWriteLock();
> -    m_memColl->setTrackMap( trackMap );
> -    m_memColl->releaseLock();
> +    m_memColl->memoryCollection()->acquireWriteLock();
> +    m_memColl->memoryCollection()->setTrackMap( trackMap );
> +    m_memColl->memoryCollection()->releaseLock();
> }
> 
> void
> @@ -319,7 +319,7 @@ MediaDeviceHandler::copyTrackListToDevice(const Meta::TrackList \
> tracklist) bool isDupe = false;
> bool hasDupe = false;
> QString format;
> -    TrackMap trackMap = m_memColl->trackMap();
> +    TrackMap trackMap = m_memColl->memoryCollection()->trackMap();
> 
> Meta::TrackList tempTrackList;
> 
> @@ -938,14 +938,14 @@ MediaDeviceHandler::privateParseTracks()
> }
> 
> // Finally, assign the created maps to the collection
> -    m_memColl->acquireWriteLock();
> -    m_memColl->setTrackMap( trackMap );
> -    m_memColl->setArtistMap( artistMap );
> -    m_memColl->setAlbumMap( albumMap );
> -    m_memColl->setGenreMap( genreMap );
> -    m_memColl->setComposerMap( composerMap );
> -    m_memColl->setYearMap( yearMap );
> -    m_memColl->releaseLock();
> +    m_memColl->memoryCollection()->acquireWriteLock();
> +    m_memColl->memoryCollection()->setTrackMap( trackMap );
> +    m_memColl->memoryCollection()->setArtistMap( artistMap );
> +    m_memColl->memoryCollection()->setAlbumMap( albumMap );
> +    m_memColl->memoryCollection()->setGenreMap( genreMap );
> +    m_memColl->memoryCollection()->setComposerMap( composerMap );
> +    m_memColl->memoryCollection()->setYearMap( yearMap );
> +    m_memColl->memoryCollection()->releaseLock();
> 
> m_memColl->collectionUpdated();
> 
> diff --git a/src/collection/support/MemoryMatcher.cpp \
> b/src/collection/support/MemoryMatcher.cpp index 44791d0..9669d34 100644
> --- a/src/collection/support/MemoryMatcher.cpp
> +++ b/src/collection/support/MemoryMatcher.cpp
> @@ -104,30 +104,6 @@ TrackList ArtistMatcher::match( MemoryCollection *memColl )
> return TrackList();
> }
> 
> -AlbumList ArtistMatcher::matchAlbums(MemoryCollection * memColl)
> -{
> -    if( !m_artist || !memColl )
> -        return AlbumList();
> -    ArtistMap artistMap = memColl->artistMap();
> -    if ( m_artist && artistMap.contains( m_artist->name() ) )
> -    {
> -        ArtistPtr artist = artistMap.value( m_artist->name() );
> -
> -        AlbumList matchingAlbums;
> -        AlbumList albums = memColl->albumMap().values();
> -
> -        foreach( AlbumPtr albumPtr, albums ) {
> -
> -            if ( albumPtr->albumArtist() == artist )
> -                matchingAlbums.push_back( albumPtr );
> -        }
> -
> -        return matchingAlbums;
> -    }
> -    else
> -        return AlbumList();
> -}
> -
> 
> TrackList ArtistMatcher::match( const TrackList &tracks )
> {
> diff --git a/src/collection/support/MemoryMatcher.h \
> b/src/collection/support/MemoryMatcher.h index dcf9e24..beddaf8 100644
> --- a/src/collection/support/MemoryMatcher.h
> +++ b/src/collection/support/MemoryMatcher.h
> @@ -62,8 +62,6 @@ class AMAROK_EXPORT ArtistMatcher : public MemoryMatcher
> virtual Meta::TrackList match( MemoryCollection *memColl );
> virtual Meta::TrackList match( const Meta::TrackList &tracks );
> 
> -        virtual Meta::AlbumList matchAlbums( MemoryCollection *memColl );
> -
> private:
> Meta::ArtistPtr m_artist;
> };
> diff --git a/src/collection/support/MemoryQueryMaker.cpp \
> b/src/collection/support/MemoryQueryMaker.cpp index f896a89..bc4a042 100644
> --- a/src/collection/support/MemoryQueryMaker.cpp
> +++ b/src/collection/support/MemoryQueryMaker.cpp
> @@ -80,14 +80,15 @@ struct MemoryQueryMaker::Private {
> bool orderDescending;
> bool orderByNumberField;
> AlbumQueryMode albumQueryMode;
> +    QString collectionId;
> };
> 
> -MemoryQueryMaker::MemoryQueryMaker( MemoryCollection *mc, const QString \
> &collectionId ) +MemoryQueryMaker::MemoryQueryMaker( QWeakPointer<MemoryCollection> \
> mc, const QString &collectionId ) : QueryMaker()
> , m_collection( mc )
> , d( new Private )
> {
> -    m_collection->setCollectionId( collectionId );
> +    d->collectionId = collectionId;
> d->matcher = 0;
> d->job = 0;
> reset();
> @@ -160,6 +161,7 @@ MemoryQueryMaker::run()
> qmi->setOrderDescending( d->orderDescending );
> qmi->setOrderByNumberField( d->orderByNumberField );
> qmi->setOrderByField( d->orderByField );
> +        qmi->setCollectionId( d->collectionId );
> 
> connect( qmi, SIGNAL(newResultReady(QString,Meta::AlbumList)), \
> SIGNAL(newResultReady(QString,Meta::AlbumList)), Qt::DirectConnection ); connect( \
> qmi, SIGNAL(newResultReady(QString,Meta::ArtistList)), \
>                 SIGNAL(newResultReady(QString,Meta::ArtistList)), \
>                 Qt::DirectConnection );
> diff --git a/src/collection/support/MemoryQueryMaker.h \
> b/src/collection/support/MemoryQueryMaker.h index aa73005..d36f12e 100644
> --- a/src/collection/support/MemoryQueryMaker.h
> +++ b/src/collection/support/MemoryQueryMaker.h
> @@ -23,6 +23,8 @@
> #include "MemoryCollection.h"
> #include "collection/QueryMaker.h"
> 
> +#include <QWeakPointer>
> +
> 
> namespace ThreadWeaver
> {
> @@ -33,7 +35,14 @@ class AMAROK_EXPORT MemoryQueryMaker : public QueryMaker
> {
> Q_OBJECT
> public:
> -        MemoryQueryMaker( MemoryCollection *mc, const QString &collectionId );
> +    /**
> +      * Creates a new MemoryQueryMaker that will query a memory collection.
> +      * This class implements the QueryMaker interface and can be used as a \
> generic +      * query maker for all collections that use MemoryCollection.
> +      * @param mc the MemoryCollection instance that the query should be run on.
> +      * @param collectionId the collectionid that has to be emitted by this \
> querymaker. +      */
> +        MemoryQueryMaker( QWeakPointer<MemoryCollection> mc, const QString \
> &collectionId ); virtual ~MemoryQueryMaker();
> 
> virtual QueryMaker* reset();
> @@ -79,7 +88,7 @@ class AMAROK_EXPORT MemoryQueryMaker : public QueryMaker
> 
> protected:
> 
> -        MemoryCollection *m_collection;
> +        QWeakPointer<MemoryCollection> m_collection;
> struct Private;
> Private * const d;
> };
> diff --git a/src/collection/support/MemoryQueryMakerInternal.cpp \
> b/src/collection/support/MemoryQueryMakerInternal.cpp index c837de2..897ac42 100644
> --- a/src/collection/support/MemoryQueryMakerInternal.cpp
> +++ b/src/collection/support/MemoryQueryMakerInternal.cpp
> @@ -24,10 +24,12 @@
> 
> #include "meta/Meta.h"
> 
> +#include <QSharedPointer>
> +
> #include <KRandomSequence>
> #include <KSortableList>
> 
> -MemoryQueryMakerInternal::MemoryQueryMakerInternal( MemoryCollection *collection )
> +MemoryQueryMakerInternal::MemoryQueryMakerInternal( const \
> QWeakPointer<MemoryCollection> &collection ) : QObject()
> , m_collection( collection )
> , m_matchers( 0 )
> @@ -55,11 +57,13 @@ MemoryQueryMakerInternal::~MemoryQueryMakerInternal()
> void
> MemoryQueryMakerInternal::runQuery()
> {
> -    m_collection->acquireReadLock();
> +    QSharedPointer<MemoryCollection> coll = m_collection.toStrongRef();
> +    if( coll )
> +        coll->acquireReadLock();
> //naive implementation, fix this
> if ( m_matchers )
> {
> -        Meta::TrackList result = m_matchers->match( m_collection );
> +        Meta::TrackList result = coll ? m_matchers->match( coll.data() ) : \
> Meta::TrackList(); if ( m_filters )
> {
> Meta::TrackList filtered;
> @@ -75,7 +79,7 @@ MemoryQueryMakerInternal::runQuery()
> }
> else if ( m_filters )
> {
> -        Meta::TrackList tracks = m_collection->trackMap().values();
> +        Meta::TrackList tracks = coll ? coll->trackMap().values() : \
> Meta::TrackList(); Meta::TrackList filtered;
> foreach( const Meta::TrackPtr &track, tracks )
> {
> @@ -86,7 +90,8 @@ MemoryQueryMakerInternal::runQuery()
> }
> else
> handleResult();
> -    m_collection->releaseLock();
> +    if( coll )
> +        coll->releaseLock();
> }
> 
> template <class PointerType>
> @@ -108,10 +113,10 @@ void MemoryQueryMakerInternal::emitProperResult( const \
> QList<PointerType>& list foreach( PointerType p, resultList )
> data << Meta::DataPtr::staticCast( p );
> 
> -        emit newResultReady( m_collection->collectionId(), data );
> +        emit newResultReady( m_collectionId, data );
> }
> else
> -        emit newResultReady( m_collection->collectionId(), list );
> +        emit newResultReady( m_collectionId, list );
> }
> 
> template<typename T>
> @@ -126,13 +131,14 @@ static inline QList<T> reverse(const QList<T> &l)
> void
> MemoryQueryMakerInternal::handleResult()
> {
> +    QSharedPointer<MemoryCollection> coll = m_collection.toStrongRef();
> //this gets called when we want to return all values for the given query type
> switch( m_type )
> {
> case QueryMaker::Custom :
> {
> QStringList result;
> -            Meta::TrackList tmpTracks = m_collection->trackMap().values();
> +            Meta::TrackList tmpTracks = coll ? coll->trackMap().values() : \
> Meta::TrackList(); Meta::TrackList tracks;
> foreach( const Meta::TrackPtr &track, tmpTracks )
> {
> @@ -180,14 +186,15 @@ MemoryQueryMakerInternal::handleResult()
> count++;
> }
> }
> -            emit newResultReady( m_collection->collectionId(), result );
> +            emit newResultReady( m_collectionId, result );
> break;
> }
> case QueryMaker::Track :
> {
> Meta::TrackList tracks;
> 
> -            foreach( Meta::TrackPtr track, m_collection->trackMap().values() )
> +            Meta::TrackList tmpTracks = coll ? coll->trackMap().values() : \
> Meta::TrackList(); +            foreach( Meta::TrackPtr track, tmpTracks )
> {
> if( m_albumQueryMode == QueryMaker::AllAlbums
> > > ( m_albumQueryMode == QueryMaker::OnlyCompilations && \
> > > track->album()->isCompilation() )
> @@ -210,9 +217,9 @@ MemoryQueryMakerInternal::handleResult()
> }
> case QueryMaker::Album :
> {
> -
> Meta::AlbumList albums;
> -            foreach( Meta::AlbumPtr album, m_collection->albumMap().values() )
> +            Meta::AlbumList tmp = coll ? coll->albumMap().values() : \
> Meta::AlbumList(); +            foreach( Meta::AlbumPtr album, tmp )
> {
> if( m_albumQueryMode == QueryMaker::AllAlbums
> > > ( m_albumQueryMode == QueryMaker::OnlyCompilations && album->isCompilation() )
> @@ -231,7 +238,8 @@ MemoryQueryMakerInternal::handleResult()
> case QueryMaker::Artist :
> {
> Meta::ArtistList artists;
> -            foreach( Meta::ArtistPtr artist, m_collection->artistMap().values() )
> +            Meta::ArtistList tmp = coll ? coll->artistMap().values() : \
> Meta::ArtistList(); +            foreach( Meta::ArtistPtr artist, tmp )
> {
> Meta::TrackList tracks = artist->tracks();
> foreach( Meta::TrackPtr track, tracks )
> @@ -252,7 +260,8 @@ MemoryQueryMakerInternal::handleResult()
> case QueryMaker::Composer :
> {
> Meta::ComposerList composers;
> -            foreach( Meta::ComposerPtr composer, \
> m_collection->composerMap().values() ) +            Meta::ComposerList tmp = coll ? \
> coll->composerMap().values() : Meta::ComposerList(); +            foreach( \
> Meta::ComposerPtr composer, tmp ) {
> Meta::TrackList tracks = composer->tracks();
> foreach( Meta::TrackPtr track, tracks )
> @@ -274,7 +283,8 @@ MemoryQueryMakerInternal::handleResult()
> case QueryMaker::Genre :
> {
> Meta::GenreList genres;
> -            foreach( Meta::GenrePtr genre, m_collection->genreMap().values() )
> +            Meta::GenreList tmp = coll ? coll->genreMap().values() : \
> Meta::GenreList(); +            foreach( Meta::GenrePtr genre, tmp )
> {
> Meta::TrackList tracks = genre->tracks();
> foreach( Meta::TrackPtr track, tracks )
> @@ -296,8 +306,9 @@ MemoryQueryMakerInternal::handleResult()
> }
> case QueryMaker::Year :
> {
> -        Meta::YearList years;
> -            foreach( Meta::YearPtr year, m_collection->yearMap().values() )
> +            Meta::YearList years;
> +            Meta::YearList tmp = coll ? coll->yearMap().values() : \
> Meta::YearList(); +            foreach( Meta::YearPtr year, tmp )
> {
> Meta::TrackList tracks = year->tracks();
> foreach( Meta::TrackPtr track, tracks )
> @@ -384,7 +395,7 @@ MemoryQueryMakerInternal::handleResult( const Meta::TrackList \
> &tmpTracks ) count++;
> }
> }
> -            emit newResultReady( m_collection->collectionId(), result );
> +            emit newResultReady( m_collectionId, result );
> break;
> }
> case QueryMaker::Track :
> diff --git a/src/collection/support/MemoryQueryMakerInternal.h \
> b/src/collection/support/MemoryQueryMakerInternal.h index a316495..095c691 100644
> --- a/src/collection/support/MemoryQueryMakerInternal.h
> +++ b/src/collection/support/MemoryQueryMakerInternal.h
> @@ -21,6 +21,8 @@
> #include "meta/Meta.h"
> 
> #include <QObject>
> +#include <QPointer>
> +#include <QWeakPointer>
> 
> class CustomReturnFunction;
> class CustomReturnValue;
> @@ -28,11 +30,27 @@ class MemoryCollection;
> class MemoryFilter;
> class MemoryMatcher;
> 
> +/**
> +  * A helper class for MemoryQueryMaker
> +  * This class will run in a dedicated thread. It exists so the actual \
> MemoryQueryMaker +  * can be safely deleted in the original thread while the query \
> is still running. +  * All relevant information is passed from MemoryQueryMaker to \
> MemoryQueryMakerInternal +  * using the provided setter methods.
> +  */
> class MemoryQueryMakerInternal : public QObject
> {
> Q_OBJECT
> public:
> -    MemoryQueryMakerInternal( MemoryCollection *collection );
> +    /**
> +      * Creates a new MemoryQueryMakerInternal that will query collection.
> +      * This class will run in a dedicated thread. It exists so the actual \
> MemoryQueryMaker +      * can be safely deleted in the original thread while the \
> query is still running. +      * @param guard a class that will be deleted before \
> collection. It is used to +      * ensure that MemoryQueryMakerInternal does not \
> access a dangling MemoryCollection +      * pointer.
> +      * @param collection the MemoryCollection instance that the query should be \
> run on. +      */
> +    MemoryQueryMakerInternal( const QWeakPointer<MemoryCollection> &collection );
> ~MemoryQueryMakerInternal();
> 
> 
> @@ -52,6 +70,7 @@ public:
> void setOrderDescending( bool orderDescending ) { m_orderDescending = \
> orderDescending; } void setOrderByNumberField( bool orderByNumberField ) { \
> m_orderByNumberField = orderByNumberField; } void setOrderByField( qint64 \
> orderByField ) { m_orderByField = orderByField; } +    void setCollectionId( const \
> QString &collectionId ) { m_collectionId = collectionId; } 
> signals:
> void newResultReady( QString collectionId, Meta::TrackList );
> @@ -68,7 +87,8 @@ private:
> void emitProperResult( const QList<PointerType > &list );
> 
> private:
> -    MemoryCollection *m_collection;
> +    QWeakPointer<MemoryCollection> m_collection;
> +    QPointer<QObject> m_guard;
> MemoryMatcher *m_matchers;
> MemoryFilter *m_filters;
> bool m_randomize;
> @@ -79,6 +99,7 @@ private:
> bool m_orderDescending;
> bool m_orderByNumberField;
> qint64 m_orderByField;
> +    QString m_collectionId;
> QList<CustomReturnFunction*> m_returnFunctions;
> QList<CustomReturnValue*> m_returnValues;
> };
> diff --git a/src/collection/support/PlaylistCollection.cpp \
> b/src/collection/support/PlaylistCollection.cpp index 5618833..0c4d732 100644
> --- a/src/collection/support/PlaylistCollection.cpp
> +++ b/src/collection/support/PlaylistCollection.cpp
> @@ -22,17 +22,17 @@
> 
> PlaylistCollection::PlaylistCollection( const Meta::PlaylistPtr &playlist )
> > Amarok::Collection()
> -        , MemoryCollection()
> , Meta::PlaylistObserver()
> , m_playlist( playlist )
> +        , m_mc( new MemoryCollection() )
> {
> subscribeTo( playlist );
> -    acquireWriteLock();
> +    m_mc->acquireWriteLock();
> foreach( const Meta::TrackPtr &track, m_playlist->tracks() )
> {
> insertTrack( track );
> }
> -    releaseLock();
> +    m_mc->releaseLock();
> }
> 
> PlaylistCollection::~PlaylistCollection()
> @@ -43,7 +43,7 @@ PlaylistCollection::~PlaylistCollection()
> QueryMaker*
> PlaylistCollection::queryMaker()
> {
> -    return new MemoryQueryMaker( this, collectionId() );
> +    return new MemoryQueryMaker( m_mc.toWeakRef(), collectionId() );
> }
> 
> CollectionLocation*
> @@ -82,9 +82,9 @@ PlaylistCollection::trackAdded( Meta::PlaylistPtr playlist, \
> Meta::TrackPtr track 
> if( track )
> {
> -        acquireWriteLock();
> +        m_mc->acquireWriteLock();
> insertTrack( track );
> -        releaseLock();
> +        m_mc->releaseLock();
> }
> }
> 
> @@ -96,35 +96,35 @@ PlaylistCollection::trackRemoved( Meta::PlaylistPtr playlist, \
> int position ) //ok, what now? is the removed track still availabe at position
> //as this is not clear from the API, and apparently not used
> //anywhere, do it the hard way...
> -    acquireWriteLock();
> -    setTrackMap( TrackMap() );
> -    setArtistMap( ArtistMap() );
> -    setAlbumMap( AlbumMap() );
> -    setGenreMap( GenreMap() );
> -    setComposerMap( ComposerMap() );
> -    setYearMap( YearMap() );
> +    m_mc->acquireWriteLock();
> +    m_mc->setTrackMap( TrackMap() );
> +    m_mc->setArtistMap( ArtistMap() );
> +    m_mc->setAlbumMap( AlbumMap() );
> +    m_mc->setGenreMap( GenreMap() );
> +    m_mc->setComposerMap( ComposerMap() );
> +    m_mc->setYearMap( YearMap() );
> foreach( const Meta::TrackPtr &track, playlist->tracks() )
> {
> insertTrack( track );
> }
> -    releaseLock();
> +    m_mc->releaseLock();
> }
> 
> //should be moved to MemoryCollection I guess
> void
> PlaylistCollection::insertTrack( const Meta::TrackPtr &track )
> {
> -    addTrack( track );
> +    m_mc->addTrack( track );
> if( track->artist() )
> -        addArtist( track->artist() );
> +        m_mc->addArtist( track->artist() );
> if( track->album() )
> -        addAlbum( track->album() );
> +        m_mc->addAlbum( track->album() );
> if( track->composer() )
> -        addComposer( track->composer() );
> +        m_mc->addComposer( track->composer() );
> if( track->genre() )
> -        addGenre( track->genre() );
> +        m_mc->addGenre( track->genre() );
> if( track->year() )
> -        addYear( track->year() );
> +        m_mc->addYear( track->year() );
> }
> 
> Meta::PlaylistPtr
> diff --git a/src/collection/support/PlaylistCollection.h \
> b/src/collection/support/PlaylistCollection.h index f92564a..586d6cf 100644
> --- a/src/collection/support/PlaylistCollection.h
> +++ b/src/collection/support/PlaylistCollection.h
> @@ -21,11 +21,13 @@
> #include "MemoryCollection.h"
> #include "meta/Playlist.h"
> 
> +#include <QSharedPointer>
> +
> /**
> * Utility class that wraps a playlist as collection and makes it possible to
> * query the content of the playlist using QueryMaker.
> */
> -class PlaylistCollection : public Amarok::Collection, public MemoryCollection, \
> public Meta::PlaylistObserver +class PlaylistCollection : public \
> Amarok::Collection, public Meta::PlaylistObserver {
> public:
> PlaylistCollection( const Meta::PlaylistPtr &playlist );
> @@ -46,6 +48,8 @@ private:
> void insertTrack( const Meta::TrackPtr &track );
> 
> Meta::PlaylistPtr m_playlist;
> +
> +    QSharedPointer<MemoryCollection> m_mc;
> };
> 
> #endif // PLAYLISTCOLLECTION_H
> diff --git a/src/collection/umscollection/UmsCollection.cpp \
> b/src/collection/umscollection/UmsCollection.cpp index 95868b7..e07feed 100644
> --- a/src/collection/umscollection/UmsCollection.cpp
> +++ b/src/collection/umscollection/UmsCollection.cpp
> @@ -69,7 +69,7 @@ UmsCollection::trackForUrl( const KUrl &url )
> QString uid = QUrl::fromPercentEncoding( url.url().toUtf8() );
> if( uid.startsWith("file://") )
> uid = uid.remove( 0, 7 );
> -    Meta::TrackPtr umsTrack = m_trackMap.value( uid );
> +    Meta::TrackPtr umsTrack = memoryCollection()->trackMap().value( uid );
> return umsTrack ? umsTrack : Collection::trackForUrl(url);
> }
> 
> diff --git a/src/services/DynamicServiceQueryMaker.cpp \
> b/src/services/DynamicServiceQueryMaker.cpp index 9a4987d..0b2a1bc 100644
> --- a/src/services/DynamicServiceQueryMaker.cpp
> +++ b/src/services/DynamicServiceQueryMaker.cpp
> @@ -18,6 +18,7 @@
> #include "DynamicServiceQueryMaker.h"
> 
> #include "Debug.h"
> +#include "ServiceCollection.h"
> 
> using namespace Meta;
> 
> @@ -156,6 +157,31 @@ QueryMaker * DynamicServiceQueryMaker::limitMaxResultSize(int \
> size) return this;
> }
> 
> +AlbumList
> +DynamicServiceQueryMaker::matchAlbums( ServiceCollection *coll, const \
> Meta::ArtistPtr &artist ) +{
> +    if( !artist || !coll )
> +        return AlbumList();
> +    ArtistMap artistMap = coll->artistMap();
> +    if ( artist && artistMap.contains( artist->name() ) )
> +    {
> +        ArtistPtr artist = artistMap.value( artist->name() );
> +
> +        AlbumList matchingAlbums;
> +        AlbumList albums = coll->albumMap().values();
> +
> +        foreach( AlbumPtr albumPtr, albums ) {
> +
> +            if ( albumPtr->albumArtist() == artist )
> +                matchingAlbums.push_back( albumPtr );
> +        }
> +
> +        return matchingAlbums;
> +    }
> +    else
> +        return AlbumList();
> +}
> +
> 
> #include "DynamicServiceQueryMaker.moc"
> 
> diff --git a/src/services/DynamicServiceQueryMaker.h \
> b/src/services/DynamicServiceQueryMaker.h index 4787bd8..be6d7ae 100644
> --- a/src/services/DynamicServiceQueryMaker.h
> +++ b/src/services/DynamicServiceQueryMaker.h
> @@ -24,6 +24,8 @@
> 
> #include <kio/jobclasses.h>
> 
> +class ServiceCollection;
> +
> namespace ThreadWeaver
> {
> class Job;
> @@ -85,6 +87,8 @@ public:
> virtual QueryMaker* beginAnd() { return this; }
> virtual QueryMaker* beginOr() { return this; }
> virtual QueryMaker* endAndOr() { return this; }
> +
> +    static Meta::AlbumList matchAlbums( ServiceCollection *coll, const \
> Meta::ArtistPtr &artist ); };
> 
> #endif
> diff --git a/src/services/ServiceCollection.cpp \
> b/src/services/ServiceCollection.cpp index 8911df3..c4d3a0e 100644
> --- a/src/services/ServiceCollection.cpp
> +++ b/src/services/ServiceCollection.cpp
> @@ -35,15 +35,15 @@ using namespace Meta;
> 
> ServiceCollection::ServiceCollection( ServiceBase * service )
> > Collection()
> -    , MemoryCollection()
> , m_service( service )
> +    , m_mc( new MemoryCollection() )
> {
> }
> 
> ServiceCollection::ServiceCollection( ServiceBase * service, const QString &id, \
> const QString &prettyName ) : Collection()
> -    , MemoryCollection()
> , m_service( service )
> +    , m_mc( new MemoryCollection() )
> , m_collectionId( id )
> , m_prettyName( prettyName )
> {
> @@ -62,7 +62,7 @@ ServiceCollection::startFullScan()
> QueryMaker*
> ServiceCollection::queryMaker()
> {
> -    return new MemoryQueryMaker( this, collectionId() );
> +    return new MemoryQueryMaker( m_mc.toWeakRef(), collectionId() );
> }
> 
> QString
> @@ -97,7 +97,7 @@ void ServiceCollection::emitUpdated()
> 
> void ServiceCollection::addTrack( Meta::TrackPtr trackPtr )
> {
> -    MemoryCollection::addTrack( trackPtr );
> +    m_mc->addTrack( trackPtr );
> const Meta::ServiceTrackPtr track = Meta::ServiceTrackPtr::dynamicCast( trackPtr );
> 
> if ( track && track->id() != 0 )
> @@ -106,7 +106,7 @@ void ServiceCollection::addTrack( Meta::TrackPtr trackPtr )
> 
> void ServiceCollection::addArtist( Meta::ArtistPtr artistPtr )
> {
> -    MemoryCollection::addArtist( artistPtr );
> +    m_mc->addArtist( artistPtr );
> const Meta::ServiceArtistPtr artist = Meta::ServiceArtistPtr::dynamicCast( \
> artistPtr ); 
> if ( artist && artist->id() != 0 )
> @@ -115,7 +115,7 @@ void ServiceCollection::addArtist( Meta::ArtistPtr artistPtr )
> 
> void ServiceCollection::addAlbum( Meta::AlbumPtr albumPtr )
> {
> -    MemoryCollection::addAlbum( albumPtr );
> +    m_mc->addAlbum( albumPtr );
> const Meta::ServiceAlbumPtr album = Meta::ServiceAlbumPtr::dynamicCast( albumPtr );
> 
> if ( album && album->id() != 0 )
> @@ -124,7 +124,7 @@ void ServiceCollection::addAlbum( Meta::AlbumPtr albumPtr )
> 
> void ServiceCollection::addGenre( Meta::GenrePtr genrePtr )
> {
> -    MemoryCollection::addGenre( genrePtr );
> +    m_mc->addGenre( genrePtr );
> const Meta::ServiceGenrePtr genre = Meta::ServiceGenrePtr::dynamicCast( genrePtr );
> 
> if ( genre && genre->id() != 0 )
> diff --git a/src/services/ServiceCollection.h b/src/services/ServiceCollection.h
> index 3aac7db..47974a5 100644
> --- a/src/services/ServiceCollection.h
> +++ b/src/services/ServiceCollection.h
> @@ -27,6 +27,7 @@
> #include <KIcon>
> 
> #include <QtGlobal>
> +#include <QSharedPointer>
> 
> typedef QMap<int, Meta::TrackPtr> TrackIdMap;
> typedef QMap<int, Meta::ArtistPtr> ArtistIdMap;
> @@ -38,7 +39,7 @@ typedef QMap<int, Meta::GenrePtr> GenreIdMap;
> *  fetch their data from somewhere ( a web service, an external program, etc....)
> */
> 
> -class AMAROK_EXPORT ServiceCollection : public Amarok::Collection, public \
> MemoryCollection +class AMAROK_EXPORT ServiceCollection : public Amarok::Collection
> {
> Q_OBJECT
> public:
> @@ -83,8 +84,22 @@ class AMAROK_EXPORT ServiceCollection : public \
> Amarok::Collection, public Memory 
> ServiceBase * service();
> 
> +        //convenience functions for subclasses
> +        void acquireWriteLock() { m_mc->acquireWriteLock(); }
> +        void acquireReadLock() { m_mc->acquireReadLock(); }
> +        void releaseLock() { m_mc->releaseLock(); }
> +        GenreMap genreMap() const { return m_mc->genreMap(); }
> +        void setGenreMap( const GenreMap &map ) { m_mc->setGenreMap( map ); }
> +        ArtistMap artistMap() const { return m_mc->artistMap(); }
> +        void setArtistMap( const ArtistMap &map ) { m_mc->setArtistMap( map ); }
> +        TrackMap trackMap() const { return m_mc->trackMap(); }
> +        void setTrackMap( const TrackMap &map ) { m_mc->setTrackMap( map ); }
> +        AlbumMap albumMap() const { return m_mc->albumMap(); }
> +        void setAlbumMap( const AlbumMap &map ) { m_mc->setAlbumMap( map ); }
> +
> private:
> ServiceBase * m_service;
> +        QSharedPointer<MemoryCollection> m_mc;
> 
> ServiceMetaFactory * m_metaFactory;
> 
> diff --git a/src/services/ampache/AmpacheServiceQueryMaker.cpp \
> b/src/services/ampache/AmpacheServiceQueryMaker.cpp index be8c07d..6946a97 100644
> --- a/src/services/ampache/AmpacheServiceQueryMaker.cpp
> +++ b/src/services/ampache/AmpacheServiceQueryMaker.cpp
> @@ -291,8 +291,7 @@ AmpacheServiceQueryMaker::fetchAlbums()
> 
> if( !m_parentArtistId.isEmpty() )
> {
> -        ArtistMatcher artistMatcher( m_collection->artistById( \
>                 m_parentArtistId.toInt() ) );
> -        albums = artistMatcher.matchAlbums( m_collection );
> +        albums = matchAlbums( m_collection, m_collection->artistById( \
> m_parentArtistId.toInt() ) ); }
> 
> if ( albums.count() > 0 )
> @@ -337,12 +336,12 @@ AmpacheServiceQueryMaker::fetchTracks()
> if( !m_parentAlbumId.isEmpty() )
> {
> AlbumMatcher albumMatcher( m_collection->albumById( m_parentAlbumId.toInt() ) );
> -        tracks = albumMatcher.match( m_collection );
> +        tracks = albumMatcher.match( m_collection->trackMap().values() );
> }
> else if ( !m_parentArtistId.isEmpty() )
> {
> ArtistMatcher artistMatcher( m_collection->artistById( m_parentArtistId.toInt() ) \
>                 );
> -        tracks = artistMatcher.match( m_collection );
> +        tracks = artistMatcher.match( m_collection->trackMap().values() );
> }
> 
> if( tracks.count() > 0 )
> diff --git a/src/services/lastfm/LastFmServiceCollection.cpp \
> b/src/services/lastfm/LastFmServiceCollection.cpp index 60da87f..c7bc153 100644
> --- a/src/services/lastfm/LastFmServiceCollection.cpp
> +++ b/src/services/lastfm/LastFmServiceCollection.cpp
> @@ -328,7 +328,7 @@ LastFmServiceCollection::queryMaker()
> {
> // TODO
> //return new LastFmServiceQueryMaker( this );
> -    return new MemoryQueryMaker( this, collectionId() );
> +    return ServiceCollection::queryMaker();
> }
> 
> #include "LastFmServiceCollection.moc"
> diff --git a/src/services/mp3tunes/Mp3tunesServiceQueryMaker.cpp \
> b/src/services/mp3tunes/Mp3tunesServiceQueryMaker.cpp index 556c048..6c995f5 100644
> --- a/src/services/mp3tunes/Mp3tunesServiceQueryMaker.cpp
> +++ b/src/services/mp3tunes/Mp3tunesServiceQueryMaker.cpp
> @@ -257,8 +257,7 @@ void Mp3tunesServiceQueryMaker::fetchAlbums()
> debug() << "Fetching Albums for parentArtist id: " << m_parentArtistId;
> 
> if ( !m_parentArtistId.isEmpty() ) {
> -        ArtistMatcher artistMatcher( m_collection->artistById( \
>                 m_parentArtistId.toInt() ) );
> -        albums = artistMatcher.matchAlbums( m_collection );
> +        albums = matchAlbums( m_collection, m_collection->artistById( \
> m_parentArtistId.toInt() ) ); } else {
> debug() << "parent id empty";
> return;
> @@ -288,10 +287,10 @@ void Mp3tunesServiceQueryMaker::fetchTracks()
> 
> if ( !m_parentArtistId.isEmpty() ) {
> ArtistMatcher artistMatcher( m_collection->artistById( m_parentArtistId.toInt() ) \
>                 );
> -        tracks = artistMatcher.match( m_collection );
> +        tracks = artistMatcher.match( m_collection->trackMap().values() );
> } else if ( !m_parentAlbumId.isEmpty() ) {
> AlbumMatcher albumMatcher( m_collection->albumById( m_parentAlbumId.toInt() ) );
> -        tracks = albumMatcher.match( m_collection );
> +        tracks = albumMatcher.match( m_collection->trackMap().values() );
> } else {
> debug() << "parent id empty";
> return;
> diff --git a/src/services/scriptable/ScriptableServiceQueryMaker.cpp \
> b/src/services/scriptable/ScriptableServiceQueryMaker.cpp index 493b5f6..eb5a9ab \
>                 100644
> --- a/src/services/scriptable/ScriptableServiceQueryMaker.cpp
> +++ b/src/services/scriptable/ScriptableServiceQueryMaker.cpp
> @@ -321,8 +321,7 @@ void ScriptableServiceQueryMaker::fetchAlbums()
> 
> if ( d->parentId != -1 )
> {
> -        ArtistMatcher artistMatcher( m_collection->artistById( d->parentId ) );
> -        albums = artistMatcher.matchAlbums( m_collection );
> +        albums = matchAlbums( m_collection, m_collection->artistById( d->parentId \
> ) ); }
> else
> albums = m_collection->albumMap().values();
> @@ -348,7 +347,7 @@ void ScriptableServiceQueryMaker::fetchTracks()
> if ( d->parentId != -1 && ( album = m_collection->albumById( d->parentId ) ) )
> {
> AlbumMatcher albumMatcher( album );
> -        tracks = albumMatcher.match( m_collection );
> +        tracks = albumMatcher.match( m_collection->trackMap().values() );
> }
> else
> tracks = m_collection->trackMap().values();
> @@ -404,8 +403,7 @@ void ScriptableServiceQueryMaker::slotScriptComplete()
> AlbumList albums;
> if ( d->parentId != -1 )
> {
> -           ArtistMatcher artistMatcher( m_collection->artistById( d->parentId ) );
> -            albums = artistMatcher.matchAlbums( m_collection );
> +            albums = matchAlbums( m_collection, m_collection->artistById( \
> d->parentId ) ); }
> else
> albums = m_collection->albumMap().values();
> @@ -422,7 +420,7 @@ void ScriptableServiceQueryMaker::slotScriptComplete()
> if( album )
> {
> AlbumMatcher albumMatcher( album );
> -                tracks = albumMatcher.match( m_collection );
> +                tracks = albumMatcher.match( m_collection->trackMap().values() );
> }
> }
> else
> diff --git a/tests/CollectionTestImpl.h b/tests/CollectionTestImpl.h
> index e5828cf..c1a1253 100644
> --- a/tests/CollectionTestImpl.h
> +++ b/tests/CollectionTestImpl.h
> @@ -21,18 +21,20 @@
> #include "collection/support/MemoryCollection.h"
> #include "collection/support/MemoryQueryMaker.h"
> 
> +#include <QSharedPointer>
> +
> //simple Amarok::Collection implementation based on MemoryCollection
> 
> class CollectionLocationTestImpl;
> 
> -class CollectionTestImpl : public Amarok::Collection, public MemoryCollection
> +class CollectionTestImpl : public Amarok::Collection
> {
> public:
> CollectionTestImpl( const QString &collectionId )
> -        : Amarok::Collection(), MemoryCollection()
> +        : Amarok::Collection(), mc( new MemoryCollection() )
> { this->id = collectionId; }
> 
> -    QueryMaker* queryMaker() { return new MemoryQueryMaker( this, id ); }
> +    QueryMaker* queryMaker() { return new MemoryQueryMaker( mc.toWeakRef(), id ); \
> } 
> KIcon icon() const { return KIcon(); }
> 
> @@ -41,6 +43,8 @@ public:
> 
> QString id;
> 
> +    QSharedPointer<MemoryCollection> mc;
> +
> };
> 
> #endif
> diff --git a/tests/collection/support/TestMemoryQueryMaker.cpp \
> b/tests/collection/support/TestMemoryQueryMaker.cpp index 1cced89..77bc3d8 100644
> --- a/tests/collection/support/TestMemoryQueryMaker.cpp
> +++ b/tests/collection/support/TestMemoryQueryMaker.cpp
> @@ -27,6 +27,7 @@
> #include "mocks/MockTrack.h"
> 
> #include <QVariantMap>
> +#include <QSharedPointer>
> #include <QSignalSpy>
> 
> #include <KCmdLineArgs>
> @@ -53,14 +54,15 @@ TestMemoryQueryMaker::TestMemoryQueryMaker()
> void
> TestMemoryQueryMaker::testDeleteQueryMakerWhileQueryIsRunning()
> {
> -    MemoryCollection mc;
> -    mc.addTrack( Meta::TrackPtr( new MetaMock( QVariantMap() )));
> -    mc.addTrack( Meta::TrackPtr( new MetaMock( QVariantMap() )));
> -    Meta::MockTrack *mock = new Meta::MockTrack();
> -    EXPECT_CALL( *mock, uidUrl() ).Times( AnyNumber() ).WillRepeatedly( Return( \
>                 "track3" ) );
> -    mc.addTrack( Meta::TrackPtr( mock ) );
> -
> -    MemoryQueryMaker *qm = new MemoryQueryMaker( &mc, "test" );
> +    QSharedPointer<MemoryCollection> mc( new MemoryCollection() );
> +    mc->addTrack( Meta::TrackPtr( new MetaMock( QVariantMap() )));
> +    mc->addTrack( Meta::TrackPtr( new MetaMock( QVariantMap() )));
> +    //Meta::MockTrack *mock = new Meta::MockTrack();
> +    //EXPECT_CALL( *mock, uidUrl() ).Times( AnyNumber() ).WillRepeatedly( Return( \
> "track3" ) ); +    //Meta::TrackPtr trackPtr( mock );
> +    //mc.addTrack( trackPtr );
> +
> +    MemoryQueryMaker *qm = new MemoryQueryMaker( mc.toWeakRef(), "test" );
> qm->setQueryType( QueryMaker::Track );
> 
> qm->run();
> @@ -72,7 +74,7 @@ TestMemoryQueryMaker::testDeleteQueryMakerWhileQueryIsRunning()
> void
> TestMemoryQueryMaker::testDeleteCollectionWhileQueryIsRunning()
> {
> -    MemoryCollection *mc = new MemoryCollection();
> +    QSharedPointer<MemoryCollection> mc( new MemoryCollection() );
> mc->addTrack( Meta::TrackPtr( new MetaMock( QVariantMap() )));
> mc->addTrack( Meta::TrackPtr( new MetaMock( QVariantMap() )));
> 
> @@ -82,7 +84,7 @@ TestMemoryQueryMaker::testDeleteCollectionWhileQueryIsRunning()
> QSignalSpy spy( qm, SIGNAL(queryDone()));
> 
> qm->run();
> -    delete mc;
> +    mc.clear();
> QTest::qWait( 500 );
> QCOMPARE( spy.count(), 1 );
> 
> diff --git a/tests/synchronization/TestMasterSlaveSynchronizationJob.cpp \
> b/tests/synchronization/TestMasterSlaveSynchronizationJob.cpp index \
>                 3be245f..d735234 100644
> --- a/tests/synchronization/TestMasterSlaveSynchronizationJob.cpp
> +++ b/tests/synchronization/TestMasterSlaveSynchronizationJob.cpp
> @@ -55,12 +55,12 @@ public:
> void removeUrlsFromCollection( const Meta::TrackList &sources )
> {
> trackRemoveCount += sources.count();
> -        coll->acquireWriteLock();
> -        TrackMap map = coll->trackMap();
> +        coll->mc->acquireWriteLock();
> +        TrackMap map = coll->mc->trackMap();
> foreach( const Meta::TrackPtr &track, sources )
> map.remove( track->uidUrl() );
> -        coll->setTrackMap( map );
> -        coll->releaseLock();
> +        coll->mc->setTrackMap( map );
> +        coll->mc->releaseLock();
> slotRemoveOperationFinished();
> }
> 
> @@ -69,7 +69,7 @@ public:
> trackCopyCount = sources.count();
> foreach( const Meta::TrackPtr &track, sources.keys() )
> {
> -            coll->addTrack( track );
> +            coll->mc->addTrack( track );
> }
> }
> };
> @@ -96,9 +96,9 @@ void addMockTrack( CollectionTestImpl *coll, const QString \
> &trackName, const QSt EXPECT_CALL( *track, uidUrl() ).Times( AnyNumber() \
> ).WillRepeatedly( Return( trackName + "_" + artistName + "_" + albumName ) ); \
> EXPECT_CALL( *track, isPlayable() ).Times( AnyNumber() ).WillRepeatedly( Return( \
> true ) ); EXPECT_CALL( *track, playableUrl() ).Times( AnyNumber() ).WillRepeatedly( \
>                 Return( KUrl( '/' + track->uidUrl() ) ) );
> -    coll->addTrack( trackPtr );
> +    coll->mc->addTrack( trackPtr );
> 
> -    Meta::AlbumPtr albumPtr = coll->albumMap().value( albumName );
> +    Meta::AlbumPtr albumPtr = coll->mc->albumMap().value( albumName );
> Meta::MockAlbum *album;
> Meta::TrackList albumTracks;
> if( albumPtr )
> @@ -118,14 +118,14 @@ void addMockTrack( CollectionTestImpl *coll, const QString \
> &trackName, const QSt albumPtr = Meta::AlbumPtr( album );
> EXPECT_CALL( *album, name() ).Times( AnyNumber() ).WillRepeatedly( Return( \
> albumName ) ); EXPECT_CALL( *album, hasAlbumArtist() ).Times( AnyNumber() \
>                 ).WillRepeatedly( Return( false ) );
> -        coll->addAlbum( albumPtr );
> +        coll->mc->addAlbum( albumPtr );
> }
> albumTracks << trackPtr;
> EXPECT_CALL( *album, tracks() ).Times( AnyNumber() ).WillRepeatedly( Return( \
> albumTracks ) ); 
> EXPECT_CALL( *track, album() ).Times( AnyNumber() ).WillRepeatedly( Return( \
> albumPtr ) ); 
> -    Meta::ArtistPtr artistPtr = coll->artistMap().value( artistName );
> +    Meta::ArtistPtr artistPtr = coll->mc->artistMap().value( artistName );
> Meta::MockArtist *artist;
> Meta::TrackList artistTracks;
> if( artistPtr )
> @@ -144,7 +144,7 @@ void addMockTrack( CollectionTestImpl *coll, const QString \
> &trackName, const QSt ::testing::Mock::AllowLeak( artist );
> artistPtr = Meta::ArtistPtr( artist );
> EXPECT_CALL( *artist, name() ).Times( AnyNumber() ).WillRepeatedly( Return( \
>                 artistName ) );
> -        coll->addArtist( artistPtr );
> +        coll->mc->addArtist( artistPtr );
> }
> artistTracks << trackPtr;
> EXPECT_CALL( *artist, tracks() ).Times( AnyNumber() ).WillRepeatedly( Return( \
> artistTracks ) ); @@ -175,8 +175,8 @@ \
> TestMasterSlaveSynchronizationJob::testAddTracksToEmptySlave() 
> //setup master
> addMockTrack( master, "track1", "artist1", "album1" );
> -    QCOMPARE( master->trackMap().count(), 1 );
> -    QCOMPARE( slave->trackMap().count(), 0 );
> +    QCOMPARE( master->mc->trackMap().count(), 1 );
> +    QCOMPARE( slave->mc->trackMap().count(), 0 );
> QCOMPARE( trackCopyCount, 0 );
> QCOMPARE( trackRemoveCount, 0 );
> 
> @@ -188,8 +188,8 @@ TestMasterSlaveSynchronizationJob::testAddTracksToEmptySlave()
> 
> QCOMPARE( trackCopyCount, 1 );
> QCOMPARE( trackRemoveCount, 0 );
> -    QCOMPARE( master->trackMap().count(), 1 );
> -    QCOMPARE( slave->trackMap().count(), 1 );
> +    QCOMPARE( master->mc->trackMap().count(), 1 );
> +    QCOMPARE( slave->mc->trackMap().count(), 1 );
> delete master;
> delete slave;
> }
> @@ -205,8 +205,8 @@ TestMasterSlaveSynchronizationJob::testAddSingleTrack()
> addMockTrack( slave, "track1", "artist1", "album1" );
> addMockTrack( master, "track2", "artist1", "album1" );
> 
> -    QCOMPARE( master->trackMap().count(), 2 );
> -    QCOMPARE( slave->trackMap().count(), 1 );
> +    QCOMPARE( master->mc->trackMap().count(), 2 );
> +    QCOMPARE( slave->mc->trackMap().count(), 1 );
> QCOMPARE( trackCopyCount, 0 );
> QCOMPARE( trackRemoveCount, 0 );
> 
> @@ -220,8 +220,8 @@ TestMasterSlaveSynchronizationJob::testAddSingleTrack()
> //verify
> QCOMPARE( trackCopyCount, 1 );
> QCOMPARE( trackRemoveCount, 0 );
> -    QCOMPARE( master->trackMap().count(), 2 );
> -    QCOMPARE( slave->trackMap().count(), 2 );
> +    QCOMPARE( master->mc->trackMap().count(), 2 );
> +    QCOMPARE( slave->mc->trackMap().count(), 2 );
> 
> delete master;
> delete slave;
> @@ -238,8 +238,8 @@ TestMasterSlaveSynchronizationJob::testAddAlbum()
> addMockTrack( slave, "track1", "artist1", "album1" );
> addMockTrack( master, "track1", "artist1", "album2" );
> 
> -    QCOMPARE( master->trackMap().count(), 2 );
> -    QCOMPARE( slave->trackMap().count(), 1 );
> +    QCOMPARE( master->mc->trackMap().count(), 2 );
> +    QCOMPARE( slave->mc->trackMap().count(), 1 );
> QCOMPARE( trackCopyCount, 0 );
> QCOMPARE( trackRemoveCount, 0 );
> 
> @@ -253,8 +253,8 @@ TestMasterSlaveSynchronizationJob::testAddAlbum()
> //verify
> QCOMPARE( trackCopyCount, 1 );
> QCOMPARE( trackRemoveCount, 0 );
> -    QCOMPARE( master->trackMap().count(), 2 );
> -    QCOMPARE( slave->trackMap().count(), 2 );
> +    QCOMPARE( master->mc->trackMap().count(), 2 );
> +    QCOMPARE( slave->mc->trackMap().count(), 2 );
> 
> delete master;
> delete slave;
> @@ -271,8 +271,8 @@ TestMasterSlaveSynchronizationJob::testAddArtist()
> addMockTrack( slave, "track1", "artist1", "album1" );
> addMockTrack( master, "track1", "artist2", "album1" );
> 
> -    QCOMPARE( master->trackMap().count(), 2 );
> -    QCOMPARE( slave->trackMap().count(), 1 );
> +    QCOMPARE( master->mc->trackMap().count(), 2 );
> +    QCOMPARE( slave->mc->trackMap().count(), 1 );
> QCOMPARE( trackCopyCount, 0 );
> QCOMPARE( trackRemoveCount, 0 );
> 
> @@ -286,8 +286,8 @@ TestMasterSlaveSynchronizationJob::testAddArtist()
> //verify
> QCOMPARE( trackCopyCount, 1 );
> QCOMPARE( trackRemoveCount, 0 );
> -    QCOMPARE( master->trackMap().count(), 2 );
> -    QCOMPARE( slave->trackMap().count(), 2 );
> +    QCOMPARE( master->mc->trackMap().count(), 2 );
> +    QCOMPARE( slave->mc->trackMap().count(), 2 );
> 
> delete master;
> delete slave;
> @@ -308,8 +308,8 @@ TestMasterSlaveSynchronizationJob::testRemoveSingleTrack()
> addMockTrack( slave, "track1", "artist1", "album1" );
> addMockTrack( slave, "track2", "artist1", "album1" );
> 
> -    QCOMPARE( master->trackMap().count(), 1 );
> -    QCOMPARE( slave->trackMap().count(), 2 );
> +    QCOMPARE( master->mc->trackMap().count(), 1 );
> +    QCOMPARE( slave->mc->trackMap().count(), 2 );
> QCOMPARE( trackCopyCount, 0 );
> QCOMPARE( trackRemoveCount, 0 );
> 
> @@ -323,8 +323,8 @@ TestMasterSlaveSynchronizationJob::testRemoveSingleTrack()
> //verify
> QCOMPARE( trackCopyCount, 0 );
> QCOMPARE( trackRemoveCount, 1 );
> -    QCOMPARE( master->trackMap().count(), 1 );
> -    QCOMPARE( slave->trackMap().count(), 1 );
> +    QCOMPARE( master->mc->trackMap().count(), 1 );
> +    QCOMPARE( slave->mc->trackMap().count(), 1 );
> 
> delete master;
> delete slave;
> @@ -346,8 +346,8 @@ TestMasterSlaveSynchronizationJob::testRemoveAlbum()
> addMockTrack( slave, "track1", "artist1", "album1" );
> addMockTrack( slave, "track1", "artist1", "album2" );
> 
> -    QCOMPARE( master->trackMap().count(), 1 );
> -    QCOMPARE( slave->trackMap().count(), 2 );
> +    QCOMPARE( master->mc->trackMap().count(), 1 );
> +    QCOMPARE( slave->mc->trackMap().count(), 2 );
> QCOMPARE( trackCopyCount, 0 );
> QCOMPARE( trackRemoveCount, 0 );
> 
> @@ -361,8 +361,8 @@ TestMasterSlaveSynchronizationJob::testRemoveAlbum()
> //verify
> QCOMPARE( trackCopyCount, 0 );
> QCOMPARE( trackRemoveCount, 1 );
> -    QCOMPARE( master->trackMap().count(), 1 );
> -    QCOMPARE( slave->trackMap().count(), 1 );
> +    QCOMPARE( master->mc->trackMap().count(), 1 );
> +    QCOMPARE( slave->mc->trackMap().count(), 1 );
> 
> delete master;
> delete slave;
> @@ -384,8 +384,8 @@ TestMasterSlaveSynchronizationJob::testRemoveArtist()
> addMockTrack( slave, "track1", "artist1", "album1" );
> addMockTrack( slave, "track1", "artist2", "album1" );
> 
> -    QCOMPARE( master->trackMap().count(), 1 );
> -    QCOMPARE( slave->trackMap().count(), 2 );
> +    QCOMPARE( master->mc->trackMap().count(), 1 );
> +    QCOMPARE( slave->mc->trackMap().count(), 2 );
> QCOMPARE( trackCopyCount, 0 );
> QCOMPARE( trackRemoveCount, 0 );
> 
> @@ -399,8 +399,8 @@ TestMasterSlaveSynchronizationJob::testRemoveArtist()
> //verify
> QCOMPARE( trackCopyCount, 0 );
> QCOMPARE( trackRemoveCount, 1 );
> -    QCOMPARE( master->trackMap().count(), 1 );
> -    QCOMPARE( slave->trackMap().count(), 1 );
> +    QCOMPARE( master->mc->trackMap().count(), 1 );
> +    QCOMPARE( slave->mc->trackMap().count(), 1 );
> 
> delete master;
> delete slave;
> @@ -419,8 +419,8 @@ TestMasterSlaveSynchronizationJob::testEmptyMaster()
> 
> //setup master
> addMockTrack( slave, "track1", "artist1", "album1" );
> -    QCOMPARE( master->trackMap().count(), 0 );
> -    QCOMPARE( slave->trackMap().count(), 1 );
> +    QCOMPARE( master->mc->trackMap().count(), 0 );
> +    QCOMPARE( slave->mc->trackMap().count(), 1 );
> QCOMPARE( trackCopyCount, 0 );
> QCOMPARE( trackRemoveCount, 0 );
> 
> @@ -432,8 +432,8 @@ TestMasterSlaveSynchronizationJob::testEmptyMaster()
> 
> QCOMPARE( trackCopyCount, 0 );
> QCOMPARE( trackRemoveCount, 1 );
> -    QCOMPARE( master->trackMap().count(), 0 );
> -    QCOMPARE( slave->trackMap().count(), 0 );
> +    QCOMPARE( master->mc->trackMap().count(), 0 );
> +    QCOMPARE( slave->mc->trackMap().count(), 0 );
> delete master;
> delete slave;
> delete Amarok::Components::setCollectionLocationDelegate( 0 );
> diff --git a/tests/synchronization/TestOneWaySynchronizationJob.cpp \
> b/tests/synchronization/TestOneWaySynchronizationJob.cpp index 97da60e..5d4f74f \
>                 100644
> --- a/tests/synchronization/TestOneWaySynchronizationJob.cpp
> +++ b/tests/synchronization/TestOneWaySynchronizationJob.cpp
> @@ -49,12 +49,12 @@ public:
> bool isWritable() const { return true; }
> bool remove( const Meta::TrackPtr &track )
> {
> -        coll->acquireWriteLock();
> +        coll->mc->acquireWriteLock();
> //theoretically we should clean up the other maps as well...
> -        TrackMap map = coll->trackMap();
> +        TrackMap map = coll->mc->trackMap();
> map.remove( track->uidUrl() );
> -        coll->setTrackMap( map );
> -        coll->releaseLock();
> +        coll->mc->setTrackMap( map );
> +        coll->mc->releaseLock();
> return true;
> }
> void copyUrlsToCollection(const QMap<Meta::TrackPtr, KUrl> &sources)
> @@ -63,7 +63,7 @@ public:
> trackCopyCount = sources.count();
> foreach( const Meta::TrackPtr &track, sources.keys() )
> {
> -            coll->addTrack( track );
> +            coll->mc->addTrack( track );
> }
> }
> };
> @@ -90,9 +90,9 @@ void addMockTrack( CollectionTestImpl *coll, const QString \
> &trackName, const QSt EXPECT_CALL( *track, uidUrl() ).Times( AnyNumber() \
> ).WillRepeatedly( Return( trackName + "_" + artistName + "_" + albumName ) ); \
> EXPECT_CALL( *track, isPlayable() ).Times( AnyNumber() ).WillRepeatedly( Return( \
> true ) ); EXPECT_CALL( *track, playableUrl() ).Times( AnyNumber() ).WillRepeatedly( \
>                 Return( KUrl( '/' + track->uidUrl() ) ) );
> -    coll->addTrack( trackPtr );
> +    coll->mc->addTrack( trackPtr );
> 
> -    Meta::AlbumPtr albumPtr = coll->albumMap().value( albumName );
> +    Meta::AlbumPtr albumPtr = coll->mc->albumMap().value( albumName );
> Meta::MockAlbum *album;
> Meta::TrackList albumTracks;
> if( albumPtr )
> @@ -112,14 +112,14 @@ void addMockTrack( CollectionTestImpl *coll, const QString \
> &trackName, const QSt albumPtr = Meta::AlbumPtr( album );
> EXPECT_CALL( *album, name() ).Times( AnyNumber() ).WillRepeatedly( Return( \
> albumName ) ); EXPECT_CALL( *album, hasAlbumArtist() ).Times( AnyNumber() \
>                 ).WillRepeatedly( Return( false ) );
> -        coll->addAlbum( albumPtr );
> +        coll->mc->addAlbum( albumPtr );
> }
> albumTracks << trackPtr;
> EXPECT_CALL( *album, tracks() ).Times( AnyNumber() ).WillRepeatedly( Return( \
> albumTracks ) ); 
> EXPECT_CALL( *track, album() ).Times( AnyNumber() ).WillRepeatedly( Return( \
> albumPtr ) ); 
> -    Meta::ArtistPtr artistPtr = coll->artistMap().value( artistName );
> +    Meta::ArtistPtr artistPtr = coll->mc->artistMap().value( artistName );
> Meta::MockArtist *artist;
> Meta::TrackList artistTracks;
> if( artistPtr )
> @@ -138,7 +138,7 @@ void addMockTrack( CollectionTestImpl *coll, const QString \
> &trackName, const QSt ::testing::Mock::AllowLeak( artist );
> artistPtr = Meta::ArtistPtr( artist );
> EXPECT_CALL( *artist, name() ).Times( AnyNumber() ).WillRepeatedly( Return( \
>                 artistName ) );
> -        coll->addArtist( artistPtr );
> +        coll->mc->addArtist( artistPtr );
> }
> artistTracks << trackPtr;
> EXPECT_CALL( *artist, tracks() ).Times( AnyNumber() ).WillRepeatedly( Return( \
> artistTracks ) ); @@ -171,8 +171,8 @@ \
> TestOneWaySynchronizationJob::testAddTrackToTarget() addMockTrack( target, \
> "track1", "artist1", "album1" ); 
> QCOMPARE( trackCopyCount, 0 );
> -    QCOMPARE( source->trackMap().count(), 2 );
> -    QCOMPARE( target->trackMap().count(), 1 );
> +    QCOMPARE( source->mc->trackMap().count(), 2 );
> +    QCOMPARE( target->mc->trackMap().count(), 1 );
> 
> OneWaySynchronizationJob *job = new OneWaySynchronizationJob();
> job->setSource( source );
> @@ -181,8 +181,8 @@ TestOneWaySynchronizationJob::testAddTrackToTarget()
> QTest::kWaitForSignal( job, SIGNAL(destroyed()), 1000 );
> 
> QCOMPARE( trackCopyCount, 1 );
> -    QCOMPARE( source->trackMap().count(), 2 );
> -    QCOMPARE( target->trackMap().count(), 2 );
> +    QCOMPARE( source->mc->trackMap().count(), 2 );
> +    QCOMPARE( target->mc->trackMap().count(), 2 );
> 
> delete source,
> delete target;
> @@ -199,8 +199,8 @@ TestOneWaySynchronizationJob::testAddAlbumToTarget()
> addMockTrack( target, "track1", "artist1", "album1" );
> 
> QCOMPARE( trackCopyCount, 0 );
> -    QCOMPARE( source->trackMap().count(), 2 );
> -    QCOMPARE( target->trackMap().count(), 1 );
> +    QCOMPARE( source->mc->trackMap().count(), 2 );
> +    QCOMPARE( target->mc->trackMap().count(), 1 );
> 
> OneWaySynchronizationJob *job = new OneWaySynchronizationJob();
> job->setSource( source );
> @@ -209,8 +209,8 @@ TestOneWaySynchronizationJob::testAddAlbumToTarget()
> QTest::kWaitForSignal( job, SIGNAL(destroyed()), 1000 );
> 
> QCOMPARE( trackCopyCount, 1 );
> -    QCOMPARE( source->trackMap().count(), 2 );
> -    QCOMPARE( target->trackMap().count(), 2 );
> +    QCOMPARE( source->mc->trackMap().count(), 2 );
> +    QCOMPARE( target->mc->trackMap().count(), 2 );
> 
> delete source,
> delete target;
> @@ -227,8 +227,8 @@ TestOneWaySynchronizationJob::testAddArtistToTarget()
> addMockTrack( target, "track1", "artist1", "album1" );
> 
> QCOMPARE( trackCopyCount, 0 );
> -    QCOMPARE( source->trackMap().count(), 2 );
> -    QCOMPARE( target->trackMap().count(), 1 );
> +    QCOMPARE( source->mc->trackMap().count(), 2 );
> +    QCOMPARE( target->mc->trackMap().count(), 1 );
> 
> OneWaySynchronizationJob *job = new OneWaySynchronizationJob();
> job->setSource( source );
> @@ -237,8 +237,8 @@ TestOneWaySynchronizationJob::testAddArtistToTarget()
> QTest::kWaitForSignal( job, SIGNAL(destroyed()), 1000 );
> 
> QCOMPARE( trackCopyCount, 1 );
> -    QCOMPARE( source->trackMap().count(), 2 );
> -    QCOMPARE( target->trackMap().count(), 2 );
> +    QCOMPARE( source->mc->trackMap().count(), 2 );
> +    QCOMPARE( target->mc->trackMap().count(), 2 );
> 
> delete source,
> delete target;
> @@ -254,8 +254,8 @@ TestOneWaySynchronizationJob::testEmptyTarget()
> addMockTrack( source, "track2", "artist1", "album1" );
> 
> QCOMPARE( trackCopyCount, 0 );
> -    QCOMPARE( source->trackMap().count(), 2 );
> -    QCOMPARE( target->trackMap().count(), 0 );
> +    QCOMPARE( source->mc->trackMap().count(), 2 );
> +    QCOMPARE( target->mc->trackMap().count(), 0 );
> 
> OneWaySynchronizationJob *job = new OneWaySynchronizationJob();
> job->setSource( source );
> @@ -264,8 +264,8 @@ TestOneWaySynchronizationJob::testEmptyTarget()
> QTest::kWaitForSignal( job, SIGNAL(destroyed()), 1000 );
> 
> QCOMPARE( trackCopyCount, 2 );
> -    QCOMPARE( source->trackMap().count(), 2 );
> -    QCOMPARE( target->trackMap().count(), 2 );
> +    QCOMPARE( source->mc->trackMap().count(), 2 );
> +    QCOMPARE( target->mc->trackMap().count(), 2 );
> 
> delete source,
> delete target;
> @@ -280,8 +280,8 @@ \
> TestOneWaySynchronizationJob::testEmptySourceWithNonEmptyTarget() addMockTrack( \
> target, "track1", "artist1", "album1" ); 
> QCOMPARE( trackCopyCount, 0 );
> -    QCOMPARE( source->trackMap().count(), 0 );
> -    QCOMPARE( target->trackMap().count(), 1 );
> +    QCOMPARE( source->mc->trackMap().count(), 0 );
> +    QCOMPARE( target->mc->trackMap().count(), 1 );
> 
> OneWaySynchronizationJob *job = new OneWaySynchronizationJob();
> job->setSource( source );
> @@ -290,8 +290,8 @@ \
> TestOneWaySynchronizationJob::testEmptySourceWithNonEmptyTarget() \
> QTest::kWaitForSignal( job, SIGNAL(destroyed()), 1000 ); 
> QCOMPARE( trackCopyCount, 0 );
> -    QCOMPARE( source->trackMap().count(), 0 );
> -    QCOMPARE( target->trackMap().count(), 1 );
> +    QCOMPARE( source->mc->trackMap().count(), 0 );
> +    QCOMPARE( target->mc->trackMap().count(), 1 );
> 
> delete source,
> delete target;
> @@ -309,8 +309,8 @@ TestOneWaySynchronizationJob::testNoActionNecessary()
> addMockTrack( target, "track2", "artist1", "album1" );
> 
> QCOMPARE( trackCopyCount, 0 );
> -    QCOMPARE( source->trackMap().count(), 2 );
> -    QCOMPARE( target->trackMap().count(), 2 );
> +    QCOMPARE( source->mc->trackMap().count(), 2 );
> +    QCOMPARE( target->mc->trackMap().count(), 2 );
> 
> OneWaySynchronizationJob *job = new OneWaySynchronizationJob();
> job->setSource( source );
> @@ -319,8 +319,8 @@ TestOneWaySynchronizationJob::testNoActionNecessary()
> QTest::kWaitForSignal( job, SIGNAL(destroyed()), 1000 );
> 
> QCOMPARE( trackCopyCount, 0 );
> -    QCOMPARE( source->trackMap().count(), 2 );
> -    QCOMPARE( target->trackMap().count(), 2 );
> +    QCOMPARE( source->mc->trackMap().count(), 2 );
> +    QCOMPARE( target->mc->trackMap().count(), 2 );
> 
> delete source,
> delete target;
> diff --git a/tests/synchronization/TestUnionJob.cpp \
> b/tests/synchronization/TestUnionJob.cpp index 2ab4c74..d4ad28f 100644
> --- a/tests/synchronization/TestUnionJob.cpp
> +++ b/tests/synchronization/TestUnionJob.cpp
> @@ -50,12 +50,12 @@ public:
> bool isWritable() const { return true; }
> bool remove( const Meta::TrackPtr &track )
> {
> -        coll->acquireWriteLock();
> +        coll->mc->acquireWriteLock();
> //theoretically we should clean up the other maps as well...
> -        TrackMap map = coll->trackMap();
> +        TrackMap map = coll->mc->trackMap();
> map.remove( track->uidUrl() );
> -        coll->setTrackMap( map );
> -        coll->releaseLock();
> +        coll->mc->setTrackMap( map );
> +        coll->mc->releaseLock();
> return true;
> }
> void copyUrlsToCollection(const QMap<Meta::TrackPtr, KUrl> &sources)
> @@ -63,7 +63,7 @@ public:
> trackCopyCount << sources.count();
> foreach( const Meta::TrackPtr &track, sources.keys() )
> {
> -            coll->addTrack( track );
> +            coll->mc->addTrack( track );
> }
> }
> };
> @@ -90,9 +90,9 @@ void addMockTrack( CollectionTestImpl *coll, const QString \
> &trackName, const QSt EXPECT_CALL( *track, uidUrl() ).Times( AnyNumber() \
> ).WillRepeatedly( Return( trackName + "_" + artistName + "_" + albumName ) ); \
> EXPECT_CALL( *track, isPlayable() ).Times( AnyNumber() ).WillRepeatedly( Return( \
> true ) ); EXPECT_CALL( *track, playableUrl() ).Times( AnyNumber() ).WillRepeatedly( \
>                 Return( KUrl( '/' + track->uidUrl() ) ) );
> -    coll->addTrack( trackPtr );
> +    coll->mc->addTrack( trackPtr );
> 
> -    Meta::AlbumPtr albumPtr = coll->albumMap().value( albumName );
> +    Meta::AlbumPtr albumPtr = coll->mc->albumMap().value( albumName );
> Meta::MockAlbum *album;
> Meta::TrackList albumTracks;
> if( albumPtr )
> @@ -112,14 +112,14 @@ void addMockTrack( CollectionTestImpl *coll, const QString \
> &trackName, const QSt albumPtr = Meta::AlbumPtr( album );
> EXPECT_CALL( *album, name() ).Times( AnyNumber() ).WillRepeatedly( Return( \
> albumName ) ); EXPECT_CALL( *album, hasAlbumArtist() ).Times( AnyNumber() \
>                 ).WillRepeatedly( Return( false ) );
> -        coll->addAlbum( albumPtr );
> +        coll->mc->addAlbum( albumPtr );
> }
> albumTracks << trackPtr;
> EXPECT_CALL( *album, tracks() ).Times( AnyNumber() ).WillRepeatedly( Return( \
> albumTracks ) ); 
> EXPECT_CALL( *track, album() ).Times( AnyNumber() ).WillRepeatedly( Return( \
> albumPtr ) ); 
> -    Meta::ArtistPtr artistPtr = coll->artistMap().value( artistName );
> +    Meta::ArtistPtr artistPtr = coll->mc->artistMap().value( artistName );
> Meta::MockArtist *artist;
> Meta::TrackList artistTracks;
> if( artistPtr )
> @@ -138,7 +138,7 @@ void addMockTrack( CollectionTestImpl *coll, const QString \
> &trackName, const QSt ::testing::Mock::AllowLeak( artist );
> artistPtr = Meta::ArtistPtr( artist );
> EXPECT_CALL( *artist, name() ).Times( AnyNumber() ).WillRepeatedly( Return( \
>                 artistName ) );
> -        coll->addArtist( artistPtr );
> +        coll->mc->addArtist( artistPtr );
> }
> artistTracks << trackPtr;
> EXPECT_CALL( *artist, tracks() ).Times( AnyNumber() ).WillRepeatedly( Return( \
> artistTracks ) ); @@ -167,8 +167,8 @@ TestUnionJob::testEmptyA()
> CollectionTestImpl *collB = new MyCollectionTestImpl("B");
> 
> addMockTrack( collB, "track1", "artist1", "album1" );
> -    QCOMPARE( collA->trackMap().count(), 0 );
> -    QCOMPARE( collB->trackMap().count(), 1 );
> +    QCOMPARE( collA->mc->trackMap().count(), 0 );
> +    QCOMPARE( collB->mc->trackMap().count(), 1 );
> QVERIFY( trackCopyCount.isEmpty() );
> 
> UnionJob *job = new UnionJob( collA, collB );
> @@ -177,8 +177,8 @@ TestUnionJob::testEmptyA()
> 
> QCOMPARE( trackCopyCount.size(), 1 );
> QVERIFY( trackCopyCount.contains( 1 ) );
> -    QCOMPARE( collA->trackMap().count(), 1 );
> -    QCOMPARE( collB->trackMap().count(), 1 );
> +    QCOMPARE( collA->mc->trackMap().count(), 1 );
> +    QCOMPARE( collB->mc->trackMap().count(), 1 );
> 
> delete collA;
> delete collB;
> @@ -191,8 +191,8 @@ TestUnionJob::testEmptyB()
> CollectionTestImpl *collB = new MyCollectionTestImpl("B");
> 
> addMockTrack( collA, "track1", "artist1", "album1" );
> -    QCOMPARE( collA->trackMap().count(), 1 );
> -    QCOMPARE( collB->trackMap().count(), 0 );
> +    QCOMPARE( collA->mc->trackMap().count(), 1 );
> +    QCOMPARE( collB->mc->trackMap().count(), 0 );
> QVERIFY( trackCopyCount.isEmpty() );
> 
> UnionJob *job = new UnionJob( collA, collB );
> @@ -201,8 +201,8 @@ TestUnionJob::testEmptyB()
> 
> QCOMPARE( trackCopyCount.size(), 1 );
> QVERIFY( trackCopyCount.contains( 1 ) );
> -    QCOMPARE( collA->trackMap().count(), 1 );
> -    QCOMPARE( collB->trackMap().count(), 1 );
> +    QCOMPARE( collA->mc->trackMap().count(), 1 );
> +    QCOMPARE( collB->mc->trackMap().count(), 1 );
> 
> delete collA;
> delete collB;
> @@ -216,8 +216,8 @@ TestUnionJob::testAddTrackToBoth()
> 
> addMockTrack( collA, "track1", "artist1", "album1" );
> addMockTrack( collB, "track2", "artist2", "album2" );
> -    QCOMPARE( collA->trackMap().count(), 1 );
> -    QCOMPARE( collB->trackMap().count(), 1 );
> +    QCOMPARE( collA->mc->trackMap().count(), 1 );
> +    QCOMPARE( collB->mc->trackMap().count(), 1 );
> QVERIFY( trackCopyCount.isEmpty() );
> 
> UnionJob *job = new UnionJob( collA, collB );
> @@ -227,8 +227,8 @@ TestUnionJob::testAddTrackToBoth()
> QCOMPARE( trackCopyCount.size(), 2 );
> QCOMPARE( trackCopyCount.at( 0 ), 1 );
> QCOMPARE( trackCopyCount.at( 1 ), 1 );
> -    QCOMPARE( collA->trackMap().count(), 2 );
> -    QCOMPARE( collB->trackMap().count(), 2 );
> +    QCOMPARE( collA->mc->trackMap().count(), 2 );
> +    QCOMPARE( collB->mc->trackMap().count(), 2 );
> 
> delete collA;
> delete collB;
> @@ -243,8 +243,8 @@ TestUnionJob::testTrackAlreadyInBoth()
> addMockTrack( collA, "track1", "artist1", "album1" );
> addMockTrack( collB, "track1", "artist1", "album1" );
> addMockTrack( collB, "track2", "artist2", "album2" );
> -    QCOMPARE( collA->trackMap().count(), 1 );
> -    QCOMPARE( collB->trackMap().count(), 2 );
> +    QCOMPARE( collA->mc->trackMap().count(), 1 );
> +    QCOMPARE( collB->mc->trackMap().count(), 2 );
> QVERIFY( trackCopyCount.isEmpty() );
> 
> UnionJob *job = new UnionJob( collA, collB );
> @@ -253,8 +253,8 @@ TestUnionJob::testTrackAlreadyInBoth()
> 
> QCOMPARE( trackCopyCount.size(), 1 );
> QVERIFY( trackCopyCount.contains( 1 ) );
> -    QCOMPARE( collA->trackMap().count(), 2 );
> -    QCOMPARE( collB->trackMap().count(), 2 );
> +    QCOMPARE( collA->mc->trackMap().count(), 2 );
> +    QCOMPARE( collB->mc->trackMap().count(), 2 );
> 
> delete collA;
> delete collB;
> 


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic