Index: src/XMPPPresence.h ================================================================== --- src/XMPPPresence.h +++ src/XMPPPresence.h @@ -24,11 +24,11 @@ #import "XMPPStanza.h" /** * \brief A class describing a presence stanza. */ -@interface XMPPPresence: XMPPStanza +@interface XMPPPresence: XMPPStanza { /// \cond internal OFString *status; OFString *show; OFNumber *priority; Index: src/XMPPPresence.m ================================================================== --- src/XMPPPresence.m +++ src/XMPPPresence.m @@ -22,13 +22,27 @@ */ #ifdef HAVE_CONFIG_H # include "config.h" #endif + +#include #import "XMPPPresence.h" #import "namespaces.h" + +// This provides us with sortable values for show values +static int show_to_int(OFString *show) +{ + if ([show isEqual: @"chat"]) return 0; + if (show == nil) return 1; // available + if ([show isEqual: @"away"]) return 2; + if ([show isEqual: @"dnd"]) return 3; + if ([show isEqual: @"xa"]) return 4; + + assert(0); +} @implementation XMPPPresence + presence { return [[[self alloc] init] autorelease]; @@ -162,6 +176,37 @@ - (OFString*)priority { return [[priority copy] autorelease]; } + +- (of_comparison_result_t)compare: (id )object +{ + XMPPPresence *otherPresence; + OFString *otherShow; + of_comparison_result_t priorityOrder; + + if (object == self) + return OF_ORDERED_SAME; + + if (![object isKindOfClass: [XMPPPresence class]]) + @throw [OFInvalidArgumentException + exceptionWithClass: [self class] + selector: _cmd]; + + otherPresence = (XMPPPresence*)object; + + priorityOrder = [priority compare: [otherPresence priority]]; + + if (priorityOrder != OF_ORDERED_SAME) + return priorityOrder; + + otherShow = [otherPresence show]; + if ([show isEqual: otherShow]) + return OF_ORDERED_SAME; + + if (show_to_int(show) < show_to_int(otherShow)) + return OF_ORDERED_ASCENDING; + + return OF_ORDERED_DESCENDING; +} @end Index: tests/test.m ================================================================== --- tests/test.m +++ tests/test.m @@ -51,20 +51,29 @@ - (void)applicationDidFinishLaunching { OFArray *arguments = [OFApplication arguments]; XMPPPresence *pres = [XMPPPresence presence]; - [pres setShow: @"chat"]; + [pres setShow: @"xa"]; [pres setStatus: @"Bored"]; [pres setPriority: [OFNumber numberWithInt8: 20]]; [pres setTo: [XMPPJID JIDWithString: @"alice@example.com"]]; [pres setFrom: [XMPPJID JIDWithString: @"bob@example.org"]]; assert([[pres XMLString] isEqual: @"chat" + @"from='bob@example.org'>xa" @"Bored20" @""]); + XMPPPresence *pres2 = [XMPPPresence presence]; + [pres2 setShow: @"away"]; + [pres2 setStatus: @"Bored"]; + [pres2 setPriority: [OFNumber numberWithInt8: 23]]; + [pres2 setTo: [XMPPJID JIDWithString: @"alice@example.com"]]; + [pres2 setFrom: [XMPPJID JIDWithString: @"bob@example.org"]]; + + assert([pres compare: pres2] == OF_ORDERED_ASCENDING); + XMPPMessage *msg = [XMPPMessage messageWithType: @"chat"]; [msg setBody: @"Hello everyone"]; [msg setTo: [XMPPJID JIDWithString: @"jdev@conference.jabber.org"]]; [msg setFrom: [XMPPJID JIDWithString: @"alice@example.com"]]; assert([[msg XMLString] isEqual: @"