author | zecke <zecke> | 2004-08-25 21:53:50 (UTC) |
---|---|---|
committer | zecke <zecke> | 2004-08-25 21:53:50 (UTC) |
commit | a64c92819cd3106584d9005e42ed972726081a94 (patch) (side-by-side diff) | |
tree | f8ac45c7154db71a988cc5a9596587a30b9d9cce | |
parent | df3e4c8b13c16aeb96e70dbaa2d409f83eed988e (diff) | |
download | opie-a64c92819cd3106584d9005e42ed972726081a94.zip opie-a64c92819cd3106584d9005e42ed972726081a94.tar.gz opie-a64c92819cd3106584d9005e42ed972726081a94.tar.bz2 |
Respect the value passed to the method
-rw-r--r-- | libopie2/opiecore/opluginloader.cpp | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/libopie2/opiecore/opluginloader.cpp b/libopie2/opiecore/opluginloader.cpp index e7eddc2..1edf3a1 100644 --- a/libopie2/opiecore/opluginloader.cpp +++ b/libopie2/opiecore/opluginloader.cpp @@ -1,135 +1,136 @@ /* * LGPLv2 or later * zecke@handhelds.org */ #include "opluginloader.h" #include "oconfig.h" +#include "odebug.h" #include <qpe/qpeapplication.h> #include <qdir.h> #include <qdict.h> #include <qtl.h> #include <qfile.h> #include <stdlib.h> namespace Opie { namespace Core { namespace Internal { struct OPluginLibraryHolder { static OPluginLibraryHolder *self(); QLibrary *ref( const QString& ); void deref( QLibrary* ); private: OPluginLibraryHolder(); ~OPluginLibraryHolder(); QDict<QLibrary> m_libs; static OPluginLibraryHolder* m_self; }; OPluginLibraryHolder* OPluginLibraryHolder::m_self = 0; OPluginLibraryHolder* OPluginLibraryHolder::self() { if ( !m_self ) m_self = new OPluginLibraryHolder; return m_self; } OPluginLibraryHolder::OPluginLibraryHolder() {} OPluginLibraryHolder::~OPluginLibraryHolder() {} /* * We do simple ref counting... We will add the QLibrary again * and again to the dictionary and on deref we will pop and pop it * until there are no more library and we will unload and delete the library * luckily dlopen does some ref counting as well so we don't need * to hack QPEApplication */ QLibrary* OPluginLibraryHolder::ref(const QString& str) { QLibrary *lib = m_libs[str]; /* if not in the dict try to load it */ if ( !lib ) { lib = new QLibrary( str, QLibrary::Immediately ); if ( !lib->isLoaded() ) { delete lib; return 0l; } } /* now refcount one up */ m_libs.insert( str, lib ); return lib; } /* * 'unshadow' the items until we're the last then unload and delete */ void OPluginLibraryHolder::deref( QLibrary* lib ) { if ( !lib ) return; QString str = lib->library(); /* no need to check if the lib was inserted or such */ (void) m_libs.take( str ); if ( !m_libs[str] ) { lib->unload(); delete lib; } } } /** * We want values with 30,29,28 at the beginning of the list */ bool operator<( const OPluginItem& l, const OPluginItem& r ) { return l.position() > r.position(); } bool operator>( const OPluginItem& l, const OPluginItem& r ) { return l.position() < r.position(); } bool operator<=( const OPluginItem& l, const OPluginItem& r ) { return l.position() >= r.position(); } /** * \brief Creates an Empty OPluginItem * * create an empty pluginitem. Position is set to -1 and the * other things are used with the default ctors */ OPluginItem::OPluginItem() : m_pos( -1 ) { } /** * @todo Create Internal name so we can have the plugin names translated. Or only for the gui? I'm not yet sure * \brief Create an OPluginItem * * Create a Plugin Item with all information. If you for some reasons * need to create your own OPluginItems make sure that 'name' is always the same * as it if used for positions and exclude list. * * @param name The if available translated Name * @param path The path to the plugin must be absolute. * @param b If the OPluginItem is enabled or not * @param pos The position of the plugin if used for sorting * */ OPluginItem::OPluginItem( const QString& name, const QString& path, bool b, int pos ) : m_name( name ), m_path( path ), m_enabled( b ), m_pos( pos ) {} /** * \brief simple d'tor */ OPluginItem::~OPluginItem() { } @@ -430,261 +431,262 @@ QUnknownInterface* OGenericPluginLoader::load( const OPluginItem& item, const QU if ( !lib ) { setSafeMode(); return 0l; } /** * try to load the plugin and just in case initialize the pointer to a pointer again */ QUnknownInterface* iface=0; if ( lib->queryInterface( uuid, &iface ) == QS_OK ) { installTranslators(pa.left( pa.find("."))); m_library.insert( iface, lib ); }else iface = 0; setSafeMode(); return iface; } /** * @internal and reads in the safe mode */ void OGenericPluginLoader::readConfig() { /* read the config for SafeMode */ OConfig conf( m_dir + "-odpplugins" ); conf.setGroup( "General" ); m_isSafeMode = conf.readBoolEntry( "SafeMode", false ); } /** * @internal Enter or leave SafeMode */ void OGenericPluginLoader::setSafeMode(const QString& str, bool b) { OConfig conf( m_dir + "-odpplugins" ); conf.setGroup( "General" ); conf.writeEntry( "SafeMode", b ); conf.writeEntry( "CrashedPlugin", str ); } /** * @internal * * Set the List of Plugin Dirs to lst. Currently only QPEApplication::qpeDir()+"/plugins/"+mytype * is used as plugin dir */ void OGenericPluginLoader::setPluginDirs( const QStringList& lst ) { m_plugDirs = lst; } /** * * @internal * Set the Plugin Dir to str. Str will be the only element in the list of plugin dirs */ void OGenericPluginLoader::setPluginDir( const QString& str) { m_plugDirs.clear(); m_plugDirs.append( str ); } /** * @internal */ bool OGenericPluginLoader::isSorted()const{ return m_isSorted; } /* * make libfoo.so.1.0.0 -> foo on UNIX * make libfoo.dylib -> foo on MAC OS X Unix * windows is obviously missing */ /** * @internal */ QString OGenericPluginLoader::unlibify( const QString& str ) { QString st = str.mid( str.find( "lib" )+3 ); #ifdef Q_OS_MACX return st.left( st.findRev( ".dylib" ) ); #else return st.left( st.findRev( ".so" ) ); #endif } /** * @internal * * \brief method to return available plugins. Internal and for reeimplementations * *Return a List of Plugins for a dir and add positions and remove disabled. * If a plugin is on the excluded list assign position -2 * * @param dir The dir to look in * @param sorted Should positions be read? * @param disabled Remove excluded from the list */ OPluginItem::List OGenericPluginLoader::plugins( const QString& _dir, bool sorted, bool disabled )const { #ifdef Q_OS_MACX QDir dir( _dir, "lib*.dylib" ); #else QDir dir( _dir, "lib*.so" ); #endif OPluginItem::List lst; /* * get excluded list and then iterate over them * Excluded list contains the name * Position is a list with 'name.pos.name.pos.name.pos' * * For the look up we will create two QMap<QString,pos> */ QMap<QString, int> positionMap; QMap<QString, int> excludedMap; OConfig cfg( m_dir+"-odpplugins" ); cfg.setGroup( _dir ); QStringList excludes = cfg.readListEntry( "Excluded", ',' ); for ( QStringList::Iterator it = excludes.begin(); it != excludes.end(); ++it ) excludedMap.insert( *it, -2 ); - if ( m_isSorted ) { + if ( sorted ) { QStringList pos = cfg.readListEntry( "Positions", '.' ); QStringList::Iterator it = pos.begin(); while ( it != pos.end() ) positionMap.insert( *it++, (*it++).toInt() ); + } QStringList list = dir.entryList(); for (QStringList::Iterator it = list.begin(); it != list.end(); ++it ) { QString str = unlibify( *it ); OPluginItem item( str, _dir + "/" + *it ); bool ex = excludedMap.contains( str ); /* * if disabled but we should show all mark it as disabled * else continue because we don't want to add the item * else if sorted we assign the right position */ if ( ex && !disabled) item.setEnabled( false ); else if ( ex && disabled ) continue; else if ( sorted ) item.setPosition( positionMap[str] ); lst.append( item ); } return lst; } /** * @internal generate a list of languages from $LANG */ QStringList OGenericPluginLoader::languageList() { if ( m_languages.isEmpty() ) { /* * be_BY.CP1251 We will add, be_BY.CP1251,be_BY,be * to our list of languages. */ QString str = ::getenv( "LANG" ); m_languages += str; int pos = str.find( '.' ); if ( pos > 0 ) m_languages += str.left( pos ); int n_pos = str.find( '_' ); if ( pos > 0 && n_pos >= pos ) m_languages += str.left( n_pos ); } return m_languages; } /** * @internal * Tries to install languages using the languageList for the type */ void OGenericPluginLoader::installTranslators(const QString& type) { QStringList lst = languageList(); /* * for each language and maybe later for each language dir... * try to load a Translator */ for ( QStringList::Iterator it = lst.begin(); it != lst.end(); ++it ) { QTranslator* trans = new QTranslator( qApp ); QString tfn = QPEApplication::qpeDir()+"/i18n/" + *it + "/" + type + ".qm" ; /* * If loaded then install else clean up and don't leak */ if ( trans->load( tfn ) ) qApp->installTranslator( trans ); else delete trans; } } /** * \brief Simple c'tor. * * Simple C'tor same as the one of the base class. Additional this * class can cast for you if you nee it. * * * @param name The name of your plugin class * @param sorted If plugins are sorted * * @see OGenericPluginLoader */ OPluginLoader::OPluginLoader( const QString& name, bool sorted ) : OGenericPluginLoader( name, sorted ) { } /** * d'tor * @see OGenericPluginLoader::~OGenericPluginLoader */ OPluginLoader::~OPluginLoader() { } /** * \brief C'Tor using a OGenericPluginLoader * The C'tor. Pass your OGenericPluginLoader to manage * OGenericPluginLoader::allAvailable plugins. * * * @param loader A Pointer to your OGenericPluginLoader * @param name The name */ OPluginManager::OPluginManager( OGenericPluginLoader* loader) : m_loader( loader ), m_isSorted( false ) { } /** * \brief Overloaded c'tor using a List of Plugins and a type name * Overloaded Constructor to work with a 'Type' of plugins * and a correspending list of those. In this case calling load * is a no operation. * * @param name The name of your plugin ('today','inputmethods','applets') * @param lst A List with plugins of your type to manage * @param isSorted If the List should be treated sorted */ OPluginManager::OPluginManager( const QString& name, const OPluginItem::List& lst, bool isSorted) : m_loader( 0l ), m_cfgName( name ), m_plugins( lst ), m_isSorted( isSorted ) |