Re: lost roster in gloox 1.0alpha
From: Jakob Schröter <js@xxxxxxxxxx>
Date: Tue, 22 Jan 2008 12:14:30 +0100 (CET)
On Tuesday January 22 2008, lerosua wrote:
> hi.
> i has  use gloox 0.9.6 to build my client before. it name icalk. and the
> svn is in
> http://code.google.com/p/icalk/
>
> recently i update the gloox to 1.0alpha. and i fixed my code to suit it.
> when i complete the work.   my client login success  but lost all roster.
> the all roster present in   function "  handleNonrosterPresence(Presence*
> stanza)"

Hi,

Thanks for the report. The attached patch should help. alpha2 is on its way...

cheers,
Jakob
Index: tests/rostermanager/rostermanager_test.cpp
===================================================================
--- tests/rostermanager/rostermanager_test.cpp  (revision 3585)
+++ tests/rostermanager/rostermanager_test.cpp  (revision 3586)
@@ -160,13 +160,14 @@
     case 1: // fill()
     {
       IQ re( IQ::Result, JID(), iq.id() );
-      Tag* q = new Tag( "query" );
+      Tag* r = new Tag( "iq" );
+      Tag* q = new Tag( r, "query" );
       q->setXmlns( XMLNS_ROSTER );
       Tag* i = new Tag( q, "item", "jid", "jid1" );
       i = new Tag( q, "item", "jid", "jid2" );
       i = new Tag( q, "item", "jid", "jid3" );
       re.addExtension( new RosterManager::Query( q ) );
-      delete q;
+      delete r;
       m_rm->handleIqID( re, ctx );
       m_test = 0;
       break;
Index: rostermanager.cpp
===================================================================
--- rostermanager.cpp   (revision 3585)
+++ rostermanager.cpp   (revision 3586)
@@ -45,7 +45,7 @@
     if( !tag || tag->name() != "query" || tag->xmlns() != XMLNS_ROSTER )
       return;
 
-    const ConstTagList& l = tag->findTagList( "/query/item" );
+    const ConstTagList& l = tag->findTagList( "query/item" );
     ConstTagList::const_iterator it = l.begin();
     for( ; it != l.end(); ++it )
     {
@@ -205,18 +205,9 @@
     if( presence->subtype() == Presence::Error )
       return;
 
-    std::string capsNode;
-    std::string capsVer;
-    const Capabilities* caps = presence->findExtension<Capabilities>( ExtCaps 
);
-    if( caps )
-    {
-      capsNode = caps->node();
-      capsVer = caps->ver();
-    }
-
     bool self = false;
     Roster::iterator it = m_roster.find( presence->from().bare() );
-    if( it != m_roster.end() || ( self = presence->from().bare() == 
m_self->jid() ) )
+    if( it != m_roster.end() || ( self = ( presence->from().bare() == 
m_self->jid() ) ) )
     {
       RosterItem* ri = self ? m_self : (*it).second;
       const std::string& resource = presence->from().resource();
@@ -231,9 +222,12 @@
         ri->setExtensions( resource, presence->extensions() );
       }
 
-      if( m_rosterListener )
+      if( m_rosterListener && !self )
         m_rosterListener->handleRosterPresence( *ri, resource,
                                                 presence->presence(), 
presence->status() );
+      else if( m_rosterListener && self )
+        m_rosterListener->handleSelfPresence( *ri, resource,
+                                              presence->presence(), 
presence->status() );
     }
     else
     {

Attachment: signature.asc
Description: This is a digitally signed message part.