libpurple/protocols/jabber/message.c

branch
string-comparison-r2
changeset 38264
99356e68aff5
parent 38260
dcada91c0912
parent 38248
1034c641ec6c
child 38358
30ba44276e74
child 40901
f25ce9376564
equal deleted inserted replaced
38263:8f5e48f0cebb 38264:99356e68aff5
37 #include "smiley.h" 37 #include "smiley.h"
38 #include "iq.h" 38 #include "iq.h"
39 39
40 #include <string.h> 40 #include <string.h>
41 41
42 static GString *jm_body_with_oob(JabberMessage *jm) {
43 GList *etc;
44 GString *body = g_string_new("");
45
46 if(jm->xhtml)
47 g_string_append(body, jm->xhtml);
48 else if(jm->body)
49 g_string_append(body, jm->body);
50
51 for(etc = jm->etc; etc; etc = etc->next) {
52 xmlnode *x = etc->data;
53 const char *xmlns = xmlnode_get_namespace(x);
54 if(purple_strequal(xmlns, NS_OOB_X_DATA)) {
55 xmlnode *url, *desc;
56 char *urltxt, *desctxt;
57
58 url = xmlnode_get_child(x, "url");
59 desc = xmlnode_get_child(x, "desc");
60
61 if(!url)
62 continue;
63
64 urltxt = xmlnode_get_data(url);
65 desctxt = desc ? xmlnode_get_data(desc) : urltxt;
66
67 if(body->len && !purple_strequal(body->str, urltxt))
68 g_string_append_printf(body, "<br/><a href='%s'>%s</a>",
69 urltxt, desctxt);
70 else
71 g_string_printf(body, "<a href='%s'>%s</a>",
72 urltxt, desctxt);
73
74 g_free(urltxt);
75
76 if(desctxt != urltxt)
77 g_free(desctxt);
78 }
79 }
80
81 return body;
82 }
83
42 void jabber_message_free(JabberMessage *jm) 84 void jabber_message_free(JabberMessage *jm)
43 { 85 {
44 g_free(jm->from); 86 g_free(jm->from);
45 g_free(jm->to); 87 g_free(jm->to);
46 g_free(jm->id); 88 g_free(jm->id);
62 104
63 PurpleConnection *gc; 105 PurpleConnection *gc;
64 PurpleAccount *account; 106 PurpleAccount *account;
65 JabberBuddy *jb; 107 JabberBuddy *jb;
66 JabberBuddyResource *jbr; 108 JabberBuddyResource *jbr;
109 GString *body;
67 110
68 if(!jid) 111 if(!jid)
69 return; 112 return;
70 113
71 gc = jm->js->gc; 114 gc = jm->js->gc;
72 account = purple_connection_get_account(gc); 115 account = purple_connection_get_account(gc);
73 116
74 jb = jabber_buddy_find(jm->js, jm->from, TRUE); 117 jb = jabber_buddy_find(jm->js, jm->from, TRUE);
75 jbr = jabber_buddy_find_resource(jb, jid->resource); 118 jbr = jabber_buddy_find_resource(jb, jid->resource);
76 119
77 if(!jm->xhtml && !jm->body) { 120 if (jbr && jm->chat_state != JM_STATE_NONE)
78 if (jbr && jm->chat_state != JM_STATE_NONE) 121 jbr->chat_states = JABBER_CHAT_STATES_SUPPORTED;
79 jbr->chat_states = JABBER_CHAT_STATES_SUPPORTED; 122
80 123 switch(jm->chat_state) {
81 if(JM_STATE_COMPOSING == jm->chat_state) { 124 case JM_STATE_COMPOSING:
82 serv_got_typing(gc, jm->from, 0, PURPLE_TYPING); 125 serv_got_typing(gc, jm->from, 0, PURPLE_TYPING);
83 } else if(JM_STATE_PAUSED == jm->chat_state) { 126 break;
127 case JM_STATE_PAUSED:
84 serv_got_typing(gc, jm->from, 0, PURPLE_TYPED); 128 serv_got_typing(gc, jm->from, 0, PURPLE_TYPED);
85 } else if(JM_STATE_GONE == jm->chat_state) { 129 break;
130 case JM_STATE_GONE: {
86 PurpleConversation *conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, 131 PurpleConversation *conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM,
87 jm->from, account); 132 jm->from, account);
88 if (conv && jid->node && jid->domain) { 133 if (conv && jid->node && jid->domain) {
89 char buf[256]; 134 char buf[256];
90 PurpleBuddy *buddy; 135 PurpleBuddy *buddy;
108 purple_conversation_write(conv, "", buf, 153 purple_conversation_write(conv, "", buf,
109 PURPLE_MESSAGE_SYSTEM, time(NULL)); 154 PURPLE_MESSAGE_SYSTEM, time(NULL));
110 } 155 }
111 } 156 }
112 serv_got_typing_stopped(gc, jm->from); 157 serv_got_typing_stopped(gc, jm->from);
113 158 break;
114 } else { 159 }
160 default:
115 serv_got_typing_stopped(gc, jm->from); 161 serv_got_typing_stopped(gc, jm->from);
116 } 162 }
117 } else { 163
164 if (jm->js->googletalk && jm->body && jm->xhtml == NULL) {
165 char *tmp = jm->body;
166 jm->body = jabber_google_format_to_html(jm->body);
167 g_free(tmp);
168 }
169
170 body = jm_body_with_oob(jm);
171
172 if(body && body->len) {
118 if (jid->resource) { 173 if (jid->resource) {
119 /* 174 /*
120 * We received a message from a specific resource, so 175 * We received a message from a specific resource, so
121 * we probably want a reply to go to this specific 176 * we probably want a reply to go to this specific
122 * resource (i.e. bind/lock the conversation to this 177 * resource (i.e. bind/lock the conversation to this
149 if(jbr->thread_id) 204 if(jbr->thread_id)
150 g_free(jbr->thread_id); 205 g_free(jbr->thread_id);
151 jbr->thread_id = g_strdup(jbr->thread_id); 206 jbr->thread_id = g_strdup(jbr->thread_id);
152 } 207 }
153 208
154 if (jm->js->googletalk && jm->xhtml == NULL) { 209 serv_got_im(gc, jm->from, body->str, 0, jm->sent);
155 char *tmp = jm->body;
156 jm->body = jabber_google_format_to_html(jm->body);
157 g_free(tmp);
158 }
159 serv_got_im(gc, jm->from, jm->xhtml ? jm->xhtml : jm->body, 0, jm->sent);
160 } 210 }
161 211
162 jabber_id_free(jid); 212 jabber_id_free(jid);
213
214 if(body)
215 g_string_free(body, TRUE);
163 } 216 }
164 217
165 static void handle_headline(JabberMessage *jm) 218 static void handle_headline(JabberMessage *jm)
166 { 219 {
167 char *title; 220 char *title;
168 GString *body; 221 GString *body;
169 GList *etc;
170 222
171 if(!jm->xhtml && !jm->body) 223 if(!jm->xhtml && !jm->body)
172 return; /* ignore headlines without any content */ 224 return; /* ignore headlines without any content */
173 225
174 body = g_string_new(""); 226 body = jm_body_with_oob(jm);
175 title = g_strdup_printf(_("Message from %s"), jm->from); 227 title = g_strdup_printf(_("Message from %s"), jm->from);
176
177 if(jm->xhtml)
178 g_string_append(body, jm->xhtml);
179 else if(jm->body)
180 g_string_append(body, jm->body);
181
182 for(etc = jm->etc; etc; etc = etc->next) {
183 xmlnode *x = etc->data;
184 const char *xmlns = xmlnode_get_namespace(x);
185 if(purple_strequal(xmlns, NS_OOB_X_DATA)) {
186 xmlnode *url, *desc;
187 char *urltxt, *desctxt;
188
189 url = xmlnode_get_child(x, "url");
190 desc = xmlnode_get_child(x, "desc");
191
192 if(!url || !desc)
193 continue;
194
195 urltxt = xmlnode_get_data(url);
196 desctxt = xmlnode_get_data(desc);
197
198 /* I'm all about ugly hacks */
199 if(body->len && jm->body && purple_strequal(body->str, jm->body))
200 g_string_printf(body, "<a href='%s'>%s</a>",
201 urltxt, desctxt);
202 else
203 g_string_append_printf(body, "<br/><a href='%s'>%s</a>",
204 urltxt, desctxt);
205
206 g_free(urltxt);
207 g_free(desctxt);
208 }
209 }
210 228
211 purple_notify_formatted(jm->js->gc, title, jm->subject ? jm->subject : title, 229 purple_notify_formatted(jm->js->gc, title, jm->subject ? jm->subject : title,
212 NULL, body->str, NULL, NULL); 230 NULL, body->str, NULL, NULL);
213 231
214 g_free(title); 232 g_free(title);

mercurial