Fix roster versioning
This fixes two things: 1) We reset the version we stored for the roster, even though it was still up to date 2) Since we make mutable copies of the items dictionary in XMPP_updateRosterItem our memory was rather high. Use a AutoreleasePool around it for now.
This commit is contained in:
parent
96b72e570e
commit
26bf6e94d8
1 changed files with 32 additions and 18 deletions
|
@ -311,43 +311,57 @@
|
||||||
OFXMLElement *rosterElement;
|
OFXMLElement *rosterElement;
|
||||||
OFEnumerator *enumerator;
|
OFEnumerator *enumerator;
|
||||||
OFXMLElement *element;
|
OFXMLElement *element;
|
||||||
XMPPRosterItem *rosterItem;
|
|
||||||
|
|
||||||
rosterElement = [iq elementForName: @"query"
|
rosterElement = [iq elementForName: @"query"
|
||||||
namespace: XMPP_NS_ROSTER];
|
namespace: XMPP_NS_ROSTER];
|
||||||
|
|
||||||
if ([connection supportsRosterVersioning] && rosterElement == nil) {
|
if ([connection supportsRosterVersioning]) {
|
||||||
OFDictionary *items = [dataStorage
|
if (rosterElement == nil) {
|
||||||
dictionaryForPath: @"roster.items"];
|
OFDictionary *items = [dataStorage
|
||||||
OFEnumerator *enumerator = [items objectEnumerator];
|
dictionaryForPath: @"roster.items"];
|
||||||
OFDictionary *item;
|
OFEnumerator *enumerator = [items objectEnumerator];
|
||||||
|
OFDictionary *item;
|
||||||
|
|
||||||
while ((item = [enumerator nextObject]) != nil) {
|
while ((item = [enumerator nextObject]) != nil) {
|
||||||
rosterItem = [XMPPRosterItem rosterItem];
|
XMPPRosterItem *rosterItem;
|
||||||
[rosterItem setJID: [XMPPJID JIDWithString:
|
XMPPJID *JID;
|
||||||
[item objectForKey: @"JID"]]];
|
|
||||||
[rosterItem setName: [item objectForKey: @"name"]];
|
|
||||||
[rosterItem setSubscription:
|
|
||||||
[item objectForKey: @"subscription"]];
|
|
||||||
[rosterItem setGroups: [item objectForKey: @"groups"]];
|
|
||||||
|
|
||||||
[rosterItems setObject: rosterItem
|
rosterItem = [XMPPRosterItem rosterItem];
|
||||||
forKey: [[rosterItem JID] bareJID]];
|
JID = [XMPPJID JIDWithString:
|
||||||
}
|
[item objectForKey: @"JID"]];
|
||||||
|
[rosterItem setJID: JID];
|
||||||
|
[rosterItem setName:
|
||||||
|
[item objectForKey: @"name"]];
|
||||||
|
[rosterItem setSubscription:
|
||||||
|
[item objectForKey: @"subscription"]];
|
||||||
|
[rosterItem setGroups:
|
||||||
|
[item objectForKey: @"groups"]];
|
||||||
|
|
||||||
|
[rosterItems setObject: rosterItem
|
||||||
|
forKey: [JID bareJID]];
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
[dataStorage setDictionary: nil
|
||||||
|
forPath: @"roster.items"];
|
||||||
}
|
}
|
||||||
|
|
||||||
enumerator = [[rosterElement children] objectEnumerator];
|
enumerator = [[rosterElement children] objectEnumerator];
|
||||||
while ((element = [enumerator nextObject]) != nil) {
|
while ((element = [enumerator nextObject]) != nil) {
|
||||||
|
OFAutoreleasePool *pool;
|
||||||
|
XMPPRosterItem *rosterItem;
|
||||||
|
|
||||||
if (![[element name] isEqual: @"item"] ||
|
if (![[element name] isEqual: @"item"] ||
|
||||||
![[element namespace] isEqual: XMPP_NS_ROSTER])
|
![[element namespace] isEqual: XMPP_NS_ROSTER])
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
pool = [OFAutoreleasePool new];
|
||||||
rosterItem = [self XMPP_rosterItemWithXMLElement: element];
|
rosterItem = [self XMPP_rosterItemWithXMLElement: element];
|
||||||
|
|
||||||
[self XMPP_updateRosterItem: rosterItem];
|
[self XMPP_updateRosterItem: rosterItem];
|
||||||
|
[pool release];
|
||||||
}
|
}
|
||||||
|
|
||||||
if ([connection supportsRosterVersioning]) {
|
if ([connection supportsRosterVersioning] && rosterElement != nil) {
|
||||||
OFString *ver =
|
OFString *ver =
|
||||||
[[rosterElement attributeForName: @"ver"] stringValue];
|
[[rosterElement attributeForName: @"ver"] stringValue];
|
||||||
[dataStorage setStringValue: ver
|
[dataStorage setStringValue: ver
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue