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