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
|
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
|
-
+
+
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
-
-
+
+
+
+
+
+
+
+
-
-
+
+
-
+
-
+
-
|
#import "XMPPJID.h"
#import "XMPPStanza.h"
#import "XMPPIQ.h"
#import "XMPPMessage.h"
#import "XMPPPresence.h"
#import "XMPPRoster.h"
@interface AppDelegate: OFObject <OFApplicationDelegate, XMPPConnectionDelegate>
@interface AppDelegate: OFObject
#ifdef OF_HAVE_OPTIONAL_PROTOCOLS
<OFApplicationDelegate, XMPPConnectionDelegate>
#endif
@end
OF_APPLICATION_DELEGATE(AppDelegate)
@implementation AppDelegate
- (void)applicationDidFinishLaunching
{
XMPPConnection *conn;
OFArray *arguments = [OFApplication arguments];
XMPPPresence *pres = [XMPPPresence presence];
[pres addShow: @"chat"];
[pres addStatus: @"Bored"];
[pres addPriority: 20];
pres.to = [XMPPJID JIDWithString: @"alice@example.com"];
pres.from = [XMPPJID JIDWithString: @"bob@example.org"];
[pres setTo: [XMPPJID JIDWithString: @"alice@example.com"]];
[pres setFrom: [XMPPJID JIDWithString: @"bob@example.org"]];
assert([[pres stringValue] isEqual: @"<presence to='alice@example.com' "
@"from='bob@example.org'><show>chat</show>"
@"<status>Bored</status><priority>20</priority>"
@"</presence>"]);
XMPPMessage *msg = [XMPPMessage messageWithType: @"chat"];
[msg addBody: @"Hello everyone"];
msg.to = [XMPPJID JIDWithString: @"jdev@conference.jabber.org"];
msg.from = [XMPPJID JIDWithString: @"alice@example.com"];
[msg setTo: [XMPPJID JIDWithString: @"jdev@conference.jabber.org"]];
[msg setFrom: [XMPPJID JIDWithString: @"alice@example.com"]];
assert([[msg stringValue] isEqual: @"<message type='chat' "
@"to='jdev@conference.jabber.org' "
@"from='alice@example.com'><body>Hello everyone</body>"
@"</message>"]);
XMPPIQ *iq = [XMPPIQ IQWithType: @"set" ID: @"128"];
iq.to = [XMPPJID JIDWithString: @"juliet@capulet.lit"];
iq.from = [XMPPJID JIDWithString: @"romeo@montague.lit"];
[iq setTo: [XMPPJID JIDWithString: @"juliet@capulet.lit"]];
[iq setFrom: [XMPPJID JIDWithString: @"romeo@montague.lit"]];
assert([[iq stringValue] isEqual: @"<iq type='set' id='128' "
@"to='juliet@capulet.lit' "
@"from='romeo@montague.lit'/>"]);
OFXMLElement *elem = [OFXMLElement elementWithName: @"iq"];
[elem addAttributeWithName: @"from" stringValue: @"bob@localhost"];
[elem addAttributeWithName: @"to" stringValue: @"alice@localhost"];
[elem addAttributeWithName: @"type" stringValue: @"get"];
[elem addAttributeWithName: @"id" stringValue: @"42"];
[elem addAttributeWithName: @"from"
stringValue: @"bob@localhost"];
[elem addAttributeWithName: @"to"
stringValue: @"alice@localhost"];
[elem addAttributeWithName: @"type"
stringValue: @"get"];
[elem addAttributeWithName: @"id"
stringValue: @"42"];
XMPPStanza *stanza = [XMPPStanza stanzaWithElement: elem];
assert([[elem stringValue] isEqual: [stanza stringValue]]);
assert(([[OFString stringWithFormat: @"%@, %@, %@, %@",
stanza.from.fullJID, stanza.to.fullJID, stanza.type, stanza.ID]
isEqual: @"bob@localhost, alice@localhost, get, 42"]));
[[stanza from] fullJID], [[stanza to] fullJID], [stanza type],
[stanza ID]] isEqual: @"bob@localhost, alice@localhost, get, 42"]));
conn = [[XMPPConnection alloc] init];
conn.delegate = self;
[conn setDelegate: self];
if (arguments.count != 3) {
if ([arguments count] != 3) {
of_log(@"Invalid count of command line arguments!");
[OFApplication terminateWithStatus: 1];
}
[conn setServer: [arguments objectAtIndex: 0]];
[conn setUsername: [arguments objectAtIndex: 1]];
[conn setPassword: [arguments objectAtIndex: 2]];
[conn setResource: @"ObjXMPP"];
[conn setUseTLS: NO];
[conn connect];
@try {
[conn handleConnection];
} @catch (id e) {
of_log(@"%@", e);
}
|
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
|
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
|
+
+
-
-
+
+
+
-
+
|
[conn requestRoster];
}
- (void)connectionDidReceiveRoster :(XMPPConnection*)conn
{
XMPPPresence *pres;
OFEnumerator *enumerator;
OFString *group;
of_log(@"Got roster! Groups: %@", conn.roster.groups);
for (OFString *group in conn.roster.groups)
of_log(@"Got roster! Groups: %@", [[conn roster] groups]);
enumerator = [[[conn roster] groups] objectEnumerator];
while ((group = [enumerator nextObject]) != nil)
of_log(@"Group %@: %@", group,
[conn.roster rosterItemsInGroup: group]);
[[conn roster] rosterItemsInGroup: group]);
pres = [XMPPPresence presence];
[pres addPriority: 10];
[pres addStatus: @"ObjXMPP test is working!"];
[conn sendStanza: pres];
}
|