--===============0133958459== Content-Type: multipart/signed; boundary="nextPart120915199.dD6zb6o5Ts"; protocol="application/pgp-signature"; micalg=pgp-sha1 Content-Transfer-Encoding: 7bit --nextPart120915199.dD6zb6o5Ts Content-Type: multipart/mixed; boundary="Boundary-01=_jsFEIvEmWIRd8CG" Content-Transfer-Encoding: 7bit Content-Disposition: inline --Boundary-01=_jsFEIvEmWIRd8CG Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Content-Disposition: inline Hello, Replaced all Qt3/KDE3 support classes with proper ones from Qt4/KDE4. This fixed nspluginviewer crash on window close. Hope it will be useful. =2D-=20 Best regards, Sergey A Saukh --Boundary-01=_jsFEIvEmWIRd8CG Content-Type: text/x-diff; charset="utf-8"; name="nsplugins.diff" Content-Transfer-Encoding: quoted-printable Content-Disposition: attachment; filename="nsplugins.diff" diff -ubEr kdebase.orig/apps/nsplugins/nspluginloader.cpp kdebase/apps/nspl= ugins/nspluginloader.cpp =2D-- kdebase.orig/apps/nsplugins/nspluginloader.cpp 2008-03-09 19:39:11.00= 0000000 +0600 +++ kdebase/apps/nsplugins/nspluginloader.cpp 2008-04-24 16:38:45.000000000= +0700 @@ -32,7 +32,7 @@ =20 =20 #include =2D#include +#include #include #include #include @@ -174,11 +174,9 @@ =20 =20 NSPluginLoader::NSPluginLoader() =2D : QObject(), _mapping(7, false), _viewer(0) + : QObject(), _mapping(), _viewer(0) { scanPlugins(); =2D _mapping.setAutoDelete( true ); =2D _filetype.setAutoDelete(true); } =20 =20 @@ -250,7 +248,7 @@ if (!mime.isEmpty()) { // insert the mimetype -> plugin mapping =2D _mapping.insert(mime, new QString(plugin)); + _mapping.insert(mime, QString(plugin).toLower()); =20 // insert the suffix -> mimetype mapping QStringList::Iterator suffix; @@ -266,8 +264,8 @@ stripped =3D stripped.right( stripped.length()-p ); =20 // add filetype to list =2D if ( !stripped.isEmpty() && !_filetype.find(stripped) ) =2D _filetype.insert( stripped, new QString(mime)); + if ( !stripped.isEmpty() && !_filetype.contains(stripped) ) + _filetype.insert( stripped, QString(mime)); } } } @@ -276,23 +274,26 @@ =20 QString NSPluginLoader::lookupMimeType(const QString &url) { =2D Q3DictIterator dit2(_filetype); =2D while (dit2.current()) =2D { =2D QString ext =3D QString(".")+dit2.currentKey(); =2D if (url.right(ext.length()) =3D=3D ext) =2D return *dit2.current(); =2D ++dit2; + QString result; + QHashIterator dit2(_filetype); + while ( dit2.hasNext() ) { + dit2.next(); + QString ext =3D QString(".")+dit2.key(); + if (url.right(ext.length()) =3D=3D ext) { + result =3D dit2.value(); + break; + } } =2D return QString(); + =20 + return result; } =20 =20 QString NSPluginLoader::lookup(const QString &mimeType) { QString plugin; =2D if ( _mapping[mimeType] ) =2D plugin =3D *_mapping[mimeType]; + if ( _mapping.contains(mimeType) ) + plugin =3D _mapping.value(mimeType); =20 kDebug() << "Looking up plugin for mimetype " << mimeType << ": " << plu= gin; =20 @@ -304,35 +305,32 @@ { kDebug() << "NSPluginLoader::loadViewer"; =20 =2D _process =3D new K3Process; =2D + _process.clearProgram(); // get the dbus app id int pid =3D (int)getpid(); QString tmp; tmp.sprintf("org.kde.nspluginviewer-%d",pid); _viewerDBusId =3Dtmp.toLatin1(); =20 =2D connect( _process, SIGNAL(processExited(K3Process*)), =2D this, SLOT(processTerminated(K3Process*)) ); + connect( &_process, SIGNAL(finished(int, QProcess::ExitStatus)), + this, SLOT(processTerminated(int , QProcess::ExitStatus)) ); =20 // find the external viewer process QString viewer =3D KGlobal::dirs()->findExe("nspluginviewer"); if (viewer.isEmpty()) { kDebug() << "can't find nspluginviewer"; =2D delete _process; return false; } =20 =2D *_process << viewer; + _process << viewer; =20 =2D // tell the process it's parameters =2D *_process << "-dbusservice"; =2D *_process << _viewerDBusId; + _process << "-dbusservice"; + _process << _viewerDBusId; =20 // run the process kDebug() << "Running nspluginviewer"; =2D _process->start(); + _process.start(); =20 // wait for the process to run int cnt =3D 0; @@ -352,14 +350,13 @@ #endif { kDebug() << "timeout"; =2D delete _process; + _process.kill(); return false; } =20 =2D if (!_process->isRunning()) + if (_process.state() =3D=3D QProcess::NotRunning) { kDebug() << "nspluginviewer terminated"; =2D delete _process; return false; } } @@ -380,9 +377,8 @@ _viewer->shutdown(); kDebug() << "Shutdown viewer"; delete _viewer; =2D delete _process; + _process.kill(); _viewer =3D 0; =2D _process =3D 0; } =20 kDebug() << "<- NSPluginLoader::unloadViewer"; @@ -391,16 +387,11 @@ =20 =20 =20 =2Dvoid NSPluginLoader::processTerminated(K3Process *proc) +void NSPluginLoader::processTerminated(int exitCode, QProcess::ExitStatus = exitStatus) { =2D if ( _process =3D=3D proc) =2D { kDebug() << "Viewer process terminated"; delete _viewer; =2D delete _process; _viewer =3D 0; =2D _process =3D 0; =2D } } =20 =20 diff -ubEr kdebase.orig/apps/nsplugins/nspluginloader.h kdebase/apps/nsplug= ins/nspluginloader.h =2D-- kdebase.orig/apps/nsplugins/nspluginloader.h 2008-03-09 19:39:11.0000= 00000 +0600 +++ kdebase/apps/nsplugins/nspluginloader.h 2008-04-24 15:56:44.000000000 += 0700 @@ -29,7 +29,8 @@ =20 =20 =20 =2D#include +#include +#include #include #include #include @@ -37,11 +38,11 @@ #include #include #include +#include =20 #define EMBEDCLASS QX11EmbedContainer =20 class OrgKdeNspluginsViewerInterface; =2Dclass K3Process; class QPushButton; class QGridLayout; class OrgKdeNspluginsInstanceInterface; @@ -104,13 +105,14 @@ void unloadViewer(); =20 protected Q_SLOTS: =2D void processTerminated( K3Process *proc ); + void processTerminated( int exitCode, QProcess::ExitStatus exitStatus ); =20 private: QStringList _searchPaths; =2D Q3Dict _mapping, _filetype; + QMultiHash _mapping; + QHash _filetype; =20 =2D K3Process *_process; + KProcess _process; QString _viewerDBusId; OrgKdeNspluginsViewerInterface *_viewer; =20 diff -ubEr kdebase.orig/apps/nsplugins/viewer/nsplugin.cpp kdebase/apps/nsp= lugins/viewer/nsplugin.cpp =2D-- kdebase.orig/apps/nsplugins/viewer/nsplugin.cpp 2008-03-09 19:39:11.0= 00000000 +0600 +++ kdebase/apps/nsplugins/viewer/nsplugin.cpp 2008-04-24 16:40:21.00000000= 0 +0700 @@ -37,7 +37,6 @@ #include #include =20 =2D#include #include #include #include @@ -611,9 +610,6 @@ _npp->ndata =3D this; _destroyed =3D false; _handle =3D handle; =2D _tempFiles.setAutoDelete( true ); =2D _streams.setAutoDelete( true ); =2D _waitingRequests.setAutoDelete( true ); _callback =3D new org::kde::nsplugins::CallBack( appId, callbackId, QDB= usConnection::sessionBus() ); =20 KUrl base(src); @@ -659,17 +655,20 @@ if ( !_destroyed ) { =20 kDebug(1431) << "delete streams"; =2D _waitingRequests.clear(); + while ( !_waitingRequests.isEmpty() ) + delete _waitingRequests.dequeue(); =20 shutdown(); =20 =2D for( NSPluginStreamBase *s=3D_streams.first(); s!=3D0; ) { =2D NSPluginStreamBase *next =3D _streams.next(); + while ( !_streams.isEmpty() ) { + NSPluginStreamBase *s =3D _streams.takeFirst(); s->stop(); =2D s =3D next; + delete s; } =20 =2D _streams.clear(); + kDebug(1431) << "delete tempfiles"; + while ( !_tempFiles.isEmpty() ) + delete _tempFiles.takeFirst(); =20 kDebug(1431) << "delete callbacks"; delete _callback; @@ -728,10 +727,10 @@ =20 // start queued requests kDebug(1431) << "looking for waiting requests"; =2D while ( _waitingRequests.head() ) { + while ( !_waitingRequests.isEmpty() ) { kDebug(1431) << "request found"; Request req( *_waitingRequests.head() ); =2D _waitingRequests.remove(); + delete _waitingRequests.dequeue(); =20 QString url; =20 @@ -880,9 +879,7 @@ { kDebug(1431) << "-> NSPluginInstance::streamFinished"; emitStatus( QString() ); =2D _streams.setAutoDelete(false); =2D _streams.remove(strm); =2D _streams.setAutoDelete(true); + _streams.removeOne(strm); strm->deleteLater(); _timer->setSingleShot( true ); _timer->start( 100 ); @@ -1219,7 +1216,6 @@ _libname =3D library; _constructed =3D false; _error =3D true; =2D _instances.setAutoDelete( true ); _NP_GetMIMEDescription =3D 0; _NP_Initialize =3D 0; _NP_Shutdown =3D 0; @@ -1274,8 +1270,12 @@ =20 NSPluginClass::~NSPluginClass() { =2D _instances.clear(); =2D _trash.clear(); + while ( !_instances.isEmpty() ) + delete _instances.takeFirst(); + + while ( !_trash.isEmpty() ) + delete _trash.takeFirst(); + shutdown(); if (_handle) _handle->unload(); @@ -1285,10 +1285,14 @@ void NSPluginClass::timer() { // delete instances =2D for ( NSPluginInstance *it=3D_trash.first(); it!=3D0; it=3D_trash.ne= xt() ) =2D _instances.remove(it); + while ( !_trash.isEmpty() ) { + NSPluginInstance *it =3D _trash.takeFirst(); + int i =3D _instances.indexOf(it); + if ( i !=3D -1 ) + delete _instances.takeAt(i); =20 =2D _trash.clear(); + delete it; + } } =20 =20 diff -ubEr kdebase.orig/apps/nsplugins/viewer/nsplugin.h kdebase/apps/nsplu= gins/viewer/nsplugin.h =2D-- kdebase.orig/apps/nsplugins/viewer/nsplugin.h 2008-03-09 19:39:11.000= 000000 +0600 +++ kdebase/apps/nsplugins/viewer/nsplugin.h 2008-04-24 16:06:50.000000000 = +0700 @@ -28,12 +28,10 @@ =20 #include =20 =2D#include #include =2D#include #include =2D//Added by qt3to4: =2D#include +#include +#include =20 #include =20 @@ -221,9 +219,9 @@ bool _destroyed; bool _embedded; void addTempFile(KTemporaryFile *tmpFile); =2D Q3PtrList _tempFiles; + QList _tempFiles; OrgKdeNspluginsCallBackInterface *_callback; =2D Q3PtrList _streams; + QList _streams; KLibrary *_handle; QTimer *_timer; =20 @@ -267,7 +265,7 @@ KParts::BrowserArguments browserArgs; }; =20 =2D Q3PtrQueue _waitingRequests; + QQueue _waitingRequests; QMap _jsrequests; }; =20 @@ -307,8 +305,8 @@ NP_InitializeUPP *_NP_Initialize; NP_ShutdownUPP *_NP_Shutdown; =20 =2D Q3PtrList _instances; =2D Q3PtrList _trash; + QList _instances; + QList _trash; =20 QByteArray _app; NPPluginFuncs _pluginFuncs; diff -ubEr kdebase.orig/apps/nsplugins/viewer/pluginhost_xt.cpp kdebase/app= s/nsplugins/viewer/pluginhost_xt.cpp =2D-- kdebase.orig/apps/nsplugins/viewer/pluginhost_xt.cpp 2008-03-09 19:39= :11.000000000 +0600 +++ kdebase/apps/nsplugins/viewer/pluginhost_xt.cpp 2008-04-24 16:44:15.000= 000000 +0700 @@ -52,7 +52,8 @@ =20 PluginHostXt::PluginHostXt(NSPluginInstance* plugin): _plugin(plugin), _outside(0), _toplevel(0), _form(0) =2D{} +{ +} =20 =20 void PluginHostXt::setupWindow(int winId, int width, int height) diff -ubEr kdebase.orig/apps/nsplugins/viewer/qxteventloop.cpp kdebase/apps= /nsplugins/viewer/qxteventloop.cpp =2D-- kdebase.orig/apps/nsplugins/viewer/qxteventloop.cpp 2008-03-09 19:39:= 11.000000000 +0600 +++ kdebase/apps/nsplugins/viewer/qxteventloop.cpp 2008-04-24 16:46:09.0000= 00000 +0700 @@ -43,7 +43,8 @@ #include //Added by qt3to4: #include =2D#include +#include +#include =20 // resolve the conflict between X11's FocusIn and QEvent::FocusIn const int XFocusOut =3D FocusOut; @@ -67,10 +68,10 @@ void unhook(); =20 XtAppContext appContext, ownContext; =2D Q3MemArray dispatchers; + QVector dispatchers; QWidgetIntDict mapper; =20 =2D Q3IntDict socknotDict; + QHash socknotDict; bool activate_timers; XtIntervalId timerid; =20 @@ -354,7 +355,7 @@ void qmotif_socknot_handler( XtPointer pointer, int *, XtInputId *id ) { QXtEventLoop *eventloop =3D (QXtEventLoop *) pointer; =2D QSocketNotifier *socknot =3D static_d->socknotDict.find( *id ); + QSocketNotifier *socknot =3D static_d->socknotDict.value( *id ); if ( ! socknot ) // this shouldn't happen return; eventloop->setSocketNotifierPending( socknot ); @@ -395,17 +396,16 @@ */ void QXtEventLoop::unregisterSocketNotifier( QSocketNotifier *notifier ) { =2D Q3IntDictIterator it( d->socknotDict ); =2D while ( it.current() && notifier !=3D it.current() ) =2D ++it; =2D if ( ! it.current() ) { + + int key =3D d->socknotDict.key(notifier); + if ( ! key ) { // this shouldn't happen qWarning( "QXtEventLoopEventLoop: failed to unregister socket notifier" ); return; } =20 =2D XtRemoveInput( it.currentKey() ); =2D d->socknotDict.remove( it.currentKey() ); + XtRemoveInput( key ); + d->socknotDict.remove( key ); =20 QEventLoop::unregisterSocketNotifier( notifier ); } diff -ubEr kdebase.orig/apps/nsplugins/viewer/viewer.cpp kdebase/apps/nsplu= gins/viewer/viewer.cpp =2D-- kdebase.orig/apps/nsplugins/viewer/viewer.cpp 2008-03-09 19:39:11.000= 000000 +0600 +++ kdebase/apps/nsplugins/viewer/viewer.cpp 2008-04-24 16:10:39.000000000 = +0700 @@ -35,7 +35,6 @@ #include #include #include =2D#include #include //Added by qt3to4: #include --Boundary-01=_jsFEIvEmWIRd8CG-- --nextPart120915199.dD6zb6o5Ts Content-Type: application/pgp-signature; name=signature.asc Content-Description: This is a digitally signed message part. -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.6 (GNU/Linux) iQEVAwUASBBbMD8ijVOOoaEyAQITBQgAjlPQR1AIl9WpLVQerEpHoziuslS0xPp9 DxuykzYqIv5/FYAXpxXcc90aegcETBTI9cBHP5i0ynRPDnNw3aqZrnziX9MdTcxD HWyOLMzElGRzEU6JDla7DB413we0mlwD5/YzLfNmhzUKgL4M6JWfZV2ktx/8Ng86 vPAezTLjeLZH6jOMHjzcPnQbjMp7GOm1DwBH613lHnna3nd5q5iVhLHrh++LkWoO eMDgW+Ha2hYfbz/X6Ja+4udW1hu/z+y8TDeceaYGRIG0qqu//npSPfVsQr2gP+R8 DicNSsYLGzQu5il3Wy0qfXxB4+09JtPI/sSKyvcq7r3Xxthyi7dm+Q== =QzgI -----END PGP SIGNATURE----- --nextPart120915199.dD6zb6o5Ts-- --===============0133958459== Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline >> Visit http://mail.kde.org/mailman/listinfo/kde-devel#unsub to unsubscribe << --===============0133958459==--