From 4d4a2b07fe52fa2d9e21b697dcf85c73bdd537a9 Mon Sep 17 00:00:00 2001 From: Florian Zeitz Date: Wed, 30 Jan 2013 21:09:34 +0100 Subject: [PATCH] Move chat window creation to JubChatClient --- src/core/JubChatClient.h | 3 ++ src/core/JubChatClient.m | 37 +++++++++++++++++++++++- src/gui/common/JubChatUI.h | 13 +++++++++ src/gui/common/JubUI.h | 1 + src/gui/gtk/JubGtkChatUI.h | 12 ++------ src/gui/gtk/JubGtkRosterUI.h | 2 -- src/gui/gtk/JubGtkRosterUI.m | 54 ++++++++---------------------------- src/gui/gtk/JubGtkUI.m | 6 ++++ 8 files changed, 72 insertions(+), 56 deletions(-) create mode 100644 src/gui/common/JubChatUI.h diff --git a/src/core/JubChatClient.h b/src/core/JubChatClient.h index 4f6205b..c6a1da8 100644 --- a/src/core/JubChatClient.h +++ b/src/core/JubChatClient.h @@ -2,10 +2,12 @@ #import #import "JubUI.h" +#import "JubChatUI.h" #import "JubConfig.h" @interface JubChatClient : OFObject { + OFMutableDictionary *chatMap; XMPPConnection *connection; XMPPRoster *roster; XMPPStreamManagement *streamManagement; @@ -20,4 +22,5 @@ @property (assign) id ui; - initWithConfig: (JubConfig*)config; +- (id)chatForContact: (XMPPContact*)contact; @end diff --git a/src/core/JubChatClient.m b/src/core/JubChatClient.m index b4a1481..3c563f5 100644 --- a/src/core/JubChatClient.m +++ b/src/core/JubChatClient.m @@ -12,8 +12,9 @@ self = [super init]; @try { - connection = [XMPPConnection new]; + chatMap = [[OFMutableDictionary alloc] init]; + connection = [XMPPConnection new]; connection.username = config.username; connection.domain = config.domain; connection.server = config.server; @@ -46,10 +47,44 @@ [streamManagement release]; [connection release]; [presence release]; + [chatMap release]; [super dealloc]; } +- (id)chatForContact: (XMPPContact*)contact +{ + OFAutoreleasePool *pool = [OFAutoreleasePool new]; + OFString *bareJID = [contact.rosterItem.JID bareJID]; + + id chat = [chatMap objectForKey: bareJID]; + if (chat == nil) { + OFString * title = + [@"Chat with " stringByAppendingString: bareJID]; + + chat = [[[[ui chatUIClass] alloc] + initWithTitle: title + closeBlock: ^{ + [chatMap removeObjectForKey: bareJID]; + } + sendBlock: ^(OFString *text) { + XMPPMessage *msg = + [XMPPMessage messageWithType: @"chat"]; + msg.body = text; + [contact sendMessage: msg + connection: connection]; + } + ] autorelease]; + + [chatMap setObject: chat + forKey: bareJID]; + } + + [pool release]; + + return chat; +} + - (void)connection: (XMPPConnection*)connection_ wasBoundToJID: (XMPPJID*)jid { diff --git a/src/gui/common/JubChatUI.h b/src/gui/common/JubChatUI.h new file mode 100644 index 0000000..b65491c --- /dev/null +++ b/src/gui/common/JubChatUI.h @@ -0,0 +1,13 @@ +@class OFString; + +typedef void (^jub_send_block_t)(OFString *); +typedef void (^jub_close_block_t)(void); + +@protocol JubChatUI +- initWithTitle: (OFString*)title + closeBlock: (jub_close_block_t)closeBlock + sendBlock: (jub_send_block_t)sendBlock; + +- (void)addMessage: (OFString*)text + sender: (OFString*)sender; +@end diff --git a/src/gui/common/JubUI.h b/src/gui/common/JubUI.h index 5d76aad..f24bcac 100644 --- a/src/gui/common/JubUI.h +++ b/src/gui/common/JubUI.h @@ -6,4 +6,5 @@ - (void)startUIThread; - (void)client: (JubChatClient*)client didChangePresence: (XMPPPresence*)presence; +- (Class)chatUIClass; @end diff --git a/src/gui/gtk/JubGtkChatUI.h b/src/gui/gtk/JubGtkChatUI.h index 351eb6d..37e47ff 100644 --- a/src/gui/gtk/JubGtkChatUI.h +++ b/src/gui/gtk/JubGtkChatUI.h @@ -2,10 +2,9 @@ #import #include -typedef void (^jub_send_block_t)(OFString *); -typedef void (^jub_close_block_t)(void); +#import "JubChatUI.h" -@interface JubGtkChatUI: OFObject +@interface JubGtkChatUI: OFObject { GtkWidget *chat_window; GtkTextView *chat_view; @@ -14,11 +13,4 @@ typedef void (^jub_close_block_t)(void); jub_close_block_t closeBlock; BOOL bufferEmpty; } - -- initWithTitle: (OFString*)title - closeBlock: (jub_close_block_t)closeBlock - sendBlock: (jub_send_block_t)sendBlock; - -- (void)addMessage: (OFString*)text - sender: (OFString*)sender; @end diff --git a/src/gui/gtk/JubGtkRosterUI.h b/src/gui/gtk/JubGtkRosterUI.h index 5dd3682..4f3d7ac 100644 --- a/src/gui/gtk/JubGtkRosterUI.h +++ b/src/gui/gtk/JubGtkRosterUI.h @@ -15,12 +15,10 @@ gulong presence_combo_changed_handler_id; OFMapTable *groupMap; OFMutableDictionary *contactMap; - OFMutableDictionary *chatMap; JubChatClient *client; } - initWithClient: (JubChatClient*)client; -- (JubGtkChatUI*)chatForJID: (XMPPJID*)jid; - (void)client: (JubChatClient*)client didChangePresence: (XMPPPresence*)presence; @end diff --git a/src/gui/gtk/JubGtkRosterUI.m b/src/gui/gtk/JubGtkRosterUI.m index 4102e34..e474bf9 100644 --- a/src/gui/gtk/JubGtkRosterUI.m +++ b/src/gui/gtk/JubGtkRosterUI.m @@ -9,12 +9,13 @@ static void roster_row_activated(GtkTreeView *tree_view, GtkTreePath *path, GtkTreeViewColumn *column, gpointer data) { - JubGtkRosterUI *roster = data; + OFAutoreleasePool *pool; + XMPPContact *contact; + JubChatClient *client = data; GtkTreeIter row_iter; GtkTreeModel *tree_model; gchar *jid_s; - XMPPJID *jid; - OFAutoreleasePool *pool; + OFString *jid; tree_model = gtk_tree_view_get_model(tree_view); gtk_tree_model_get_iter(tree_model, &row_iter, path); @@ -24,10 +25,12 @@ static void roster_row_activated(GtkTreeView *tree_view, GtkTreePath *path, if (!jid_s) return; pool = [OFAutoreleasePool new]; - jid = [XMPPJID JIDWithString: [OFString stringWithUTF8String: jid_s]]; - [roster performSelectorOnMainThread: @selector(chatForJID:) - withObject: jid + jid = [OFString stringWithUTF8String: jid_s]; + contact = [client.contactManager.contacts objectForKey: jid]; + + [client performSelectorOnMainThread: @selector(chatForContact:) + withObject: contact waitUntilDone: NO]; [pool release]; } @@ -82,7 +85,6 @@ static gboolean filter_roster_by_presence(GtkTreeModel *model, initWithKeyFunctions: keyFunctions valueFunctions: rowRefFunctions]; contactMap = [[OFMutableDictionary alloc] init]; - chatMap = [[OFMutableDictionary alloc] init]; client = [client_ retain]; [client.contactManager addDelegate: self]; @@ -109,7 +111,7 @@ static gboolean filter_roster_by_presence(GtkTreeModel *model, "RosterTreeView")); g_signal_connect(roster_view, "row_activated", - G_CALLBACK(roster_row_activated), self); + G_CALLBACK(roster_row_activated), client); presence_combo = GTK_COMBO_BOX(gtk_builder_get_object(builder, "PresenceComboBox")); @@ -132,7 +134,6 @@ static gboolean filter_roster_by_presence(GtkTreeModel *model, [client.contactManager removeDelegate: self]; [groupMap release]; [contactMap release]; - [chatMap release]; [client release]; gtk_widget_destroy(roster_window); @@ -140,46 +141,13 @@ static gboolean filter_roster_by_presence(GtkTreeModel *model, [super dealloc]; } -// FIXME: This needs to move somewhere else -- (JubGtkChatUI*)chatForJID: (XMPPJID*)jid -{ - OFAutoreleasePool *pool = [OFAutoreleasePool new]; - JubGtkChatUI *chat = - [chatMap objectForKey: [jid bareJID]]; - if (chat == nil) { - OFString * title = [@"Chat with " stringByAppendingString: - [jid bareJID]]; - - chat = [[[JubGtkChatUI alloc] - initWithTitle: title - closeBlock: ^{ - [chatMap removeObjectForKey: [jid bareJID]]; - } - sendBlock: ^(OFString *text) { - XMPPMessage *msg = - [XMPPMessage messageWithType: @"chat"]; - msg.to = jid; - msg.body = text; - [client.connection sendStanza: msg]; - } - ] autorelease]; - - [chatMap setObject: chat - forKey: [jid bareJID]]; - } - - [pool release]; - - return chat; -} - - (void)contact: (XMPPContact*)contact didSendMessage: (XMPPMessage*)message { if (message.body == nil || ![message.type isEqual: @"chat"]) return; - JubGtkChatUI *chat = [self chatForJID: message.from]; + id chat = [client chatForContact: contact]; [chat addMessage: message.body sender: [message.from bareJID]]; } diff --git a/src/gui/gtk/JubGtkUI.m b/src/gui/gtk/JubGtkUI.m index 7aef46c..d3595a9 100644 --- a/src/gui/gtk/JubGtkUI.m +++ b/src/gui/gtk/JubGtkUI.m @@ -2,6 +2,7 @@ #include #import "JubGtkUI.h" +#import "JubGtkChatUI.h" #import "JubGtkRosterUI.h" void on_roster_window_destroy(GObject *object, gpointer user_data) @@ -50,6 +51,11 @@ void on_roster_window_destroy(GObject *object, gpointer user_data) }] start]; } +- (Class)chatUIClass +{ + return [JubGtkChatUI class]; +} + - (void)client: (JubChatClient*)client didChangePresence: (XMPPPresence*)presence { -- 2.39.5