summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGregorio Guidi <greg_g@gentoo.org>2005-04-03 23:37:27 +0000
committerGregorio Guidi <greg_g@gentoo.org>2005-04-03 23:37:27 +0000
commite4e2ea8106693983505db5806b6fda6fb4071787 (patch)
tree6bbc4d9997348840e1be7e2bef9aba4e384fcaa0 /kde-base
parentVersion bump (diff)
downloadhistorical-e4e2ea8106693983505db5806b6fda6fb4071787.tar.gz
historical-e4e2ea8106693983505db5806b6fda6fb4071787.tar.bz2
historical-e4e2ea8106693983505db5806b6fda6fb4071787.zip
Add patches for bug #86446 (crash on logout) and for bug #87485 (handling of names with spaces).
Package-Manager: portage-2.0.51.19
Diffstat (limited to 'kde-base')
-rw-r--r--kde-base/kdenetwork/ChangeLog10
-rw-r--r--kde-base/kdenetwork/Manifest42
-rw-r--r--kde-base/kdenetwork/files/digest-kdenetwork-3.4.0-r11
-rw-r--r--kde-base/kdenetwork/files/kdenetwork-3.4.0-kopete-logout.patch534
-rw-r--r--kde-base/kdenetwork/files/kdenetwork-3.4.0-kopete-spaces.patch496
-rw-r--r--kde-base/kdenetwork/kdenetwork-3.4.0-r1.ebuild60
6 files changed, 1118 insertions, 25 deletions
diff --git a/kde-base/kdenetwork/ChangeLog b/kde-base/kdenetwork/ChangeLog
index 52a469648a20..5199ce0c27b7 100644
--- a/kde-base/kdenetwork/ChangeLog
+++ b/kde-base/kdenetwork/ChangeLog
@@ -1,6 +1,14 @@
# ChangeLog for kde-base/kdenetwork
# Copyright 2002-2005 Gentoo Foundation; Distributed under the GPL v2
-# $Header: /var/cvsroot/gentoo-x86/kde-base/kdenetwork/ChangeLog,v 1.134 2005/03/18 18:02:42 morfic Exp $
+# $Header: /var/cvsroot/gentoo-x86/kde-base/kdenetwork/ChangeLog,v 1.135 2005/04/03 23:37:27 greg_g Exp $
+
+*kdenetwork-3.4.0-r1 (03 Apr 2005)
+
+ 03 Apr 2005; Gregorio Guidi <greg_g@gentoo.org>
+ +files/kdenetwork-3.4.0-kopete-logout.patch,
+ +files/kdenetwork-3.4.0-kopete-spaces.patch, +kdenetwork-3.4.0-r1.ebuild:
+ Add patches for bug #86446 (crash on logout) and for bug #87485 (handling of
+ names with spaces).
18 Mar 2005; Daniel Goller <morfic@gentoo.org> kdenetwork-3.4.0.ebuild:
Added to ~ppc
diff --git a/kde-base/kdenetwork/Manifest b/kde-base/kdenetwork/Manifest
index a51253e37a0d..566bd010f4a0 100644
--- a/kde-base/kdenetwork/Manifest
+++ b/kde-base/kdenetwork/Manifest
@@ -1,32 +1,26 @@
------BEGIN PGP SIGNED MESSAGE-----
-Hash: SHA1
-
-MD5 71fccce18dbad84d8054b36d08c0ba2c kdenetwork-3.2.3.ebuild 1226
-MD5 394fa6a0f5c95931a64bd8bc86048948 kdenetwork-3.3.1.ebuild 1186
+MD5 14889ab75f97d76e58b0c1154e7683a9 metadata.xml 161
MD5 b3131524da89e63f45c41ddcf9a80bdb kdenetwork-3.3.1-r1.ebuild 1260
-MD5 fc193fdc9c2f4ed3191665ec65521aa6 kdenetwork-3.2.3-r1.ebuild 1305
+MD5 55a0e3505463c3505deee74cc8907398 kdenetwork-3.4.0-r1.ebuild 1534
+MD5 c40c0bac1cdd187a93ef5f1040477ce8 ChangeLog 17465
MD5 93f938d4747753832ab04d62c8eaf514 kdenetwork-3.4.0_rc1.ebuild 1311
-MD5 ef1e3eb9e3060247262db53c06c1e4af kdenetwork-3.3.2.ebuild 1217
+MD5 394fa6a0f5c95931a64bd8bc86048948 kdenetwork-3.3.1.ebuild 1186
MD5 9b3285644d8d99b2d51492d186317f0a kdenetwork-3.4.0.ebuild 1312
-MD5 88a9cf1f58956c0ec3d6f4ef2f171dfa ChangeLog 17154
-MD5 14889ab75f97d76e58b0c1154e7683a9 metadata.xml 161
-MD5 732cc856c1e48585781d79173f5d271b files/lisa 538
-MD5 28c3ba792f8a0ce436216062cefa7908 files/reslisa 549
-MD5 3939e85ee43aba114cc3ece4194145b6 files/reslisa.conf 340
-MD5 d97100af0cb95f733660b7a61492d71f files/lisa.conf 452
-MD5 8dcaf6114da2b32d2bce63e39a38758e files/3.3.1-kget.diff 1321
+MD5 fc193fdc9c2f4ed3191665ec65521aa6 kdenetwork-3.2.3-r1.ebuild 1305
+MD5 ef1e3eb9e3060247262db53c06c1e4af kdenetwork-3.3.2.ebuild 1217
+MD5 71fccce18dbad84d8054b36d08c0ba2c kdenetwork-3.2.3.ebuild 1226
MD5 f943d9cf7ef24546694871e6d9f2dc96 files/digest-kdenetwork-3.4.0_rc1 74
MD5 72eca9b8637e868d730399e0becc045d files/digest-kdenetwork-3.2.3-r1 70
+MD5 622d3497792334fa87e483e249da693d files/digest-kdenetwork-3.4.0-r1 70
+MD5 c72f00859a8536c527d040173f92d3f4 files/kdenetwork-3.4.0-kopete-logout.patch 20923
+MD5 8dae5eac25d478ebf23279132c4a0ead files/digest-kdenetwork-3.3.2 70
+MD5 3939e85ee43aba114cc3ece4194145b6 files/reslisa.conf 340
+MD5 72eca9b8637e868d730399e0becc045d files/digest-kdenetwork-3.2.3 70
+MD5 d272c023453f42fe190bfed26a1378e4 files/kdenetwork-3.4.0-kopete-spaces.patch 17289
+MD5 d97100af0cb95f733660b7a61492d71f files/lisa.conf 452
+MD5 622d3497792334fa87e483e249da693d files/digest-kdenetwork-3.4.0 70
MD5 a0086a72d069c5606f1e2ea81b98fea8 files/digest-kdenetwork-3.3.1-r1 70
+MD5 732cc856c1e48585781d79173f5d271b files/lisa 538
MD5 a32555833318266feb7ea1f68742fdf7 files/yahoo-fix-connect-062404.patch 1139
-MD5 72eca9b8637e868d730399e0becc045d files/digest-kdenetwork-3.2.3 70
+MD5 8dcaf6114da2b32d2bce63e39a38758e files/3.3.1-kget.diff 1321
MD5 a0086a72d069c5606f1e2ea81b98fea8 files/digest-kdenetwork-3.3.1 70
-MD5 8dae5eac25d478ebf23279132c4a0ead files/digest-kdenetwork-3.3.2 70
-MD5 622d3497792334fa87e483e249da693d files/digest-kdenetwork-3.4.0 70
------BEGIN PGP SIGNATURE-----
-Version: GnuPG v1.4.0 (GNU/Linux)
-
-iD8DBQFCOxK5UpKYMelfdYERAsf0AJ4g/CdFEj/astmeQmmfRPasMUNiAQCbBOqS
-DD7sSXXg1VYQO5n95ExP6J0=
-=Xl0J
------END PGP SIGNATURE-----
+MD5 28c3ba792f8a0ce436216062cefa7908 files/reslisa 549
diff --git a/kde-base/kdenetwork/files/digest-kdenetwork-3.4.0-r1 b/kde-base/kdenetwork/files/digest-kdenetwork-3.4.0-r1
new file mode 100644
index 000000000000..8bdd86e1c2ed
--- /dev/null
+++ b/kde-base/kdenetwork/files/digest-kdenetwork-3.4.0-r1
@@ -0,0 +1 @@
+MD5 47a8d21ce486426caf56bf6129ce993f kdenetwork-3.4.0.tar.bz2 7327047
diff --git a/kde-base/kdenetwork/files/kdenetwork-3.4.0-kopete-logout.patch b/kde-base/kdenetwork/files/kdenetwork-3.4.0-kopete-logout.patch
new file mode 100644
index 000000000000..ae1d402a00da
--- /dev/null
+++ b/kde-base/kdenetwork/files/kdenetwork-3.4.0-kopete-logout.patch
@@ -0,0 +1,534 @@
+diff -Nur kdenetwork-3.4.0.orig/kopete/kopete/chatwindow/kopetechatwindow.cpp kdenetwork-3.4.0/kopete/kopete/chatwindow/kopetechatwindow.cpp
+--- kdenetwork-3.4.0.orig/kopete/kopete/chatwindow/kopetechatwindow.cpp 2005-02-23 11:30:49.000000000 +0100
++++ kdenetwork-3.4.0/kopete/kopete/chatwindow/kopetechatwindow.cpp 2005-04-04 00:12:30.000000000 +0200
+@@ -26,6 +26,7 @@
+ #include <qtooltip.h>
+ #include <qfileinfo.h>
+
++#include <kapplication.h>
+ #include <kcursor.h>
+ #include <klocale.h>
+ #include <kmenubar.h>
+@@ -49,6 +50,7 @@
+ #include "chatmessagepart.h"
+ #include "chattexteditpart.h"
+ #include "chatview.h"
++#include "../kopeteapplication.h"
+ #include "kopetechatwindow.h"
+ #include "kopeteemoticonaction.h"
+ #include "kopetegroup.h"
+@@ -214,6 +216,7 @@
+ KGlobal::config()->setGroup( QString::fromLatin1("ChatWindowSettings") );
+ m_alwaysShowTabs = KGlobal::config()->readBoolEntry( QString::fromLatin1("AlwaysShowTabs"), false );
+ // kdDebug( 14010 ) << k_funcinfo << "Open Windows: " << windows.count() << endl;
++ kapp->ref();
+ }
+
+ KopeteChatWindow::~KopeteChatWindow()
+@@ -261,6 +264,7 @@
+ }
+
+ delete anim;
++ kapp->deref();
+ }
+
+ void KopeteChatWindow::windowListChanged()
+@@ -1030,13 +1034,8 @@
+ m_activeView->addText( sm );
+ }
+
+-void KopeteChatWindow::closeEvent( QCloseEvent *e )
++bool KopeteChatWindow::queryClose()
+ {
+-// kdDebug( 14010 ) << k_funcinfo << endl;
+-
+- // FIXME: This should only check if it *can* close
+- // and not start closing if the close can be aborted halfway, it would
+- // leave us with half the chats open and half of them closed. - Martijn
+ bool canClose = true;
+
+ // kdDebug( 14010 ) << " Windows left open:" << endl;
+@@ -1049,6 +1048,10 @@
+ // move out of the way before view is removed
+ ++it;
+
++ // FIXME: This should only check if it *can* close
++ // and not start closing if the close can be aborted halfway, it would
++ // leave us with half the chats open and half of them closed. - Martijn
++
+ // if the view is closed, it is removed from chatViewList for us
+ if ( !view->closeView() )
+ {
+@@ -1056,21 +1059,44 @@
+ canClose = false;
+ }
+ }
++ return canClose;
++}
+
+- if ( canClose )
++bool KopeteChatWindow::queryExit()
++{
++ KopeteApplication *app = static_cast<KopeteApplication *>( kapp );
++ if ( app->sessionSaving()
++ || app->isShuttingDown() /* only set if KopeteApplication::quitKopete() or
++ KopeteApplication::commitData() called */
++ || !KopetePrefs::prefs()->showTray() /* also close if our tray icon is hidden! */
++ || !isShown() )
+ {
++ Kopete::PluginManager::self()->shutdown();
++ return true;
++ }
++ else
++ return false;
++}
++
++void KopeteChatWindow::closeEvent( QCloseEvent * e )
++{
++ // if there's a system tray applet and we are not shutting down then just do what needs to be done if a
++ // window is closed.
++ KopeteApplication *app = static_cast<KopeteApplication *>( kapp );
++ if ( KopetePrefs::prefs()->showTray() && !app->isShuttingDown() && !app->sessionSaving() ) {
++ hide();
++/* // BEGIN of code borrowed from KMainWindow::closeEvent
+ // Save settings if auto-save is enabled, and settings have changed
+ if ( settingsDirty() && autoSaveSettings() )
+ saveAutoSaveSettings();
+-
+- e->accept();
+-
+- // DO NOT call base class's closeEvent - see comment in KopeteApplication constructor for reason
++
++ if ( queryClose() ) {
++ e->accept();
++ }
++ // END of code borrowed from KMainWindow::closeEvent*/
+ }
+ else
+- {
+- e->ignore();
+- }
++ KMainWindow::closeEvent( e );
+ }
+
+ void KopeteChatWindow::slotConfKeys()
+diff -Nur kdenetwork-3.4.0.orig/kopete/kopete/chatwindow/kopetechatwindow.h kdenetwork-3.4.0/kopete/kopete/chatwindow/kopetechatwindow.h
+--- kdenetwork-3.4.0.orig/kopete/kopete/chatwindow/kopetechatwindow.h 2004-11-17 13:05:31.000000000 +0100
++++ kdenetwork-3.4.0/kopete/kopete/chatwindow/kopetechatwindow.h 2005-04-04 00:12:30.000000000 +0200
+@@ -94,6 +94,13 @@
+ void updateMembersActions();
+ void setStatus( const QString & );
+
++ /**
++ * Reimplemented from KMainWindow - asks each ChatView in the window if it is ok to close the window
++ * @return true if no ChatView objects to closing.
++ */
++ virtual bool queryClose();
++ virtual bool queryExit();
++
+ KTempFile *backgroundFile;
+ QPtrList<ChatView> chatViewList;
+
+diff -Nur kdenetwork-3.4.0.orig/kopete/kopete/kopeteapplication.cpp kdenetwork-3.4.0/kopete/kopete/kopeteapplication.cpp
+--- kdenetwork-3.4.0.orig/kopete/kopete/kopeteapplication.cpp 2005-02-03 23:52:01.000000000 +0100
++++ kdenetwork-3.4.0/kopete/kopete/kopeteapplication.cpp 2005-04-04 00:12:30.000000000 +0200
+@@ -55,25 +55,7 @@
+ m_isShuttingDown = false;
+ m_mainWindow = new KopeteWindow( 0, "mainWindow" );
+
+- /* KMainWindow is very broken from our point of view - it deref()'s the app
+- * when the last visible KMainWindow is destroyed. This is broken for a number
+- * of reasons, not least because it can happen more than once within a single
+- * instance of Kopete. Also, our main window is hidden when it's in the tray,
+- * and closing the last chatwindow when in that state can cause the app to quit.
+- *
+- * KopeteApplication's reference counting scheme is different to that of a normal
+- * KDE application. It works as follows: the Kopete::PluginManager has a reference
+- * to the application. No windows ever call KMainWindow::closeEvent, so KMainWindow
+- * doesn't stupidly deref() our application. This ensures that the application
+- * reference counting still works properly, and that the application terminates
+- * neither too early (bug 75805) nor too late (bug 71657). - Richard
+- */
+-
+- // KApplication sets the reference count to 1 on startup. Kopete::PluginManager has a
+- // reference to us once created, so create it and drop our own reference.
+ Kopete::PluginManager::self();
+- deref();
+-
+
+ Kopete::UI::Global::setMainWidget( m_mainWindow );
+
+@@ -106,6 +88,8 @@
+
+ //Create the emoticon installer
+ m_emoticonHandler = new Kopete::EmoticonMimeTypeHandler;
++
++ QObject::connect( this, SIGNAL( aboutToQuit() ), SLOT( slotCleanShutdown() ) );
+ }
+
+ KopeteApplication::~KopeteApplication()
+@@ -223,7 +207,6 @@
+ }
+ }
+
+-
+ void KopeteApplication::slotAllPluginsLoaded()
+ {
+ KCmdLineArgs *args = KCmdLineArgs::parsedArgs();
+@@ -320,41 +303,28 @@
+ {
+ kdDebug( 14000 ) << k_funcinfo << endl;
+
+- if ( !m_isShuttingDown )
+- {
+- m_isShuttingDown = true;
++ m_isShuttingDown = true;
+
+-#if KDE_VERSION < KDE_MAKE_VERSION( 3, 1, 90 )
+- // When we close Kopete through KSystemTray, kdelibs will close all open
+- // windows first. However, despite the destructive close the main window
+- // is _NOT_ yet deleted at this point (it's a scheduled deleteLater()
+- // call).
+- // Due to a bug in KMainWindow prior to KDE 3.2 calling close() a second
+- // time also derefs KApplication a second time, which causes a premature
+- // call to KApplication::quit(), so we never go through the plugin
+- // manager's shutdown process.
+- // Unfortunately we can't assume close() ever being called though,
+- // because the code paths not using the system tray still need this.
+- // As a workaround we schedule a call to quitKopete() through a timer,
+- // so the event loop is processed and the window is already deleted.
+- // - Martijn
+- QTimer::singleShot( 0, this, SLOT( quitKopete() ) );
+- return;
+-#endif
++ // close all windows
++ QPtrListIterator<KMainWindow> it(*KMainWindow::memberList);
++ for (it.toFirst(); it.current(); ++it)
++ {
++ if ( !it.current()->close() )
++ {
++ m_isShuttingDown = false;
++ break;
++ }
+ }
++}
+
+- if ( !m_mainWindow.isNull() )
+- m_mainWindow->close();
+-
++void KopeteApplication::slotCleanShutdown()
++{
+ // save the contact list now, just in case a change was made very recently
+ // and it hasn't autosaved yet
+ Kopete::ContactList::self()->save();
+ Kopete::AccountManager::self()->save();
+
+- //unload plugins and shutdown
+- Kopete::PluginManager::self()->shutdown();
+ }
+-
+ void KopeteApplication::commitData( QSessionManager &sm )
+ {
+ m_isShuttingDown = true;
+diff -Nur kdenetwork-3.4.0.orig/kopete/kopete/kopeteapplication.h kdenetwork-3.4.0/kopete/kopete/kopeteapplication.h
+--- kdenetwork-3.4.0.orig/kopete/kopete/kopeteapplication.h 2004-02-29 04:52:59.000000000 +0100
++++ kdenetwork-3.4.0/kopete/kopete/kopeteapplication.h 2005-04-04 00:12:30.000000000 +0200
+@@ -58,7 +58,8 @@
+
+ public slots:
+ /**
+- * Quit Kopete. This method marks Kopete as 'shutting down' to avoid
++ * Quit Kopete, closing all the windows, which causes application shutdown
++ * This method marks Kopete as 'shutting down' to avoid
+ * showing the message box that Kopete will be left running in the
+ * system tray before calling qApp->quit().
+ */
+@@ -75,7 +76,7 @@
+ * auto-connect
+ */
+ void slotAllPluginsLoaded();
+-
++ void slotCleanShutdown();
+ private:
+ // The main window might get deleted behind our back (W_DestructiveClose),
+ // so use a guarded pointer
+diff -Nur kdenetwork-3.4.0.orig/kopete/kopete/kopetewindow.cpp kdenetwork-3.4.0/kopete/kopete/kopetewindow.cpp
+--- kdenetwork-3.4.0.orig/kopete/kopete/kopetewindow.cpp 2005-02-25 11:52:29.000000000 +0100
++++ kdenetwork-3.4.0/kopete/kopete/kopetewindow.cpp 2005-04-04 00:12:30.000000000 +0200
+@@ -67,9 +67,32 @@
+ #include "kopeteuiglobal.h"
+ #include "systemtray.h"
+
++/* KMainWindow is very broken from our point of view - it deref()'s the app
++ * when the last visible KMainWindow is destroyed. But when our main window is
++ * hidden when it's in the tray,closing the last chatwindow would cause the app
++ * to quit. - Richard
++ *
++ * Fortunately KMainWindow checks queryExit before deref()ing the Kapplication.
++ * KopeteWindow reimplements queryExit() and only returns true if it is shutting down
++ * (either because the user quit Kopete, or the session manager did).
++ *
++ * KopeteWindow and ChatWindows are closed by session management.
++ * App shutdown is not performed by the KopeteWindow but by KopeteApplication:
++ * 1) user quit - KopeteWindow::slotQuit() was called, calls KopeteApplication::quitKopete(),
++ * which closes all chatwindows and the KopeteWindow. The last window to close
++ * shuts down the PluginManager in queryExit(). When the PluginManager has completed its
++ * shutdown, the app is finally deref()ed, and the contactlist and accountmanager
++ * are saved.
++ * and calling KApplication::quit()
++ * 2) session - KopeteWindow and all chatwindows are closed by KApplication session management.
++ * quit Then the shutdown proceeds as above.
++ *
++ * queryClose() is honoured so group chats and chats receiving recent messages can interrupt
++ * (session) quit.
++ */
+
+ KopeteWindow::KopeteWindow( QWidget *parent, const char *name )
+-: KMainWindow( parent, name )
++: KMainWindow( parent, name, WType_TopLevel )
+ {
+ // Applications should ensure that their StatusBar exists before calling createGUI()
+ // so that the StatusBar is always correctly positioned when KDE is configured to use
+@@ -446,42 +469,59 @@
+ Kopete::AccountManager::self()->setAwayAll( awayReason );
+ }
+
+-void KopeteWindow::closeEvent( QCloseEvent *e )
++
++bool KopeteWindow::queryClose()
+ {
+- // Note that KSystemTray closes all windows when you select quit()
+- // from it. This means that closeEvent will be called twice on exit.
+ KopeteApplication *app = static_cast<KopeteApplication *>( kapp );
++ if ( !app->sessionSaving() // if we are just closing but not shutting down
++ && !app->isShuttingDown()
++ && KopetePrefs::prefs()->showTray()
++ && isShown() )
++ // I would make this a KMessageBox::queuedMessageBox but there doesn't seem to be don'tShowAgain support for those
++ KMessageBox::information( this,
++ i18n( "<qt>Closing the main window will keep Kopete running in the "
++ "system tray. Use 'Quit' from the 'File' menu to quit the application.</qt>" ),
++ i18n( "Docking in System Tray" ), "hideOnCloseInfo" );
++// else // we are shutting down either user initiated or session management
++// Kopete::PluginManager::self()->shutdown();
++
++ return true;
++}
+
+- // also close if our tray icon is hidden!
+- if( app->isShuttingDown() || !KopetePrefs::prefs()->showTray() || !isShown() )
++bool KopeteWindow::queryExit()
++{
++ KopeteApplication *app = static_cast<KopeteApplication *>( kapp );
++ if ( app->sessionSaving()
++ || app->isShuttingDown() /* only set if KopeteApplication::quitKopete() or
++ KopeteApplication::commitData() called */
++ || !KopetePrefs::prefs()->showTray() /* also close if our tray icon is hidden! */
++ || !isShown() )
+ {
+- // DO NOT call base class's closeEvent - see comment in KopeteApplication constructor for reason
++ Kopete::PluginManager::self()->shutdown();
++ return true;
++ }
++ else
++ return false;
++}
++
++void KopeteWindow::closeEvent( QCloseEvent *e )
++{
++ // if there's a system tray applet and we are not shutting down then just do what needs to be done if a
++ // window is closed.
++ KopeteApplication *app = static_cast<KopeteApplication *>( kapp );
++ if ( KopetePrefs::prefs()->showTray() && !app->isShuttingDown() && !app->sessionSaving() ) {
++ // BEGIN of code borrowed from KMainWindow::closeEvent
+ // Save settings if auto-save is enabled, and settings have changed
+ if ( settingsDirty() && autoSaveSettings() )
+ saveAutoSaveSettings();
+-
+- e->accept();
+-
+- //If we're not showing the tray, and they close the window (via the 'X' in the titlebar),
+- //workaround the fact that accepting the close event doesn't cause kopete to shutdown
+- if ( !app->isShuttingDown() )
+- {
+- queryExit();
+- slotQuit();
++
++ if ( queryClose() ) {
++ e->accept();
+ }
+-
+- //may never get called
+- return;
++ // END of code borrowed from KMainWindow::closeEvent
+ }
+-
+- // FIXME: KDE 3.3: use queuedMessageBox
+- KMessageBox::information( this,
+- i18n( "<qt>Closing the main window will keep Kopete running in the "
+- "system tray. Use 'Quit' from the 'File' menu to quit the application.</qt>" ),
+- i18n( "Docking in System Tray" ), "hideOnCloseInfo" );
+-
+- hide();
+- e->ignore();
++ else
++ KMainWindow::closeEvent( e );
+ }
+
+ void KopeteWindow::slotQuit()
+diff -Nur kdenetwork-3.4.0.orig/kopete/kopete/kopetewindow.h kdenetwork-3.4.0/kopete/kopete/kopetewindow.h
+--- kdenetwork-3.4.0.orig/kopete/kopete/kopetewindow.h 2005-02-23 11:30:49.000000000 +0100
++++ kdenetwork-3.4.0/kopete/kopete/kopetewindow.h 2005-04-04 00:12:30.000000000 +0200
+@@ -190,6 +190,8 @@
+ void makeTrayToolTip();
+ void startAutoHideTimer();
+
++ virtual bool queryClose();
++ virtual bool queryExit();
+ private:
+ int docked;
+ bool hidden;
+diff -Nur kdenetwork-3.4.0.orig/kopete/kopete/systemtray.cpp kdenetwork-3.4.0/kopete/kopete/systemtray.cpp
+--- kdenetwork-3.4.0.orig/kopete/kopete/systemtray.cpp 2005-02-03 23:52:01.000000000 +0100
++++ kdenetwork-3.4.0/kopete/kopete/systemtray.cpp 2005-04-04 00:12:30.000000000 +0200
+@@ -25,6 +25,7 @@
+
+ #include <kwin.h>
+ #include <kaboutdata.h>
++#include <kactioncollection.h>
+ #include <kapplication.h>
+ #include <kdebug.h>
+ #include <kiconloader.h>
+@@ -36,7 +37,7 @@
+ #include "kopeteaccount.h"
+ #include "kopeteaccountmanager.h"
+ #include "kopetecontact.h"
+-
++#include "kopetewindow.h"
+
+ KopeteSystemTray* KopeteSystemTray::s_systemTray = 0L;
+
+@@ -70,6 +71,18 @@
+ const Kopete::OnlineStatus &, const Kopete::OnlineStatus &)),
+ this, SLOT(slotReevaluateAccountStates()));
+
++ // the slot called by default by the quit action, KSystemTray::maybeQuit(),
++ // just closes the parent window, which is hard to distinguish in that window's closeEvent()
++ // from a click on the window's close widget
++ // in the quit case, we want to quit the application
++ // in the close widget click case, we only want to hide the parent window
++ // so instead, we make it call our general purpose quit slot on the window, which causes a window close and everything else we need
++ // KDE4 - app will have to listen for quitSelected instead
++ KAction *quit = actionCollection()->action( "file_quit" );
++ quit->disconnect();
++ KopeteWindow *myParent = static_cast<KopeteWindow *>( parent );
++ connect( quit, SIGNAL( activated() ), myParent, SLOT( slotQuit() ) );
++
+ //setPixmap(mKopeteIcon);
+ slotReevaluateAccountStates();
+ slotConfigChanged();
+diff -Nur kdenetwork-3.4.0.orig/kopete/libkopete/kopeteaccount.cpp kdenetwork-3.4.0/kopete/libkopete/kopeteaccount.cpp
+--- kdenetwork-3.4.0.orig/kopete/libkopete/kopeteaccount.cpp 2005-03-04 10:53:38.000000000 +0100
++++ kdenetwork-3.4.0/kopete/libkopete/kopeteaccount.cpp 2005-04-04 00:12:30.000000000 +0200
+@@ -97,6 +97,7 @@
+ while ( !d->contacts.isEmpty() )
+ delete *QDictIterator<Contact>( d->contacts );
+
++ kdDebug( 14010 ) << k_funcinfo << " account '" << d->id << "' about to emit accountDestroyed " << endl;
+ emit accountDestroyed(this);
+
+ delete d->myself;
+diff -Nur kdenetwork-3.4.0.orig/kopete/libkopete/kopetepluginmanager.cpp kdenetwork-3.4.0/kopete/libkopete/kopetepluginmanager.cpp
+--- kdenetwork-3.4.0.orig/kopete/libkopete/kopetepluginmanager.cpp 2004-10-17 20:37:16.000000000 +0200
++++ kdenetwork-3.4.0/kopete/libkopete/kopetepluginmanager.cpp 2005-04-04 00:12:30.000000000 +0200
+@@ -101,7 +101,7 @@
+ PluginManager::~PluginManager()
+ {
+ if ( d->shutdownMode != Private::DoneShutdown )
+- kdWarning( 14010 ) << k_funcinfo << "Destructing plugin manager without going through the shutdown process!" << endl << kdBacktrace() << endl;
++ kdWarning( 14010 ) << k_funcinfo << "Destructing plugin manager without going through the shutdown process! Backtrace is: " << endl << kdBacktrace() << endl;
+
+ // Quick cleanup of the remaining plugins, hope it helps
+ // Note that deleting it.data() causes slotPluginDestroyed to be called, which
+@@ -160,7 +160,7 @@
+
+ void PluginManager::shutdown()
+ {
+- //kdDebug( 14010 ) << k_funcinfo << endl;
++ kdDebug( 14010 ) << k_funcinfo << kdBacktrace() << endl;
+
+ d->shutdownMode = Private::ShuttingDown;
+
+@@ -200,6 +200,7 @@
+ // FIXME: I don't buy the above argument. Add a Kopete::Plugin::emitReadyForUnload(void),
+ // and make readyForUnload be passed a plugin. - Richard
+ Plugin *plugin = dynamic_cast<Plugin *>( const_cast<QObject *>( sender() ) );
++ kdDebug( 14010 ) << k_funcinfo << plugin->pluginId() << "ready for unload" << endl;
+ if ( !plugin )
+ {
+ kdWarning( 14010 ) << k_funcinfo << "Calling object is not a plugin!" << endl;
+diff -Nur kdenetwork-3.4.0.orig/kopete/libkopete/kopetepluginmanager.h kdenetwork-3.4.0/kopete/libkopete/kopetepluginmanager.h
+--- kdenetwork-3.4.0.orig/kopete/libkopete/kopetepluginmanager.h 2004-11-18 23:12:09.000000000 +0100
++++ kdenetwork-3.4.0/kopete/libkopete/kopetepluginmanager.h 2005-04-04 00:12:30.000000000 +0200
+@@ -175,7 +175,6 @@
+ * is neglectable for the user.
+ */
+ void allPluginsLoaded();
+-
+ private slots:
+ /**
+ * @brief Cleans up some references if the plugin is destroyed
+diff -Nur kdenetwork-3.4.0.orig/kopete/libkopete/kopeteprotocol.cpp kdenetwork-3.4.0/kopete/libkopete/kopeteprotocol.cpp
+--- kdenetwork-3.4.0.orig/kopete/libkopete/kopeteprotocol.cpp 2004-12-04 15:39:03.000000000 +0100
++++ kdenetwork-3.4.0/kopete/libkopete/kopeteprotocol.cpp 2005-04-04 00:12:30.000000000 +0200
+@@ -96,6 +96,8 @@
+ {//slot connected in aboutToUnload
+ if ( !self || !self->account() || self->account()->isConnected())
+ return;
++ // some protocols change status several times during shutdown. We should only call deleteLater() once
++ disconnect( self, 0, this, 0 );
+
+ connect( self->account(), SIGNAL(accountDestroyed(const Kopete::Account* )),
+ this, SLOT( slotAccountDestroyed( ) ) );
+@@ -105,15 +107,23 @@
+
+ void Protocol::slotAccountDestroyed( )
+ {
++ kdDebug( 14010 ) << k_funcinfo << " an account was destroyed" << endl;
+ QDict<Account> dict = AccountManager::self()->accounts( this );
+ if ( dict.isEmpty() )
+ {
++ kdDebug( 14010 ) << "all gone, we are ready for unload" << endl;
+ // While at this point we are still in a stack trace from the destroyed
+ // account it's safe to emit readyForUnload already, because it uses a
+ // deleteLater rather than a delete for exactly this reason, to keep the
+ // API managable
+ emit( readyForUnload() );
+ }
++ else
++ {
++ kdDebug( 14010 ) << "protocol still has " << dict.count() << " accounts:" << endl;
++ for( QDictIterator<Account> di(dict); di.current(); ++di )
++ kdDebug( 14010 ) << " " << di.currentKey() << " : " << di.current()->accountId() << endl;
++ }
+ }
+
+ void Protocol::aboutToUnload()
+@@ -121,8 +131,6 @@
+
+ d->unloading = true;
+
+- bool allDisconnected = true;
+-
+ // Disconnect all accounts
+ QDict<Account> accounts = AccountManager::self()->accounts( this );
+
+@@ -139,8 +147,6 @@
+ SIGNAL( onlineStatusChanged( Kopete::Contact *, const Kopete::OnlineStatus &, const Kopete::OnlineStatus & ) ),
+ this, SLOT( slotAccountOnlineStatusChanged( Kopete::Contact * ) ) );
+ it.current()->disconnect();
+-
+- allDisconnected = false;
+ }
+ else
+ {
diff --git a/kde-base/kdenetwork/files/kdenetwork-3.4.0-kopete-spaces.patch b/kde-base/kdenetwork/files/kdenetwork-3.4.0-kopete-spaces.patch
new file mode 100644
index 000000000000..6358c0947fd8
--- /dev/null
+++ b/kde-base/kdenetwork/files/kdenetwork-3.4.0-kopete-spaces.patch
@@ -0,0 +1,496 @@
+diff -Nur kdenetwork-3.4.0.orig/kopete/protocols/oscar/aim/aimcontact.cpp kdenetwork-3.4.0/kopete/protocols/oscar/aim/aimcontact.cpp
+--- kdenetwork-3.4.0.orig/kopete/protocols/oscar/aim/aimcontact.cpp 2005-02-23 11:30:54.000000000 +0100
++++ kdenetwork-3.4.0/kopete/protocols/oscar/aim/aimcontact.cpp 2005-04-04 00:13:50.000000000 +0200
+@@ -145,7 +145,7 @@
+
+ void AIMContact::userInfoUpdated( const QString& contact, const UserDetails& details )
+ {
+- if ( contact.lower() != contactId().lower() )
++ if ( Oscar::normalize( contact ) != Oscar::normalize( contactId() ) )
+ return;
+
+ kdDebug(OSCAR_RAW_DEBUG) << k_funcinfo << contact << endl;
+@@ -179,7 +179,7 @@
+
+ void AIMContact::userOnline( const QString& userId )
+ {
+- if ( userId.lower() == contactId().lower() )
++ if ( Oscar::normalize( userId ) == Oscar::normalize( contactId() ) )
+ {
+ kdDebug(OSCAR_RAW_DEBUG) << k_funcinfo << "Getting more contact info" << endl;
+ setOnlineStatus( mProtocol->statusOnline );
+@@ -197,7 +197,7 @@
+
+ void AIMContact::updateAwayMessage( const QString& contact, const QString& message )
+ {
+- if ( contact.lower() != contactId().lower() )
++ if ( Oscar::normalize( contact ) != Oscar::normalize( contactId() ) )
+ return;
+ else
+ {
+@@ -220,7 +220,7 @@
+
+ void AIMContact::updateProfile( const QString& contact, const QString& profile )
+ {
+- if ( contact.lower() != contactId().lower() )
++ if ( Oscar::normalize( contact ) != Oscar::normalize( contactId() ) )
+ return;
+
+ setProperty( mProtocol->clientProfile, profile );
+diff -Nur kdenetwork-3.4.0.orig/kopete/protocols/oscar/aim/aimcontact.cpp.orig kdenetwork-3.4.0/kopete/protocols/oscar/aim/aimcontact.cpp.orig
+--- kdenetwork-3.4.0.orig/kopete/protocols/oscar/aim/aimcontact.cpp.orig 1970-01-01 01:00:00.000000000 +0100
++++ kdenetwork-3.4.0/kopete/protocols/oscar/aim/aimcontact.cpp.orig 2005-02-23 11:30:54.000000000 +0100
+@@ -0,0 +1,267 @@
++/*
++ aimcontact.cpp - Oscar Protocol Plugin
++
++ Copyright (c) 2003 by Will Stephenson
++ Kopete (c) 2002-2004 by the Kopete developers <kopete-devel@kde.org>
++
++ *************************************************************************
++ * *
++ * 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. *
++ * *
++ *************************************************************************
++*/
++
++#include <time.h>
++
++#include <qapplication.h>
++#include <qregexp.h>
++
++#include <kactionclasses.h>
++#include <klocale.h>
++#include <kdebug.h>
++#include <kmessagebox.h>
++
++#include "kopeteaway.h"
++#include "kopetemessagemanager.h"
++#include "kopeteuiglobal.h"
++#include "kopetemetacontact.h"
++
++//liboscar
++#include "client.h"
++#include "oscartypes.h"
++#include "oscarutils.h"
++
++#include "aimprotocol.h"
++#include "aimuserinfo.h"
++#include "aimcontact.h"
++#include "aimaccount.h"
++
++AIMContact::AIMContact( Kopete::Account* account, const QString& name, Kopete::MetaContact* parent,
++ const QString& icon, const Oscar::SSI& ssiItem )
++: OscarContact(account, name, parent, icon, ssiItem )
++{
++ mProtocol=static_cast<AIMProtocol *>(protocol());
++ setOnlineStatus( mProtocol->statusOffline );
++
++ m_infoDialog = 0L;
++ m_warnUserAction = 0L;
++ mUserProfile="";
++ m_haveAwayMessage = false;
++
++ QObject::connect( mAccount->engine(), SIGNAL( receivedUserInfo( const QString&, const UserDetails& ) ),
++ this, SLOT( userInfoUpdated( const QString&, const UserDetails& ) ) );
++ //QObject::connect( mAccount->engine(), SIGNAL( userIsOnline( const QString& ) ), this, SLOT( userOnline( const QString& ) ) );
++ QObject::connect( mAccount->engine(), SIGNAL( userIsOffline( const QString& ) ), this, SLOT( userOffline( const QString& ) ) );
++ QObject::connect( mAccount->engine(), SIGNAL( receivedAwayMessage( const QString&, const QString& ) ),
++ this, SLOT( updateAwayMessage( const QString&, const QString& ) ) );
++ QObject::connect( mAccount->engine(), SIGNAL( receivedProfile( const QString&, const QString& ) ),
++ this, SLOT( updateProfile( const QString&, const QString& ) ) );
++ QObject::connect( mAccount->engine(), SIGNAL( userWarned( const QString&, Q_UINT16, Q_UINT16 ) ),
++ this, SLOT( gotWarning( const QString&, Q_UINT16, Q_UINT16 ) ) );
++}
++
++AIMContact::~AIMContact()
++{
++}
++
++bool AIMContact::isReachable()
++{
++ return true;
++}
++
++QPtrList<KAction> *AIMContact::customContextMenuActions()
++{
++
++ QPtrList<KAction> *actionCollection = new QPtrList<KAction>();
++ if ( !m_warnUserAction )
++ {
++ m_warnUserAction = new KAction( i18n( "&Warn User" ), 0, this, SLOT( warnUser() ), this, "warnAction" );
++ }
++
++ m_warnUserAction->setEnabled( account()->isConnected() );
++
++ actionCollection->append( m_warnUserAction );
++ return actionCollection;
++}
++
++const QString AIMContact::awayMessage()
++{
++ return property(mProtocol->awayMessage).value().toString();
++}
++
++void AIMContact::setAwayMessage(const QString &message)
++{
++ kdDebug(14152) << k_funcinfo <<
++ "Called for '" << contactId() << "', away msg='" << message << "'" << endl;
++ QString filteredMessage = message;
++ filteredMessage.replace(
++ QRegExp(QString::fromLatin1("<[hH][tT][mM][lL].*>(.*)</[hH][tT][mM][lL]>")),
++ QString::fromLatin1("\\1"));
++ filteredMessage.replace(
++ QRegExp(QString::fromLatin1("<[bB][oO][dD][yY].*>(.*)</[bB][oO][dD][yY]>")),
++ QString::fromLatin1("\\1") );
++ filteredMessage.replace(
++ QRegExp(QString::fromLatin1("<[fF][oO][nN][tT].*>(.*)</[fF][oO][nN][tT]>")),
++ QString::fromLatin1("\\1") );
++ setProperty(mProtocol->awayMessage, filteredMessage);
++}
++
++int AIMContact::warningLevel() const
++{
++ return m_warningLevel;
++}
++
++void AIMContact::updateSSIItem()
++{
++ if ( m_ssiItem.type() != 0xFFFF && m_ssiItem.waitingAuth() == false &&
++ onlineStatus() == Kopete::OnlineStatus::Unknown )
++ {
++ //make sure they're offline
++ setOnlineStatus( static_cast<AIMProtocol*>( protocol() )->statusOffline );
++ }
++}
++
++void AIMContact::slotUserInfo()
++{
++ if ( !m_infoDialog)
++ {
++ m_infoDialog = new AIMUserInfoDialog( this, static_cast<AIMAccount*>( account() ), false, Kopete::UI::Global::mainWidget(), 0 );
++ if( !m_infoDialog )
++ return;
++ connect( m_infoDialog, SIGNAL( finished() ), this, SLOT( closeUserInfoDialog() ) );
++ m_infoDialog->show();
++ if ( mAccount->isConnected() )
++ {
++ mAccount->engine()->requestAIMProfile( contactId() );
++ mAccount->engine()->requestAIMAwayMessage( contactId() );
++ }
++ }
++ else
++ m_infoDialog->raise();
++}
++
++void AIMContact::userInfoUpdated( const QString& contact, const UserDetails& details )
++{
++ if ( contact.lower() != contactId().lower() )
++ return;
++
++ kdDebug(OSCAR_RAW_DEBUG) << k_funcinfo << contact << endl;
++
++ //if they don't have an SSI alias, make sure we use the capitalization from the
++ //server so their contact id looks all pretty.
++ QString nickname = property( Kopete::Global::Properties::self()->nickName() ).value().toString();
++ if ( Oscar::normalize( nickname ) == Oscar::normalize( details.userId() ) )
++ setProperty( Kopete::Global::Properties::self()->nickName(), details.userId() );
++
++ if ( ( details.userClass() & 32 ) == 0 )
++ {
++ setOnlineStatus( mProtocol->statusOnline ); //we're online
++ removeProperty( mProtocol->awayMessage );
++ m_haveAwayMessage = false;
++ }
++ else
++ {
++ setOnlineStatus( mProtocol->statusAway ); //we're away
++ if ( !m_haveAwayMessage ) //prevent cyclic away message requests
++ {
++ mAccount->engine()->requestAIMAwayMessage( contactId() );
++ m_haveAwayMessage = true;
++ }
++ }
++
++ OscarContact::userInfoUpdated( contact, details );
++}
++
++
++
++void AIMContact::userOnline( const QString& userId )
++{
++ if ( userId.lower() == contactId().lower() )
++ {
++ kdDebug(OSCAR_RAW_DEBUG) << k_funcinfo << "Getting more contact info" << endl;
++ setOnlineStatus( mProtocol->statusOnline );
++ }
++}
++
++void AIMContact::userOffline( const QString& userId )
++{
++ if ( Oscar::normalize( userId ) == Oscar::normalize( contactId() ) )
++ {
++ setOnlineStatus( mProtocol->statusOffline );
++ removeProperty( mProtocol->awayMessage );
++ }
++}
++
++void AIMContact::updateAwayMessage( const QString& contact, const QString& message )
++{
++ if ( contact.lower() != contactId().lower() )
++ return;
++ else
++ {
++ if ( message.isEmpty() )
++ {
++ removeProperty( mProtocol->awayMessage );
++ setOnlineStatus( mProtocol->statusOnline );
++ m_haveAwayMessage = false;
++ }
++ else
++ {
++ m_haveAwayMessage = true;
++ setAwayMessage( message );
++ setOnlineStatus( mProtocol->statusAway );
++ }
++ }
++
++ emit updatedProfile();
++}
++
++void AIMContact::updateProfile( const QString& contact, const QString& profile )
++{
++ if ( contact.lower() != contactId().lower() )
++ return;
++
++ setProperty( mProtocol->clientProfile, profile );
++ emit updatedProfile();
++}
++
++void AIMContact::gotWarning( const QString& contact, Q_UINT16 increase, Q_UINT16 newLevel )
++{
++ //somebody just got bitchslapped! :O
++ Q_UNUSED( increase );
++ if ( Oscar::normalize( contact ) == Oscar::normalize( contactId() ) )
++ m_warningLevel = newLevel;
++
++ //TODO add a KNotify event after merge to HEAD
++}
++
++void AIMContact::closeUserInfoDialog()
++{
++ m_infoDialog->delayedDestruct();
++ m_infoDialog = 0L;
++}
++
++void AIMContact::warnUser()
++{
++ QString nick = property( Kopete::Global::Properties::self()->nickName() ).value().toString();
++ QString message = i18n( "<qt>Would you like to warn %1 anonymously or with your name?<br>" \
++ "(Warning a user on AIM will result in a \"Warning Level\"" \
++ " increasing for the user you warn. Once this level has reached a" \
++ " certain point, they will not be able to sign on. Please do not abuse" \
++ " this function, it is meant for legitimate practices.)</qt>" ).arg( nick );
++
++
++ int result = KMessageBox::questionYesNoCancel( Kopete::UI::Global::mainWidget(), message,
++ i18n( "Warn User %1?" ).arg( nick ),
++ i18n( "Warn Anonymously" ), i18n( "Warn" ) );
++
++ if ( result == KMessageBox::Yes )
++ mAccount->engine()->sendWarning( contactId(), true);
++ else if ( result == KMessageBox::No )
++ mAccount->engine()->sendWarning( contactId(), false);
++}
++
++#include "aimcontact.moc"
++//kate: tab-width 4; indent-mode csands;
+diff -Nur kdenetwork-3.4.0.orig/kopete/protocols/oscar/icq/icqcontact.cpp kdenetwork-3.4.0/kopete/protocols/oscar/icq/icqcontact.cpp
+--- kdenetwork-3.4.0.orig/kopete/protocols/oscar/icq/icqcontact.cpp 2005-02-03 23:52:07.000000000 +0100
++++ kdenetwork-3.4.0/kopete/protocols/oscar/icq/icqcontact.cpp 2005-04-04 00:13:50.000000000 +0200
+@@ -106,7 +106,7 @@
+
+ void ICQContact::userOnline( const QString& userId )
+ {
+- if ( userId != contactId() )
++ if ( Oscar::normalize( userId ) != Oscar::normalize( contactId() ) )
+ return;
+
+ kdDebug(OSCAR_ICQ_DEBUG) << "Setting " << userId << " online" << endl;
+@@ -116,7 +116,7 @@
+
+ void ICQContact::userOffline( const QString& userId )
+ {
+- if ( userId != contactId() )
++ if ( Oscar::normalize( userId ) != Oscar::normalize( contactId() ) )
+ return;
+
+ kdDebug(OSCAR_ICQ_DEBUG) << "Setting " << userId << " offline" << endl;
+@@ -130,7 +130,7 @@
+ setOnlineStatus( mProtocol->statusManager()->waitingForAuth() );
+
+ QString nickname = property( Kopete::Global::Properties::self()->nickName() ).value().toString();
+- if ( nickname.isEmpty() || nickname == contactId() )
++ if ( nickname.isEmpty() || Oscar::normalize( nickname ) == Oscar::normalize( contactId() ) )
+ {
+ int time = ( KApplication::random() % 25 ) * 1000;
+ kdDebug(OSCAR_ICQ_DEBUG) << k_funcinfo << "updating nickname in " << time/1000 << " seconds" << endl;
+@@ -164,7 +164,7 @@
+
+ void ICQContact::slotGotAuthReply( const QString& contact, const QString& reason, bool granted )
+ {
+- if ( contact != contactId() )
++ if ( Oscar::normalize( contact ) != Oscar::normalize( contactId() ) )
+ return;
+
+ kdDebug(OSCAR_ICQ_DEBUG) << k_funcinfo << endl;
+@@ -189,7 +189,7 @@
+
+ void ICQContact::slotGotAuthRequest( const QString& contact, const QString& reason )
+ {
+- if ( contact != contactId() )
++ if ( Oscar::normalize( contact ) != Oscar::normalize( contactId() ) )
+ return;
+
+ ICQAuthReplyDialog replyDialog;
+@@ -202,7 +202,7 @@
+
+ void ICQContact::receivedLongInfo( const QString& contact )
+ {
+- if ( contact.lower() != contactId().lower() )
++ if ( Oscar::normalize( contact ) != Oscar::normalize( contactId() ) )
+ {
+ if ( m_infoWidget )
+ m_infoWidget->delayedDestruct();
+@@ -224,7 +224,7 @@
+
+ void ICQContact::receivedShortInfo( const QString& contact )
+ {
+- if ( contact != contactId() )
++ if ( Oscar::normalize( contact ) != Oscar::normalize( contactId() ) )
+ return;
+
+ ICQShortInfo shortInfo = mAccount->engine()->getShortInfo( contact );
+diff -Nur kdenetwork-3.4.0.orig/kopete/protocols/oscar/liboscar/ssiauthtask.cpp kdenetwork-3.4.0/kopete/protocols/oscar/liboscar/ssiauthtask.cpp
+--- kdenetwork-3.4.0.orig/kopete/protocols/oscar/liboscar/ssiauthtask.cpp 2005-01-30 16:09:38.000000000 +0100
++++ kdenetwork-3.4.0/kopete/protocols/oscar/liboscar/ssiauthtask.cpp 2005-04-04 00:13:50.000000000 +0200
+@@ -21,6 +21,7 @@
+ #include "transfer.h"
+ #include "buffer.h"
+ #include "connection.h"
++#include "oscarutils.h"
+
+ #include <kdebug.h>
+
+@@ -135,7 +136,7 @@
+ {
+ Buffer* buf = transfer()->buffer();
+
+- QString uin = buf->getBUIN();
++ QString uin = Oscar::normalize( buf->getBUIN() );
+ QString reason = buf->getBSTR();
+
+ buf->getWord(); // 0x0000 - Unknown
+@@ -149,7 +150,7 @@
+ {
+ Buffer* buf = transfer()->buffer();
+
+- QString uin = buf->getBUIN();
++ QString uin = Oscar::normalize( buf->getBUIN() );
+ QString reason = buf->getBSTR();
+
+ buf->getWord(); // 0x0000 - Unknown
+@@ -164,7 +165,7 @@
+ {
+ Buffer* buf = transfer()->buffer();
+
+- QString uin = buf->getBUIN();
++ QString uin = Oscar::normalize( buf->getBUIN() );
+ bool accepted = buf->getByte();
+ QString reason = buf->getBSTR();
+
+@@ -186,7 +187,7 @@
+ {
+ Buffer* buf = transfer()->buffer();
+
+- QString uin = buf->getBUIN();
++ QString uin = Oscar::normalize( buf->getBUIN() );
+
+ kdDebug( OSCAR_RAW_DEBUG ) << k_funcinfo << "User " << uin << " added you to the contact list" << endl;
+ emit contactAddedYou( uin );
+diff -Nur kdenetwork-3.4.0.orig/kopete/protocols/oscar/liboscar/ssilisttask.cpp kdenetwork-3.4.0/kopete/protocols/oscar/liboscar/ssilisttask.cpp
+--- kdenetwork-3.4.0.orig/kopete/protocols/oscar/liboscar/ssilisttask.cpp 2005-01-25 16:10:19.000000000 +0100
++++ kdenetwork-3.4.0/kopete/protocols/oscar/liboscar/ssilisttask.cpp 2005-04-04 00:13:50.000000000 +0200
+@@ -110,6 +110,9 @@
+ tlvList.append( t );
+ }
+
++ if ( itemType == ROSTER_CONTACT )
++ itemName = Oscar::normalize( itemName );
++
+ Oscar::SSI s( itemName, groupId, itemId, itemType, tlvList );
+ s.setTLVListLength( tlvLength );
+
+diff -Nur kdenetwork-3.4.0.orig/kopete/protocols/oscar/liboscar/ssimodifytask.cpp kdenetwork-3.4.0/kopete/protocols/oscar/liboscar/ssimodifytask.cpp
+--- kdenetwork-3.4.0.orig/kopete/protocols/oscar/liboscar/ssimodifytask.cpp 2005-02-01 20:41:08.000000000 +0100
++++ kdenetwork-3.4.0/kopete/protocols/oscar/liboscar/ssimodifytask.cpp 2005-04-04 00:13:50.000000000 +0200
+@@ -41,7 +41,7 @@
+ {
+ }
+
+-void SSIModifyTask::onGo( )
++void SSIModifyTask::onGo()
+ {
+ sendSSIUpdate();
+ }
+@@ -62,7 +62,10 @@
+ {
+ m_opType = Add;
+ m_opSubject = Contact;
+- Oscar::SSI oldItem = m_ssiManager->findContact( contact );
++
++ QString newContact = Oscar::normalize( contact );
++
++ Oscar::SSI oldItem = m_ssiManager->findContact( newContact );
+ Oscar::SSI groupItem = m_ssiManager->findGroup( group );
+
+ if ( !groupItem )
+@@ -81,7 +84,7 @@
+ }
+
+ kdDebug( OSCAR_RAW_DEBUG ) << k_funcinfo << "creating new SSI item for " << contact << " in group " << group << endl;
+- Oscar::SSI newItem( contact, groupItem.gid(), m_ssiManager->nextContactId(), ROSTER_CONTACT, tlvList );
++ Oscar::SSI newItem( newContact, groupItem.gid(), m_ssiManager->nextContactId(), ROSTER_CONTACT, tlvList );
+ m_newItem = newItem;
+ return true;
+ }
+@@ -90,7 +93,7 @@
+ {
+ m_opType = Remove;
+ m_opSubject = Contact;
+- m_oldItem = m_ssiManager->findContact( contact );
++ m_oldItem = m_ssiManager->findContact( Oscar::normalize( contact ) );
+ kdDebug(OSCAR_RAW_DEBUG) << k_funcinfo << "Scheduling" << m_oldItem.name() << " for removal" << endl;
+ return true;
+ }
+@@ -99,7 +102,7 @@
+ {
+ m_opType = Change;
+ m_opSubject = Group;
+- m_oldItem = m_ssiManager->findContact( contact );
++ m_oldItem = m_ssiManager->findContact( Oscar::normalize( contact ) );
+ Oscar::SSI oldGroupItem;
+ if ( m_oldItem.isValid() )
+ oldGroupItem = m_ssiManager->findGroup( newGroup );
+@@ -138,7 +141,7 @@
+ return true;
+ }
+
+-bool SSIModifyTask::removeGroup( const QString & groupName )
++bool SSIModifyTask::removeGroup( const QString& groupName )
+ {
+ m_opType = Remove;
+ m_opSubject = Group;
diff --git a/kde-base/kdenetwork/kdenetwork-3.4.0-r1.ebuild b/kde-base/kdenetwork/kdenetwork-3.4.0-r1.ebuild
new file mode 100644
index 000000000000..a0b2eedc4928
--- /dev/null
+++ b/kde-base/kdenetwork/kdenetwork-3.4.0-r1.ebuild
@@ -0,0 +1,60 @@
+# Copyright 1999-2005 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: /var/cvsroot/gentoo-x86/kde-base/kdenetwork/kdenetwork-3.4.0-r1.ebuild,v 1.1 2005/04/03 23:37:27 greg_g Exp $
+
+inherit kde-dist eutils
+
+DESCRIPTION="KDE network apps: kopete, kppp, kget..."
+
+KEYWORDS="~x86 ~amd64 ~sparc ~ppc"
+IUSE="rdesktop slp ssl wifi"
+
+DEPEND="~kde-base/kdebase-${PV}
+ slp? ( net-libs/openslp )
+ wifi? ( net-wireless/wireless-tools )"
+
+RDEPEND="${DEPEND}
+ rdesktop? ( >=net-misc/rdesktop-1.3.1-r1 )
+ dev-lang/perl
+ ssl? ( app-crypt/qca-tls
+ dev-perl/IO-Socket-SSL )"
+# perl: for KSirc
+# qca-tls: for Kopete jabber plugin.
+# IO-Socket-SSL: for SSL support in KSirc.
+
+src_unpack() {
+ kde_src_unpack
+
+ # fix kde bug 91288. Applied for 3.4.1.
+ epatch "${FILESDIR}/${P}-kopete-logout.patch"
+
+ # fix kde bug 99671. Applied for 3.4.1.
+ epatch "${FILESDIR}/${P}-kopete-spaces.patch"
+}
+
+src_compile() {
+ myconf="$(use_enable slp)"
+ use wifi || export DO_NOT_COMPILE="${DO_NOT_COMPILE} wifi"
+
+ kde_src_compile
+}
+
+src_install() {
+ kde_src_install
+
+ chmod u+s ${D}/${KDEDIR}/bin/reslisa
+
+ # empty config file needed for lisa to work with default settings
+ dodir /etc
+ touch ${D}/etc/lisarc
+
+ # lisa, reslisa initscripts
+ sed -e "s:_KDEDIR_:${KDEDIR}:g" ${FILESDIR}/lisa > ${T}/lisa
+ sed -e "s:_KDEDIR_:${KDEDIR}:g" ${FILESDIR}/reslisa > ${T}/reslisa
+ exeinto /etc/init.d
+ doexe ${T}/lisa ${T}/reslisa
+
+ insinto /etc/conf.d
+ newins ${FILESDIR}/lisa.conf lisa
+ newins ${FILESDIR}/reslisa.conf reslisa
+}