From 31f444510d5d8b0e211b72d910d9e307024241cf Mon Sep 17 00:00:00 2001 From: Florian Zeitz Date: Thu, 10 Feb 2011 03:54:08 +0100 Subject: [PATCH] Add stanza classes XMPPStanza, XMPPIQ, XMPPMessage and XMPPPresence --- XMPPConnection.m | 4 +- XMPPStanza.h | 57 +++++++++++++ XMPPStanza.m | 213 +++++++++++++++++++++++++++++++++++++++++++++++ XMPPStanza.o | Bin 0 -> 34148 bytes test.m | 42 +++++++++- 5 files changed, 313 insertions(+), 3 deletions(-) create mode 100644 XMPPStanza.h create mode 100644 XMPPStanza.m create mode 100644 XMPPStanza.o diff --git a/XMPPConnection.m b/XMPPConnection.m index 2188ad3..aa84e2f 100644 --- a/XMPPConnection.m +++ b/XMPPConnection.m @@ -1,4 +1,5 @@ #import "XMPPConnection.h" +#import "XMPPStanza.h" #define NS_BIND @"urn:ietf:params:xml:ns:xmpp-bind" #define NS_CLIENT @"jabber:client" @@ -135,8 +136,7 @@ - (void)_sendResourceBind { - OFXMLElement *iq = [OFXMLElement elementWithName: @"iq"]; - [iq addAttributeWithName: @"type" stringValue: @"set"]; + XMPPIQ *iq = [XMPPIQ IQWithType: @"set" ID: @"bind0"]; [iq addChild: [OFXMLElement elementWithName: @"bind" namespace: NS_BIND]]; diff --git a/XMPPStanza.h b/XMPPStanza.h new file mode 100644 index 0000000..8539e6b --- /dev/null +++ b/XMPPStanza.h @@ -0,0 +1,57 @@ +#import + +@interface XMPPStanza: OFXMLElement +{ + OFString *from; + OFString *to; + OFString *type; + OFString *ID; +} + +@property (copy) OFString *from; +@property (copy) OFString *to; +@property (copy) OFString *type; +@property (copy) OFString *ID; + ++ stanzaWithName: (OFString*)name; ++ stanzaWithElement: (OFXMLElement*)elem; + +- initWithName: (OFString*)name; +- initWithElement: (OFXMLElement*)elem; +@end + +@interface XMPPIQ: XMPPStanza +{ +} + ++ IQWithType: (OFString*)type_ + ID: (OFString*)ID_; +@end + +@interface XMPPMessage: XMPPStanza +{ +} + ++ message; ++ messageWithID: (OFString*)ID_; ++ messageWithType: (OFString*)type_; ++ messageWithType: (OFString*)type_ + ID: (OFString*)ID_; + +- (void)addBody: (OFString*)body; +@end + +@interface XMPPPresence: XMPPStanza +{ +} + ++ presence; ++ presenceWithID: (OFString*)ID_; ++ presenceWithType: (OFString*)type_; ++ presenceWithType: (OFString*)type_ + ID: (OFString*)ID_; + +- (void)addShow: (OFString*)show; +- (void)addStatus: (OFString*)status; +- (void)addPriority: (char)priority; +@end diff --git a/XMPPStanza.m b/XMPPStanza.m new file mode 100644 index 0000000..0077388 --- /dev/null +++ b/XMPPStanza.m @@ -0,0 +1,213 @@ +#import "XMPPStanza.h" + +@implementation XMPPStanza +@synthesize from; +@synthesize to; +@synthesize type; +@synthesize ID; + ++ stanzaWithName: (OFString*)name +{ + return [[[self alloc] initWithName: name] autorelease]; +} + ++ stanzaWithElement: (OFXMLElement*)elem { + return [[[self alloc] initWithElement: elem] autorelease]; +} + +- initWithName: (OFString*)name_ +{ + if (!([name_ isEqual: @"iq"] || + [name_ isEqual: @"message"] || + [name_ isEqual: @"presence"])) + of_log(@"Invalid stanza name!"); + + self = [super initWithName: name_]; + [self setDefaultNamespace: @"jabber:client"]; + + from = [[OFString alloc] init]; + to = [[OFString alloc] init]; + type = [[OFString alloc] init]; + ID = [[OFString alloc] init]; + + return self; +} + +- initWithElement: (OFXMLElement*)elem +{ + self = [super initWithName: elem.name + namespace: elem.namespace]; + + from = [[OFString alloc] init]; + to = [[OFString alloc] init]; + type = [[OFString alloc] init]; + ID = [[OFString alloc] init]; + + OFXMLAttribute *attr; + + for (attr in elem.attributes) { + if ([attr.name isEqual: @"from"]) { + [self setFrom: [attr stringValue]]; + } else if ([attr.name isEqual: @"to"]) { + [self setTo: [attr stringValue]]; + } else if ([attr.name isEqual: @"type"]) { + [self setType: [attr stringValue]]; + } else if ([attr.name isEqual: @"id"]) { + [self setID: [attr stringValue]]; + } else { + [self addAttribute: attr]; + } + } + + OFXMLElement *el; + + for (el in elem.children) { + [self addChild: el]; + } + + return self; +} + +- (void)dealloc +{ + [from release]; + [to release]; + [type release]; + [ID release]; + + [super dealloc]; +} + +- (void)setFrom: (OFString*)from_ +{ + OFString* old = from; + from = [from_ copy]; + [old release]; + [self addAttributeWithName: @"from" stringValue: from_]; +} + +- (void)setTo: (OFString*)to_ +{ + OFString* old = to; + to = [to_ copy]; + [old release]; + [self addAttributeWithName: @"to" stringValue: to]; +} + +- (void)setType: (OFString*)type_ +{ + OFString* old = type; + type = [type_ copy]; + [old release]; + [self addAttributeWithName: @"type" stringValue: type]; +} + +- (void)setID: (OFString*)ID_ +{ + OFString* old = ID; + ID = [ID_ copy]; + [old release]; + [self addAttributeWithName: @"id" stringValue: ID]; +} +@end + +@implementation XMPPIQ ++ IQWithType: (OFString*)type_ + ID: (OFString*)ID_ +{ + if (!([type_ isEqual: @"get"] || + [type_ isEqual: @"set"] || + [type_ isEqual: @"result"] || + [type_ isEqual: @"error"])) + of_log(@"Invalid IQ type!"); + + id ret; + ret = [[[self alloc] initWithName: @"iq"] autorelease]; + [ret setType: type_]; + [ret setID: ID_]; + return ret; +} +@end + +@implementation XMPPMessage ++ message +{ + return [self messageWithType: nil ID: nil]; +} + ++ messageWithID: (OFString*)ID_ +{ + return [self messageWithType: nil ID: ID_]; +} + ++ messageWithType: (OFString*)type_ +{ + return [self messageWithType: type_ ID: nil]; +} + ++ messageWithType: (OFString*)type_ + ID: (OFString*)ID_ +{ + id ret; + ret = [[[self alloc] initWithName: @"message"] autorelease]; + if (type_) + [ret setType: type_]; + if (ID_) + [ret setID: ID_]; + return ret; +} + +- (void)addBody: (OFString*)body +{ + [self addChild: [OFXMLElement elementWithName: @"body" + stringValue: body]]; +} +@end + +@implementation XMPPPresence ++ presence +{ + return [self presenceWithType: nil ID: nil]; +} + ++ presenceWithID: (OFString*)ID_ +{ + return [self presenceWithType: nil ID: ID_]; +} + ++ presenceWithType: (OFString*)type_ +{ + return [self presenceWithType: type_ ID: nil]; +} + ++ presenceWithType: (OFString*)type_ + ID: (OFString*)ID_ +{ + id ret; + ret = [[[self alloc] initWithName: @"presence"] autorelease]; + if (type_) + [ret setType: type_]; + if (ID_) + [ret setID: ID_]; + return ret; +} + +- (void)addShow: (OFString*)show +{ + [self addChild: [OFXMLElement elementWithName: @"show" + stringValue: show]]; +} + +- (void)addStatus: (OFString*)status +{ + [self addChild: [OFXMLElement elementWithName: @"status" + stringValue: status]]; +} + +- (void)addPriority: (char)priority +{ + OFString* prio = [OFString stringWithFormat: @"%d", priority]; + [self addChild: [OFXMLElement elementWithName: @"priority" + stringValue: prio]]; +} +@end diff --git a/XMPPStanza.o b/XMPPStanza.o new file mode 100644 index 0000000000000000000000000000000000000000..c46eb751d8f3f041a3f9e109602ba2b8f9c384f5 GIT binary patch literal 34148 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 literal 0 HcmV?d00001 diff --git a/test.m b/test.m index 7c6346b..98a665c 100644 --- a/test.m +++ b/test.m @@ -1,5 +1,7 @@ -#include +#include +#import #import "XMPPConnection.h" +#import "XMPPStanza.h" @interface AppDelegate: OFObject { @@ -14,6 +16,44 @@ OF_APPLICATION_DELEGATE(AppDelegate) { OFArray *arguments = [OFApplication arguments]; + XMPPPresence *pres = [XMPPPresence presence]; + [pres addShow: @"chat"]; + [pres addStatus: @"Bored"]; + [pres addPriority: 20]; + pres.to = @"alice@example.com"; + pres.from = @"bob@example.org"; + assert([[pres stringValue] isEqual: @"chat" + @"Bored20" + @""]); + + XMPPMessage *msg = [XMPPMessage messageWithType: @"chat"]; + [msg addBody: @"Hello everyone"]; + msg.to = @"jdev@conference.jabber.org"; + msg.from = @"alice@example.com"; + assert([[msg stringValue] isEqual: @"Hello everyone" + @""]); + + XMPPIQ *iq = [XMPPIQ IQWithType: @"set" ID: @"128"]; + iq.to = @"juliet@capulet.lit"; + iq.from = @"romeo@montague.lit"; + assert([[iq stringValue] isEqual: @""]); + + OFXMLElement *elem = [OFXMLElement elementWithName: @"iq"]; + [elem addAttributeWithName: @"from" stringValue: @"bob@localhost"]; + [elem addAttributeWithName: @"to" stringValue: @"alice@localhost"]; + [elem addAttributeWithName: @"type" stringValue: @"get"]; + [elem addAttributeWithName: @"id" stringValue: @"42"]; + XMPPStanza *stanza = [XMPPStanza stanzaWithElement: elem]; + assert([[elem stringValue] isEqual: [stanza stringValue]]); + assert(([[OFString stringWithFormat: @"%@, %@, %@, %@", stanza.from, + stanza.to, stanza.type, stanza.ID] + isEqual: @"bob@localhost, alice@localhost, get, 42"])); + conn = [[XMPPConnection alloc] init]; if (arguments.count != 3) {