23 #include "managerimpl.h"
25 #include <kaboutdata.h>
29 #include <kstandarddirs.h>
30 #include <kconfiggroup.h>
32 #include <QtDBus/QtDBus>
37 #include "kresourcesmanageradaptor.h"
41 class ManagerImpl::ManagerImplPrivate
50 Resource::List mResources;
56 ManagerImpl::ManagerImpl(
ManagerNotifier *notifier,
const QString &family )
57 : d( new ManagerImplPrivate )
59 d->mNotifier = notifier;
65 d->mConfigRead =
false;
67 new KResourcesManagerAdaptor(
this );
68 const QString dBusPath = QLatin1String(
"/ManagerIface_" ) + family;
69 QDBusConnection::sessionBus().registerObject( dBusPath,
this );
72 d->mId = KRandom::randomString( 8 );
75 QDBusConnection::sessionBus().registerService(
"org.kde.KResourcesManager" );
77 QDBusConnection::sessionBus().connect(
"", dBusPath,
78 "org.kde.KResourcesManager",
"signalKResourceAdded",
79 this, SLOT(dbusKResourceAdded(QString,QString)));
80 QDBusConnection::sessionBus().connect(
"", dBusPath,
81 "org.kde.KResourcesManager",
"signalKResourceModified",
82 this, SLOT(dbusKResourceModified(QString,QString)));
83 QDBusConnection::sessionBus().connect(
"", dBusPath,
84 "org.kde.KResourcesManager",
"signalKResourceDeleted",
85 this, SLOT(dbusKResourceDeleted(QString,QString)));
88 ManagerImpl::~ManagerImpl()
92 qDeleteAll( d->mResources );
97 void ManagerImpl::createStandardConfig()
99 if ( !d->mStdConfig ) {
100 QString file = defaultConfigFile( d->mFamily );
101 d->mStdConfig =
new KConfig( file );
104 d->mConfig = d->mStdConfig;
107 void ManagerImpl::readConfig( KConfig *cfg )
112 d->mFactory->reloadConfig();
118 createStandardConfig();
124 KConfigGroup group = d->mConfig->group(
"General" );
126 QStringList keys = group.readEntry(
"ResourceKeys", QStringList() );
127 keys += group.readEntry(
"PassiveResourceKeys", QStringList() );
129 const QString standardKey = group.readEntry(
"Standard" );
131 for ( QStringList::const_iterator it = keys.constBegin(); it != keys.constEnd(); ++it ) {
132 readResourceConfig( *it,
false );
135 d->mConfigRead =
true;
138 void ManagerImpl::writeConfig( KConfig *cfg )
143 createStandardConfig();
148 QStringList activeKeys;
149 QStringList passiveKeys;
152 Resource::List::Iterator it;
153 for ( it = d->mResources.begin(); it != d->mResources.end(); ++it ) {
154 writeResourceConfig( *it,
false );
156 QString key = ( *it )->identifier();
157 if ( ( *it )->isActive() ) {
158 activeKeys.append( key );
160 passiveKeys.append( key );
166 kDebug() <<
"Saving general info";
167 KConfigGroup group = d->mConfig->group(
"General" );
168 group.writeEntry(
"ResourceKeys", activeKeys );
169 group.writeEntry(
"PassiveResourceKeys", passiveKeys );
170 if ( d->mStandard ) {
171 group.writeEntry(
"Standard", d->mStandard->identifier() );
173 group.writeEntry(
"Standard",
"" );
177 kDebug() <<
"finished";
180 void ManagerImpl::add(
Resource *resource )
184 if ( d->mResources.isEmpty() ) {
185 d->mStandard = resource;
188 d->mResources.append( resource );
190 if ( d->mConfigRead ) {
191 writeResourceConfig( resource,
true );
194 signalKResourceAdded( d->mId, resource->
identifier() );
197 void ManagerImpl::remove(
Resource *resource )
199 if ( d->mStandard == resource ) {
202 removeResource( resource );
204 d->mResources.removeAll( resource );
206 signalKResourceDeleted( d->mId, resource->
identifier() );
210 kDebug() <<
"Finished";
213 void ManagerImpl::change(
Resource *resource )
215 writeResourceConfig( resource,
true );
217 signalKResourceModified( d->mId, resource->
identifier() );
220 void ManagerImpl::setActive(
Resource *resource,
bool active )
222 if ( resource && resource->
isActive() != active ) {
227 Resource *ManagerImpl::standardResource()
232 void ManagerImpl::setStandardResource(
Resource *resource )
234 d->mStandard = resource;
239 void ManagerImpl::dbusKResourceAdded(
const QString &managerId,
240 const QString &resourceId )
242 if ( managerId == d->mId ) {
243 kDebug() <<
"Ignore D-Bus notification to myself";
246 kDebug() <<
"Receive D-Bus call: added resource" << resourceId;
248 if ( getResource( resourceId ) ) {
249 kDebug() <<
"This resource is already known to me.";
253 createStandardConfig();
256 d->mConfig->reparseConfiguration();
257 Resource *resource = readResourceConfig( resourceId,
true );
260 d->mNotifier->notifyResourceAdded( resource );
262 kError() <<
"Received D-Bus: resource added for unknown resource"
267 void ManagerImpl::dbusKResourceModified(
const QString &managerId,
268 const QString &resourceId )
270 if ( managerId == d->mId ) {
271 kDebug() <<
"Ignore D-Bus notification to myself";
274 kDebug() <<
"Receive D-Bus call: modified resource" << resourceId;
276 Resource *resource = getResource( resourceId );
278 d->mNotifier->notifyResourceModified( resource );
280 kError() <<
"Received D-Bus: resource modified for unknown resource"
285 void ManagerImpl::dbusKResourceDeleted(
const QString &managerId,
286 const QString &resourceId )
288 if ( managerId == d->mId ) {
289 kDebug() <<
"Ignore D-Bus notification to myself";
292 kDebug() <<
"Receive D-Bus call: deleted resource" << resourceId;
294 Resource *resource = getResource( resourceId );
296 d->mNotifier->notifyResourceDeleted( resource );
298 kDebug() <<
"Removing item from mResources";
300 if ( d->mStandard == resource ) {
303 d->mResources.removeAll( resource );
305 kError() <<
"Received D-Bus: resource deleted for unknown resource"
310 QStringList ManagerImpl::resourceNames()
314 Resource::List::ConstIterator it;
315 for ( it = d->mResources.constBegin(); it != d->mResources.constEnd(); ++it ) {
316 result.append( ( *it )->resourceName() );
321 Resource::List *ManagerImpl::resourceList()
323 return &d->mResources;
326 QList<Resource *> ManagerImpl::resources()
328 return QList<Resource *>( d->mResources );
331 QList<Resource *> ManagerImpl::resources(
bool active )
333 QList<Resource *> result;
335 for (
int i = 0; i < d->mResources.size(); ++i ) {
336 if ( d->mResources.at( i )->isActive() == active ) {
337 result.append( d->mResources.at( i ) );
343 Resource *ManagerImpl::readResourceConfig(
const QString &identifier,
346 kDebug() << identifier;
348 if ( !d->mFactory ) {
349 kError() <<
"mFactory is 0. Did the app forget to call readConfig?";
353 KConfigGroup group = d->mConfig->group(
"Resource_" + identifier );
355 QString type = group.readEntry(
"ResourceType" );
356 QString name = group.readEntry(
"ResourceName" );
357 Resource *resource = d->mFactory->resource( type, group );
359 kDebug() <<
"Failed to create resource with id" << identifier;
367 group = d->mConfig->group(
"General" );
369 QString standardKey = group.readEntry(
"Standard" );
370 if ( standardKey == identifier ) {
371 d->mStandard = resource;
375 QStringList activeKeys = group.readEntry(
"ResourceKeys", QStringList() );
376 resource->
setActive( activeKeys.contains( identifier ) );
378 d->mResources.append( resource );
383 void ManagerImpl::writeResourceConfig(
Resource *resource,
bool checkActive )
387 kDebug() <<
"Saving resource" << key;
390 createStandardConfig();
393 KConfigGroup group( d->mConfig,
"Resource_" + key );
396 group = d->mConfig->group(
"General" );
397 QString standardKey = group.readEntry(
"Standard" );
399 if ( resource == d->mStandard && standardKey != key ) {
400 group.writeEntry(
"Standard", resource->
identifier() );
401 }
else if ( resource != d->mStandard && standardKey == key ) {
402 group.writeEntry(
"Standard",
"" );
406 QStringList activeKeys = group.readEntry(
"ResourceKeys", QStringList() );
407 QStringList passiveKeys = group.readEntry(
"PassiveResourceKeys", QStringList() );
409 if ( passiveKeys.contains( key ) ) {
410 passiveKeys.removeAll( key );
411 group.writeEntry(
"PassiveResourceKeys", passiveKeys );
413 if ( !activeKeys.contains( key ) ) {
414 activeKeys.append( key );
415 group.writeEntry(
"ResourceKeys", activeKeys );
417 }
else if ( !resource->
isActive() ) {
418 if ( activeKeys.contains( key ) ) {
419 activeKeys.removeAll( key );
420 group.writeEntry(
"ResourceKeys", activeKeys );
422 if ( !passiveKeys.contains( key ) ) {
423 passiveKeys.append( key );
424 group.writeEntry(
"PassiveResourceKeys", passiveKeys );
432 void ManagerImpl::removeResource(
Resource *resource )
437 createStandardConfig();
440 KConfigGroup group = d->mConfig->group(
"General" );
441 QStringList activeKeys = group.readEntry(
"ResourceKeys", QStringList() );
442 if ( activeKeys.contains( key ) ) {
443 activeKeys.removeAll( key );
444 group.writeEntry(
"ResourceKeys", activeKeys );
446 QStringList passiveKeys= group.readEntry(
"PassiveResourceKeys", QStringList() );
447 passiveKeys.removeAll( key );
448 group.writeEntry(
"PassiveResourceKeys", passiveKeys );
451 QString standardKey = group.readEntry(
"Standard" );
452 if ( standardKey == key ) {
453 group.writeEntry(
"Standard",
"" );
456 d->mConfig->deleteGroup(
"Resource_" + resource->
identifier() );
460 Resource *ManagerImpl::getResource(
const QString &identifier )
462 Resource::List::ConstIterator it;
463 for ( it = d->mResources.constBegin(); it != d->mResources.constEnd(); ++it ) {
464 if ( ( *it )->identifier() == identifier ) {
471 QString ManagerImpl::defaultConfigFile(
const QString &family )
473 return KStandardDirs::locateLocal(
"config",
474 QString(
"kresources/%1/stdrc" ).arg( family ) );