- Update
This commit is contained in:
1 parent
d281d765ea
commit
5b074a5176
1261 files changed
+199158
-7303
No files matched your search
@@ -0,0 +1,16 @@
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
#if TARGET_OS_IPHONE
|
||||
#import "DDXML.h"
|
||||
#endif
|
||||
|
||||
@class XMPPResultSet;
|
||||
|
||||
|
||||
@interface NSXMLElement (XEP_0059)
|
||||
|
||||
- (BOOL)isResultSet;
|
||||
- (BOOL)hasResultSet;
|
||||
- (XMPPResultSet *)resultSet;
|
||||
|
||||
@end
|
||||
@@ -0,0 +1,47 @@
|
||||
#import "NSXMLElement+XEP_0059.h"
|
||||
#import "NSXMLElement+XMPP.h"
|
||||
#import "XMPPResultSet.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 NSXMLElement (XEP_0059)
|
||||
|
||||
|
||||
- (BOOL)isResultSet
|
||||
{
|
||||
if([[self name] isEqualToString:NAME_XMPP_RESULT_SET] && [[self xmlns] isEqualToString:XMLNS_XMPP_RESULT_SET])
|
||||
{
|
||||
return YES;
|
||||
}
|
||||
else
|
||||
{
|
||||
return NO;
|
||||
}
|
||||
}
|
||||
|
||||
- (BOOL)hasResultSet
|
||||
{
|
||||
if([self resultSet])
|
||||
{
|
||||
return YES;
|
||||
}
|
||||
else
|
||||
{
|
||||
return NO;
|
||||
}
|
||||
}
|
||||
|
||||
- (XMPPResultSet *)resultSet
|
||||
{
|
||||
NSXMLElement *resultSetElement = [self elementForName:NAME_XMPP_RESULT_SET xmlns:XMLNS_XMPP_RESULT_SET];
|
||||
XMPPResultSet *resultSet = [XMPPResultSet resultSetFromElement:resultSetElement];
|
||||
return resultSet;
|
||||
}
|
||||
|
||||
@end
|
||||
@@ -0,0 +1,96 @@
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
#if TARGET_OS_IPHONE
|
||||
#import "DDXML.h"
|
||||
#endif
|
||||
|
||||
/**
|
||||
* The XMPPResultSet class represents an <set xmlns='http://jabber.org/protocol/rsm'> element form XEP-0059.
|
||||
* It extends NSXMLElement.
|
||||
*
|
||||
* Calling resultSet on an NSXMLElement returns an XMPPResultSet if it exists (see NSXMLElement+XEP_0059.h)
|
||||
*
|
||||
* This class exists to provide developers an easy way to add functionality to Result Set processing.
|
||||
* Simply add your own category to XMPPResultSet to extend it with your own custom methods.
|
||||
*
|
||||
* XMPPResultSet uses NSNotFound to Specify undefined integer values i.e. max,firstIndex and count.
|
||||
* XMPPResultSet uses a NSString of 0 length but not nil to supply empty elements i.e. before and after.
|
||||
*
|
||||
* Example:
|
||||
*
|
||||
* To fetch the last 10 items in a result set you need the following XML:
|
||||
*
|
||||
* <set xmlns='http://jabber.org/protocol/rsm'>
|
||||
* <max>10</max>
|
||||
* <before/>
|
||||
* </set>
|
||||
*
|
||||
* This Result Set can be created by:
|
||||
*
|
||||
* [XMPPResultSet resultSetWithMax:10 firstIndex:NSNotFound after:nil before:@""];
|
||||
**/
|
||||
|
||||
@interface XMPPResultSet : NSXMLElement
|
||||
|
||||
/**
|
||||
* Converts an NSXMLElement to an XMPPResultSet element in place (no memory allocations or copying)
|
||||
**/
|
||||
+ (XMPPResultSet *)resultSetFromElement:(NSXMLElement *)element;
|
||||
|
||||
/**
|
||||
* Creates and returns a new autoreleased XMPPResultSet element.
|
||||
**/
|
||||
+ (XMPPResultSet *)resultSet;
|
||||
|
||||
+ (XMPPResultSet *)resultSetWithMax:(NSInteger)max;
|
||||
|
||||
+ (XMPPResultSet *)resultSetWithMax:(NSInteger)max
|
||||
firstIndex:(NSInteger)index;
|
||||
|
||||
+ (XMPPResultSet *)resultSetWithMax:(NSInteger)max
|
||||
after:(NSString *)after;
|
||||
|
||||
+ (XMPPResultSet *)resultSetWithMax:(NSInteger)max
|
||||
before:(NSString *)before;
|
||||
|
||||
+ (XMPPResultSet *)resultSetWithMax:(NSInteger)max
|
||||
firstIndex:(NSInteger)firstIndex
|
||||
after:(NSString *)after
|
||||
before:(NSString *)before;
|
||||
|
||||
|
||||
/**
|
||||
* Creates and returns a new XMPPResultSet element.
|
||||
**/
|
||||
- (id)init;
|
||||
|
||||
- (id)initWithMax:(NSInteger)max;
|
||||
|
||||
- (id)initWithMax:(NSInteger)max
|
||||
firstIndex:(NSInteger)firstIndex;
|
||||
|
||||
- (id)initWithMax:(NSInteger)max
|
||||
after:(NSString *)after;
|
||||
|
||||
- (id)initWithMax:(NSInteger)max
|
||||
before:(NSString *)before;
|
||||
|
||||
- (id)initWithMax:(NSInteger)max
|
||||
firstIndex:(NSInteger)firstIndex
|
||||
after:(NSString *)after
|
||||
before:(NSString *)before;
|
||||
|
||||
|
||||
- (NSInteger)max;
|
||||
|
||||
- (NSInteger)firstIndex;
|
||||
|
||||
- (NSString *)after;
|
||||
- (NSString *)before;
|
||||
|
||||
- (NSInteger)count;
|
||||
|
||||
- (NSString *)first;
|
||||
- (NSString *)last;
|
||||
|
||||
@end
|
||||
@@ -0,0 +1,230 @@
|
||||
#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
|
||||
Reference in new issue
Block a user