pluginmanager.cpp

来自「Amarok是一款在LINUX或其他类UNIX操作系统中运行的音频播放器软件。 」· C++ 代码 · 共 227 行

CPP
227
字号
/***************************************************************************begin                : 2004/03/12copyright            : (C) Mark Kretschmannemail                : markey@web.de***************************************************************************//*************************************************************************** *                                                                         * *   This program is free software; you can redistribute it and/or modify  * *   it under the terms of the GNU General Public License as published by  * *   the Free Software Foundation; either version 2 of the License, or     * *   (at your option) any later version.                                   * *                                                                         * ***************************************************************************/#define DEBUG_PREFIX "PluginManager"#include "debug.h"#include "plugin.h"#include "pluginmanager.h"#include <vector>#include <qfile.h>#include <qstring.h>#include <klibloader.h>#include <klocale.h>#include <kmessagebox.h>using std::vector;using Amarok::Plugin;vector<PluginManager::StoreItem>PluginManager::m_store;/////////////////////////////////////////////////////////////////////////////////////// PUBLIC INTERFACE/////////////////////////////////////////////////////////////////////////////////////KTrader::OfferListPluginManager::query( const QString& constraint ){    // Add versioning constraint    QString    str  = "[X-KDE-Amarok-framework-version] == ";    str += QString::number( FrameworkVersion );    if ( !constraint.stripWhiteSpace().isEmpty() )        str += " and " + constraint;    str += " and ";    str += "[X-KDE-Amarok-rank] > 0";    debug() << "Plugin trader constraint: " << str << endl;    return KTrader::self()->query( "Amarok/Plugin", str );}Plugin*PluginManager::createFromQuery( const QString &constraint ){    Debug::Block block( __PRETTY_FUNCTION__ );    KTrader::OfferList offers = query( constraint );    if ( offers.isEmpty() ) {        warning() << k_funcinfo << "No matching plugin found.\n";        return 0;    }    // Select plugin with highest rank    int rank = 0;    uint current = 0;    for ( uint i = 0; i < offers.count(); i++ ) {        if ( offers[i]->property( "X-KDE-Amarok-rank" ).toInt() > rank )            current = i;    }    return createFromService( offers[current] );}Plugin*PluginManager::createFromService( const KService::Ptr service ){    debug() << "Trying to load: " << service->library() << endl;    //get the library loader instance    KLibLoader *loader = KLibLoader::self();    //try to load the specified library    KLibrary *lib = loader->globalLibrary( QFile::encodeName( service->library() ) );    if ( !lib ) {        KMessageBox::error( 0, i18n( "<p>KLibLoader could not load the plugin:<br/><i>%1</i></p>"                                     "<p>Error message:<br/><i>%2</i></p>" )                               .arg( service->library() )                               .arg( loader->lastErrorMessage() ) );        return 0;    }    //look up address of init function and cast it to pointer-to-function    Plugin* (*create_plugin)() = ( Plugin* (*)() ) lib->symbol( "create_plugin" );    if ( !create_plugin ) {        warning() << k_funcinfo << "create_plugin == NULL\n";        return 0;    }    //create plugin on the heap    Plugin* plugin = create_plugin();    //put plugin into store    StoreItem item;    item.plugin = plugin;    item.library = lib;    item.service = service;    m_store.push_back( item );    dump( service );    return plugin;}voidPluginManager::unload( Plugin* plugin ){    DEBUG_FUNC_INFO    vector<StoreItem>::iterator iter = lookupPlugin( plugin );    if ( iter != m_store.end() ) {        delete (*iter).plugin;        debug() << "Unloading library: "<< (*iter).service->library() << endl;        (*iter).library->unload();        m_store.erase( iter );    }    else        warning() << k_funcinfo << "Could not unload plugin (not found in store).\n";}KService::PtrPluginManager::getService( const Plugin* plugin ){    if ( !plugin ) {        warning() << k_funcinfo << "pointer == NULL\n";        return 0;    }    //search plugin in store    vector<StoreItem>::const_iterator iter = lookupPlugin( plugin );    if ( iter == m_store.end() ) {        warning() << k_funcinfo << "Plugin not found in store.\n";	return 0;    }    return (*iter).service;}voidPluginManager::showAbout( const QString &constraint ){    KTrader::OfferList offers = query( constraint );    if ( offers.isEmpty() )        return;    KService::Ptr s = offers.front();    const QString body = "<tr><td>%1</td><td>%2</td></tr>";    QString str  = "<html><body><table width=\"100%\" border=\"1\">";    str += body.arg( i18n( "Name" ),                s->name() );    str += body.arg( i18n( "Library" ),             s->library() );    str += body.arg( i18n( "Authors" ),             s->property( "X-KDE-Amarok-authors" ).toStringList().join( "\n" ) );    str += body.arg( i18n( "Email" ),               s->property( "X-KDE-Amarok-email" ).toStringList().join( "\n" ) );    str += body.arg( i18n( "Version" ),             s->property( "X-KDE-Amarok-version" ).toString() );    str += body.arg( i18n( "Framework Version" ),   s->property( "X-KDE-Amarok-framework-version" ).toString() );    str += "</table></body></html>";    KMessageBox::information( 0, str, i18n( "Plugin Information" ) );}voidPluginManager::dump( const KService::Ptr service ){      debug() << "PluginManager Service Info:" << endl;      debug() << "---------------------------" << endl;      debug() << "name                          : " << service->name() << endl;      debug() << "library                       : " << service->library() << endl;      debug() << "desktopEntryPath              : " << service->desktopEntryPath() << endl;      debug() << "X-KDE-Amarok-plugintype       : " << service->property( "X-KDE-Amarok-plugintype" ).toString() << endl;      debug() << "X-KDE-Amarok-name             : " << service->property( "X-KDE-Amarok-name" ).toString() << endl;      debug() << "X-KDE-Amarok-authors          : " << service->property( "X-KDE-Amarok-authors" ).toStringList() << endl;      debug() << "X-KDE-Amarok-rank             : " << service->property( "X-KDE-Amarok-rank" ).toString() << endl;      debug() << "X-KDE-Amarok-version          : " << service->property( "X-KDE-Amarok-version" ).toString() << endl;      debug() << "X-KDE-Amarok-framework-version: " << service->property( "X-KDE-Amarok-framework-version" ).toString() << endl;}/////////////////////////////////////////////////////////////////////////////////////// PRIVATE INTERFACE/////////////////////////////////////////////////////////////////////////////////////vector<PluginManager::StoreItem>::iteratorPluginManager::lookupPlugin( const Plugin* plugin ){    vector<StoreItem>::iterator iter;    //search plugin pointer in store    vector<StoreItem>::iterator iterEnd(m_store.end() );    for ( iter = m_store.begin(); iter != iterEnd; ++iter ) {        if ( (*iter).plugin == plugin )            break;    }    return iter;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?