#import "JubChatClient.h"
+#import "ObjXMPP/namespaces.h"
+
+#import "JubAvatarManager.h"
+
+#define JUB_CLIENT_URI @"http://babelmonkeys.de/jubjub"
@implementation JubChatClient
@synthesize connection = _connection;
@synthesize roster = _roster;
+@synthesize avatarManager = _avatarManager;
@synthesize contactManager = _contactManager;
+@synthesize discoEntity = _discoEntity;
@synthesize presence = _presence;
@synthesize ui = _ui;
_roster = [[XMPPRoster alloc] initWithConnection: _connection];
[_roster addDelegate: self];
+ _discoEntity =
+ [[XMPPDiscoEntity alloc] initWithConnection: _connection
+ capsNode: JUB_CLIENT_URI];
+
+ XMPPDiscoIdentity *identity =
+ [XMPPDiscoIdentity identityWithCategory: @"client"
+ type: @"pc"
+ name: @"JubJub"];
+ [_discoEntity addIdentity: identity];
+ [_discoEntity addFeature: XMPP_NS_CAPS];
+
+ _avatarManager =
+ [[JubAvatarManager alloc] initWithClient: self];
+
_contactManager = [[XMPPContactManager alloc]
initWithConnection: _connection
roster: _roster];
_streamManagement = [[XMPPStreamManagement alloc]
initWithConnection: _connection];
-
- [_connection asyncConnectAndHandle];
} @catch (id e) {
[self release];
@throw e;
[_roster release];
[_contactManager release];
+ [_discoEntity release];
[_streamManagement release];
+ [_avatarManager release];
[_connection release];
[_presence release];
[_chatMap release];
return chat;
}
+- (void)sendPresenceWithStatus: (OFString*)status
+{
+ [self sendPresenceWithStatus: status
+ text: nil];
+}
+
+- (void)sendPresenceWithStatus: (OFString*)status
+ text: (OFString*)text
+{
+ XMPPPresence *presence;
+
+ if ([status isEqual: @"unavailable"])
+ presence = [XMPPPresence presenceWithType: @"unavailable"];
+ else
+ presence = [XMPPPresence presence];
+
+ if (!([status isEqual: @"available"] ||
+ [status isEqual: @"unavailable"]))
+ presence.show = status;
+
+ if (text != nil)
+ presence.status = text;
+
+ OFXMLElement *caps = [OFXMLElement elementWithName: @"c"
+ namespace: XMPP_NS_CAPS];
+ [caps addAttributeWithName: @"hash"
+ stringValue: @"sha-1"];
+ [caps addAttributeWithName: @"ver"
+ stringValue: [_discoEntity capsHash]];
+ [caps addAttributeWithName: @"node"
+ stringValue: JUB_CLIENT_URI];
+
+ [presence addChild: caps];
+
+ [_connection sendStanza: presence];
+}
+
- (void)connection: (XMPPConnection*)connection
wasBoundToJID: (XMPPJID*)jid
{
- of_log(@"Bound to JID: %@", [jid fullJID]);
-
[_roster requestRoster];
}
if ([presence.from isEqual: connection.JID]) {
[_ui client: self
didChangePresence: presence];
- OF_SETTER(_presence, presence, YES, 0);
+ OF_SETTER(_presence, presence, true, 0);
}
}
- (void)rosterWasReceived: (XMPPRoster*)roster
{
- XMPPPresence *pres = [XMPPPresence presence];
- [pres setStatus: @"Hello from JubJub"];
- [_connection sendStanza: pres];
+ [self sendPresenceWithStatus: @"available"
+ text: @"Hello from JubJub"];
}
@end