-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathXMPPDispatcher.m
153 lines (140 loc) · 4.25 KB
/
XMPPDispatcher.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
//
// XMPPDispatcher.m
// Jabber
//
// Created by David Chisnall on Sun May 23 2004.
// Copyright (c) 2004 __MyCompanyName__. All rights reserved.
//
#import "XMPPDispatcher.h"
#import "JID.h"
#import <EtoileFoundation/EtoileFoundation.h>
@implementation XMPPDispatcher
+ (id) dispatcherWithDefaultInfoQueryHandler:(id <XMPPInfoQueryStanzaHandler>)iq
messageHandler:(id <MessageHandler>)message
presenceHandler:(id <PresenceHandler>)presence
{
return [[XMPPDispatcher alloc] initWithDefaultInfoQueryHandler:iq
messageHandler:message
presenceHandler:presence];
}
- (id) initWithDefaultInfoQueryHandler:(id <XMPPInfoQueryStanzaHandler>)iq
messageHandler:(id <MessageHandler>)message
presenceHandler:(id <PresenceHandler>)presence
{
SUPERINIT;
iqHandlers = [[NSMutableDictionary alloc] init];
iqNamespaceHandlers = [[NSMutableDictionary alloc] init];
messageHandlers = [[NSMutableDictionary alloc] init];
presenceHandlers = [[NSMutableDictionary alloc] init];
defaultIqHandler = iq;
defaultMessageHandler = message;
defaultPresenceHandler = presence;
return self;
}
- (id) init
{
return [self initWithDefaultInfoQueryHandler:nil messageHandler:nil presenceHandler:nil];
}
- (id) addInfoQueryHandler:(id <XMPPInfoQueryStanzaHandler>)handler forNamespace:(NSString*)aNamespace
{
NSMutableSet * handlers = [iqNamespaceHandlers valueForKey:aNamespace];
if(handlers == nil)
{
handlers = [[NSMutableSet alloc] init];
[iqNamespaceHandlers setObject:handlers forKey:aNamespace];
}
[handlers addObject:handler];
return self;
}
- (id) addInfoQueryResultHandler:(id <XMPPInfoQueryStanzaHandler>)handler forID:(NSString*)iqID
{
NSMutableSet * handlers = [iqHandlers valueForKey:iqID];
if(handlers == nil)
{
handlers = [[NSMutableSet alloc] init];
[iqHandlers setObject:handlers forKey:iqID];
}
[handlers addObject:handler];
return self;
}
- (id) addMessageHandler:(id <MessageHandler>)handler ForJID:(NSString*)jid
{
NSMutableSet * handlers = [messageHandlers valueForKey:jid];
if(handlers == nil)
{
handlers = [[NSMutableSet alloc] init];
[messageHandlers setObject:handlers forKey:jid];
}
[handlers addObject:handler];
return self;
}
- (id) addPresenceHandler:(id <PresenceHandler>)handler ForJID:(NSString*)jid
{
NSMutableSet * handlers = [presenceHandlers valueForKey:jid];
if(handlers == nil)
{
handlers = [[NSMutableSet alloc] init];
[presenceHandlers setObject:handlers forKey:jid];
}
[handlers addObject:handler];
return self;
}
- (void) dispatchMessage:(XMPPMessage*)aMessage
{
JID * jid = [aMessage correspondent];
NSMutableSet * handlers = [messageHandlers objectForKey:[jid jidString]];
if(handlers == nil)
{
handlers = [messageHandlers objectForKey:[jid jidStringWithNoResource]];
if(handlers == nil)
{
handlers = [[NSMutableSet alloc] init];
[messageHandlers setObject:handlers forKey:[jid jidStringWithNoResource]];
}
}
//TODO: Make this a proper protocol thing
FOREACH(handlers, handler, id<MessageHandler>)
{
[handler handleMessage:aMessage];
}
[defaultMessageHandler handleMessage:aMessage];
}
- (void) dispatchPresence:(XMPPPresence*)aPresence
{
NSMutableSet * handlers = [presenceHandlers valueForKey:[[aPresence jid] jidString]];
FOREACH(handlers, presenceHandler, id<PresenceHandler>)
{
[presenceHandler handlePresence:aPresence];
}
if (![[[aPresence jid] jidStringWithNoResource] isEqualToString:[[aPresence jid] jidString]])
{
handlers = [presenceHandlers valueForKey:[[aPresence jid] jidStringWithNoResource]];
FOREACH(handlers, generalPresenceHandler, id<PresenceHandler>)
{
[generalPresenceHandler handlePresence:aPresence];
}
}
[defaultPresenceHandler handlePresence:aPresence];
}
- (void) dispatchInfoQuery:(XMPPInfoQueryStanza*)anIq
{
iq_type_t type = [anIq type];
if(type == IQ_TYPE_SET || type == IQ_TYPE_GET)
{
NSMutableSet * handlers = [iqNamespaceHandlers valueForKey:[anIq queryNamespace]];
FOREACH(handlers, iqHandler, id<XMPPInfoQueryStanzaHandler>)
{
[iqHandler handleInfoQuery:anIq];
}
}
else
{
NSMutableSet * handlers = [iqHandlers valueForKey:[anIq sequenceID]];
FOREACH(handlers, iqHandler, id<XMPPInfoQueryStanzaHandler>)
{
[iqHandler handleInfoQuery:anIq];
}
}
[defaultIqHandler handleInfoQuery:anIq];
}
@end