summaryrefslogtreecommitdiffabout
path: root/microkde
Unidiff
Diffstat (limited to 'microkde') (more/less context) (ignore whitespace changes)
-rw-r--r--microkde/kdecore/klibloader.cpp17
1 files changed, 12 insertions, 5 deletions
diff --git a/microkde/kdecore/klibloader.cpp b/microkde/kdecore/klibloader.cpp
index 130cc7c..c07d50f 100644
--- a/microkde/kdecore/klibloader.cpp
+++ b/microkde/kdecore/klibloader.cpp
@@ -1,81 +1,85 @@
1/* This file is part of the KDE libraries 1/* This file is part of the KDE libraries
2 Copyright (C) 1999 Torben Weis <weis@kde.org> 2 Copyright (C) 1999 Torben Weis <weis@kde.org>
3 Copyright (C) 2000 Michael Matz <matz@kde.org> 3 Copyright (C) 2000 Michael Matz <matz@kde.org>
4 4
5 This library is free software; you can redistribute it and/or 5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Library General Public 6 modify it under the terms of the GNU Library General Public
7 License version 2 as published by the Free Software Foundation. 7 License version 2 as published by the Free Software Foundation.
8 8
9 This library is distributed in the hope that it will be useful, 9 This library is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of 10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 Library General Public License for more details. 12 Library General Public License for more details.
13 13
14 You should have received a copy of the GNU Library General Public License 14 You should have received a copy of the GNU Library General Public License
15 along with this library; see the file COPYING.LIB. If not, write to 15 along with this library; see the file COPYING.LIB. If not, write to
16 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 16 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17 Boston, MA 02111-1307, USA. 17 Boston, MA 02111-1307, USA.
18*/ 18*/
19//US #include <config.h> 19//US #include <config.h>
20#include <qclipboard.h> 20#include <qclipboard.h>
21#include <qfile.h> 21#include <qfile.h>
22#include <qtimer.h> 22#include <qtimer.h>
23#include <qobjectdict.h> 23#include <qobjectdict.h>
24#include <qwidgetlist.h> 24#include <qwidgetlist.h>
25#include <qwidget.h> 25#include <qwidget.h>
26 26
27#include "kapplication.h" 27#include "kapplication.h"
28#include "klibloader.h" 28#include "klibloader.h"
29#include "kstandarddirs.h" 29#include "kstandarddirs.h"
30#include "kdebug.h" 30#include "kdebug.h"
31#include "klocale.h" 31#include "klocale.h"
32 32
33//US #include "ltdl.h" 33/*US
34#ifndef NDEBUG
35#include "ltdl.h"
36#endif
37*/
34 38
35//US do everything through qlibrary 39//US do everything through qlibrary
36#ifndef DESKTOP_VERSION 40#ifndef DESKTOP_VERSION
37#include <qpe/qpeapplication.h> 41#include <qpe/qpeapplication.h>
38#include <qtopia/qlibrary.h> 42#include <qtopia/qlibrary.h>
39#endif 43#endif
40 44
41/*US 45/*US
42#ifdef Q_WS_X11 46#ifdef Q_WS_X11
43#include <X11/Xlib.h> 47#include <X11/Xlib.h>
44#include <X11/Xatom.h> 48#include <X11/Xatom.h>
45#endif 49#endif
46*/ 50*/
47template class QAsciiDict<KLibrary>; 51template class QAsciiDict<KLibrary>;
48 52
49#include <stdlib.h> //getenv 53#include <stdlib.h> //getenv
50 54
51/*US 55/*US
52#if HAVE_DLFCN_H 56#if HAVE_DLFCN_H
53# include <dlfcn.h> 57# include <dlfcn.h>
54#endif 58#endif
55 59
56#ifdef RTLD_GLOBAL 60#ifdef RTLD_GLOBAL
57# define LT_GLOBAL RTLD_GLOBAL 61# define LT_GLOBAL RTLD_GLOBAL
58#else 62#else
59# ifdef DL_GLOBAL 63# ifdef DL_GLOBAL
60# define LT_GLOBAL DL_GLOBAL 64# define LT_GLOBAL DL_GLOBAL
61# endif 65# endif
62#endif 66#endif
63#ifndef LT_GLOBAL 67#ifndef LT_GLOBAL
64# define LT_GLOBAL 0 68# define LT_GLOBAL 0
65#endif 69#endif
66*/ 70*/
67 71
68/*US 72/*US
69extern "C" { 73extern "C" {
70extern int lt_dlopen_flag; 74extern int lt_dlopen_flag;
71} 75}
72*/ 76*/
73 77
74KLibFactory::KLibFactory( QObject* parent, const char* name ) 78KLibFactory::KLibFactory( QObject* parent, const char* name )
75 : QObject( parent, name ) 79 : QObject( parent, name )
76{ 80{
77} 81}
78 82
79KLibFactory::~KLibFactory() 83KLibFactory::~KLibFactory()
80{ 84{
81// kdDebug(150) << "Deleting KLibFactory " << this << endl; 85// kdDebug(150) << "Deleting KLibFactory " << this << endl;
@@ -108,101 +112,104 @@ KLibrary::KLibrary( const QString& libname, const QString& filename, QLibrary* h
108 m_handle = handle; 112 m_handle = handle;
109 m_factory = 0; 113 m_factory = 0;
110 m_timer = 0; 114 m_timer = 0;
111} 115}
112 116
113KLibrary::~KLibrary() 117KLibrary::~KLibrary()
114{ 118{
115// kdDebug(150) << "Deleting KLibrary " << this << " " << m_libname << endl; 119// kdDebug(150) << "Deleting KLibrary " << this << " " << m_libname << endl;
116 if ( m_timer && m_timer->isActive() ) 120 if ( m_timer && m_timer->isActive() )
117 m_timer->stop(); 121 m_timer->stop();
118 122
119 // If any object is remaining, delete 123 // If any object is remaining, delete
120 if ( m_objs.count() > 0 ) 124 if ( m_objs.count() > 0 )
121 { 125 {
122 QPtrListIterator<QObject> it( m_objs ); 126 QPtrListIterator<QObject> it( m_objs );
123 for ( ; it.current() ; ++it ) 127 for ( ; it.current() ; ++it )
124 { 128 {
125 kdDebug(150) << "Factory still has object " << it.current() << " " << it.current()->name () << " Library = " << m_libname << endl; 129 kdDebug(150) << "Factory still has object " << it.current() << " " << it.current()->name () << " Library = " << m_libname << endl;
126 disconnect( it.current(), SIGNAL( destroyed() ), 130 disconnect( it.current(), SIGNAL( destroyed() ),
127 this, SLOT( slotObjectDestroyed() ) ); 131 this, SLOT( slotObjectDestroyed() ) );
128 } 132 }
129 m_objs.setAutoDelete(true); 133 m_objs.setAutoDelete(true);
130 m_objs.clear(); 134 m_objs.clear();
131 } 135 }
132 136
133 if ( m_factory ) { 137 if ( m_factory ) {
134 //kdDebug(150) << " ... deleting the factory " << m_factory << endl; 138 //kdDebug(150) << " ... deleting the factory " << m_factory << endl;
135 delete m_factory; 139 delete m_factory;
136 } 140 }
137} 141}
138 142
139QString KLibrary::name() const 143QString KLibrary::name() const
140{ 144{
141 return m_libname; 145 return m_libname;
142} 146}
143 147
144QString KLibrary::fileName() const 148QString KLibrary::fileName() const
145{ 149{
146 return m_filename; 150 return m_filename;
147} 151}
148 152
149KLibFactory* KLibrary::factory() 153KLibFactory* KLibrary::factory()
150{ 154{
151 if ( m_factory ) 155 if ( m_factory )
152 return m_factory; 156 return m_factory;
153 157
154 QCString symname; 158 QCString symname;
155 symname.sprintf("init_%s", name().latin1() ); 159 symname.sprintf("init_%s", name().latin1() );
156 160
157 void* sym = symbol( symname ); 161 void* sym = symbol( symname );
158 if ( !sym ) 162 if ( !sym )
159 { 163 {
160 qDebug("KLibrary: The library %s does not offer an %s function", name().latin1(), symname.data()); 164 qDebug("KLibrary: The library %s does not offer an %s function", name().latin1(), symname.data());
165#ifndef NDEBUG
166//US qDebug("KLibrary: errorcode: %s", lt_dlerror());
167#endif
161 kdWarning(150) << "KLibrary: The library " << name().latin1() << " does not offer an init_" << name().latin1() << " function" << endl; 168 kdWarning(150) << "KLibrary: The library " << name().latin1() << " does not offer an init_" << name().latin1() << " function" << endl;
162 return 0; 169 return 0;
163 } 170 }
164 171
165 typedef KLibFactory* (*t_func)(); 172 typedef KLibFactory* (*t_func)();
166 t_func func = (t_func)sym; 173 t_func func = (t_func)sym;
167 m_factory = func(); 174 m_factory = func();
168 175
169 if( !m_factory ) 176 if( !m_factory )
170 { 177 {
171 kdWarning(150) << "KLibrary: The library " << name() << " does not offer a KDE compatible factory" << endl; 178 kdWarning(150) << "KLibrary: The library " << name() << " does not offer a KDE compatible factory" << endl;
172 return 0; 179 return 0;
173 } 180 }
174 181
175 connect( m_factory, SIGNAL( objectCreated( QObject * ) ), 182 connect( m_factory, SIGNAL( objectCreated( QObject * ) ),
176 this, SLOT( slotObjectCreated( QObject * ) ) ); 183 this, SLOT( slotObjectCreated( QObject * ) ) );
177 184
178 return m_factory; 185 return m_factory;
179} 186}
180 187
181void* KLibrary::symbol( const char* symname ) const 188void* KLibrary::symbol( const char* symname ) const
182{ 189{
183//US void* sym = lt_dlsym( (lt_dlhandle) m_handle, symname ); 190//US void* sym = lt_dlsym( (lt_dlhandle) m_handle, symname );
184 void* sym = m_handle->resolve( symname ); 191 void* sym = m_handle->resolve( symname );
185 if ( !sym ) 192 if ( !sym )
186 { 193 {
187//US kdWarning(150) << "KLibrary: " << lt_dlerror() << endl; 194//US kdWarning(150) << "KLibrary: " << lt_dlerror() << endl;
188 kdWarning(150) << "KLibrary: " << m_libname << ", symbol:" << symname << " not found " << endl; 195 kdWarning(150) << "KLibrary: " << m_libname << ", symbol:" << symname << " not found " << endl;
189 return 0; 196 return 0;
190 } 197 }
191 198
192 return sym; 199 return sym;
193} 200}
194 201
195bool KLibrary::hasSymbol( const char* symname ) const 202bool KLibrary::hasSymbol( const char* symname ) const
196{ 203{
197//US void* sym = lt_dlsym( (lt_dlhandle) m_handle, symname ); 204//US void* sym = lt_dlsym( (lt_dlhandle) m_handle, symname );
198 void* sym = m_handle->resolve( symname ); 205 void* sym = m_handle->resolve( symname );
199 return (sym != 0L ); 206 return (sym != 0L );
200} 207}
201 208
202void KLibrary::unload() const 209void KLibrary::unload() const
203{ 210{
204 if (KLibLoader::s_self) 211 if (KLibLoader::s_self)
205 KLibLoader::s_self->unloadLibrary(QFile::encodeName(name())); 212 KLibLoader::s_self->unloadLibrary(QFile::encodeName(name()));
206} 213}
207 214
208void KLibrary::slotObjectCreated( QObject *obj ) 215void KLibrary::slotObjectCreated( QObject *obj )
@@ -362,100 +369,100 @@ KLibLoader::~KLibLoader()
362QString KLibLoader::findLibrary( const char * name/*US , const KInstance * instance*/ ) 369QString KLibLoader::findLibrary( const char * name/*US , const KInstance * instance*/ )
363{ 370{
364 QCString libname( name ); 371 QCString libname( name );
365 372
366 // only append ".la" if there is no extension 373 // only append ".la" if there is no extension
367 // this allows to load non-libtool libraries as well 374 // this allows to load non-libtool libraries as well
368 // (mhk, 20000228) 375 // (mhk, 20000228)
369 int pos = libname.findRev('/'); 376 int pos = libname.findRev('/');
370 if (pos < 0) 377 if (pos < 0)
371 pos = 0; 378 pos = 0;
372/*US 379/*US
373 if (libname.find('.', pos) < 0) { 380 if (libname.find('.', pos) < 0) {
374 libname += ".la"; 381 libname += ".la";
375 } 382 }
376*/ 383*/
377//US in the microedition we work only with shared libraries. 384//US in the microedition we work only with shared libraries.
378 if (libname.find('.', pos) < 0) { 385 if (libname.find('.', pos) < 0) {
379 libname += ".so"; 386 libname += ".so";
380 } 387 }
381 388
382 // only look up the file if it is not an absolute filename 389 // only look up the file if it is not an absolute filename
383 // (mhk, 20000228) 390 // (mhk, 20000228)
384 QString libfile; 391 QString libfile;
385 if (libname[0] == '/') 392 if (libname[0] == '/')
386 libfile = libname; 393 libfile = libname;
387 else 394 else
388 { 395 {
389//US at this point the libname must exist as real filesname. No expansions will be made later 396//US at this point the libname must exist as real filesname. No expansions will be made later
390// in findResources. Because of that we prepend the lib prefix here to the name 397// in findResources. Because of that we prepend the lib prefix here to the name
391//US I add also the "lib" prefix. I do not how could this could have worked before without it? 398//US I add also the "lib" prefix. I do not how could this could have worked before without it?
392 libname.insert(pos, "lib"); 399 libname.insert(pos, "lib");
393 400
394 401
395//US libfile = instance->dirs()->findResource( "module", libname ); 402//US libfile = instance->dirs()->findResource( "module", libname );
396 libfile = KGlobal::dirs()->findResource( "module", libname ); 403 libfile = KGlobal::dirs()->findResource( "module", libname );
397 if ( libfile.isEmpty() ) 404 if ( libfile.isEmpty() )
398 { 405 {
399//US libfile = instance->dirs()->findResource( "lib", libname ); 406//US libfile = instance->dirs()->findResource( "lib", libname );
400 libfile = KGlobal::dirs()->findResource( "lib", libname ); 407 libfile = KGlobal::dirs()->findResource( "lib", libname );
401#ifndef NDEBUG 408#ifndef NDEBUG
402 if ( !libfile.isEmpty() && libname.left(3) == "lib" ) // don't warn for kdeinit modules 409 if ( !libfile.isEmpty() && libname.left(3) == "lib" ) // don't warn for kdeinit modules
403 kdDebug(150) << "library " << libname << " not found under 'module' but under 'lib'" << endl; 410 kdDebug(150) << "library " << libname << " not found under 'module' but under 'lib'" << endl;
404#endif 411#endif
405 } 412 }
406 if ( libfile.isEmpty() ) 413 if ( libfile.isEmpty() )
407 { 414 {
408#ifndef NDEBUG 415#ifndef NDEBUG
409 kdDebug(150) << "library=" << libname << ": No file names " << libname.data() << " found in paths." << endl; 416 kdDebug(150) << "library=" << libname << ": No file names " << libname.data() << " found in paths." << endl;
410#endif 417 self()->d->errorMessage = i18n("Library files for \"%1\" not found in paths").arg(libname);
411 self()->d->errorMessage = i18n("Library files for \"%1\" not found in paths").arg(libname);
412 418
413 qDebug("KLibLoader::library could not find library: %s", libname.data()); 419 qDebug("KLibLoader::library could not find library: %s", libname.data());
420#endif
414 421
415 } 422 }
416 else 423 else
417 self()->d->errorMessage = QString::null; 424 self()->d->errorMessage = QString::null;
418 } 425 }
419 return libfile; 426 return libfile;
420} 427}
421 428
422 429
423KLibrary* KLibLoader::globalLibrary( const char *name ) 430KLibrary* KLibLoader::globalLibrary( const char *name )
424{ 431{
425KLibrary *tmp; 432KLibrary *tmp;
426/*US 433/*US
427int olt_dlopen_flag = lt_dlopen_flag; 434int olt_dlopen_flag = lt_dlopen_flag;
428 435
429 lt_dlopen_flag |= LT_GLOBAL; 436 lt_dlopen_flag |= LT_GLOBAL;
430 kdDebug(150) << "Loading the next library global with flag " 437 kdDebug(150) << "Loading the next library global with flag "
431 << lt_dlopen_flag 438 << lt_dlopen_flag
432 << "." << endl; 439 << "." << endl;
433*/ 440*/
434 tmp = library(name); 441 tmp = library(name);
435/*US 442/*US
436 lt_dlopen_flag = olt_dlopen_flag; 443 lt_dlopen_flag = olt_dlopen_flag;
437*/ 444*/
438return tmp; 445return tmp;
439} 446}
440 447
441 448
442KLibrary* KLibLoader::library( const char *name ) 449KLibrary* KLibLoader::library( const char *name )
443{ 450{
444 if (!name) 451 if (!name)
445 return 0; 452 return 0;
446 453
447 KLibWrapPrivate* wrap = m_libs[name]; 454 KLibWrapPrivate* wrap = m_libs[name];
448 if (wrap) { 455 if (wrap) {
449 /* Nothing to do to load the library. */ 456 /* Nothing to do to load the library. */
450 wrap->ref_count++; 457 wrap->ref_count++;
451 return wrap->lib; 458 return wrap->lib;
452 } 459 }
453 460
454 /* Test if this library was loaded at some time, but got 461 /* Test if this library was loaded at some time, but got
455 unloaded meanwhile, whithout being dlclose()'ed. */ 462 unloaded meanwhile, whithout being dlclose()'ed. */
456 QPtrListIterator<KLibWrapPrivate> it(d->loaded_stack); 463 QPtrListIterator<KLibWrapPrivate> it(d->loaded_stack);
457 for (; it.current(); ++it) { 464 for (; it.current(); ++it) {
458 if (it.current()->name == name) 465 if (it.current()->name == name)
459 wrap = it.current(); 466 wrap = it.current();
460 } 467 }
461 468