Make XMPPPresence comparable

This commit is contained in:
Florian Zeitz 2013-01-14 21:11:29 +01:00
parent 1e6f98c6df
commit e951bacb3b
3 changed files with 57 additions and 3 deletions

View file

@ -26,7 +26,7 @@
/**
* \brief A class describing a presence stanza.
*/
@interface XMPPPresence: XMPPStanza
@interface XMPPPresence: XMPPStanza <OFComparing>
{
/// \cond internal
OFString *status;

View file

@ -25,9 +25,23 @@
# include "config.h"
#endif
#include <assert.h>
#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
{
@ -164,4 +178,35 @@
{
return [[priority copy] autorelease];
}
- (of_comparison_result_t)compare: (id <OFComparing>)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

View file

@ -53,16 +53,25 @@ OF_APPLICATION_DELEGATE(AppDelegate)
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: @"<presence to='alice@example.com' "
@"from='bob@example.org'><show>chat</show>"
@"from='bob@example.org'><show>xa</show>"
@"<status>Bored</status><priority>20</priority>"
@"</presence>"]);
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"]];