bool hasMandatoryProperties( const KPluginInfo& info )
{
    QVariant mode = info.property( "X-KDevelop-Mode" );
    QVariant version = info.property( "X-KDevelop-Version" );

    return mode.isValid() && mode.canConvert( QVariant::String )
           && version.isValid() && version.canConvert( QVariant::String );
}
 bool canUnload( const KPluginInfo& plugin )
 {
     kDebug() << "checking can unload for:" << plugin.name() << plugin.property("X-KDevelop-LoadMode");
     if( plugin.property( "X-KDevelop-LoadMode" ).toString() == "AlwaysOn" )
     {
         return false;
     }
     QStringList interfaces = plugin.property( "X-KDevelop-Interfaces" ).toStringList();
     kDebug() << "checking dependencies:" << interfaces;
     foreach( const KPluginInfo& info, loadedPlugins.keys() )
     {
         if( info.pluginName() != plugin.pluginName() )
         {
             QStringList dependencies = info.property( "X-KDevelop-IRequired" ).toStringList();
             dependencies += info.property( "X-KDevelop-IOptional" ).toStringList();
             foreach( const QString& dep, dependencies )
             {
                 if( interfaces.contains( dep ) && !canUnload( info ) )
                 {
                     return false;
                 }
             }
         }
     }
bool isGlobalPlugin( const KPluginInfo& info )
{
    return info.property( "X-KDevelop-Category" ).toString() == "Global";
}