adium 2089:1b917c8c2d14: AMPurpleJabberNode did all sorts of nas...
commits at adium.im
commits at adium.im
Tue May 5 08:16:45 UTC 2009
details: http://hg.adium.im/adium/rev/1b917c8c2d14
revision: 2089:1b917c8c2d14
author: David Smith <catfish.man at gmail.com>
date: Tue May 05 01:16:39 2009 -0700
AMPurpleJabberNode did all sorts of nasty things, including direct ivar access (which, iirc, is unsafe or unsupported on the non-fragile ivar runtime). Now it doesn't
diffstat:
Plugins/Purple Service/AMPurpleJabberNode.h | 16 ++--
Plugins/Purple Service/AMPurpleJabberNode.m | 109 ++++++++++++---------------
2 files changed, 57 insertions(+), 68 deletions(-)
diffs (263 lines):
diff -r e55580d85f00 -r 1b917c8c2d14 Plugins/Purple Service/AMPurpleJabberNode.h
--- a/Plugins/Purple Service/AMPurpleJabberNode.h Tue May 05 00:28:37 2009 -0700
+++ b/Plugins/Purple Service/AMPurpleJabberNode.h Tue May 05 01:16:39 2009 -0700
@@ -15,7 +15,7 @@
@end
@interface AMPurpleJabberNode : NSObject <NSCopying> {
- PurpleConnection *gc;
+ PurpleConnection *gc;
NSString *jid;
NSString *node;
@@ -35,13 +35,13 @@
- (void)fetchItems;
- (void)fetchInfo;
-- (NSString*)name;
-- (NSString*)jid;
-- (NSString*)node;
-- (NSArray*)items;
-- (NSSet*)features;
-- (NSArray*)identities;
-- (NSArray*)commands;
+ at property (readonly, copy, nonatomic) NSString *name;
+ at property (readonly, copy, nonatomic) NSString *jid;
+ at property (readonly, copy, nonatomic) NSString *node;
+ at property (readonly, nonatomic) NSArray *items;
+ at property (readonly, retain, nonatomic) NSSet *features;
+ at property (readonly, retain, nonatomic) NSArray *identities;
+ at property (readonly, nonatomic) NSArray *commands;
- (void)addDelegate:(id)delegate;
- (void)removeDelegate:(id)delegate;
diff -r e55580d85f00 -r 1b917c8c2d14 Plugins/Purple Service/AMPurpleJabberNode.m
--- a/Plugins/Purple Service/AMPurpleJabberNode.m Tue May 05 00:28:37 2009 -0700
+++ b/Plugins/Purple Service/AMPurpleJabberNode.m Tue May 05 01:16:39 2009 -0700
@@ -9,6 +9,18 @@
static unsigned iqCounter = 0;
+ at interface AMPurpleJabberNode()
+ at property (readwrite, copy, nonatomic) NSString *name;
+ at property (readwrite, copy, nonatomic) NSString *jid;
+ at property (readwrite, copy, nonatomic) NSString *node;
+ at property (readwrite, retain, nonatomic) NSSet *features;
+ at property (readwrite, retain, nonatomic) NSArray *identities;
+ at property (readwrite, retain, nonatomic) AMPurpleJabberNode *commandsNode;
+ at property (readwrite, assign, nonatomic) PurpleConnection *gc;
+ at property (readwrite, copy, nonatomic) NSMutableArray *delegates;
+ at property (readwrite, retain, nonatomic) NSArray *itemsArray;
+ at end
+
@implementation AMPurpleJabberNode
static void AMPurpleJabberNode_received_data_cb(PurpleConnection *gc, xmlnode **packet, gpointer this) {
@@ -25,17 +37,17 @@
return;
if (strcmp((*packet)->name, "iq"))
return;
- if (![[NSString stringWithUTF8String:from] isEqualToString:self->jid])
+ if (![[NSString stringWithUTF8String:from] isEqualToString:self.jid])
return;
xmlnode *query = xmlnode_get_child_with_namespace(*packet,"query","http://jabber.org/protocol/disco#info");
if (query) {
- if (self->features || self->identities)
+ if (self.features || self.identities)
return; // we already have that information
const char *node = xmlnode_get_attrib(query,"node");
- if ((self->node && !node) || (!self->node && node))
+ if ((self.node && !node) || (!self.node && node))
return;
- if (node && ![[NSString stringWithUTF8String:node] isEqualToString:self->node])
+ if (node && ![[NSString stringWithUTF8String:node] isEqualToString:self.node])
return;
// it's us, fill in features and identities
@@ -62,10 +74,10 @@
}
}
- self->identities = identities;
- self->features = features;
+ self.identities = identities;
+ self.features = features;
- for (id delegate in self->delegates) {
+ for (id delegate in self.delegates) {
if ([delegate respondsToSelector:@selector(jabberNodeGotInfo:)])
[delegate jabberNodeGotInfo:self];
}
@@ -83,13 +95,11 @@
if (!isCommand) {
// commands have to be prefetched to be available when the user tries to access the context menu
- if (self->commands)
- [self->commands release];
- self->commands = [[AMPurpleJabberNode alloc] initWithJID:self->jid
+ self.commandsNode = [[AMPurpleJabberNode alloc] initWithJID:self.jid
node:@"http://jabber.org/protocol/commands"
name:nil
- connection:self->gc];
- [self->commands fetchItems];
+ connection:self.gc];
+ [self.commandsNode fetchItems];
}
}
return;
@@ -97,13 +107,13 @@
query = xmlnode_get_child_with_namespace(*packet,"query","http://jabber.org/protocol/disco#items");
if (query) {
- if (self->items)
+ if (self.itemsArray)
return; // we already have that info
const char *node = xmlnode_get_attrib(query,"node");
- if ((self->node && !node) || (!self->node && node))
+ if ((self.node && !node) || (!self.node && node))
return;
- if (node && ![[NSString stringWithUTF8String:node] isEqualToString:self->node])
+ if (node && ![[NSString stringWithUTF8String:node] isEqualToString:self.node])
return;
// it's us, create the subnodes
@@ -120,10 +130,9 @@
AMPurpleJabberNode *newnode = [[AMPurpleJabberNode alloc] initWithJID:[NSString stringWithUTF8String:jid]
node:node?[NSString stringWithUTF8String:node]:nil
name:name?[NSString stringWithUTF8String:name]:nil
- connection:self->gc];
+ connection:self.gc];
// propagate delegates
- [newnode->delegates release];
- newnode->delegates = [self->delegates retain];
+ newnode.delegates = self.delegates;
[items addObject:newnode];
// check if we're a conference service
if ([[self jid] rangeOfString:@"@"].location == NSNotFound) { // we can't be one when we have an @
@@ -131,7 +140,7 @@
for (identity in self.identities) {
if ([[identity objectForKey:@"category"] isEqualToString:@"conference"]) {
// since we're a conference service, assume that our children are conferences
- newnode->identities = [[NSArray arrayWithObject:identity] retain];
+ newnode.identities = [NSArray arrayWithObject:identity];
break;
}
}
@@ -144,9 +153,9 @@
}
}
}
- self->items = items;
+ self.itemsArray = items;
- for (id delegate in self->delegates) {
+ for (id delegate in self.delegates) {
if ([delegate respondsToSelector:@selector(jabberNodeGotItems:)])
[delegate jabberNodeGotItems:self];
}
@@ -161,10 +170,10 @@
[self release];
return nil;
}
- jid = [_jid copy];
- node = [_node copy];
- name = [_name copy];
- gc = _gc;
+ self.jid = _jid;
+ self.node = _node;
+ self.name = _name;
+ self.gc = _gc;
delegates = [[NSMutableArray alloc] init];
purple_signal_connect(jabber, "jabber-receiving-xmlnode", self,
@@ -184,14 +193,15 @@
// share the items, identities and features between copies
// copy the rest, keep delegates separate
- copy->jid = [jid copy];
- copy->node = [node copy];
- copy->name = [name copy];
- copy->gc = gc;
- copy->delegates = [[NSMutableArray alloc] init];
- copy->items = [items retain];
- copy->features = [features retain];
- copy->identities = [identities retain];
+ copy.jid = self.jid;
+ copy.node = self.node;
+ copy.name = self.name;
+ copy.gc = self.gc;
+
+ copy.delegates = [[[NSMutableArray alloc] init] autorelease];
+ copy.features = self.features;
+ copy.identities = self.identities;
+ copy.itemsArray = self.itemsArray;
purple_signal_connect(jabber, "jabber-receiving-xmlnode", copy,
PURPLE_CALLBACK(AMPurpleJabberNode_received_data_cb), copy);
@@ -213,10 +223,7 @@
}
- (void)fetchItems {
- if (items) {
- [items release];
- items = nil;
- }
+ self.itemsArray = nil;
NSXMLElement *iq = [NSXMLNode elementWithName:@"iq"];
[iq addAttribute:[NSXMLNode attributeWithName:@"type" stringValue:@"get"]];
@@ -237,14 +244,8 @@
}
- (void)fetchInfo {
- if (features) {
- [features release];
- features = nil;
- }
- if (identities) {
- [identities release];
- identities = nil;
- }
+ self.features = nil;
+ self.identities = nil;
NSXMLElement *iq = [NSXMLNode elementWithName:@"iq"];
[iq addAttribute:[NSXMLNode attributeWithName:@"type" stringValue:@"get"]];
@@ -264,15 +265,6 @@
(PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl)->send_raw)(gc, [xmlData bytes], [xmlData length]);
}
-- (NSString*)name {
- return name;
-}
-- (NSString*)jid {
- return jid;
-}
-- (NSString*)node {
- return node;
-}
- (NSArray*)items {
if (!items) {
BOOL isCommand = NO;
@@ -292,16 +284,13 @@
return items;
}
-- (NSSet*)features {
- return features;
-}
-- (NSArray*)identities {
- return identities;
-}
+
- (NSArray*)commands {
return [commands items];
}
+ at synthesize commandsNode = commands, itemsArray = items, identities, features, node, jid, name, gc, delegates;
+
- (void)addDelegate:(id)delegate {
[delegates addObject:delegate];
}
More information about the commits
mailing list