2016-02-24 16:56:39 +01:00

231 lines
6.0 KiB
Objective-C

#import "XMPPResultSet.h"
#import "NSXMLElement+XMPP.h"
#import <objc/runtime.h>
#if ! __has_feature(objc_arc)
#warning This file must be compiled with ARC. Use -fobjc-arc flag (or convert project to ARC).
#endif
#define XMLNS_XMPP_RESULT_SET @"http://jabber.org/protocol/rsm"
#define NAME_XMPP_RESULT_SET @"set"
@implementation XMPPResultSet
+ (void)initialize
{
// We use the object_setClass method below to dynamically change the class from a standard NSXMLElement.
// The size of the two classes is expected to be the same.
//
// If a developer adds instance methods to this class, bad things happen at runtime that are very hard to debug.
// This check is here to aid future developers who may make this mistake.
//
// For Fearless And Experienced Objective-C Developers:
// It may be possible to support adding instance variables to this class if you seriously need it.
// To do so, try realloc'ing self after altering the class, and then initialize your variables.
size_t superSize = class_getInstanceSize([NSXMLElement class]);
size_t ourSize = class_getInstanceSize([XMPPResultSet class]);
if (superSize != ourSize)
{
NSLog(@"Adding instance variables to XMPPResultSet is not currently supported!");
exit(15);
}
}
+ (XMPPResultSet *)resultSetFromElement:(NSXMLElement *)element
{
object_setClass(element, [XMPPResultSet class]);
return (XMPPResultSet *)element;
}
+ (XMPPResultSet *)resultSet
{
return [[XMPPResultSet alloc] init];
}
+ (XMPPResultSet *)resultSetWithMax:(NSInteger)max
{
return [[XMPPResultSet alloc] initWithMax:max];
}
+ (XMPPResultSet *)resultSetWithMax:(NSInteger)max
firstIndex:(NSInteger)firstIndex
{
return [[XMPPResultSet alloc] initWithMax:max firstIndex:firstIndex];
}
+ (XMPPResultSet *)resultSetWithMax:(NSInteger)max
after:(NSString *)after
{
return [[XMPPResultSet alloc] initWithMax:max after:after];
}
+ (XMPPResultSet *)resultSetWithMax:(NSInteger)max
before:(NSString *)before
{
return [[XMPPResultSet alloc] initWithMax:max before:before];
}
+ (XMPPResultSet *)resultSetWithMax:(NSInteger)max
firstIndex:(NSInteger)firstIndex
after:(NSString *)after
before:(NSString *)before
{
return [[XMPPResultSet alloc] initWithMax:max
firstIndex:firstIndex
after:after
before:before];
}
- (id)init
{
return [self initWithMax:NSNotFound firstIndex:NSNotFound after:nil before:nil];
}
- (id)initWithMax:(NSInteger)max
{
return [self initWithMax:max firstIndex:NSNotFound after:nil before:nil];
}
- (id)initWithMax:(NSInteger)max
firstIndex:(NSInteger)firstIndex
{
return [self initWithMax:max firstIndex:firstIndex after:nil before:nil];
}
- (id)initWithMax:(NSInteger)max
after:(NSString *)after
{
return [self initWithMax:max firstIndex:NSNotFound after:after before:nil];
}
- (id)initWithMax:(NSInteger)max
before:(NSString *)before
{
return [self initWithMax:max firstIndex:NSNotFound after:nil before:before];
}
- (id)initWithMax:(NSInteger)max
firstIndex:(NSInteger)firstIndex
after:(NSString *)after
before:(NSString *)before
{
if ((self = [super initWithName:NAME_XMPP_RESULT_SET xmlns:XMLNS_XMPP_RESULT_SET]))
{
if(max != NSNotFound)
{
NSXMLElement *maxElement = [NSXMLElement elementWithName:@"max" stringValue:[@(max) stringValue]];
[self addChild:maxElement];
}
if(firstIndex != NSNotFound)
{
NSXMLElement *maxElement = [NSXMLElement elementWithName:@"index" stringValue:[@(firstIndex) stringValue]];
[self addChild:maxElement];
}
if(after != nil)
{
if([after length])
{
NSXMLElement *afterElement = [NSXMLElement elementWithName:@"after" stringValue:after];
[self addChild:afterElement];
}
else
{
NSXMLElement *afterElement = [NSXMLElement elementWithName:@"after"];
[self addChild:afterElement];
}
}
if(before != nil)
{
if([before length])
{
NSXMLElement *beforeElement = [NSXMLElement elementWithName:@"before" stringValue:before];
[self addChild:beforeElement];
}
else
{
NSXMLElement *beforeElement = [NSXMLElement elementWithName:@"before"];
[self addChild:beforeElement];
}
}
}
return self;
}
- (id)initWithXMLString:(NSString *)string error:(NSError *__autoreleasing *)error
{
if((self = [super initWithXMLString:string error:error]))
{
self = [XMPPResultSet resultSetFromElement:self];
}
return self;
}
- (NSInteger)max
{
if([self elementForName:@"max"])
{
return [[[self elementForName:@"max"] stringValue] intValue];
}else{
return NSNotFound;
}
}
- (NSInteger)firstIndex
{
if([[self elementForName:@"first"] attributeForName:@"index"])
{
return [[self elementForName:@"first"] attributeIntegerValueForName:@"index"];
}
else if([self elementForName:@"index"])
{
return [[[self elementForName:@"index"] stringValue] intValue];
}
else
{
return NSNotFound;
}
}
- (NSString *)after
{
return [[self elementForName:@"after"] stringValue];
}
- (NSString *)before
{
return [[self elementForName:@"before"] stringValue];
}
- (NSInteger)count
{
if([self elementForName:@"count"])
{
return [[[self elementForName:@"count"] stringValue] intValue];
}
else
{
return NSNotFound;
}
}
- (NSString *)first
{
return [[self elementForName:@"first"] stringValue];
}
- (NSString *)last
{
return [[self elementForName:@"last"] stringValue];
}
@end