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.