bool CLibrary::loadLibrary(const std::string &libName, bool addNelDecoration, bool tryLibPath, bool ownership) { _Ownership = ownership; string libPath = libName; if (addNelDecoration) libPath = makeLibName(libPath); if (tryLibPath) { // remove any directory spec string filename = CFile::getFilename(libPath); for (uint i=0; i<_LibPaths.size(); ++i) { string pathname = _LibPaths[i]+filename; if (CFile::isExists(pathname)) { // we found it, replace libPath libPath = pathname; break; } } } nldebug("Loading dynamic library '%s'", libPath.c_str()); // load the lib now _LibHandle = nlLoadLibrary(libPath); _LibFileName = libPath; // MTR: some new error handling. Just logs if it couldn't load the handle. if(_LibHandle == NULL) { #ifdef NL_OS_UNIX const char *errormsg = dlerror(); #else const char *errormsg = "Verify DLL existence"; #endif nlwarning("Loading library %s failed: %s", libPath.c_str(), errormsg); } else { // check for 'pure' NeL library void *entryPoint = getSymbolAddress(NL_MACRO_TO_STR(NLMISC_PURE_LIB_ENTRY_POINT)); if (entryPoint != NULL) { // rebuild the interface pointer _PureNelLibrary = *(reinterpret_cast<INelLibrary**>(entryPoint)); // call the private initialization method. _PureNelLibrary->_onLibraryLoaded(INelContext::getInstance()); } } return _LibHandle != NULL; }
//static QString KLibLoader::findLibrary( const char * name, const KInstance * instance ) { QCString libname = makeLibName( name ); // only look up the file if it is not an absolute filename // (mhk, 20000228) QString libfile; if (!QDir::isRelativePath(libname)) libfile = QFile::decodeName( libname ); else { libfile = instance->dirs()->findResource( "module", libname ); if ( libfile.isEmpty() ) { libfile = instance->dirs()->findResource( "lib", libname ); #ifndef NDEBUG if ( !libfile.isEmpty() && libname.left(3) == "lib" ) // don't warn for kdeinit modules kdDebug(150) << "library " << libname << " not found under 'module' but under 'lib'" << endl; #endif } } return libfile; }
KLibrary* KLibLoader::library( const char *name ) { if (!name) return 0; KLibWrapPrivate* wrap = m_libs[name]; if (wrap) { /* Nothing to do to load the library. */ wrap->ref_count++; return wrap->lib; } /* Test if this library was loaded at some time, but got unloaded meanwhile, whithout being dlclose()'ed. */ QPtrListIterator<KLibWrapPrivate> it(d->loaded_stack); for (; it.current(); ++it) { if (it.current()->name == name) wrap = it.current(); } if (wrap) { d->pending_close.removeRef(wrap); if (!wrap->lib) { /* This lib only was in loaded_stack, but not in m_libs. */ wrap->lib = new KLibrary( name, wrap->filename, wrap->handle ); } wrap->ref_count++; } else { QString libfile = findLibrary( name ); if ( libfile.isEmpty() ) { const QCString libname = makeLibName( name ); #ifndef NDEBUG kdDebug(150) << "library=" << name << ": No file named " << libname << " found in paths." << endl; #endif d->errorMessage = i18n("Library files for \"%1\" not found in paths.").arg(libname); return 0; } lt_dlhandle handle = lt_dlopen( QFile::encodeName(libfile) ); if ( !handle ) { const char* errmsg = lt_dlerror(); if(errmsg) d->errorMessage = QString::fromLocal8Bit(errmsg); else d->errorMessage = QString::null; return 0; } else d->errorMessage = QString::null; KLibrary *lib = new KLibrary( name, libfile, handle ); wrap = new KLibWrapPrivate(lib, handle); d->loaded_stack.prepend(wrap); } m_libs.insert( name, wrap ); connect( wrap->lib, SIGNAL( destroyed() ), this, SLOT( slotLibraryDestroyed() ) ); return wrap->lib; }