Mercurial > pidgin.yaz
changeset 21820:509871e4f61c
Cleanup to prevent unnecessary alloc/free. Also a small fix to remove the possiblity that a message will be sent before the stream is started.
author | Daniel Atallah <daniel.atallah@gmail.com> |
---|---|
date | Tue, 11 Dec 2007 20:28:09 +0000 |
parents | 1162bf342def |
children | 37f0b6291374 |
files | libpurple/protocols/bonjour/jabber.c |
diffstat | 1 files changed, 51 insertions(+), 70 deletions(-) [+] |
line wrap: on
line diff
--- a/libpurple/protocols/bonjour/jabber.c Tue Dec 11 19:03:37 2007 +0000 +++ b/libpurple/protocols/bonjour/jabber.c Tue Dec 11 20:28:09 2007 +0000 @@ -77,31 +77,6 @@ static void xep_iq_parse(xmlnode *packet, PurpleConnection *connection, PurpleBuddy *pb); -#if 0 /* this isn't used anywhere... */ -static const char * -_font_size_purple_to_ichat(int size) -{ - switch (size) { - case 1: - return "8"; - case 2: - return "10"; - case 3: - return "12"; - case 4: - return "14"; - case 5: - return "17"; - case 6: - return "21"; - case 7: - return "24"; - } - - return "12"; -} -#endif - static BonjourJabberConversation * bonjour_jabber_conv_new(PurpleBuddy *pb) { @@ -143,34 +118,48 @@ { xmlnode *body_node, *html_node, *events_node; PurpleConnection *gc = pb->account->gc; - char *body, *html_body = NULL; - const char *ichat_balloon_color = NULL; - const char *ichat_text_color = NULL; - const char *font_face = NULL; - const char *font_size = NULL; - const char *font_color = NULL; + gchar *body = NULL; gboolean composing_event = FALSE; body_node = xmlnode_get_child(message_node, "body"); - if (body_node == NULL) + html_node = xmlnode_get_child(message_node, "html"); + + if (body_node == NULL && html_node == NULL) { + purple_debug_error("bonjour", "No body or html node found, discarding message.\n"); return; - body = xmlnode_get_data(body_node); + } - html_node = xmlnode_get_child(message_node, "html"); - if (html_node != NULL) - { + events_node = xmlnode_get_child_with_namespace(message_node, "x", "jabber:x:event"); + if (events_node != NULL) { + if (xmlnode_get_child(events_node, "composing") != NULL) + composing_event = TRUE; + if (xmlnode_get_child(events_node, "id") != NULL) { + /* The user is just typing */ + /* TODO: Deal with typing notification */ + return; + } + } + + if (html_node != NULL) { xmlnode *html_body_node; html_body_node = xmlnode_get_child(html_node, "body"); - if (html_body_node != NULL) - { + if (html_body_node != NULL) { xmlnode *html_body_font_node; + const char *ichat_balloon_color = NULL; + const char *ichat_text_color = NULL; + const char *font_face = NULL; + const char *font_size = NULL; + const char *font_color = NULL; ichat_balloon_color = xmlnode_get_attrib(html_body_node, "ichatballooncolor"); ichat_text_color = xmlnode_get_attrib(html_body_node, "ichattextcolor"); html_body_font_node = xmlnode_get_child(html_body_node, "font"); - if (html_body_font_node != NULL) - { /* Types of messages sent by iChat */ + + /* Types of messages sent by iChat */ + if (html_body_font_node != NULL) { + gchar *html_body; + font_face = xmlnode_get_attrib(html_body_font_node, "face"); /* The absolute iChat font sizes should be converted to 1..7 range */ font_size = xmlnode_get_attrib(html_body_font_node, "ABSZ"); @@ -178,49 +167,41 @@ font_size = _font_size_ichat_to_purple(atoi(font_size)); font_color = xmlnode_get_attrib(html_body_font_node, "color"); html_body = xmlnode_get_data(html_body_font_node); + if (html_body == NULL) /* This is the kind of formated messages that Purple creates */ html_body = xmlnode_to_str(html_body_font_node, NULL); + + if (html_body != NULL) { + /* Use some sane defaults */ + if (font_face == NULL) font_face = "Helvetica"; + if (font_size == NULL) font_size = "3"; + if (ichat_text_color == NULL) ichat_text_color = "#000000"; + if (ichat_balloon_color == NULL) ichat_balloon_color = "#FFFFFF"; + + body = g_strdup_printf("<font face='%s' size='%s' color='%s' back='%s'>%s</font>", + font_face, font_size, ichat_text_color, ichat_balloon_color, + html_body); + + g_free(html_body); + } } } } - events_node = xmlnode_get_child_with_namespace(message_node, "x", "jabber:x:event"); - if (events_node != NULL) - { - if (xmlnode_get_child(events_node, "composing") != NULL) - composing_event = TRUE; - if (xmlnode_get_child(events_node, "id") != NULL) - { - /* The user is just typing */ - /* TODO: Deal with typing notification */ - g_free(body); - g_free(html_body); - return; - } - } + /* Compose the message */ + if (body == NULL && body_node != NULL) + body = xmlnode_get_data(body_node); - /* Compose the message */ - if (html_body != NULL) - { - g_free(body); - - if (font_face == NULL) font_face = "Helvetica"; - if (font_size == NULL) font_size = "3"; - if (ichat_text_color == NULL) ichat_text_color = "#000000"; - if (ichat_balloon_color == NULL) ichat_balloon_color = "#FFFFFF"; - body = g_strdup_printf("<font face='%s' size='%s' color='%s' back='%s'>%s</font>", - font_face, font_size, ichat_text_color, ichat_balloon_color, - html_body); + if (body == NULL) { + purple_debug_error("bonjour", "No html body or regular body found.\n"); + return; } - /* TODO: Should we do something with "composing_event" here? */ - /* Send the message to the UI */ serv_got_im(gc, pb->name, body, 0, time(NULL)); g_free(body); - g_free(html_body); } struct _check_buddy_by_address_t { @@ -345,7 +326,7 @@ if (ret < len) { /* Don't interfere with the stream starting */ - if (bconv->tx_handler == 0) + if (bconv->sent_stream_start == FULLY_SENT && bconv->recv_stream_start && bconv->tx_handler == 0) bconv->tx_handler = purple_input_add(bconv->socket, PURPLE_INPUT_WRITE, _send_data_write_cb, pb); purple_circ_buffer_append(bconv->tx_buf, message + ret, len - ret);