dependency issue (KService* -> KPluginLoader -> KLocale)
David Faure
faure at kde.org
Wed Aug 29 21:53:32 UTC 2012
KService, KServiceTypeTrader and KMimeTypeTrader (all of which I moved to a
new "kservice" framework), all have a template method (createInstance*) which
uses KPluginLoader to load the plugin described by the given service, or
trader query.
Which gives two, well, three solutions:
1) Moving KPluginLoader to the kservice framework as well.
2) Moving these template methods out, e.g. into KPluginLoader itself, making
kpluginloader one tier above kservice. the app code change looks like this:
- Client *client = service->createInstance<Client>(this, ...)
+ Client *client = KPluginLoader::createInstance<Client>(service, this, ...)
3) Making kservice *and* kpluginloader tier1 libs, and having the template
methods to integrate the two somewhere else, above.
Pro for 1: kservice is apps and plugins, so loading plugins is part of the
same framework. When Qt-5.1 gets a proper trader equivalent, and once I write
the libxdg-cache-based application lookup, we can migrate the apps and plugins
to that, and slowly phase out kservice.
Con for 1: KPluginLoader itself depends on KLocale, since it automatically
inserts the translation catalog for the plugin. I think that's a good feature,
it's part of what makes klocale superior to qtranslator, so the only solution
would be that kservice is tier2, and depends on the klocale framework.
The downside is that the users of KService as an application descriptor
(kopenwithdialog, krun, kded vfolder, open-or-save dialog...) are getting an
unwanted dependency.
Pro for 2: solves the dependency issue, although then we still need to find a
home for KPluginLoader, and that home will be a tier2 [solved by solution 3].
Con for 2 and 3: SIC change, and a weird one:
although the KService template can easily move to KPluginLoader (which already
knows about KService, so this would just be an extra convenience method),
KMimeTypeTrader::createInstanceFromQuery really belongs in KMimeTypeTrader
IMHO. Well, we could have KPluginLoader::createInstanceFromMimeTypeQuery
and createInstanceFromServiceTypeQuery, but this is getting long, not very
OOP, and it seems like a bit of a reverse depedency hack to put that into the
plugin loader itself (you do the trader query first, and then the plugin
loading). To the app developer's point of view, direct plugin loading ("load
foo.so") is *more* low-level than the trader which can also load plugins... or
maybe this is just dinosaur-thinking, one could say "the trader is an
implementation detail of the high-level KPluginLoader all-in-one method" :-)
Con for 3: no idea where that would be, and it's starting to look like weird
API for the benefit of cutting dependencies. Possibly for no good purpose in
this case.
Hmm.... another idea:
Solution 1b: move KPluginLoader to kservice, but solve the i18n dependency by
having some singleton inside KPluginLoader emit a signal when loading a
plugin, and some singleton in KLocale picks that up and loads the catalog. Too
hacky? (ugly singletons, and exposing some internal object publically for the
benefit of one other framework)... It would work, though, I guess...
I had started in the direction of solution 2, because it was ok for the
kservice template method, but moving the trader ones seems really strange to
me, so I stopped to write this thinking-out-loud email :-)
I think I'll reverse that and go for solution 1 then, i.e. moving
kpluginloader and making kservice tier2. (Or possibly solution 1b?)
If this is indeed "temporary" because the proper kf5/qt5 solution is the qt
plugin metadata querying stuff anyway, then it doesn't matter this much, I
guess (the kservice framework will be kept for compatibility in any case, we
have a huge amount of apps and plugins depending on it).
Well, I guess I answered my own (implicit) question here, but if someone has a
better idea I'm listening :-)
--
David Faure, faure at kde.org, http://www.davidfaure.fr
Sponsored by Nokia to work on KDE, incl. KDE Frameworks 5
More information about the Kde-frameworks-devel
mailing list