Skip to content

Commit e110992

Browse files
committed
XEP-0066: Out of Band Data
Fixes robbiehanson#196
1 parent 6027964 commit e110992

File tree

4 files changed

+385
-0
lines changed

4 files changed

+385
-0
lines changed

Extensions/XEP-0066/XMPPIQ+XEP_0066.h

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
#import "XMPPIQ.h"
2+
3+
@interface XMPPIQ (XEP_0066)
4+
5+
+ (XMPPIQ *)outOfBandDataRequestTo:(XMPPJID *)jid
6+
elementID:(NSString *)eid
7+
URL:(NSURL *)URL
8+
desc:(NSString *)dec;
9+
10+
+ (XMPPIQ *)outOfBandDataRequestTo:(XMPPJID *)jid
11+
elementID:(NSString *)eid
12+
URI:(NSString *)URI
13+
desc:(NSString *)dec;
14+
15+
16+
- (id)initOutOfBandDataRequestTo:(XMPPJID *)jid
17+
elementID:(NSString *)eid
18+
URL:(NSURL *)URL
19+
desc:(NSString *)dec;
20+
21+
- (id)initOutOfBandDataRequestTo:(XMPPJID *)jid
22+
elementID:(NSString *)eid
23+
URI:(NSString *)URI
24+
desc:(NSString *)dec;
25+
26+
- (void)addOutOfBandURL:(NSURL *)URL desc:(NSString *)desc;
27+
- (void)addOutOfBandURI:(NSString *)URI desc:(NSString *)desc;
28+
29+
- (XMPPIQ *)generateOutOfBandDataSuccessResponse;
30+
31+
- (XMPPIQ *)generateOutOfBandDataFailureResponse;
32+
33+
- (XMPPIQ *)generateOutOfBandDataRejectResponse;
34+
35+
- (BOOL)isOutOfBandDataRequest;
36+
- (BOOL)isOutOfBandDataFailureResponse;
37+
- (BOOL)isOutOfBandDataRejectResponse;
38+
39+
- (BOOL)hasOutOfBandData;
40+
41+
- (NSURL *)outOfBandURL;
42+
- (NSString *)outOfBandURI;
43+
- (NSString *)outOfBandDesc;
44+
45+
@end

Extensions/XEP-0066/XMPPIQ+XEP_0066.m

Lines changed: 229 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,229 @@
1+
#import "XMPPIQ+XEP_0066.h"
2+
#import "NSXMLElement+XMPP.h"
3+
4+
#if ! __has_feature(objc_arc)
5+
#warning This file must be compiled with ARC. Use -fobjc-arc flag (or convert project to ARC).
6+
#endif
7+
8+
#define NAME_OUT_OF_BAND @"query"
9+
#define XMLNS_OUT_OF_BAND @"jabber:iq:oob"
10+
11+
@implementation XMPPIQ (XEP_0066)
12+
13+
14+
+ (XMPPIQ *)outOfBandDataRequestTo:(XMPPJID *)jid
15+
elementID:(NSString *)eid
16+
URL:(NSURL *)URL
17+
desc:(NSString *)desc
18+
{
19+
return [[XMPPIQ alloc] initOutOfBandDataRequestTo:jid
20+
elementID:eid
21+
URL:URL
22+
desc:desc];
23+
}
24+
25+
+ (XMPPIQ *)outOfBandDataRequestTo:(XMPPJID *)jid
26+
elementID:(NSString *)eid
27+
URI:(NSString *)URI
28+
desc:(NSString *)desc
29+
{
30+
return [[XMPPIQ alloc] initOutOfBandDataRequestTo:jid
31+
elementID:eid
32+
URI:URI
33+
desc:desc];
34+
}
35+
36+
37+
- (id)initOutOfBandDataRequestTo:(XMPPJID *)jid
38+
elementID:(NSString *)eid
39+
URL:(NSURL *)URL
40+
desc:(NSString *)desc
41+
{
42+
if((self = [self initWithType:@"set" to:jid elementID:eid]))
43+
{
44+
[self addOutOfBandURL:URL desc:desc];
45+
}
46+
47+
return self;
48+
}
49+
50+
- (id)initOutOfBandDataRequestTo:(XMPPJID *)jid
51+
elementID:(NSString *)eid
52+
URI:(NSString *)URI
53+
desc:(NSString *)desc
54+
{
55+
if((self = [self initWithType:@"set" to:jid elementID:eid]))
56+
{
57+
[self addOutOfBandURI:URI desc:desc];
58+
}
59+
60+
return self;
61+
}
62+
63+
- (void)addOutOfBandURL:(NSURL *)URL desc:(NSString *)desc
64+
{
65+
NSXMLElement *outOfBand = [NSXMLElement elementWithName:NAME_OUT_OF_BAND xmlns:XMLNS_OUT_OF_BAND];
66+
67+
if([[URL path] length])
68+
{
69+
NSXMLElement *URLElement = [NSXMLElement elementWithName:@"url" stringValue:[URL path]];
70+
[outOfBand addChild:URLElement];
71+
}
72+
73+
if([desc length])
74+
{
75+
NSXMLElement *descElement = [NSXMLElement elementWithName:@"desc" stringValue:desc];
76+
[outOfBand addChild:descElement];
77+
}
78+
79+
[self addChild:outOfBand];
80+
}
81+
82+
- (void)addOutOfBandURI:(NSString *)URI desc:(NSString *)desc
83+
{
84+
NSXMLElement *outOfBand = [NSXMLElement elementWithName:NAME_OUT_OF_BAND xmlns:XMLNS_OUT_OF_BAND];
85+
86+
if([URI length])
87+
{
88+
NSXMLElement *URLElement = [NSXMLElement elementWithName:@"url" stringValue:URI];
89+
[outOfBand addChild:URLElement];
90+
}
91+
92+
if([desc length])
93+
{
94+
NSXMLElement *descElement = [NSXMLElement elementWithName:@"desc" stringValue:desc];
95+
[outOfBand addChild:descElement];
96+
}
97+
98+
[self addChild:outOfBand];
99+
}
100+
101+
- (XMPPIQ *)generateOutOfBandDataSuccessResponse
102+
{
103+
return [XMPPIQ iqWithType:@"result" to:[self from] elementID:[self elementID]];
104+
}
105+
106+
- (XMPPIQ *)generateOutOfBandDataFailureResponse
107+
{
108+
XMPPIQ *outOfBandDataFailureResponse = [XMPPIQ iqWithType:@"error" to:[self from] elementID:[self elementID]];
109+
110+
[outOfBandDataFailureResponse addOutOfBandURI:[self outOfBandURI] desc:[self outOfBandDesc]];
111+
112+
NSXMLElement *errorElement = [NSXMLElement elementWithName:@"error"];
113+
[errorElement addAttributeWithName:@"code" stringValue:@"404"];
114+
[errorElement addAttributeWithName:@"type" stringValue:@"cancel"];
115+
116+
NSXMLElement *itemNotFoundElement = [NSXMLElement elementWithName:@"item-not-found" xmlns:@"rn:ietf:params:xml:ns:xmpp-stanzas"];
117+
[errorElement addChild:itemNotFoundElement];
118+
119+
[outOfBandDataFailureResponse addChild:errorElement];
120+
121+
122+
return outOfBandDataFailureResponse;
123+
}
124+
125+
- (XMPPIQ *)generateOutOfBandDataRejectResponse
126+
{
127+
XMPPIQ *outOfBandDataRejectResponse = [XMPPIQ iqWithType:@"error" to:[self from] elementID:[self elementID]];
128+
129+
[outOfBandDataRejectResponse addOutOfBandURI:[self outOfBandURI] desc:[self outOfBandDesc]];
130+
131+
NSXMLElement *errorElement = [NSXMLElement elementWithName:@"error"];
132+
[errorElement addAttributeWithName:@"code" stringValue:@"406"];
133+
[errorElement addAttributeWithName:@"type" stringValue:@"modify"];
134+
135+
NSXMLElement *notAcceptableElement = [NSXMLElement elementWithName:@"not-acceptable" xmlns:@"rn:ietf:params:xml:ns:xmpp-stanzas"];
136+
[errorElement addChild:notAcceptableElement];
137+
138+
[outOfBandDataRejectResponse addChild:errorElement];
139+
140+
return outOfBandDataRejectResponse;
141+
}
142+
143+
- (BOOL)isOutOfBandDataRequest
144+
{
145+
if([self hasOutOfBandData] && [self isSetIQ])
146+
{
147+
return YES;
148+
}else{
149+
return NO;
150+
}
151+
}
152+
153+
- (BOOL)isOutOfBandDataFailureResponse
154+
{
155+
NSXMLElement *errorElement = [self elementForName:@"error"];
156+
157+
NSUInteger errorCode = [errorElement attributeIntegerValueForName:@"code"];
158+
NSString *errorType = [errorElement attributeStringValueForName:@"type"];
159+
160+
if([self hasOutOfBandData] && [self isErrorIQ] && errorCode == 404 && [errorType isEqualToString:@"cancel"])
161+
{
162+
return YES;
163+
}else{
164+
return NO;
165+
}
166+
}
167+
168+
- (BOOL)isOutOfBandDataRejectResponse
169+
{
170+
NSXMLElement *errorElement = [self elementForName:@"error"];
171+
172+
NSUInteger errorCode = [errorElement attributeIntegerValueForName:@"code"];
173+
NSString *errorType = [errorElement attributeStringValueForName:@"type"];
174+
175+
if([self hasOutOfBandData] && [self isErrorIQ] && errorCode == 406 && [errorType isEqualToString:@"modify"])
176+
{
177+
return YES;
178+
}else{
179+
return NO;
180+
}
181+
}
182+
183+
- (BOOL)hasOutOfBandData
184+
{
185+
return ([self elementForName:NAME_OUT_OF_BAND xmlns:XMLNS_OUT_OF_BAND] ? YES : NO);
186+
}
187+
188+
- (NSURL *)outOfBandURL
189+
{
190+
NSURL *URL = nil;
191+
192+
NSXMLElement *outOfBand = [self elementForName:NAME_OUT_OF_BAND xmlns:XMLNS_OUT_OF_BAND];
193+
194+
NSXMLElement *URLElement = [outOfBand elementForName:@"url"];
195+
196+
NSString *URLString = [URLElement stringValue];
197+
198+
if([URLString length])
199+
{
200+
URL = [NSURL URLWithString:URLString];
201+
}
202+
203+
return URL;
204+
205+
}
206+
207+
- (NSString *)outOfBandURI
208+
{
209+
NSXMLElement *outOfBand = [self elementForName:NAME_OUT_OF_BAND xmlns:XMLNS_OUT_OF_BAND];
210+
211+
NSXMLElement *URLElement = [outOfBand elementForName:@"url"];
212+
213+
NSString *URI= [URLElement stringValue];
214+
215+
return URI;
216+
}
217+
218+
- (NSString *)outOfBandDesc
219+
{
220+
NSXMLElement *outOfBand = [self elementForName:NAME_OUT_OF_BAND xmlns:XMLNS_OUT_OF_BAND];
221+
222+
NSXMLElement *descElement = [outOfBand elementForName:@"desc"];
223+
224+
NSString *desc = [descElement stringValue];
225+
226+
return desc;
227+
}
228+
229+
@end
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
#import "XMPPMessage.h"
2+
3+
@interface XMPPMessage (XEP_0066)
4+
5+
- (void)addOutOfBandURL:(NSURL *)URL desc:(NSString *)desc;
6+
- (void)addOutOfBandURI:(NSString *)URI desc:(NSString *)desc;
7+
8+
- (BOOL)hasOutOfBandData;
9+
10+
- (NSURL *)outOfBandURL;
11+
- (NSString *)outOfBandURI;
12+
- (NSString *)outOfBandDesc;
13+
14+
@end
Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
#import "XMPPMessage+XEP_0066.h"
2+
#import "NSXMLElement+XMPP.h"
3+
4+
#if ! __has_feature(objc_arc)
5+
#warning This file must be compiled with ARC. Use -fobjc-arc flag (or convert project to ARC).
6+
#endif
7+
8+
#define NAME_OUT_OF_BAND @"x"
9+
#define XMLNS_OUT_OF_BAND @"jabber:iq:oob"
10+
11+
@implementation XMPPMessage (XEP_0066)
12+
13+
- (void)addOutOfBandURL:(NSURL *)URL desc:(NSString *)desc
14+
{
15+
NSXMLElement *outOfBand = [NSXMLElement elementWithName:NAME_OUT_OF_BAND xmlns:XMLNS_OUT_OF_BAND];
16+
17+
if([[URL path] length])
18+
{
19+
NSXMLElement *URLElement = [NSXMLElement elementWithName:@"url" stringValue:[URL path]];
20+
[outOfBand addChild:URLElement];
21+
}
22+
23+
if([desc length])
24+
{
25+
NSXMLElement *descElement = [NSXMLElement elementWithName:@"desc" stringValue:desc];
26+
[outOfBand addChild:descElement];
27+
}
28+
29+
[self addChild:outOfBand];
30+
}
31+
32+
- (void)addOutOfBandURI:(NSString *)URI desc:(NSString *)desc
33+
{
34+
NSXMLElement *outOfBand = [NSXMLElement elementWithName:NAME_OUT_OF_BAND xmlns:XMLNS_OUT_OF_BAND];
35+
36+
if([URI length])
37+
{
38+
NSXMLElement *URLElement = [NSXMLElement elementWithName:@"url" stringValue:URI];
39+
[outOfBand addChild:URLElement];
40+
}
41+
42+
if([desc length])
43+
{
44+
NSXMLElement *descElement = [NSXMLElement elementWithName:@"desc" stringValue:desc];
45+
[outOfBand addChild:descElement];
46+
}
47+
48+
[self addChild:outOfBand];
49+
}
50+
51+
- (BOOL)hasOutOfBandData
52+
{
53+
return ([self elementForName:NAME_OUT_OF_BAND xmlns:XMLNS_OUT_OF_BAND] ? YES : NO);
54+
}
55+
56+
- (NSURL *)outOfBandURL
57+
{
58+
NSURL *URL = nil;
59+
60+
NSXMLElement *outOfBand = [self elementForName:NAME_OUT_OF_BAND xmlns:XMLNS_OUT_OF_BAND];
61+
62+
NSXMLElement *URLElement = [outOfBand elementForName:@"url"];
63+
64+
NSString *URLString = [URLElement stringValue];
65+
66+
if([URLString length])
67+
{
68+
URL = [NSURL URLWithString:URLString];
69+
}
70+
71+
return URL;
72+
73+
}
74+
75+
- (NSString *)outOfBandURI
76+
{
77+
NSXMLElement *outOfBand = [self elementForName:NAME_OUT_OF_BAND xmlns:XMLNS_OUT_OF_BAND];
78+
79+
NSXMLElement *URLElement = [outOfBand elementForName:@"url"];
80+
81+
NSString *URI= [URLElement stringValue];
82+
83+
return URI;
84+
}
85+
86+
- (NSString *)outOfBandDesc
87+
{
88+
NSXMLElement *outOfBand = [self elementForName:NAME_OUT_OF_BAND xmlns:XMLNS_OUT_OF_BAND];
89+
90+
NSXMLElement *descElement = [outOfBand elementForName:@"desc"];
91+
92+
NSString *desc = [descElement stringValue];
93+
94+
return desc;
95+
}
96+
97+
@end

0 commit comments

Comments
 (0)