ProviderPtr ImporterManager::createProvider( QVariantMap config ) { Controller *controller = Amarok::Components::statSyncingController(); // First, get rid of the old provider instance. Note: the StatSyncing::Config // remembers the provider by the id, even when it's unregistered. After this // block, old instance should be destroyed, its destructor called. if( config.contains( "uid" ) ) { const QString providerId = config.value( "uid" ).toString(); if( m_providers.contains( providerId ) ) { ProviderPtr oldProvider = m_providers.take( providerId ); if( controller ) controller->unregisterProvider( oldProvider ); } } // Create a concrete provider using the config. The QueuedConnection in connect() // is important, because on reconfigure we *destroy* the old provider instance ImporterProviderPtr provider = newInstance( config ); if( !provider ) { warning() << __PRETTY_FUNCTION__ << "created provider is null!"; return provider; } connect( provider.data(), SIGNAL(reconfigurationRequested(QVariantMap)), SLOT(createProvider(QVariantMap)), Qt::QueuedConnection); m_providers.insert( provider->id(), provider ); // Register the provider if( controller ) { controller->registerProvider( provider ); // Set provider to offline if( Config *config = controller->config() ) { config->updateProvider( provider->id(), provider->prettyName(), provider->icon(), /*online*/ false ); config->save(); } } // Save the settings KConfigGroup group = providerConfig( provider ); group.deleteGroup(); foreach( const QString &key, provider->m_config.keys() ) group.writeEntry( key, provider->m_config.value( key ) ); group.sync(); return provider; }