File indexing completed on 2024-05-05 04:48:32
0001 /**************************************************************************************** 0002 * Copyright (c) 2013 Konrad Zemek <konrad.zemek@gmail.com> * 0003 * * 0004 * This program is free software; you can redistribute it and/or modify it under * 0005 * the terms of the GNU General Public License as published by the Free Software * 0006 * Foundation; either version 2 of the License, or (at your option) any later * 0007 * version. * 0008 * * 0009 * This program is distributed in the hope that it will be useful, but WITHOUT ANY * 0010 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A * 0011 * PARTICULAR PURPOSE. See the GNU General Public License for more details. * 0012 * * 0013 * You should have received a copy of the GNU General Public License along with * 0014 * this program. If not, see <http://www.gnu.org/licenses/>. * 0015 ****************************************************************************************/ 0016 0017 #include "ImporterManager.h" 0018 0019 #include "ImporterProvider.h" 0020 #include "core/support/Amarok.h" 0021 #include "core/support/Components.h" 0022 #include "core/support/Debug.h" 0023 #include "statsyncing/Config.h" 0024 #include "statsyncing/Controller.h" 0025 0026 #include <KConfigGroup> 0027 0028 #include <QStringList> 0029 #include <QVariant> 0030 0031 namespace StatSyncing 0032 { 0033 0034 ImporterManager::ImporterManager() 0035 : ProviderFactory() 0036 { 0037 } 0038 0039 ImporterManager::~ImporterManager() 0040 { 0041 } 0042 0043 void 0044 ImporterManager::init() 0045 { 0046 foreach( const QString &providerId, managerConfig().groupList() ) 0047 { 0048 KConfigGroup group = providerConfig( providerId ); 0049 0050 QVariantMap config; 0051 foreach( const QString &key, group.keyList() ) 0052 config.insert( key, group.readEntry( key, QVariant( QString() ) ) ); 0053 0054 ProviderPtr provider = createProvider( config ); 0055 m_providers.insert( provider->id(), provider ); 0056 } 0057 0058 if( Controller *controller = Amarok::Components::statSyncingController() ) 0059 if( Config *config = controller->config() ) 0060 connect( config, &Config::providerForgotten, 0061 this, &ImporterManager::slotProviderForgotten ); 0062 0063 m_initialized = true; 0064 } 0065 0066 ProviderConfigWidget* 0067 ImporterManager::createConfigWidget() 0068 { 0069 return configWidget( QVariantMap() ); 0070 } 0071 0072 ProviderPtr 0073 ImporterManager::createProvider( const QVariantMap &config ) 0074 { 0075 Controller *controller = Amarok::Components::statSyncingController(); 0076 0077 // First, get rid of the old provider instance. Note: the StatSyncing::Config 0078 // remembers the provider by the id, even when it's unregistered. After this 0079 // block, old instance should be destroyed, its destructor called. 0080 if( config.contains( QStringLiteral("uid") ) ) 0081 { 0082 const QString providerId = config.value( QStringLiteral("uid") ).toString(); 0083 if( m_providers.contains( providerId ) ) 0084 { 0085 ProviderPtr oldProvider = m_providers.take( providerId ); 0086 if( controller ) 0087 controller->unregisterProvider( oldProvider ); 0088 } 0089 } 0090 0091 // Create a concrete provider using the config. The QueuedConnection in connect() 0092 // is important, because on reconfigure we *destroy* the old provider instance 0093 ImporterProviderPtr provider = newInstance( config ); 0094 if( !provider ) 0095 { 0096 warning() << __PRETTY_FUNCTION__ << "created provider is null!"; 0097 return provider; 0098 } 0099 0100 connect( provider.data(), &StatSyncing::ImporterProvider::reconfigurationRequested, 0101 this, &ImporterManager::createProvider, Qt::QueuedConnection); 0102 m_providers.insert( provider->id(), provider ); 0103 0104 // Register the provider 0105 if( controller ) 0106 { 0107 controller->registerProvider( provider ); 0108 0109 // Set provider to offline 0110 if( Config *config = controller->config() ) 0111 { 0112 config->updateProvider( provider->id(), provider->prettyName(), 0113 provider->icon(), /*online*/ false ); 0114 config->save(); 0115 } 0116 } 0117 0118 // Save the settings 0119 KConfigGroup group = providerConfig( provider ); 0120 group.deleteGroup(); 0121 foreach( const QString &key, provider->m_config.keys() ) 0122 group.writeEntry( key, provider->m_config.value( key ) ); 0123 group.sync(); 0124 0125 return provider; 0126 } 0127 0128 KConfigGroup 0129 ImporterManager::managerConfig() const 0130 { 0131 return Amarok::config( QStringLiteral("Importers") ).group( type() ); 0132 } 0133 0134 KConfigGroup 0135 ImporterManager::providerConfig( const QString &providerId ) const 0136 { 0137 return managerConfig().group( providerId ); 0138 } 0139 0140 KConfigGroup 0141 ImporterManager::providerConfig( const ProviderPtr &provider ) const 0142 { 0143 return providerConfig( provider->id() ); 0144 } 0145 0146 void 0147 ImporterManager::slotProviderForgotten( const QString &providerId ) 0148 { 0149 // Check if the provider is managed by this ImporterManager 0150 if( !m_providers.contains( providerId ) ) 0151 return; 0152 0153 ProviderPtr provider = m_providers.take( providerId ); 0154 if( Controller *controller = Amarok::Components::statSyncingController() ) 0155 controller->unregisterProvider( provider ); 0156 0157 // Remove configuration 0158 KConfigGroup group = providerConfig( providerId ); 0159 group.deleteGroup(); 0160 group.sync(); 0161 } 0162 0163 } // namespace StatSyncing