Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Merge pull request robbiehanson#25 from bnadim/master
Added publish function to extension XEP-0060 PubSub
  • Loading branch information
robbiehanson committed Mar 24, 2012
2 parents 4493712 + 5a301cc commit a24da86
Show file tree
Hide file tree
Showing 2 changed files with 136 additions and 4 deletions.
13 changes: 13 additions & 0 deletions Extensions/XEP-0060/XMPPPubSub.h
Expand Up @@ -2,11 +2,16 @@
// XMPPPubSub.h
//
// Created by Duncan Robertson [duncan@whomwah.com]
// Updated by Nadim for Novedia Group - Hubiquitus project[hubiquitus.com]
//

#import <Foundation/Foundation.h>
#import "XMPPModule.h"

#if TARGET_OS_IPHONE
#import "DDXML.h"
#endif

@class XMPPStream;
@class XMPPJID;
@class XMPPIQ;
Expand All @@ -23,21 +28,29 @@
@property (nonatomic, readonly) XMPPJID *serviceJID;

- (NSString *)subscribeToNode:(NSString *)node withOptions:(NSDictionary *)options;
- (NSString *)unsubscribeFromNode:(NSString *)node withSubid:(NSString *)subid;
- (NSString *)unsubscribeFromNode:(NSString *)node;
- (NSString *)createNode:(NSString *)node withOptions:(NSDictionary *)options;
- (NSString *)deleteNode:(NSString *)node;
- (NSString *)configureNode:(NSString *)node;
- (NSString *)allItemsForNode:(NSString *)node;
- (NSString *)publishToNode:(NSString*)node entry:(NSXMLElement*)entry;
- (NSString *)discoverItemsForNode:(NSString*)node;
- (NSString *)getSubscriptions;
- (NSString *)getSubscriptionsForNode:(NSString*)node;


@end

@protocol XMPPPubSubDelegate
@optional

- (void)xmppPubSub:(XMPPPubSub *)sender didSubscribe:(XMPPIQ *)iq;
- (void)xmppPubSub:(XMPPPubSub *)sender didUnsubscribe:(XMPPIQ *)iq;
- (void)xmppPubSub:(XMPPPubSub *)sender didCreateNode:(NSString *)node withIQ:(XMPPIQ *)iq;
- (void)xmppPubSub:(XMPPPubSub *)sender didReceiveMessage:(XMPPMessage *)message;
- (void)xmppPubSub:(XMPPPubSub *)sender didReceiveError:(XMPPIQ *)iq;
- (void)xmppPubSub:(XMPPPubSub *)sender didReceiveResult:(XMPPIQ *)iq;
- (void)xmppPubSub:(XMPPPubSub *)sender didPublish:(XMPPIQ *)iq;

@end
127 changes: 123 additions & 4 deletions Extensions/XEP-0060/XMPPPubSub.m
Expand Up @@ -102,7 +102,25 @@ - (BOOL)xmppStream:(XMPPStream *)sender didReceiveIQ:(XMPPIQ *)iq
return YES;
}
}
}
} else {
//Check if it was a publish
NSString *elementID = [iq attributeStringValueForName:@"id"];
if (elementID) {
NSArray * elementIDComp = [elementID componentsSeparatedByString:@":"];
if (elementIDComp > 0) {
NSString * opType = [elementIDComp objectAtIndex:1];

if ([opType isEqualToString:@"publish_node"]) {
[multicastDelegate xmppPubSub:self didPublish:iq];
return YES;

} else if([opType isEqualToString:@"unsubscribe_node"]) {
[multicastDelegate xmppPubSub:self didUnsubscribe:iq];
return YES;
}
}
}
}

[multicastDelegate xmppPubSub:self didReceiveResult:iq];
return YES;
Expand Down Expand Up @@ -192,8 +210,11 @@ - (NSString *)subscribeToNode:(NSString *)node withOptions:(NSDictionary *)optio
return sid;
}

- (NSString *)unsubscribeFromNode:(NSString*)node {
return [self unsubscribeFromNode:node withSubid:nil];
}

- (NSString *)unsubscribeFromNode:(NSString*)node
- (NSString *)unsubscribeFromNode:(NSString *)node withSubid:(NSString *)subid
{
// <iq type='set' from='francisco@denmark.lit/barracks' to='pubsub.shakespeare.lit' id='unsub1'>
// <pubsub xmlns='http://jabber.org/protocol/pubsub'>
Expand All @@ -207,7 +228,11 @@ - (NSString *)unsubscribeFromNode:(NSString*)node
NSXMLElement *ps = [NSXMLElement elementWithName:@"pubsub" xmlns:NS_PUBSUB];
NSXMLElement *subscribe = [NSXMLElement elementWithName:@"unsubscribe"];
[subscribe addAttributeWithName:@"node" stringValue:node];
[subscribe addAttributeWithName:@"jid" stringValue:[xmppStream.myJID full]];
[subscribe addAttributeWithName:@"jid" stringValue:[xmppStream.myJID bare]];

if (subid) {
[subscribe addAttributeWithName:@"subid" stringValue:subid];
}

// join them all together
[ps addChild:subscribe];
Expand All @@ -218,6 +243,36 @@ - (NSString *)unsubscribeFromNode:(NSString*)node
return sid;
}

- (NSString *)getSubscriptions {
return [self getSubscriptionsForNode:nil];
}

- (NSString *)getSubscriptionsForNode:(NSString *)node {
//<iq type='get' from='francisco@denmark.lit/barracks' to='pubsub.shakespeare.lit' id='subscriptions1'>
// <pubsub xmlns='http://jabber.org/protocol/pubsub'>
// <subscriptions/>
// </pubsub>
//</iq>

NSString *sid = [NSString stringWithFormat:@"%@:subscriptions_for_node", xmppStream.generateUUID];

XMPPIQ *iq = [XMPPIQ iqWithType:@"get" to:serviceJID elementID:sid];
NSXMLElement *ps = [NSXMLElement elementWithName:@"pubsub" xmlns:NS_PUBSUB];
NSXMLElement *subscriptions = [NSXMLElement elementWithName:@"subscriptions"];

if (node) {
[subscriptions addAttributeWithName:@"node" stringValue:node];
}

// join them all together
[ps addChild:subscriptions];
[iq addChild:ps];

[xmppStream sendElement:iq];

return sid;

}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#pragma mark Node Admin
Expand Down Expand Up @@ -321,7 +376,7 @@ - (NSString*)deleteNode:(NSString*)node
}


- (NSString*)allItemsForNode:(NSString*)node
- (NSString*)discoverItemsForNode:(NSString*)node
{
// <iq type='get' from='francisco@denmark.lit/barracks' to='pubsub.shakespeare.lit' id='nodes2'>
// <query xmlns='http://jabber.org/protocol/disco#items' node='blogs'/>
Expand All @@ -342,6 +397,31 @@ - (NSString*)allItemsForNode:(NSString*)node
return sid;
}

- (NSString*)allItemsForNode:(NSString*)node
{
//<iq type='get' from='francisco@denmark.lit/barracks' to='pubsub.shakespeare.lit' id='items1'>
// <pubsub xmlns='http://jabber.org/protocol/pubsub'>
// <items node='princely_musings'/>
// </pubsub>
//</iq>

NSString *sid = [NSString stringWithFormat:@"%@:allitems_for_node", xmppStream.generateUUID];
XMPPIQ *iq = [XMPPIQ iqWithType:@"get" to:serviceJID elementID:sid];
NSXMLElement *pubsub = [NSXMLElement elementWithName:@"pubsub" xmlns:NS_PUBSUB];
NSXMLElement *items = [NSXMLElement elementWithName:@"items"];

if (node != nil) {
[items addAttributeWithName:@"node" stringValue:node];
}

[pubsub addChild:items];
[iq addChild:pubsub];

[xmppStream sendElement:iq];

return sid;
}

- (NSString*)configureNode:(NSString*)node
{
// <iq type='get' from='hamlet@denmark.lit/elsinore' to='pubsub.shakespeare.lit' id='config1'>
Expand All @@ -365,4 +445,43 @@ - (NSString*)configureNode:(NSString*)node
return sid;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#pragma mark - publication methods
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

- (NSString *)publishToNode:(NSString *)node entry:(NSXMLElement *)entry {
//<iq type='set' from='hamlet@denmark.lit/blogbot' to='pubsub.shakespeare.lit' id='publish1'>
// <pubsub xmlns='http://jabber.org/protocol/pubsub'>
// <publish node='princely_musings'>
// <item id='bnd81g37d61f49fgn581'>
// Some content
// </item>
// </publish>
// </pubsub>
//</iq>

NSString *sid = [NSString stringWithFormat:@"%@:publish_node", xmppStream.generateUUID];

//create iq message
XMPPIQ *iq = [XMPPIQ iqWithType:@"set" to:serviceJID elementID:sid];

//create child nodes
NSXMLElement * pubsub = [NSXMLElement elementWithName:@"pubsub" xmlns:NS_PUBSUB];

NSXMLElement * publish = [NSXMLElement elementWithName:@"publish"];
[publish addAttributeWithName:@"node" stringValue:node];

NSXMLElement * item = [NSXMLElement elementWithName:@"item"];

//create node hierarchy
[item addChild:entry];
[publish addChild:item];
[pubsub addChild:publish];
[iq addChild:pubsub];

[xmppStream sendElement:iq];

return sid;
}

@end

0 comments on commit a24da86

Please sign in to comment.