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
|
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
|
-
+
-
-
-
+
+
+
-
-
+
+
|
+ (instancetype)discoEntityWithConnection: (XMPPConnection *)connection
capsNode: (OFString *)capsNode
{
return [[[self alloc] initWithConnection: connection
capsNode: capsNode] autorelease];
}
- initWithConnection: (XMPPConnection *)connection
- (instancetype)initWithConnection: (XMPPConnection *)connection
{
return [self initWithConnection: connection
capsNode: nil];
}
- initWithJID: (XMPPJID *)JID
node: (nullable OFString *)node
name: (nullable OFString *)name
- (instancetype)initWithJID: (XMPPJID *)JID
node: (nullable OFString *)node
name: (nullable OFString *)name
{
OF_INVALID_INIT_METHOD
}
- initWithConnection: (XMPPConnection *)connection
capsNode: (OFString *)capsNode
- (instancetype)initWithConnection: (XMPPConnection *)connection
capsNode: (OFString *)capsNode
{
self = [super initWithJID: [connection JID]
node: nil
name: nil];
@try {
_discoNodes = [[OFMutableDictionary alloc] init];
|
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
|
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
|
-
-
-
-
+
-
-
+
-
|
{
[_discoNodes setObject: node
forKey: [node node]];
}
- (OFString *)capsHash
{
OFEnumerator *enumerator;
XMPPDiscoIdentity *identity;
OFString *feature;
OFMutableString *caps = [OFMutableString string];
OFSHA1Hash *hash = [OFSHA1Hash cryptoHash];
OFData *digest;
enumerator = [_identities objectEnumerator];
for (XMPPDiscoIdentity *identity in _identities)
while ((identity = [enumerator nextObject]) != nil)
[caps appendFormat: @"%@/%@//%@<", [identity category],
[identity type], [identity name]];
enumerator = [_features objectEnumerator];
for (OFString *feature in _features)
while ((feature = [enumerator nextObject]) != nil)
[caps appendFormat: @"%@<", feature];
[hash updateWithBuffer: [caps UTF8String]
length: [caps UTF8StringLength]];
digest = [OFData dataWithItems: [hash digest]
count: [[hash class] digestSize]];
|
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
|
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
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
|
-
+
-
+
-
+
-
+
-
+
|
OFXMLElement *query = [IQ elementForName: @"query"
namespace: XMPP_NS_DISCO_ITEMS];
if (query != nil) {
OFString *node =
[[query attributeForName: @"node"] stringValue];
if (node == nil)
return [self XMPP_handleItemsIQ: IQ
return [self xmpp_handleItemsIQ: IQ
connection: connection];
XMPPDiscoNode *responder = [_discoNodes objectForKey: node];
if (responder != nil)
return [responder XMPP_handleItemsIQ: IQ
return [responder xmpp_handleItemsIQ: IQ
connection: connection];
return false;
}
query = [IQ elementForName: @"query"
namespace: XMPP_NS_DISCO_INFO];
if (query != nil) {
OFString *node =
[[query attributeForName: @"node"] stringValue];
if (node == nil)
return [self XMPP_handleInfoIQ: IQ
return [self xmpp_handleInfoIQ: IQ
connection: connection];
OFString *capsNode = [_capsNode stringByAppendingFormat: @"#%@",
[self capsHash]];
if ([capsNode isEqual: node])
return [self XMPP_handleInfoIQ: IQ
return [self xmpp_handleInfoIQ: IQ
connection: connection];
XMPPDiscoNode *responder = [_discoNodes objectForKey: node];
if (responder != nil)
return [responder XMPP_handleInfoIQ: IQ
return [responder xmpp_handleInfoIQ: IQ
connection: connection];
return false;
}
return false;
}
@end
|