- Update
This commit is contained in:
1 parent
d281d765ea
commit
5b074a5176
1261 files changed
+199158
-7303
No files matched your search
@@ -0,0 +1,14 @@
|
||||
#import <Foundation/Foundation.h>
|
||||
#import "XMPPMessage.h"
|
||||
|
||||
|
||||
@interface XMPPMessage (XEP_0184)
|
||||
|
||||
- (BOOL)hasReceiptRequest;
|
||||
- (BOOL)hasReceiptResponse;
|
||||
- (NSString *)receiptResponseID;
|
||||
- (XMPPMessage *)generateReceiptResponse;
|
||||
|
||||
- (void)addReceiptRequest;
|
||||
|
||||
@end
|
||||
@@ -0,0 +1,64 @@
|
||||
#import "XMPPMessage+XEP_0184.h"
|
||||
#import "NSXMLElement+XMPP.h"
|
||||
|
||||
|
||||
@implementation XMPPMessage (XEP_0184)
|
||||
|
||||
- (BOOL)hasReceiptRequest
|
||||
{
|
||||
NSXMLElement *receiptRequest = [self elementForName:@"request" xmlns:@"urn:xmpp:receipts"];
|
||||
|
||||
return (receiptRequest != nil);
|
||||
}
|
||||
|
||||
- (BOOL)hasReceiptResponse
|
||||
{
|
||||
NSXMLElement *receiptResponse = [self elementForName:@"received" xmlns:@"urn:xmpp:receipts"];
|
||||
|
||||
return (receiptResponse != nil);
|
||||
}
|
||||
|
||||
- (NSString *)receiptResponseID
|
||||
{
|
||||
NSXMLElement *receiptResponse = [self elementForName:@"received" xmlns:@"urn:xmpp:receipts"];
|
||||
|
||||
return [receiptResponse attributeStringValueForName:@"id"];
|
||||
}
|
||||
|
||||
- (XMPPMessage *)generateReceiptResponse
|
||||
{
|
||||
// Example:
|
||||
//
|
||||
// <message to="juliet">
|
||||
// <received xmlns="urn:xmpp:receipts" id="ABC-123"/>
|
||||
// </message>
|
||||
|
||||
NSXMLElement *received = [NSXMLElement elementWithName:@"received" xmlns:@"urn:xmpp:receipts"];
|
||||
|
||||
NSXMLElement *message = [NSXMLElement elementWithName:@"message"];
|
||||
|
||||
NSString *to = [self fromStr];
|
||||
if (to)
|
||||
{
|
||||
[message addAttributeWithName:@"to" stringValue:to];
|
||||
}
|
||||
|
||||
NSString *msgid = [self elementID];
|
||||
if (msgid)
|
||||
{
|
||||
[received addAttributeWithName:@"id" stringValue:msgid];
|
||||
}
|
||||
|
||||
[message addChild:received];
|
||||
|
||||
return [[self class] messageFromElement:message];
|
||||
}
|
||||
|
||||
|
||||
- (void)addReceiptRequest
|
||||
{
|
||||
NSXMLElement *receiptRequest = [NSXMLElement elementWithName:@"request" xmlns:@"urn:xmpp:receipts"];
|
||||
[self addChild:receiptRequest];
|
||||
}
|
||||
|
||||
@end
|
||||
@@ -0,0 +1,32 @@
|
||||
#import "XMPPModule.h"
|
||||
|
||||
#define _XMPP_MESSAGE_DELIVERY_RECEIPTS_H
|
||||
|
||||
/**
|
||||
* XMPPMessageDeliveryReceipts can be configured to automatically send delivery receipts and requests in accordance to XEP-0184
|
||||
**/
|
||||
|
||||
@interface XMPPMessageDeliveryReceipts : XMPPModule
|
||||
|
||||
/**
|
||||
* Automatically add message delivery requests to outgoing messages, in all situations that are permitted in XEP-0184
|
||||
*
|
||||
* - Message MUST NOT be of type 'error' or 'groupchat'
|
||||
* - Message MUST have an id
|
||||
* - Message MUST NOT have a delivery receipt or request
|
||||
* - To must either be a bare JID or a full JID that advertises the urn:xmpp:receipts capability
|
||||
*
|
||||
* Default NO
|
||||
**/
|
||||
|
||||
@property (assign) BOOL autoSendMessageDeliveryRequests;
|
||||
|
||||
/**
|
||||
* Automatically send message delivery receipts when a message with a delivery request is received
|
||||
*
|
||||
* Default NO
|
||||
**/
|
||||
|
||||
@property (assign) BOOL autoSendMessageDeliveryReceipts;
|
||||
|
||||
@end
|
||||
@@ -0,0 +1,210 @@
|
||||
#import "XMPPMessageDeliveryReceipts.h"
|
||||
#import "XMPPMessage+XEP_0184.h"
|
||||
#import "XMPPFramework.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_URN_XMPP_RECEIPTS @"urn:xmpp:receipts"
|
||||
|
||||
@implementation XMPPMessageDeliveryReceipts
|
||||
|
||||
@synthesize autoSendMessageDeliveryRequests;
|
||||
@synthesize autoSendMessageDeliveryReceipts;
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
#pragma mark Init/Dealloc
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
- (id)initWithDispatchQueue:(dispatch_queue_t)queue
|
||||
{
|
||||
if((self = [super initWithDispatchQueue:queue]))
|
||||
{
|
||||
autoSendMessageDeliveryRequests = NO;
|
||||
autoSendMessageDeliveryReceipts = NO;
|
||||
}
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
#pragma mark XMPPModule
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
- (BOOL)activate:(XMPPStream *)aXmppStream
|
||||
{
|
||||
if ([super activate:aXmppStream])
|
||||
{
|
||||
#ifdef _XMPP_CAPABILITIES_H
|
||||
[xmppStream autoAddDelegate:self delegateQueue:moduleQueue toModulesOfClass:[XMPPCapabilities class]];
|
||||
#endif
|
||||
return YES;
|
||||
}
|
||||
|
||||
return NO;
|
||||
}
|
||||
|
||||
- (void)deactivate
|
||||
{
|
||||
#ifdef _XMPP_CAPABILITIES_H
|
||||
[xmppStream removeAutoDelegate:self delegateQueue:moduleQueue fromModulesOfClass:[XMPPCapabilities class]];
|
||||
#endif
|
||||
|
||||
[super deactivate];
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
#pragma mark Properties
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
- (BOOL)autoSendMessageDeliveryRequests
|
||||
{
|
||||
__block BOOL result = NO;
|
||||
|
||||
dispatch_block_t block = ^{
|
||||
result = autoSendMessageDeliveryRequests;
|
||||
};
|
||||
|
||||
if (dispatch_get_specific(moduleQueueTag))
|
||||
block();
|
||||
else
|
||||
dispatch_sync(moduleQueue, block);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
- (void)setAutoSendMessageDeliveryRequests:(BOOL)flag
|
||||
{
|
||||
dispatch_block_t block = ^{
|
||||
autoSendMessageDeliveryRequests = flag;
|
||||
};
|
||||
|
||||
if (dispatch_get_specific(moduleQueueTag))
|
||||
block();
|
||||
else
|
||||
dispatch_async(moduleQueue, block);
|
||||
}
|
||||
|
||||
- (BOOL)autoSendMessageDeliveryReceipts
|
||||
{
|
||||
__block BOOL result = NO;
|
||||
|
||||
dispatch_block_t block = ^{
|
||||
result = autoSendMessageDeliveryReceipts;
|
||||
};
|
||||
|
||||
if (dispatch_get_specific(moduleQueueTag))
|
||||
block();
|
||||
else
|
||||
dispatch_sync(moduleQueue, block);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
- (void)setAutoSendMessageDeliveryReceipts:(BOOL)flag
|
||||
{
|
||||
dispatch_block_t block = ^{
|
||||
autoSendMessageDeliveryReceipts = flag;
|
||||
};
|
||||
|
||||
if (dispatch_get_specific(moduleQueueTag))
|
||||
block();
|
||||
else
|
||||
dispatch_async(moduleQueue, block);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
#pragma mark XMPPStream Delegate
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
- (void)xmppStream:(XMPPStream *)sender didReceiveMessage:(XMPPMessage *)message
|
||||
{
|
||||
if([message hasReceiptRequest])
|
||||
{
|
||||
if(self.autoSendMessageDeliveryReceipts)
|
||||
{
|
||||
XMPPMessage *generatedReceiptResponse = [message generateReceiptResponse];
|
||||
[sender sendElement:generatedReceiptResponse];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
- (XMPPMessage *)xmppStream:(XMPPStream *)sender willSendMessage:(XMPPMessage *)message
|
||||
{
|
||||
if(self.autoSendMessageDeliveryRequests
|
||||
&& [message to]
|
||||
&& ![message isErrorMessage] && ![[[message attributeForName:@"type"] stringValue] isEqualToString:@"groupchat"]
|
||||
&& [[message elementID] length]
|
||||
&& ![message hasReceiptRequest] && ![message hasReceiptResponse])
|
||||
{
|
||||
|
||||
#ifdef _XMPP_CAPABILITIES_H
|
||||
BOOL addReceiptRequest = NO;
|
||||
|
||||
__block XMPPCapabilities *xmppCapabilities = nil;
|
||||
|
||||
[xmppStream enumerateModulesOfClass:[XMPPCapabilities class] withBlock:^(XMPPModule *module, NSUInteger idx, BOOL *stop) {
|
||||
xmppCapabilities = (XMPPCapabilities *)module;
|
||||
}];
|
||||
|
||||
if([[message to] isFull] && [xmppCapabilities.xmppCapabilitiesStorage areCapabilitiesKnownForJID:[message to] xmppStream:sender])
|
||||
{
|
||||
NSXMLElement *capabilities = [xmppCapabilities.xmppCapabilitiesStorage capabilitiesForJID:[message to] xmppStream:xmppStream];
|
||||
|
||||
for(NSXMLElement *feature in [capabilities children])
|
||||
{
|
||||
if([[feature name] isEqualToString:@"feature"]
|
||||
&& [[feature attributeStringValueForName:@"var"] isEqualToString:XMLNS_URN_XMPP_RECEIPTS])
|
||||
{
|
||||
addReceiptRequest = YES;
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
addReceiptRequest = YES;
|
||||
}
|
||||
#else
|
||||
BOOL addReceiptRequest = YES;
|
||||
#endif
|
||||
|
||||
if(addReceiptRequest)
|
||||
{
|
||||
[message addReceiptRequest];
|
||||
}
|
||||
}
|
||||
|
||||
return message;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
#pragma mark XMPPCapabilities delegate
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifdef _XMPP_CAPABILITIES_H
|
||||
/**
|
||||
* If an XMPPCapabilites instance is used we want to advertise our support for XEP-0184.
|
||||
**/
|
||||
- (void)xmppCapabilities:(XMPPCapabilities *)sender collectingMyCapabilities:(NSXMLElement *)query
|
||||
{
|
||||
// This method is invoked on the moduleQueue.
|
||||
|
||||
// <query xmlns="http://jabber.org/protocol/disco#info">
|
||||
// ...
|
||||
// <feature var='urn:xmpp:receipts'/>
|
||||
// ...
|
||||
// </query>
|
||||
|
||||
NSXMLElement *messageDeliveryReceiptsFeatureElement = [NSXMLElement elementWithName:@"feature"];
|
||||
[messageDeliveryReceiptsFeatureElement addAttributeWithName:@"var" stringValue:XMLNS_URN_XMPP_RECEIPTS];
|
||||
|
||||
[query addChild:messageDeliveryReceiptsFeatureElement];
|
||||
}
|
||||
#endif
|
||||
|
||||
@end
|
||||
Reference in new issue
Block a user