| 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); |