SVN commit 707597 by zander: I realized the other day that our plugin versioning system is a bit weak; it doesn't scale well beyond the simple usage of 1 codebase. So I thought lets fix that :) Specifically I made the following possible; * allowing users to download a plugin that a 3rd party made and just install it without things breaking. This specifically means that if the user is running KOffice 2.2 and the plugin uses features in KOffice 2.3, we will not load the plugin. But if the user is running KOffice 2.4 we will load it. The latter was impossible before. * The user can install a plugin in his homedir that supersedes the same plugin installed on the system. I want to allow a user to download a new version and get it loaded without silly things like suddenly seeing 2 versions in his apps. For this reason I made all registries (in the libs) use both a MinVersion and a PluginVersion variable. MinVersion basically is a 'minimum required application version for this plugin to run'. So it won't be used if the plugin requires a higher number version of KOffice. PluginVersion means the version of the plugin. If multiple are found, the highest number is used. The version I put as the current one is '0', so any plugin that should have a minimum version of 0. This may sound a bit weird as we normally start counting at 1, but I did this on purpose due to 2 reasons. 1) it fits nicely with the KOffice minor version. So KOffice2.3 will have a minimum version of 3. 2) we won't freeze the APIs until KOffice2.1, so the first real version that external plugin implementers will actually see is version 1. CCMAIL: koffice-devel@kde.org M +2 -1 karbon/plugins/tools/karbontools.desktop M +2 -1 kchart/shape/chartshape.desktop M +2 -1 kformula/flake/formulashape.desktop M +2 -1 kspread/flake/tableshape.desktop M +1 -1 libs/flake/KoShapeBorderRegistry.cpp M +3 -3 libs/flake/KoShapeRegistry.cpp M +3 -3 libs/flake/KoToolRegistry.cpp M +3 -1 libs/flake/flake.desktop M +3 -1 libs/flake/flakeshape.desktop M +3 -1 libs/flake/flaketool.desktop M +1 -1 libs/kotext/KoInlineObjectRegistry.cpp M +1 -1 libs/kotext/KoTextEditingRegistry.cpp M +3 -1 libs/kotext/inlinetextobject.desktop M +3 -1 libs/kotext/texteditingplugin.desktop M +3 -1 libs/main/KoDockRegistry.cpp M +20 -5 libs/main/KoPluginLoader.cpp M +4 -0 libs/main/kofficedocker.desktop M +1 -1 libs/pigment/KoColorSpaceRegistry.cpp M +3 -1 libs/pigment/pigment.desktop M +2 -1 plugins/autocorrection/autocorrect.desktop M +2 -1 plugins/changecase/changecase.desktop M +2 -1 plugins/colorspaces/cmyk_u16/krita_cmyk_u16_plugin.desktop M +2 -2 plugins/colorspaces/cmyk_u8/kritacmykplugin.desktop M +2 -1 plugins/colorspaces/gray_u16/koffice_graya_u16_plugin.desktop M +2 -1 plugins/colorspaces/gray_u8/kofficegrayaplugin.desktop M +2 -1 plugins/colorspaces/rgb_u8/kritargbplugin.desktop M +2 -1 plugins/defaultTools/defaulttools.desktop M +2 -0 plugins/dockers/kofficedockers.desktop M +2 -1 plugins/spellcheck/spellcheck.desktop M +2 -1 plugins/variables/textvariables.desktop M +2 -1 shapes/divineProportion/divineproportionshape.desktop M +2 -1 shapes/musicshape/musicshape.desktop M +2 -1 shapes/pathshapes/pathshapes.desktop M +2 -1 shapes/pictureshape/pictureshape.desktop M +2 -1 shapes/text/textshape.desktop M +2 -1 shapes/videoshape/videoshape.desktop M +2 -1 tools/thesaurus/thesaurustool.desktop --- trunk/koffice/karbon/plugins/tools/karbontools.desktop #707596:707597 @@ -18,4 +18,5 @@ ServiceTypes=KOffice/Tool Type=Service X-KDE-Library=karbontools -X-Flake-Version=1 +X-Flake-MinVersion=0 +X-Flake-PluginVersion=1 --- trunk/koffice/kchart/shape/chartshape.desktop #707596:707597 @@ -15,4 +15,5 @@ ServiceTypes=KOffice/Shape Type=Service X-KDE-Library=chartshape -X-Flake-Version=1 +X-Flake-MinVersion=0 +X-Flake-PluginVersion=1 --- trunk/koffice/kformula/flake/formulashape.desktop #707596:707597 @@ -16,4 +16,5 @@ ServiceTypes=KOffice/Flake Type=Service X-KDE-Library=formulashape -X-Flake-Version=1 +X-Flake-MinVersion=0 +X-Flake-PluginVersion=1 --- trunk/koffice/kspread/flake/tableshape.desktop #707596:707597 @@ -14,4 +14,5 @@ ServiceTypes=KOffice/Shape Type=Service X-KDE-Library=tableshape -X-Flake-Version=1 +X-Flake-MinVersion=0 +X-Flake-PluginVersion=1 --- trunk/koffice/libs/flake/KoShapeBorderRegistry.cpp #707596:707597 @@ -30,7 +30,7 @@ config.whiteList = "FlakeBorderPlugins"; config.blacklist = "FlakeBorderPluginsDisabled"; KoPluginLoader::instance()->load(QString::fromLatin1("KOffice/Border"), - QString::fromLatin1("[X-Flake-Version] == 1"), + QString::fromLatin1("[X-Flake-MinVersion] <= 0"), config); // Also add our hard-coded basic border --- trunk/koffice/libs/flake/KoShapeRegistry.cpp #707596:707597 @@ -1,6 +1,6 @@ /* This file is part of the KDE project * Copyright (c) 2006 Boudewijn Rempt (boud@valdyas.org) - * Copyright (C) 2006 Thomas Zander + * Copyright (C) 2006-2007 Thomas Zander * Copyright (C) 2006 Thorsten Zachmann * Copyright (C) 2007 Jan Hambrecht * @@ -61,12 +61,12 @@ config.blacklist = "FlakePluginsDisabled"; config.group = "koffice"; KoPluginLoader::instance()->load( QString::fromLatin1("KOffice/Flake"), - QString::fromLatin1("[X-Flake-Version] == 1"), + QString::fromLatin1("[X-Flake-MinVersion] <= 0"), config); config.whiteList = "ShapePlugins"; config.blacklist = "ShapePluginsDisabled"; KoPluginLoader::instance()->load(QString::fromLatin1("KOffice/Shape"), - QString::fromLatin1("[X-Flake-Version] == 1"), + QString::fromLatin1("[X-Flake-MinVersion] <= 0"), config); // Also add our hard-coded basic shape --- trunk/koffice/libs/flake/KoToolRegistry.cpp #707596:707597 @@ -1,5 +1,5 @@ /* This file is part of the KDE project - * Copyright (C) 2006 Thomas Zander + * Copyright (C) 2006-2007 Thomas Zander * Copyright (c) 2004 Boudewijn Rempt * * This library is free software; you can redistribute it and/or @@ -32,11 +32,11 @@ config.blacklist = "FlakePluginsDisabled"; config.group = "koffice"; KoPluginLoader::instance()->load( QString::fromLatin1("KOffice/Flake"), - QString::fromLatin1("[X-Flake-Version] == 1")); + QString::fromLatin1("[X-Flake-MinVersion] <= 0")); config.whiteList = "ToolPlugins"; config.blacklist = "ToolPluginsDisabled"; KoPluginLoader::instance()->load( QString::fromLatin1("KOffice/Tool"), - QString::fromLatin1("[X-Flake-Version] == 1")); + QString::fromLatin1("[X-Flake-MinVersion] <= 0")); } KoToolRegistry::~KoToolRegistry() --- trunk/koffice/libs/flake/flake.desktop #707596:707597 @@ -26,5 +26,7 @@ Comment[sv]=Ett insticksprogram som innehåller en formmängd och ett verktyg Comment[x-test]=xxA plugin that contains a set of a shape and a toolxx Comment[zh_TW]=包含形狀與工具集的外掛程式 -[PropertyDef::X-Flake-Version] +[PropertyDef::X-Flake-MinVersion] Type=int +[PropertyDef::X-Flake-PluginVersion] +Type=int --- trunk/koffice/libs/flake/flakeshape.desktop #707596:707597 @@ -22,5 +22,7 @@ Comment[sv]=Definition av ett formobjekt i Flake Comment[x-test]=xxDefinition of a flake shape objectxx Comment[zh_TW]=Flake 形狀物件定義 -[PropertyDef::X-Flake-Version] +[PropertyDef::X-Flake-MinVersion] Type=int +[PropertyDef::X-Flake-PluginVersion] +Type=int --- trunk/koffice/libs/flake/flaketool.desktop #707596:707597 @@ -23,5 +23,7 @@ Comment[sv]=Definition av verktyg i Flake Comment[x-test]=xxDefinition of flake toolsxx Comment[zh_TW]=Flake 工具定義 -[PropertyDef::X-Flake-Version] +[PropertyDef::X-Flake-MinVersion] Type=int +[PropertyDef::X-Flake-PluginVersion] +Type=int --- trunk/koffice/libs/kotext/KoInlineObjectRegistry.cpp #707596:707597 @@ -33,7 +33,7 @@ config.blacklist = "TextInlinePluginsDisabled"; config.group = "koffice"; KoPluginLoader::instance()->load( QString::fromLatin1("KOffice/Text-InlineObject"), - QString::fromLatin1("[X-KoText-Version] == 1"), config); + QString::fromLatin1("[X-KoText-MinVersion] <= 0"), config); } KoInlineObjectRegistry *KoInlineObjectRegistry::s_instance = 0; --- trunk/koffice/libs/kotext/KoTextEditingRegistry.cpp #707596:707597 @@ -29,7 +29,7 @@ config.blacklist = "TextEditingPluginsDisabled"; config.group = "koffice"; KoPluginLoader::instance()->load( QString::fromLatin1("KOffice/Text-EditingPlugin"), - QString::fromLatin1("[X-KoText-Version] == 1"), config); + QString::fromLatin1("[X-KoText-MinVersion] <= 0"), config); } KoTextEditingRegistry *KoTextEditingRegistry::s_instance = 0; --- trunk/koffice/libs/kotext/inlinetextobject.desktop #707596:707597 @@ -22,5 +22,7 @@ Comment[sv]=Definition av ett textobjekt Comment[x-test]=xxDefinition of a text objectxx Comment[zh_TW]=定義文字物件 -[PropertyDef::X-KoText-Version] +[PropertyDef::X-KoText-MinVersion] Type=int +[PropertyDef::X-Flake-PluginVersion] +Type=int --- trunk/koffice/libs/kotext/texteditingplugin.desktop #707596:707597 @@ -22,5 +22,7 @@ Comment[sv]=Definition av ett Insticksprogram för textredigering Comment[x-test]=xxDefinition of a text-editing pluginxx Comment[zh_TW]=文字編輯外掛程式定義 -[PropertyDef::X-KoText-Version] +[PropertyDef::X-KoText-MinVersion] Type=int +[PropertyDef::X-Flake-PluginVersion] +Type=int --- trunk/koffice/libs/main/KoDockRegistry.cpp #707596:707597 @@ -30,7 +30,9 @@ config.whiteList = "DockerPlugins"; config.blacklist = "DockerPluginsDisabled"; config.group = "koffice"; - KoPluginLoader::instance()->load( QString::fromLatin1("KOffice/Dock"), QString(), config); + KoPluginLoader::instance()->load( QString::fromLatin1("KOffice/Dock"), + QString::fromLatin1("[X-Flake-MinVersion] <= 0"), + config); } KoDockRegistry::~KoDockRegistry() --- trunk/koffice/libs/main/KoPluginLoader.cpp #707596:707597 @@ -1,5 +1,6 @@ /* This file is part of the KDE project - * Copyright (c) 2006 Boudewijn Rempt (boud@valdyas.org) + * Copyright (c) 2006 Boudewijn Rempt + * Copyright (c) 2007 Thomas Zander * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public @@ -73,7 +74,7 @@ bool configChanged = false; QList blacklist; // what we will save out afterwards if(config.whiteList && config.blacklist && config.group) { - kDebug(30003) <<"Loading" << serviceType <<" with checking the config"; + kDebug(30003) <<"Loading" << serviceType <<"with checking the config"; KConfigGroup configGroup = KGlobal::config()->group(config.group); QList whiteList = configGroup.readEntry(config.whiteList, config.defaults); QList knownList; @@ -99,17 +100,31 @@ else plugins = offers; + QMap > serviceNames; + foreach(KSharedPtr service, plugins) { + if(serviceNames.contains(service->name())) { // duplicate + QVariant pluginVersion2 = service->property("X-Flake-PluginVersion"); + if(pluginVersion2.isNull()) // just take the first one found... + continue; + KSharedPtr otherService = serviceNames.value(service->name()); + QVariant pluginVersion = otherService->property("X-Flake-PluginVersion"); + if(! (pluginVersion.isNull() || pluginVersion.toInt() < pluginVersion2.toInt()) ) + continue; // replace the old one with this one, since its newer. + } + serviceNames.insert(service->name(), service); + } + QList whiteList; - foreach(KSharedPtr service, plugins) { + foreach(KSharedPtr service, serviceNames.values()) { int errCode = 0; QObject * plugin = KService::createInstance(service, this, QStringList(), &errCode ); if ( plugin ) { whiteList << service->library(); - kDebug(30003) <<"Loaded plugin" << service->name(); + kDebug(30003) << "Loaded plugin" << service->name(); delete plugin; } else { - kWarning(30003) <<"Loading plugin '" << service->name() << "' failed, "<< KLibLoader::errorString( errCode ) << " ("<< errCode << ")\n"; + kWarning(30003) << "Loading plugin" << service->name() << "failed, "<< KLibLoader::errorString( errCode ) << "("<< errCode << ")"; } } --- trunk/koffice/libs/main/kofficedocker.desktop #707596:707597 @@ -23,3 +23,7 @@ Comment[sv]=Ett insticksprogram som innehåller en så kallad 'grafisk dockningskomponent' Comment[x-test]=xxA plugin that contains a so called 'dockwidget'xx Comment[zh_TW]=包含「嵌入元件」的外掛程式 +[PropertyDef::X-Flake-MinVersion] +Type=int +[PropertyDef::X-Flake-PluginVersion] +Type=int --- trunk/koffice/libs/pigment/KoColorSpaceRegistry.cpp #707596:707597 @@ -141,7 +141,7 @@ config.whiteList = "ColorSpacePlugins"; config.blacklist = "ColorSpacePluginsDisabled"; config.group = "koffice"; - KoPluginLoader::instance()->load("KOffice/ColorSpace","[X-Pigment-Version] == 1", config); + KoPluginLoader::instance()->load("KOffice/ColorSpace","[X-Pigment-MinVersion] <= 0", config); } KoColorSpaceRegistry::KoColorSpaceRegistry() : d(new Private()) --- trunk/koffice/libs/pigment/pigment.desktop #707596:707597 @@ -13,5 +13,7 @@ Comment[sv]=En modul som implementerar en fullständig färgrymd för användning med libpigment Comment[x-test]=xxA module implementing a complete colorspace for use with libpigmentxx Comment[zh_TW]=實作完整色彩空間以使用 libpigment 的模組 -[PropertyDef::X-Pigment-Version] +[PropertyDef::X-Pigment-MinVersion] Type=int +[PropertyDef::X-Flake-PluginVersion] +Type=int --- trunk/koffice/plugins/autocorrection/autocorrect.desktop #707596:707597 @@ -15,5 +15,6 @@ Name[zh_TW]=自動修正外掛程式 ServiceTypes=KOffice/Text-EditingPlugin Type=Service -X-KoText-Version=1 +X-KoText-MinVersion=0 +X-KoText-PluginVersion=1 X-KDE-Library=autocorrect --- trunk/koffice/plugins/changecase/changecase.desktop #707596:707597 @@ -11,5 +11,6 @@ Name[zh_TW]=改變大小寫外掛程式 ServiceTypes=KOffice/Text-EditingPlugin Type=Service -X-KoText-Version=1 X-KDE-Library=changecase +X-KoText-MinVersion=0 +X-Flake-PluginVersion=1 --- trunk/koffice/plugins/colorspaces/cmyk_u16/krita_cmyk_u16_plugin.desktop #707596:707597 @@ -72,4 +72,5 @@ ServiceTypes=KOffice/ColorSpace Type=Service X-KDE-Library=krita_cmyk_u16_plugin -X-Pigment-Version=1 +X-Pigment-MinVersion=0 +X-Flake-PluginVersion=1 --- trunk/koffice/plugins/colorspaces/cmyk_u8/kritacmykplugin.desktop #707596:707597 @@ -84,5 +84,5 @@ ServiceTypes=KOffice/ColorSpace Type=Service X-KDE-Library=kritacmykplugin -X-Pigment-Version=1 - +X-Pigment-MinVersion=0 +X-Flake-PluginVersion=1 --- trunk/koffice/plugins/colorspaces/gray_u16/koffice_graya_u16_plugin.desktop #707596:707597 @@ -48,5 +48,6 @@ Comment[zh_TW]=每色頻為 16-bit 的灰階圖片色彩模型 ServiceTypes=KOffice/ColorSpace Type=Service -X-Pigment-Version=1 X-KDE-Library=koffice_graya_u16_plugin +X-Pigment-MinVersion=0 +X-Flake-PluginVersion=1 --- trunk/koffice/plugins/colorspaces/gray_u8/kofficegrayaplugin.desktop #707596:707597 @@ -55,4 +55,5 @@ ServiceTypes=KOffice/ColorSpace Type=Service X-KDE-Library=kofficegrayau8plugin -X-Pigment-Version=1 +X-Pigment-MinVersion=0 +X-Flake-PluginVersion=1 --- trunk/koffice/plugins/colorspaces/rgb_u8/kritargbplugin.desktop #707596:707597 @@ -86,4 +86,5 @@ ServiceTypes=KOffice/ColorSpace Type=Service X-KDE-Library=kritargbplugin -X-Pigment-Version=1 +X-Pigment-MinVersion=0 +X-Flake-PluginVersion=1 --- trunk/koffice/plugins/defaultTools/defaulttools.desktop #707596:707597 @@ -15,4 +15,5 @@ ServiceTypes=KOffice/Flake Type=Service X-KDE-Library=defaulttools -X-Flake-Version=1 +X-KoText-MinVersion=0 +X-Flake-PluginVersion=1 --- trunk/koffice/plugins/dockers/kofficedockers.desktop #707596:707597 @@ -14,3 +14,5 @@ ServiceTypes=KOffice/Dock Type=Service X-KDE-Library=kofficedockers +X-Flake-MinVersion=0 +X-Flake-PluginVersion=1 --- trunk/koffice/plugins/spellcheck/spellcheck.desktop #707596:707597 @@ -3,5 +3,6 @@ Name=SpellCheck plugin ServiceTypes=KOffice/Text-EditingPlugin Type=Service -X-KoText-Version=1 X-KDE-Library=spellcheck +X-KoText-MinVersion=0 +X-Flake-PluginVersion=1 --- trunk/koffice/plugins/variables/textvariables.desktop #707596:707597 @@ -14,5 +14,6 @@ Name[zh_TW]=文字變數 ServiceTypes=KOffice/Text-InlineObject Type=Service -X-KoText-Version=1 X-KDE-Library=textvariables +X-KoText-MinVersion=0 +X-Flake-PluginVersion=1 --- trunk/koffice/shapes/divineProportion/divineproportionshape.desktop #707596:707597 @@ -12,4 +12,5 @@ ServiceTypes=KOffice/Flake Type=Service X-KDE-Library=divineproportionshape -X-Flake-Version=1 +X-Flake-MinVersion=0 +X-Flake-PluginVersion=1 --- trunk/koffice/shapes/musicshape/musicshape.desktop #707596:707597 @@ -14,4 +14,5 @@ ServiceTypes=KOffice/Shape Type=Service X-KDE-Library=musicshape -X-Flake-Version=1 +X-Flake-MinVersion=0 +X-Flake-PluginVersion=1 --- trunk/koffice/shapes/pathshapes/pathshapes.desktop #707596:707597 @@ -14,5 +14,6 @@ Name[zh_TW]=路徑形狀 ServiceTypes=KOffice/Shape Type=Service -X-Flake-Version=1 X-KDE-Library=pathshapes +X-Flake-MinVersion=0 +X-Flake-PluginVersion=1 --- trunk/koffice/shapes/pictureshape/pictureshape.desktop #707596:707597 @@ -13,4 +13,5 @@ ServiceTypes=KOffice/Shape Type=Service X-KDE-Library=pictureshape -X-Flake-Version=1 +X-Flake-MinVersion=0 +X-Flake-PluginVersion=1 --- trunk/koffice/shapes/text/textshape.desktop #707596:707597 @@ -14,4 +14,5 @@ ServiceTypes=KOffice/Flake Type=Service X-KDE-Library=textshape -X-Flake-Version=1 +X-Flake-MinVersion=0 +X-Flake-PluginVersion=1 --- trunk/koffice/shapes/videoshape/videoshape.desktop #707596:707597 @@ -14,4 +14,5 @@ ServiceTypes=KOffice/Shape Type=Service X-KDE-Library=videoshape -X-Flake-Version=1 +X-Flake-MinVersion=0 +X-Flake-PluginVersion=1 --- trunk/koffice/tools/thesaurus/thesaurustool.desktop #707596:707597 @@ -102,5 +102,6 @@ Comment[x-test]=xxShow Related Wordsxx Comment[xh]=Bonisa Amagama Ahlobeneyo Comment[zh_TW]=顯示相關單字 -X-KoText-Version=1 +X-KoText-MinVersion=0 +X-Flake-PluginVersion=1 ServiceTypes=KOffice/Text-EditingPlugin _______________________________________________ koffice-devel mailing list koffice-devel@kde.org https://mail.kde.org/mailman/listinfo/koffice-devel