Make XMPPPresence comparable
This commit is contained in:
parent
1e6f98c6df
commit
e951bacb3b
3 changed files with 57 additions and 3 deletions
|
@ -26,7 +26,7 @@
|
||||||
/**
|
/**
|
||||||
* \brief A class describing a presence stanza.
|
* \brief A class describing a presence stanza.
|
||||||
*/
|
*/
|
||||||
@interface XMPPPresence: XMPPStanza
|
@interface XMPPPresence: XMPPStanza <OFComparing>
|
||||||
{
|
{
|
||||||
/// \cond internal
|
/// \cond internal
|
||||||
OFString *status;
|
OFString *status;
|
||||||
|
|
|
@ -25,9 +25,23 @@
|
||||||
# include "config.h"
|
# include "config.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include <assert.h>
|
||||||
|
|
||||||
#import "XMPPPresence.h"
|
#import "XMPPPresence.h"
|
||||||
#import "namespaces.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
|
@implementation XMPPPresence
|
||||||
+ presence
|
+ presence
|
||||||
{
|
{
|
||||||
|
@ -164,4 +178,35 @@
|
||||||
{
|
{
|
||||||
return [[priority copy] autorelease];
|
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
|
@end
|
||||||
|
|
13
tests/test.m
13
tests/test.m
|
@ -53,16 +53,25 @@ OF_APPLICATION_DELEGATE(AppDelegate)
|
||||||
OFArray *arguments = [OFApplication arguments];
|
OFArray *arguments = [OFApplication arguments];
|
||||||
|
|
||||||
XMPPPresence *pres = [XMPPPresence presence];
|
XMPPPresence *pres = [XMPPPresence presence];
|
||||||
[pres setShow: @"chat"];
|
[pres setShow: @"xa"];
|
||||||
[pres setStatus: @"Bored"];
|
[pres setStatus: @"Bored"];
|
||||||
[pres setPriority: [OFNumber numberWithInt8: 20]];
|
[pres setPriority: [OFNumber numberWithInt8: 20]];
|
||||||
[pres setTo: [XMPPJID JIDWithString: @"alice@example.com"]];
|
[pres setTo: [XMPPJID JIDWithString: @"alice@example.com"]];
|
||||||
[pres setFrom: [XMPPJID JIDWithString: @"bob@example.org"]];
|
[pres setFrom: [XMPPJID JIDWithString: @"bob@example.org"]];
|
||||||
assert([[pres XMLString] isEqual: @"<presence to='alice@example.com' "
|
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>"
|
@"<status>Bored</status><priority>20</priority>"
|
||||||
@"</presence>"]);
|
@"</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"];
|
XMPPMessage *msg = [XMPPMessage messageWithType: @"chat"];
|
||||||
[msg setBody: @"Hello everyone"];
|
[msg setBody: @"Hello everyone"];
|
||||||
[msg setTo: [XMPPJID JIDWithString: @"jdev@conference.jabber.org"]];
|
[msg setTo: [XMPPJID JIDWithString: @"jdev@conference.jabber.org"]];
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue