From 2444ac841fad00133f231e9667ab427c4ce4d39e Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Tue, 5 Oct 2010 01:44:25 +0200 Subject: Receiving messages works again (kinda) --- src/gui/Conversation.vala | 2 +- src/gui/CoreConnector.vala | 90 ++++++++++++++++++++++++++-------------------- src/gui/Ephraim.vala | 22 ++++++------ 3 files changed, 62 insertions(+), 52 deletions(-) (limited to 'src/gui') diff --git a/src/gui/Conversation.vala b/src/gui/Conversation.vala index 7c8dc03..926ed3d 100644 --- a/src/gui/Conversation.vala +++ b/src/gui/Conversation.vala @@ -62,7 +62,7 @@ public class Conversation { conversations.remove(widget); } - public void chat_message(string type, string from, string message) { + public void chat_message(string from, string type, string message) { if(type != "chat") return; diff --git a/src/gui/CoreConnector.vala b/src/gui/CoreConnector.vala index 4c853ff..46c94f2 100644 --- a/src/gui/CoreConnector.vala +++ b/src/gui/CoreConnector.vala @@ -1,25 +1,27 @@ public class CoreConnector { - static Eva.Term match_gui_init; + static Eva.Term match_init_view; static Eva.Term match_roster_update; static Eva.Term match_resource_entry; static Eva.Term match_avatar; - static Eva.Term match_new_conversation; - static Eva.Term match_chat_message; + static Eva.Term match_conversation; + static Eva.Term match_conversation_new; + static Eva.Term match_conversation_message; static construct { - match_gui_init = Eva.parse("{global,{gui_init,Terms}}"); + match_init_view = Eva.parse("{global,{init_view,Terms}}"); match_roster_update = Eva.parse("{account,Account,{roster_update,JID,Name,Subscription,Groups,Resources,Avatar}}"); match_resource_entry = Eva.parse("{Name,{resource_entry,Priority,Show,Status}}"); match_avatar = Eva.parse("{avatar,Data}"); - match_new_conversation = Eva.parse("{new_conversation,JID}"); - match_chat_message = Eva.parse("{chat_message,JID,Type,From,Body}"); + match_conversation = Eva.parse("{account,Account,{conversation,Ref,Message}}"); + match_conversation_new = Eva.parse("{new,JID}"); + match_conversation_message = Eva.parse("{message,From,Type,Body}"); } Eva.PacketHandler con; public signal void update_contact(Contact contact); - public signal void new_conversation(string jid); - public signal void chat_message(string jid, string from, string type, string message); + public signal void new_conversation(Eva.Ref conv_ref, string jid); + public signal void chat_message(Eva.Ref conv_ref, string from, string type, string message); public void start() { con = new Eva.PacketHandler(new UnixInputStream(3, true), new UnixOutputStream(4, true), 4); @@ -43,7 +45,7 @@ public class CoreConnector { private void handle_term(Eva.Term term) { Gee.Map match; - if((match = term.match(match_gui_init)) != null) { + if((match = term.match(match_init_view)) != null) { Eva.Cons terms = match["Terms"] as Eva.Cons; while(terms != null) { @@ -175,46 +177,56 @@ public class CoreConnector { } update_contact(contact); } - else if((match = term.match(match_new_conversation)) != null) { - Eva.Binary jid_term = match["JID"] as Eva.Binary; - if(jid_term == null) { + else if((match = term.match(match_conversation)) != null) { + Eva.Ref conv_ref = match["Ref"] as Eva.Ref; + if(conv_ref == null) { warn_if_reached(); return; } - string jid = from_utf8(jid_term); - - new_conversation(jid); - } - else if((match = term.match(match_chat_message)) != null) { - Eva.Binary jid_term = match["JID"] as Eva.Binary; - if(jid_term == null) { + Eva.Term message_term = match["Message"]; + if(message_term == null) { warn_if_reached(); return; } - string jid = from_utf8(jid_term); - - Eva.Atom type_term = match["Type"] as Eva.Atom; - if(type_term == null) { - warn_if_reached(); - return; + + Gee.Map cmatch; + if((cmatch = message_term.match(match_conversation_new)) != null) { + Eva.Binary jid_term = cmatch["JID"] as Eva.Binary; + if(jid_term == null) { + warn_if_reached(); + return; + } + + string jid = from_utf8(jid_term); + new_conversation(conv_ref, jid); } - string type = type_term.value; + else if((cmatch = message_term.match(match_conversation_message)) != null) { + Eva.Binary from_term = cmatch["From"] as Eva.Binary; + if(from_term == null) { + warn_if_reached(); + return; + } + string from = from_utf8(from_term); - Eva.Binary from_term = match["From"] as Eva.Binary; - if(from_term == null) { - warn_if_reached(); - return; - } - string from = from_utf8(from_term); + Eva.Atom type_term = cmatch["Type"] as Eva.Atom; + if(type_term == null) { + warn_if_reached(); + return; + } + string type = type_term.value; - Eva.Binary body_term = match["Body"] as Eva.Binary; - if(body_term == null) { - warn_if_reached(); - return; - } - string body = from_utf8(body_term); + Eva.Binary body_term = cmatch["Body"] as Eva.Binary; + if(body_term == null) { + warn_if_reached(); + return; + } + string body = from_utf8(body_term); - chat_message(jid, type, from, body); + chat_message(conv_ref, from, type, body); + } + else { + stdout.printf("Received unhandled term: %s\n", term.to_string()); + } } else { stdout.printf("Received unhandled term: %s\n", term.to_string()); diff --git a/src/gui/Ephraim.vala b/src/gui/Ephraim.vala index 5801966..fb5e77f 100644 --- a/src/gui/Ephraim.vala +++ b/src/gui/Ephraim.vala @@ -17,7 +17,7 @@ public class Ephraim { unowned Gtk.TreeView rosterView = builder.get_object("Roster") as Gtk.TreeView; - Gee.TreeMap conversations = new Gee.TreeMap(); + Gee.TreeMap conversations = new Gee.TreeMap(); unowned Gtk.Notebook conversationNotebook = builder.get_object("Conversations") as Gtk.Notebook; ContactList roster = new ContactList(rosterView); @@ -28,24 +28,22 @@ public class Ephraim { coreconn.update_contact.connect(roster.update_contact); - coreconn.new_conversation.connect((jid) => { + coreconn.new_conversation.connect((conv_ref, jid) => { Contact contact = roster.get_contact(jid); - if(contact != null) { - conversations[jid] = new Conversation(conversationNotebook, jid, contact.display_string); - } - else { - conversations[jid] = new Conversation(conversationNotebook, jid, null); - } + Conversation conv = new Conversation(conversationNotebook, jid, contact != null ? contact.display_string : null); - conversations[jid].send_message.connect((type, message) => coreconn.send_message(jid, type, message)); + conversations[conv_ref] = conv; + conv.send_message.connect((type, message) => coreconn.send_message(jid, type, message)); }); - coreconn.chat_message.connect((jid, type, from, message) => { - if(!(jid in conversations.keys)) + coreconn.chat_message.connect((conv_ref, from, type, message) => { + if(!(conv_ref in conversations.keys)) { + warn_if_reached(); return; + } - conversations[jid].chat_message(type, from, message); + conversations[conv_ref].chat_message(from, type, message); }); //if(!coreconn.start()) -- cgit v1.2.3