Index: src/XMPPRoster.h ================================================================== --- src/XMPPRoster.h +++ src/XMPPRoster.h @@ -33,6 +33,8 @@ - initWithConnection: (XMPPConnection*)conn; - (OFArray*)groups; - (OFArray*)rosterItemsInGroup: (OFString*)group; - (void)addRosterItem: (XMPPRosterItem*)rosterItem; +- (void)updateRosterItem: (XMPPRosterItem*)rosterItem; +- (void)deleteRosterItem: (XMPPRosterItem*)rosterItem; @end Index: src/XMPPRoster.m ================================================================== --- src/XMPPRoster.m +++ src/XMPPRoster.m @@ -97,10 +97,15 @@ return [[[groups objectForKey: group] copy] autorelease]; } - (void)addRosterItem: (XMPPRosterItem*)rosterItem { + [self updateRosterItem: rosterItem]; +} + +- (void)updateRosterItem: (XMPPRosterItem*)rosterItem +{ XMPPIQ *iq = [XMPPIQ IQWithType: @"set" ID: [connection generateStanzaID]]; OFXMLElement *query = [OFXMLElement elementWithName: @"query" namespace: XMPP_NS_ROSTER]; OFXMLElement *item = [OFXMLElement elementWithName: @"item" @@ -115,11 +120,31 @@ for (OFString *group in rosterItem.groups) [item addChild: [OFXMLElement elementWithName: @"group" namespace: XMPP_NS_ROSTER stringValue: group]]; + [query addChild: item]; + [iq addChild: query]; + + [connection sendStanza: iq]; +} + +- (void)deleteRosterItem: (XMPPRosterItem*)rosterItem +{ + XMPPIQ *iq = [XMPPIQ IQWithType: @"set" + ID: [connection generateStanzaID]]; + OFXMLElement *query = [OFXMLElement elementWithName: @"query" + namespace: XMPP_NS_ROSTER]; + OFXMLElement *item = [OFXMLElement elementWithName: @"item" + namespace: XMPP_NS_ROSTER]; + + [item addAttributeWithName: @"jid" + stringValue: rosterItem.JID.bareJID]; + [item addAttributeWithName: @"subscription" + stringValue: @"remove"]; + [query addChild: item]; [iq addChild: query]; [connection sendStanza: iq]; } @end Index: src/XMPPRosterItem.m ================================================================== --- src/XMPPRosterItem.m +++ src/XMPPRosterItem.m @@ -27,13 +27,30 @@ + rosterItem { return [[[self alloc] init] autorelease]; } + +- copy +{ + XMPPRosterItem *new = [[XMPPRosterItem alloc] init]; + + @try { + new->JID = [JID copy]; + new->name = [name copy]; + new->subscription = [subscription copy]; + new->groups = [groups copy]; + } @catch (id e) { + [new release]; + @throw e; + } + + return new; +} - (OFString*)description { return [OFString stringWithFormat: @"", JID, name, subscription, groups]; } @end