--- /dev/null
+Index: kopete/protocols/yahoo/libkyahoo/listtask.cpp
+===================================================================
+--- kopete/protocols/yahoo/libkyahoo/listtask.cpp (revision 1110517)
++++ kopete/protocols/yahoo/libkyahoo/listtask.cpp (working copy)
+@@ -34,9 +34,6 @@
+
+ }
+
+-QStringList loginstealthedbuddies;
+-QStringList loginunstealthedbuddies;
+-
+ bool ListTask::take( Transfer* transfer )
+ {
+ if ( !forMe( transfer ) )
+@@ -85,47 +82,30 @@
+ case 301:
+ if( p.second == "319"){
+ emit gotBuddy( buddy, QString(), group );
+- /**
+- * Note: michaelacole
+- * Since you can log in from other places and remove or add Perm Offline status
+- * We have to reset both conditions at login
+- * Yahoo sends this data at this time,
+- * so better to compile list of both now then notify kopete client.
+- */
+- loginunstealthedbuddies.append( buddy );
+ }
+ break;
+ case 317:
+ if( p.second == "2"){
+- kDebug(YAHOO_RAW_DEBUG) << "Stealthed setting on" << buddy ;
+- /** Note: michaelacole
+- * Since you can log in from other places and remove or add Perm Offline status
+- * We have to reset both conditions at login
+- * Yahoo sends this data at this time,
+- * so better to compile list of both now then notify kopete client.
+- */
+- loginstealthedbuddies.append( buddy );
+- loginunstealthedbuddies.removeAll( buddy );
++ kDebug(YAHOO_RAW_DEBUG) << "Stealthed setting on" << buddy ;
++ emit stealthStatusChanged( buddy, Yahoo::StealthActive );
+ };
+ break;
+- /**
+- * Note: michaelacole
+- * Other buddy codes are here for add to list and blacklist
+- * I will need to capute more codes for addition here.
+- * Blacklist is done on the server at Yahoo whereas
+- * Kopete has its own plugin for blacklisting.
+- */
++ /**
++ * Note: michaelacole
++ * Other buddy codes are here for add to list and blacklist
++ * I will need to capute more codes for addition here.
++ * Blacklist is done on the server at Yahoo whereas
++ * Kopete has its own plugin for blacklisting.
++ */
+ }
+ }
+- /**
+- * Note: michaelacole
+- * Since you can log in from other places and remove or add Perm Offline status
+- * We have to reset both conditions at login
+- * Yahoo sends this data at this time,
+- * so better to compile list of both now then notify kopete client.
+- */
+- client()->notifyUnstealthedBuddies( loginunstealthedbuddies );
+- client()->notifyStealthedBuddies( loginstealthedbuddies );
++ /**
++ * Note: michaelacole
++ * Since you can log in from other places and remove or add Perm Offline status
++ * We have to reset both conditions at login
++ * Yahoo sends this data at this time,
++ * so better to compile list of both now then notify kopete client.
++ */
+ }
+
+
+Index: kopete/protocols/yahoo/libkyahoo/client.cpp
+===================================================================
+--- kopete/protocols/yahoo/libkyahoo/client.cpp (revision 1110517)
++++ kopete/protocols/yahoo/libkyahoo/client.cpp (working copy)
+@@ -76,8 +76,7 @@
+ int error;
+ QString errorString;
+ QString errorInformation;
+- QStringList stealthedBuddies;
+- QStringList unstealthedBuddies;
++ QSet<QString> stealthedBuddies;
+ // tasks
+ bool tasksInitialized;
+ LoginTask * loginTask;
+@@ -133,14 +132,13 @@
+
+ QObject::connect( d->loginTask, SIGNAL( haveSessionID( uint ) ), SLOT( lt_gotSessionID( uint ) ) );
+ QObject::connect( d->loginTask, SIGNAL( buddyListReady() ), SLOT( processPictureQueue() ) );
+- QObject::connect( d->loginTask, SIGNAL( buddyListReady() ), SLOT( processStealthQueue() ) );
+ QObject::connect( d->loginTask, SIGNAL( loginResponse( int, const QString& ) ),
+ SLOT( slotLoginResponse( int, const QString& ) ) );
+ QObject::connect( d->loginTask, SIGNAL( haveCookies() ), SLOT( slotGotCookies() ) );
+ QObject::connect( d->listTask, SIGNAL( gotBuddy(const QString &, const QString &, const QString &) ),
+ SIGNAL( gotBuddy(const QString &, const QString &, const QString &) ) );
+ QObject::connect( d->listTask, SIGNAL( stealthStatusChanged( const QString&, Yahoo::StealthStatus ) ),
+- SIGNAL( stealthStatusChanged( const QString&, Yahoo::StealthStatus ) ) );
++ SLOT( notifyStealthStatusChanged( const QString&, Yahoo::StealthStatus ) ) );
+ }
+
+ Client::~Client()
+@@ -182,9 +180,11 @@
+ emit connected();
+ kDebug(YAHOO_RAW_DEBUG) << " starting login task ... ";
+
++ // Clear stealth settings
++ d->stealthedBuddies.clear();
++
+ d->loginTask->setStateOnConnect( (d->statusOnConnect == Yahoo::StatusInvisible) ? Yahoo::StatusInvisible : Yahoo::StatusAvailable );
+ d->loginTask->go();
+- processStealthQueue();
+ d->active = true;
+ }
+
+@@ -615,29 +615,6 @@
+ spt->go( true );
+ }
+
+-// **** Stealth Handling **** michaelacole
+-void Client::processStealthQueue()
+-{
+- if( d->buddyListReady ){
+- while (!d->unstealthedBuddies.isEmpty())
+- {
+- QString it;
+- it = d->unstealthedBuddies.takeFirst();
+- kDebug(YAHOO_RAW_DEBUG) << "unstealthed setting set on" << it;
+- stealthContact( it, Yahoo::StealthOffline , Yahoo::StealthNotActive );
+- }
+-
+- while (!d->stealthedBuddies.isEmpty())
+- {
+- QString it;
+- it = d->stealthedBuddies.takeFirst();
+- kDebug(YAHOO_RAW_DEBUG) << "stealthed setting set on" << it ;
+- stealthContact( it, Yahoo::StealthPermOffline , Yahoo::StealthActive );
+- }
+- }
+-}
+-
+-
+ // ***** Webcam handling *****
+
+ void Client::requestWebcam( const QString &userId )
+@@ -767,14 +744,22 @@
+ emit error( level );
+ }
+
+-void Client::notifyStealthedBuddies( const QStringList &buddies)
++Yahoo::StealthStatus Client::stealthStatus( const QString &userId ) const
+ {
+- d->stealthedBuddies = buddies;
++ if ( d->stealthedBuddies.contains( userId ) )
++ return Yahoo::StealthActive;
++ else
++ return Yahoo::StealthNotActive;
+ }
+
+-void Client::notifyUnstealthedBuddies( const QStringList &buddies)
++void Client::notifyStealthStatusChanged( const QString &userId, Yahoo::StealthStatus state )
+ {
+- d->unstealthedBuddies = buddies;
++ if ( state == Yahoo::StealthActive )
++ d->stealthedBuddies.insert( userId );
++ else
++ d->stealthedBuddies.remove( userId );
++
++ emit stealthStatusChanged( userId, state );
+ }
+
+ QString Client::userId()
+@@ -902,7 +887,7 @@
+ QObject::connect( d->statusTask, SIGNAL( statusChanged(QString,int,const QString,int,int,int) ),
+ SIGNAL( statusChanged(QString,int,const QString,int,int,int) ) );
+ QObject::connect( d->statusTask, SIGNAL( stealthStatusChanged( const QString&, Yahoo::StealthStatus ) ),
+- SIGNAL( stealthStatusChanged( const QString&, Yahoo::StealthStatus ) ) );
++ SLOT( notifyStealthStatusChanged( const QString&, Yahoo::StealthStatus ) ) );
+ QObject::connect( d->statusTask, SIGNAL( loginResponse( int, const QString& ) ),
+ SLOT( slotLoginResponse( int, const QString& ) ) );
+ QObject::connect( d->statusTask, SIGNAL( authorizationRejected( const QString&, const QString& ) ),
+Index: kopete/protocols/yahoo/libkyahoo/listtask.h
+===================================================================
+--- kopete/protocols/yahoo/libkyahoo/listtask.h (revision 1110517)
++++ kopete/protocols/yahoo/libkyahoo/listtask.h (working copy)
+@@ -40,7 +40,7 @@
+
+ signals:
+ void gotBuddy(const QString&, const QString&, const QString&);
+-
++ void stealthStatusChanged( const QString&, Yahoo::StealthStatus );
+ };
+
+ #endif
+Index: kopete/protocols/yahoo/libkyahoo/client.h
+===================================================================
+--- kopete/protocols/yahoo/libkyahoo/client.h (revision 1110517)
++++ kopete/protocols/yahoo/libkyahoo/client.h (working copy)
+@@ -189,6 +189,12 @@
+ void stealthContact( QString const &userId, Yahoo::StealthMode mode, Yahoo::StealthStatus state );
+
+ /**
++ * Get the stealth status of a buddy
++ * @param userId the yahoo ID of the buddy
++ */
++ Yahoo::StealthStatus stealthStatus( const QString &userId ) const;
++
++ /**
+ * Request the buddy's picture
+ * @param userId the yahoo ID of the buddy
+ */
+@@ -456,12 +462,6 @@
+ */
+ void notifyError( const QString &info, const QString &errorString, LogLevel level );
+
+- /**
+- * Steathed information from login..
+- */
+- void notifyStealthedBuddies( const QStringList &buddies);
+- void notifyUnstealthedBuddies( const QStringList &buddies);
+-
+ signals:
+ /** CONNECTION EVENTS */
+ /**
+@@ -723,10 +723,10 @@
+ */
+ void processPictureQueue();
+
+- /**
+- * Update all Stealth info after login
++ /**
++ * Steathed information from login..
+ */
+- void processStealthQueue();
++ void notifyStealthStatusChanged( const QString &, Yahoo::StealthStatus );
+
+ private:
+ void distribute( Transfer *transfer );
+Index: kopete/protocols/yahoo/yahoocontact.h
+===================================================================
+--- kopete/protocols/yahoo/yahoocontact.h (revision 1110517)
++++ kopete/protocols/yahoo/yahoocontact.h (working copy)
+@@ -56,8 +56,8 @@
+
+ void setOnlineStatus(const Kopete::OnlineStatus &status);
+ void setYahooStatus( const Kopete::OnlineStatus& );
+- void setStealthed( bool );
+- bool stealthed();
++ void updateStealthed();
++ bool stealthed() const;
+
+
+ /** The group name getter and setter methods**/
+@@ -121,7 +121,6 @@
+ YahooChatSession *m_manager;
+ YahooWebcamDialog* m_webcamDialog;
+ YahooAccount* m_account;
+- bool m_stealthed;
+ bool m_receivingWebcam;
+ bool m_sessionActive;
+
+Index: kopete/protocols/yahoo/yahoocontact.cpp
+===================================================================
+--- kopete/protocols/yahoo/yahoocontact.cpp (revision 1110517)
++++ kopete/protocols/yahoo/yahoocontact.cpp (working copy)
+@@ -74,7 +74,6 @@
+ m_manager = 0L;
+ m_account = account;
+ m_YABEntry = 0L;
+- m_stealthed = false;
+ m_receivingWebcam = false;
+ m_sessionActive = false;
+
+@@ -109,7 +108,8 @@
+
+ void YahooContact::setOnlineStatus(const Kopete::OnlineStatus &status)
+ {
+- if( m_stealthed && status.internalStatus() <= 999) // Not Stealted -> Stealthed
++ bool isStealthed = stealthed();
++ if( isStealthed && status.internalStatus() <= 999) // Not Stealted -> Stealthed
+ {
+ Contact::setOnlineStatus(
+ Kopete::OnlineStatus(status.status() ,
+@@ -119,7 +119,7 @@
+ status.overlayIcons() + QStringList("yahoo_stealthed") ,
+ i18n("%1|Stealthed", status.description() ) ) );
+ }
+- else if( !m_stealthed && status.internalStatus() > 999 )// Stealthed -> Not Stealthed
++ else if( !isStealthed && status.internalStatus() > 999 )// Stealthed -> Not Stealthed
+ Contact::setOnlineStatus( static_cast< YahooProtocol *>( protocol() )->statusFromYahoo( status.internalStatus() - 1000 ) );
+ else
+ Contact::setOnlineStatus( status );
+@@ -128,15 +128,14 @@
+ setStatusMessage( Kopete::StatusMessage() );
+ }
+
+-void YahooContact::setStealthed( bool stealthed )
++void YahooContact::updateStealthed()
+ {
+- m_stealthed = stealthed;
+ setOnlineStatus( onlineStatus() );
+ }
+
+-bool YahooContact::stealthed()
++bool YahooContact::stealthed() const
+ {
+- return m_stealthed;
++ return (m_account->yahooSession()->stealthStatus( m_userId ) == Yahoo::StealthActive );
+ }
+
+ void YahooContact::serialize(QMap<QString, QString> &serializedData, QMap<QString, QString> &addressBookData)
+Index: kopete/protocols/yahoo/yahooaccount.cpp
+===================================================================
+--- kopete/protocols/yahoo/yahooaccount.cpp (revision 1110517)
++++ kopete/protocols/yahoo/yahooaccount.cpp (working copy)
+@@ -978,7 +978,7 @@
+ kDebug(YAHOO_GEN_DEBUG) << "contact " << who << " doesn't exist.";
+ return;
+ }
+- kc->setStealthed( state == Yahoo::StealthActive );
++ kc->updateStealthed();
+ }
+
+ QString YahooAccount::prepareIncomingMessage( const QString &messageText )
--- /dev/null
+# Copyright 1999-2010 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: /var/cvsroot/gentoo-x86/kde-base/kopete/kopete-4.4.2-r1.ebuild,v 1.1 2010/04/04 15:51:47 jmbsvicetto Exp $
+
+EAPI="3"
+
+KMNAME="kdenetwork"
+inherit kde4-meta
+
+DESCRIPTION="KDE multi-protocol IM client"
+KEYWORDS="~alpha ~amd64 ~hppa ~ia64 ~ppc ~ppc64 ~sparc ~x86 ~amd64-linux ~x86-linux"
+IUSE="debug +handbook ssl v4l2"
+
+# tests hang, last checked for 4.2.96
+RESTRICT=test
+
+# Available plugins
+#
+# addbookmarks: NO DEPS
+# alias: NO DEPS (disabled upstream)
+# autoreplace: NO DEPS
+# contactnotes: NO DEPS
+# highlight: NO DEPS
+# history: NO DEPS
+# latex: virtual/latex as RDEPEND
+# nowlistening: NO DEPS
+# otr: libotr
+# pipes: NO DEPS
+# privacy: NO DEPS
+# statistics: dev-db/sqlite:3
+# texteffect: NO DEPS
+# translator: NO DEPS
+# urlpicpreview: NO DEPS
+# webpresence: libxml2 libxslt
+# NOTE: By default we enable all plugins that don't have any dependencies
+PLUGINS="+addbookmarks +autoreplace +contactnotes +highlight +history latex
++nowlistening otr +pipes +privacy +statistics +texteffect +translator
++urlpicpreview webpresence"
+
+# Available protocols
+#
+# gadu: net-libs/libgadu @since 4.3
+# groupwise: app-crypt/qca:2
+# irc: NO DEPS, probably will fail so inform user about it
+# jabber: net-dns/libidn app-crypt/qca:2 ENABLED BY DEFAULT NETWORK
+# jingle: media-libs/speex net-libs/ortp DISABLED BY UPSTREAM
+# meanwhile: net-libs/meanwhile
+# msn: libmsn == this is wlm plugin, we disable msn one
+# oscar: NO DEPS
+# qq: NO DEPS
+# telepathy: net-libs/decibel
+# testbed: NO DEPS
+# winpopup: NO DEPS
+# yahoo: NO DEPS
+# zeroconfg: (bonjour) NO DEPS
+PROTOCOLS="gadu groupwise +jabber jingle meanwhile msn oscar qq skype sms
+testbed winpopup yahoo zeroconf"
+
+# disabled protocols
+# telepathy: net-libs/decibel
+# irc: NO DEPS
+
+IUSE="${IUSE} ${PLUGINS} ${PROTOCOLS}"
+
+COMMONDEPEND="
+ dev-libs/libpcre
+ $(add_kdebase_dep kdepimlibs)
+ kde-base/qimageblitz
+ >=x11-libs/qt-gui-4.4.0:4[mng]
+ !aqua? ( x11-libs/libXScrnSaver )
+ gadu? ( >=net-libs/libgadu-1.8.0[threads] )
+ groupwise? ( app-crypt/qca:2 )
+ jabber? (
+ app-crypt/qca:2
+ net-dns/libidn
+ )
+ jingle? (
+ >=media-libs/mediastreamer-2.3.0
+ media-libs/speex
+ net-libs/ortp
+ )
+ meanwhile? ( net-libs/meanwhile )
+ msn? ( >=net-libs/libmsn-4.0 )
+ otr? ( >=net-libs/libotr-3.2.0 )
+ statistics? ( dev-db/sqlite:3 )
+ webpresence? ( dev-libs/libxml2 dev-libs/libxslt )
+ v4l2? ( media-libs/libv4l )
+"
+RDEPEND="${COMMONDEPEND}
+ latex? (
+ media-gfx/imagemagick
+ virtual/latex-base
+ )
+ sms? ( app-mobilephone/smssend )
+ ssl? ( app-crypt/qca-ossl )
+"
+# telepathy? ( net-libs/decibel )"
+DEPEND="${COMMONDEPEND}
+ !aqua? ( x11-proto/scrnsaverproto )
+"
+
+PATCHES=( "${FILESDIR}/${P}-yahoo-stealth-fix.patch" )
+
+src_prepare() {
+ sed -e "s:lib/mozilla:$(get_libdir)/mozilla:" \
+ -i kopete/protocols/skype/skypebuttons/CMakeLists.txt || die "sed failed"
+ sed -e '/set (LIBV4L2_REQUIRED TRUE)/s/TRUE/FALSE/' \
+ -i kopete/CMakeLists.txt || die 'failed to make v4l2 optional'
+
+ kde4-meta_src_prepare
+}
+
+src_configure() {
+ local x x2
+ # Handle common stuff
+ mycmakeargs=(
+ $(cmake-utils_use_with jingle GOOGLETALK)
+ $(cmake-utils_use_with jingle LiboRTP)
+ $(cmake-utils_use_with jingle Mediastreamer)
+ $(cmake-utils_use_with jingle Speex)
+ $(cmake-utils_use_with v4l2 LibV4L2)
+ )
+ # enable protocols
+ for x in ${PROTOCOLS}; do
+ [[ ${x/+/} = msn ]] && x2=Libmsn || x2=""
+ mycmakeargs+=($(cmake-utils_use_with ${x/+/} ${x2}))
+ [[ ${x/+/} = zeroconf ]] && x2=bonjour || x2=""
+ mycmakeargs+=($(cmake-utils_use_with ${x/+/} ${x2}))
+ done
+
+ # enable plugins
+ for x in ${PLUGINS}; do
+ mycmakeargs+=($(cmake-utils_use_with ${x/+/}))
+ done
+
+ kde4-meta_src_configure
+}
+
+pkg_postinst() {
+ kde4-meta_pkg_postinst
+
+ #if use telepathy; then
+ # elog "To use kopete telepathy plugins, you need to start gabble first:"
+ # elog "GABBLE_PERSIST=1 telepathy-gabble &"
+ # elog "export TELEPATHY_DATA_PATH='${EPREFIX}/usr/share/telepathy/managers/'"
+ #fi
+
+ if ! use ssl; then
+ if use jabber || use msn; then # || use irc; then
+ echo
+ #elog "In order to use ssl in jabber, msn and irc you'll need to"
+ elog "In order to use ssl in jabber and msn you'll need to"
+ elog "install app-crypt/qca-ossl package."
+ echo
+ fi
+ fi
+}