void SongLoaderInserter::Load(Playlist *destination, int row, bool play_now, bool enqueue, const QList<QUrl> &urls) { destination_ = destination; row_ = row; play_now_ = play_now; enqueue_ = enqueue; connect(destination, SIGNAL(destroyed()), SLOT(DestinationDestroyed())); foreach (const QUrl& url, urls) { SongLoader* loader = new SongLoader(library_, this); // we're connecting this before we're even sure if this is an async load // to avoid race conditions (signal emission before we're listening to it) connect(loader, SIGNAL(LoadFinished(bool)), SLOT(PendingLoadFinished(bool))); SongLoader::Result ret = loader->Load(url); if (ret == SongLoader::WillLoadAsync) { pending_.insert(loader); continue; } if (ret == SongLoader::Success) songs_ << loader->songs(); else emit Error(tr("Error loading %1").arg(url.toString())); delete loader; }
void SongLoaderInserter::Load(Playlist* destination, int row, bool play_now, bool enqueue, const QList<QUrl>& urls) { destination_ = destination; row_ = row; play_now_ = play_now; enqueue_ = enqueue; connect(destination, SIGNAL(destroyed()), SLOT(DestinationDestroyed())); connect(this, SIGNAL(PreloadFinished()), SLOT(InsertSongs())); connect(this, SIGNAL(EffectiveLoadFinished(const SongList&)), destination, SLOT(UpdateItems(const SongList&))); for (const QUrl& url : urls) { SongLoader* loader = new SongLoader(library_, player_, this); SongLoader::Result ret = loader->Load(url); if (ret == SongLoader::BlockingLoadRequired) { pending_.append(loader); continue; } if (ret == SongLoader::Success) songs_ << loader->songs(); else emit Error(tr("Error loading %1").arg(url.toString())); delete loader; } if (pending_.isEmpty()) { InsertSongs(); deleteLater(); } else { QtConcurrent::run(this, &SongLoaderInserter::AsyncLoad); } }