Mercurial > pidgin
annotate src/protocols/jabber/message.c @ 8746:dbe23964ff2b
[gaim-migrate @ 9501]
(17:07:06) Luke: Hello Luke,
Sean has added 2 newlines in src/protocols/novell/novell.c.
Unfortunately this breaks the string freeze. If Sean's patch will not
be reverted, please commit my German translation update (file
i18n55.patch). If Sean's patch will be reverted, please do nothing.
Regards, Bj?rn
(17:09:28) Sean: oh, yeah, I did. I did that yesterady, didn't I?
(17:09:34) Luke: *nods*
(17:10:16) Sean: ok, revert it.
(17:10:24) Sean: please
(17:10:27) Luke: willdo
committer: Tailor Script <tailor@pidgin.im>
| author | Luke Schierer <lschiere@pidgin.im> |
|---|---|
| date | Wed, 21 Apr 2004 21:14:21 +0000 |
| parents | 599d6ac9bbfe |
| children | d7b5fbc451da |
| rev | line source |
|---|---|
| 7014 | 1 /* |
| 2 * gaim - Jabber Protocol Plugin | |
| 3 * | |
| 4 * Copyright (C) 2003, Nathan Walp <faceprint@faceprint.com> | |
| 5 * | |
| 6 * This program is free software; you can redistribute it and/or modify | |
| 7 * it under the terms of the GNU General Public License as published by | |
| 8 * the Free Software Foundation; either version 2 of the License, or | |
| 9 * (at your option) any later version. | |
| 10 * | |
| 11 * This program is distributed in the hope that it will be useful, | |
| 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 14 * GNU General Public License for more details. | |
| 15 * | |
| 16 * You should have received a copy of the GNU General Public License | |
| 17 * along with this program; if not, write to the Free Software | |
| 18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
| 19 * | |
| 20 */ | |
| 21 #include "internal.h" | |
| 22 | |
| 23 #include "debug.h" | |
| 24 #include "notify.h" | |
| 25 #include "server.h" | |
|
7095
c8bf2da398e3
[gaim-migrate @ 7660]
Christian Hammond <chipx86@chipx86.com>
parents:
7014
diff
changeset
|
26 #include "util.h" |
| 7014 | 27 |
| 28 #include "buddy.h" | |
| 29 #include "chat.h" | |
| 30 #include "message.h" | |
| 31 #include "xmlnode.h" | |
| 32 | |
| 33 #define JABBER_TYPING_NOTIFY_INT 15 | |
| 34 | |
| 35 void jabber_message_free(JabberMessage *jm) | |
| 36 { | |
| 37 if(jm->from) | |
| 38 g_free(jm->from); | |
| 39 if(jm->to) | |
| 40 g_free(jm->to); | |
| 41 if(jm->subject) | |
| 42 g_free(jm->subject); | |
| 43 if(jm->body) | |
| 44 g_free(jm->body); | |
| 45 if(jm->xhtml) | |
| 46 g_free(jm->xhtml); | |
| 47 if(jm->password) | |
| 48 g_free(jm->password); | |
| 7145 | 49 if(jm->etc) |
| 50 g_list_free(jm->etc); | |
| 7014 | 51 |
| 52 g_free(jm); | |
| 53 } | |
| 54 | |
| 7145 | 55 static void handle_chat(JabberMessage *jm) |
| 7014 | 56 { |
| 57 JabberID *jid = jabber_id_new(jm->from); | |
| 58 char *from; | |
| 59 | |
| 60 JabberBuddy *jb; | |
| 61 JabberBuddyResource *jbr; | |
| 62 | |
| 7310 | 63 if(!jid) |
| 64 return; | |
| 65 | |
| 7014 | 66 jb = jabber_buddy_find(jm->js, jm->from, TRUE); |
| 7306 | 67 jbr = jabber_buddy_find_resource(jb, jid->resource); |
| 7014 | 68 |
| 8043 | 69 if(jabber_find_unnormalized_conv(jm->from, jm->js->gc->account)) { |
| 7014 | 70 from = g_strdup(jm->from); |
| 7258 | 71 } else if(jid->node) { |
| 72 GaimConversation *conv; | |
| 73 | |
| 7014 | 74 from = g_strdup_printf("%s@%s", jid->node, jid->domain); |
| 8043 | 75 conv = jabber_find_unnormalized_conv(from, jm->js->gc->account); |
| 7258 | 76 if(conv) |
| 77 gaim_conversation_set_name(conv, jm->from); | |
| 78 g_free(from); | |
| 79 from = g_strdup(jm->from); | |
| 80 } else { | |
| 7014 | 81 from = g_strdup(jid->domain); |
| 7258 | 82 } |
| 7014 | 83 |
| 84 if(!jm->xhtml && !jm->body) { | |
| 85 if(jm->events & JABBER_MESSAGE_EVENT_COMPOSING) | |
| 86 serv_got_typing(jm->js->gc, from, 0, GAIM_TYPING); | |
| 87 else | |
| 88 serv_got_typing_stopped(jm->js->gc, from); | |
| 89 } else { | |
| 8400 | 90 if(jbr) { |
| 91 if(jm->events & JABBER_MESSAGE_EVENT_COMPOSING) | |
| 92 jbr->capabilities |= JABBER_CAP_COMPOSING; | |
| 93 if(jbr->thread_id) | |
| 94 g_free(jbr->thread_id); | |
| 95 jbr->thread_id = g_strdup(jbr->thread_id); | |
| 96 } | |
| 7014 | 97 serv_got_im(jm->js->gc, from, jm->xhtml ? jm->xhtml : jm->body, 0, |
| 98 jm->sent); | |
| 99 } | |
| 100 | |
| 101 g_free(from); | |
| 102 jabber_id_free(jid); | |
| 103 } | |
| 104 | |
| 7145 | 105 static void handle_headline(JabberMessage *jm) |
| 106 { | |
| 107 char *title; | |
| 108 GString *body = g_string_new(""); | |
| 109 GList *etc; | |
| 110 | |
| 111 title = g_strdup_printf(_("Message from %s"), jm->from); | |
| 112 | |
| 113 if(jm->xhtml) | |
| 114 g_string_append(body, jm->xhtml); | |
| 115 else if(jm->body) | |
| 116 g_string_append(body, jm->body); | |
| 117 | |
| 118 for(etc = jm->etc; etc; etc = etc->next) { | |
| 119 xmlnode *x = etc->data; | |
| 120 const char *xmlns = xmlnode_get_attrib(x, "xmlns"); | |
| 121 if(xmlns && !strcmp(xmlns, "jabber:x:oob")) { | |
| 122 xmlnode *url, *desc; | |
| 123 char *urltxt, *desctxt; | |
| 124 | |
| 125 url = xmlnode_get_child(x, "url"); | |
| 126 desc = xmlnode_get_child(x, "desc"); | |
| 127 | |
| 128 if(!url || !desc) | |
| 129 continue; | |
| 130 | |
| 131 urltxt = xmlnode_get_data(url); | |
| 132 desctxt = xmlnode_get_data(desc); | |
| 133 | |
| 134 /* I'm all about ugly hacks */ | |
| 135 if(body->len && !strcmp(body->str, jm->body)) | |
| 136 g_string_printf(body, "<a href='%s'>%s</a>", | |
| 137 urltxt, desctxt); | |
| 138 else | |
| 139 g_string_append_printf(body, "<br/><a href='%s'>%s</a>", | |
| 140 urltxt, desctxt); | |
| 141 | |
| 142 g_free(urltxt); | |
| 143 g_free(desctxt); | |
| 144 } | |
| 145 } | |
| 146 | |
| 147 gaim_notify_formatted(jm->js->gc, title, jm->subject ? jm->subject : title, | |
| 148 NULL, body->str, NULL, NULL); | |
| 149 | |
| 150 g_free(title); | |
| 151 g_string_free(body, TRUE); | |
| 152 } | |
| 153 | |
| 154 static void handle_groupchat(JabberMessage *jm) | |
| 7014 | 155 { |
| 156 JabberID *jid = jabber_id_new(jm->from); | |
| 7310 | 157 JabberChat *chat; |
| 158 | |
| 159 if(!jid) | |
| 160 return; | |
| 161 | |
| 162 chat = jabber_chat_find(jm->js, jid->node, jid->domain); | |
| 7014 | 163 |
| 164 if(!chat) | |
| 165 return; | |
| 166 | |
| 7971 | 167 if(jm->subject) { |
| 7183 | 168 gaim_conv_chat_set_topic(GAIM_CONV_CHAT(chat->conv), jid->resource, |
| 169 jm->subject); | |
| 7971 | 170 if(!jm->xhtml && !jm->body) { |
| 171 char *msg; | |
| 172 if(jid->resource) | |
| 173 msg = g_strdup_printf(_("%s has set the topic to: %s"), jid->resource, jm->subject); | |
| 174 else | |
| 175 msg = g_strdup_printf(_("The topic is: %s"), jm->subject); | |
| 176 gaim_conv_chat_write(GAIM_CONV_CHAT(chat->conv), "", msg, GAIM_MESSAGE_SYSTEM, jm->sent); | |
| 177 g_free(msg); | |
| 178 } | |
| 179 } | |
| 7014 | 180 |
| 7630 | 181 if(jm->xhtml || jm->body) { |
| 182 if(jid->resource) | |
| 183 serv_got_chat_in(jm->js->gc, chat->id, jid->resource, 0, | |
| 184 jm->xhtml ? jm->xhtml : jm->body, jm->sent); | |
| 185 else if(chat->muc) | |
| 186 gaim_conv_chat_write(GAIM_CONV_CHAT(chat->conv), "", | |
| 187 jm->xhtml ? jm->xhtml : jm->body, | |
| 188 GAIM_MESSAGE_SYSTEM, jm->sent); | |
| 189 } | |
| 190 | |
| 7014 | 191 jabber_id_free(jid); |
| 192 } | |
| 193 | |
| 7145 | 194 static void handle_groupchat_invite(JabberMessage *jm) |
| 7014 | 195 { |
| 7310 | 196 GHashTable *components; |
| 7014 | 197 JabberID *jid = jabber_id_new(jm->to); |
| 8537 | 198 char *stripped; |
| 7014 | 199 |
| 7310 | 200 if(!jid) |
| 201 return; | |
| 202 | |
| 203 components = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); | |
| 204 | |
| 7332 | 205 g_hash_table_replace(components, g_strdup("room"), g_strdup(jid->node)); |
| 7448 | 206 g_hash_table_replace(components, g_strdup("server"), g_strdup(jid->domain)); |
| 7332 | 207 g_hash_table_replace(components, g_strdup("handle"), |
| 208 g_strdup(jm->js->user->node)); | |
| 209 g_hash_table_replace(components, g_strdup("password"), | |
| 210 g_strdup(jm->password)); | |
| 7014 | 211 |
| 212 jabber_id_free(jid); | |
| 8537 | 213 stripped = gaim_markup_strip_html(jm->body); |
| 214 serv_got_chat_invite(jm->js->gc, jm->to, jm->from, stripped, components); | |
| 215 g_free(stripped); | |
| 7014 | 216 } |
| 217 | |
| 7145 | 218 static void handle_error(JabberMessage *jm) |
| 7014 | 219 { |
| 220 char *buf; | |
| 221 | |
| 222 if(!jm->body) | |
| 223 return; | |
| 224 | |
| 225 buf = g_strdup_printf(_("Message delivery to %s failed: %s"), | |
| 226 jm->from, jm->error); | |
| 227 | |
| 7944 | 228 gaim_notify_formatted(jm->js->gc, _("Jabber Message Error"), _("Jabber Message Error"), buf, |
| 229 jm->xhtml ? jm->xhtml : jm->body, NULL, NULL); | |
| 7014 | 230 |
| 231 g_free(buf); | |
| 232 } | |
| 233 | |
| 234 void jabber_message_parse(JabberStream *js, xmlnode *packet) | |
| 235 { | |
| 236 JabberMessage *jm; | |
| 237 const char *type; | |
| 238 xmlnode *child; | |
| 239 | |
| 240 if(strcmp(packet->name, "message")) | |
| 241 return; | |
| 242 | |
| 243 jm = g_new0(JabberMessage, 1); | |
| 244 jm->js = js; | |
| 245 jm->sent = time(NULL); | |
| 246 | |
| 247 type = xmlnode_get_attrib(packet, "type"); | |
| 248 | |
| 249 if(type) { | |
| 250 if(!strcmp(type, "normal")) | |
| 251 jm->type = JABBER_MESSAGE_NORMAL; | |
| 252 else if(!strcmp(type, "chat")) | |
| 253 jm->type = JABBER_MESSAGE_CHAT; | |
| 254 else if(!strcmp(type, "groupchat")) | |
| 255 jm->type = JABBER_MESSAGE_GROUPCHAT; | |
| 256 else if(!strcmp(type, "headline")) | |
| 257 jm->type = JABBER_MESSAGE_HEADLINE; | |
| 258 else if(!strcmp(type, "error")) | |
| 259 jm->type = JABBER_MESSAGE_ERROR; | |
| 260 else | |
| 261 jm->type = JABBER_MESSAGE_OTHER; | |
| 262 } else { | |
| 263 jm->type = JABBER_MESSAGE_NORMAL; | |
| 264 } | |
| 265 | |
| 266 jm->from = g_strdup(xmlnode_get_attrib(packet, "from")); | |
| 267 jm->to = g_strdup(xmlnode_get_attrib(packet, "to")); | |
| 268 | |
| 269 for(child = packet->child; child; child = child->next) { | |
| 8135 | 270 if(child->type != XMLNODE_TYPE_TAG) |
| 7014 | 271 continue; |
| 272 | |
| 273 if(!strcmp(child->name, "subject")) { | |
| 274 if(!jm->subject) | |
| 275 jm->subject = xmlnode_get_data(child); | |
| 8400 | 276 } else if(!strcmp(child->name, "thread")) { |
| 277 if(!jm->thread_id) | |
| 278 jm->thread_id = xmlnode_get_data(child); | |
| 7014 | 279 } else if(!strcmp(child->name, "body")) { |
| 280 if(!jm->body) | |
| 7894 | 281 jm->body = xmlnode_to_str(child, NULL); |
| 7241 | 282 } else if(!strcmp(child->name, "html")) { |
| 283 if(!jm->xhtml) | |
| 7642 | 284 jm->xhtml = xmlnode_to_str(child, NULL); |
| 7014 | 285 } else if(!strcmp(child->name, "error")) { |
| 286 const char *code = xmlnode_get_attrib(child, "code"); | |
| 287 char *code_txt = NULL; | |
| 288 char *text = xmlnode_get_data(child); | |
| 289 | |
| 290 if(code) | |
| 291 code_txt = g_strdup_printf(_(" (Code %s)"), code); | |
| 292 | |
| 293 if(!jm->error) | |
| 294 jm->error = g_strdup_printf("%s%s", text ? text : "", | |
| 295 code_txt ? code_txt : ""); | |
| 296 | |
| 297 g_free(code_txt); | |
| 298 g_free(text); | |
| 299 } else if(!strcmp(child->name, "x")) { | |
| 300 const char *xmlns = xmlnode_get_attrib(child, "xmlns"); | |
| 301 if(xmlns && !strcmp(xmlns, "jabber:x:event")) { | |
| 302 if(xmlnode_get_child(child, "composing")) | |
| 303 jm->events |= JABBER_MESSAGE_EVENT_COMPOSING; | |
| 304 } else if(xmlns && !strcmp(xmlns, "jabber:x:delay")) { | |
| 305 const char *timestamp = xmlnode_get_attrib(child, "stamp"); | |
| 306 if(timestamp) | |
| 8577 | 307 jm->sent = gaim_str_to_time(timestamp, TRUE); |
| 7014 | 308 } else if(xmlns && !strcmp(xmlns, "jabber:x:conference") && |
| 309 jm->type != JABBER_MESSAGE_GROUPCHAT_INVITE) { | |
| 310 const char *jid = xmlnode_get_attrib(child, "jid"); | |
| 311 if(jid) { | |
| 312 jm->type = JABBER_MESSAGE_GROUPCHAT_INVITE; | |
| 313 g_free(jm->to); | |
| 314 jm->to = g_strdup(jid); | |
| 315 } | |
| 316 } else if(xmlns && !strcmp(xmlns, | |
| 317 "http://jabber.org/protocol/muc#user")) { | |
| 318 xmlnode *invite = xmlnode_get_child(child, "invite"); | |
| 319 if(invite) { | |
| 320 xmlnode *reason, *password; | |
| 7968 | 321 const char *jid = xmlnode_get_attrib(invite, "from"); |
| 7014 | 322 g_free(jm->to); |
| 323 jm->to = jm->from; | |
| 324 jm->from = g_strdup(jid); | |
| 325 if((reason = xmlnode_get_child(invite, "reason"))) { | |
| 326 g_free(jm->body); | |
| 327 jm->body = xmlnode_get_data(reason); | |
| 328 } | |
| 329 if((password = xmlnode_get_child(invite, "password"))) | |
| 330 jm->password = xmlnode_get_data(password); | |
| 331 | |
| 332 jm->type = JABBER_MESSAGE_GROUPCHAT_INVITE; | |
| 333 } | |
| 7145 | 334 } else { |
| 335 jm->etc = g_list_append(jm->etc, child); | |
| 7014 | 336 } |
| 337 } | |
| 338 } | |
| 339 | |
| 340 switch(jm->type) { | |
| 341 case JABBER_MESSAGE_NORMAL: | |
| 342 case JABBER_MESSAGE_CHAT: | |
| 7145 | 343 handle_chat(jm); |
| 344 break; | |
| 7014 | 345 case JABBER_MESSAGE_HEADLINE: |
| 7145 | 346 handle_headline(jm); |
| 7014 | 347 break; |
| 348 case JABBER_MESSAGE_GROUPCHAT: | |
| 349 handle_groupchat(jm); | |
| 350 break; | |
| 351 case JABBER_MESSAGE_GROUPCHAT_INVITE: | |
| 352 handle_groupchat_invite(jm); | |
| 353 break; | |
| 354 case JABBER_MESSAGE_ERROR: | |
| 355 handle_error(jm); | |
| 356 break; | |
| 357 case JABBER_MESSAGE_OTHER: | |
| 358 gaim_debug(GAIM_DEBUG_INFO, "jabber", | |
| 359 "Received message of unknown type: %s\n", type); | |
| 360 break; | |
| 361 } | |
| 362 jabber_message_free(jm); | |
| 363 } | |
| 364 | |
| 365 void jabber_message_send(JabberMessage *jm) | |
| 366 { | |
| 367 xmlnode *message, *child; | |
| 368 const char *type = NULL; | |
| 369 | |
| 370 message = xmlnode_new("message"); | |
| 371 | |
| 372 switch(jm->type) { | |
| 373 case JABBER_MESSAGE_NORMAL: | |
| 374 type = "normal"; | |
| 375 break; | |
| 376 case JABBER_MESSAGE_CHAT: | |
| 377 case JABBER_MESSAGE_GROUPCHAT_INVITE: | |
| 378 type = "chat"; | |
| 379 break; | |
| 380 case JABBER_MESSAGE_HEADLINE: | |
| 381 type = "headline"; | |
| 382 break; | |
| 383 case JABBER_MESSAGE_GROUPCHAT: | |
| 384 type = "groupchat"; | |
| 385 break; | |
| 386 case JABBER_MESSAGE_ERROR: | |
| 387 type = "error"; | |
| 388 break; | |
| 389 case JABBER_MESSAGE_OTHER: | |
| 390 type = NULL; | |
| 391 break; | |
| 392 } | |
| 393 | |
| 394 if(type) | |
| 395 xmlnode_set_attrib(message, "type", type); | |
| 396 | |
| 397 xmlnode_set_attrib(message, "to", jm->to); | |
| 398 | |
| 8400 | 399 if(jm->thread_id) { |
| 400 child = xmlnode_new_child(message, "thread"); | |
| 401 xmlnode_insert_data(child, jm->thread_id, -1); | |
| 402 } | |
| 403 | |
| 7971 | 404 if(jm->events || (!jm->body && !jm->xhtml && !jm->subject)) { |
| 7014 | 405 child = xmlnode_new_child(message, "x"); |
| 406 xmlnode_set_attrib(child, "xmlns", "jabber:x:event"); | |
| 407 if(jm->events & JABBER_MESSAGE_EVENT_COMPOSING) | |
| 408 xmlnode_new_child(child, "composing"); | |
| 409 } | |
| 410 | |
| 411 if(jm->subject) { | |
| 412 child = xmlnode_new_child(message, "subject"); | |
| 413 xmlnode_insert_data(child, jm->subject, -1); | |
| 414 } | |
| 415 | |
| 416 if(jm->body) { | |
| 417 child = xmlnode_new_child(message, "body"); | |
| 418 xmlnode_insert_data(child, jm->body, -1); | |
| 419 } | |
| 420 | |
| 421 if(jm->xhtml) { | |
| 422 child = xmlnode_from_str(jm->xhtml, -1); | |
| 423 if(child) { | |
| 424 xmlnode_insert_child(message, child); | |
| 425 } else { | |
| 426 gaim_debug(GAIM_DEBUG_ERROR, "jabber", | |
| 427 "XHTML translation/validation failed, returning: %s\n", | |
| 428 jm->xhtml); | |
| 429 } | |
| 430 } | |
| 431 | |
| 432 jabber_send(jm->js, message); | |
| 433 | |
| 434 xmlnode_free(message); | |
| 435 } | |
| 436 | |
| 437 int jabber_message_send_im(GaimConnection *gc, const char *who, const char *msg, | |
|
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7095
diff
changeset
|
438 GaimConvImFlags flags) |
| 7014 | 439 { |
| 440 JabberMessage *jm; | |
| 441 JabberBuddy *jb; | |
| 442 JabberBuddyResource *jbr; | |
| 443 char *buf; | |
| 7135 | 444 char *xhtml; |
| 7306 | 445 char *resource; |
| 7014 | 446 |
| 447 if(!who || !msg) | |
| 448 return 0; | |
| 449 | |
| 7306 | 450 resource = jabber_get_resource(who); |
| 451 | |
| 7014 | 452 jb = jabber_buddy_find(gc->proto_data, who, TRUE); |
| 7306 | 453 jbr = jabber_buddy_find_resource(jb, resource); |
| 454 | |
| 455 g_free(resource); | |
| 7014 | 456 |
| 457 jm = g_new0(JabberMessage, 1); | |
| 458 jm->js = gc->proto_data; | |
| 459 jm->type = JABBER_MESSAGE_CHAT; | |
| 460 jm->events = JABBER_MESSAGE_EVENT_COMPOSING; | |
| 461 jm->to = g_strdup(who); | |
| 8400 | 462 if(jbr && jbr->thread_id) |
| 463 jm->thread_id = jbr->thread_id; | |
| 7014 | 464 |
| 7773 | 465 buf = g_strdup_printf("<html xmlns='http://jabber.org/protocol/xhtml-im'><body xmlns='http://www.w3.org/1999/xhtml'>%s</body></html>", msg); |
| 7014 | 466 |
| 7135 | 467 gaim_markup_html_to_xhtml(buf, &xhtml, &jm->body); |
| 7014 | 468 g_free(buf); |
| 469 | |
| 470 if(!jbr || jbr->capabilities & JABBER_CAP_XHTML) | |
| 471 jm->xhtml = xhtml; | |
| 472 else | |
| 473 g_free(xhtml); | |
| 474 | |
| 475 jabber_message_send(jm); | |
| 476 jabber_message_free(jm); | |
| 477 return 1; | |
| 478 } | |
| 479 | |
| 7345 | 480 int jabber_message_send_chat(GaimConnection *gc, int id, const char *msg) |
| 7014 | 481 { |
| 482 JabberChat *chat; | |
| 483 JabberMessage *jm; | |
| 8042 | 484 JabberStream *js; |
| 7345 | 485 char *buf, *xhtml; |
| 7014 | 486 |
| 8042 | 487 if(!msg || !gc) |
| 7014 | 488 return 0; |
| 489 | |
| 8042 | 490 js = gc->proto_data; |
| 7014 | 491 chat = jabber_chat_find_by_id(js, id); |
| 492 | |
| 8043 | 493 if(!chat) |
| 494 return 0; | |
| 495 | |
| 7923 | 496 if(!strcmp(msg, "/configure") || !strcmp(msg, "/config")) { |
| 497 jabber_chat_request_room_configure(chat); | |
| 498 return 1; | |
| 7955 | 499 } else if(!strcmp(msg, "/register")) { |
| 500 jabber_chat_register(chat); | |
| 7971 | 501 return 1; |
| 502 } else if(!strncmp(msg, "/topic", 6)) { | |
| 503 jabber_chat_change_topic(chat, strlen(msg) > 7 ? msg+7 : NULL); | |
| 504 return 1; | |
| 7972 | 505 } else if(!strncmp(msg, "/nick", 5)) { |
| 506 if(strlen(msg) > 6) | |
| 507 jabber_chat_change_nick(chat, msg+6); | |
| 508 return 1; | |
| 7974 | 509 } else if(!strncmp(msg, "/part", 5)) { |
| 510 jabber_chat_part(chat, strlen(msg) > 6 ? msg+6 : NULL); | |
| 511 return 1; | |
| 7923 | 512 } |
| 513 | |
| 7014 | 514 jm = g_new0(JabberMessage, 1); |
| 515 jm->js = gc->proto_data; | |
| 7444 | 516 jm->type = JABBER_MESSAGE_GROUPCHAT; |
| 7014 | 517 jm->to = g_strdup_printf("%s@%s", chat->room, chat->server); |
| 518 | |
| 7773 | 519 buf = g_strdup_printf("<html xmlns='http://jabber.org/protocol/xhtml-im'><body xmlns='http://www.w3.org/1999/xhtml'>%s</body></html>", msg); |
| 7345 | 520 |
| 521 gaim_markup_html_to_xhtml(buf, &xhtml, &jm->body); | |
| 522 g_free(buf); | |
| 523 | |
| 524 if(chat->xhtml) | |
| 525 jm->xhtml = xhtml; | |
| 526 else | |
| 527 g_free(xhtml); | |
| 7014 | 528 |
| 529 jabber_message_send(jm); | |
| 530 jabber_message_free(jm); | |
| 531 return 1; | |
| 532 } | |
| 533 | |
| 534 int jabber_send_typing(GaimConnection *gc, const char *who, int typing) | |
| 535 { | |
| 536 JabberMessage *jm; | |
| 537 JabberBuddy *jb; | |
| 538 JabberBuddyResource *jbr; | |
| 7306 | 539 char *resource = jabber_get_resource(who); |
| 7014 | 540 |
| 541 jb = jabber_buddy_find(gc->proto_data, who, TRUE); | |
| 7306 | 542 jbr = jabber_buddy_find_resource(jb, resource); |
| 543 | |
| 544 g_free(resource); | |
| 7014 | 545 |
| 7187 | 546 if(!jbr || !(jbr->capabilities & JABBER_CAP_COMPOSING)) |
| 7014 | 547 return 0; |
| 548 | |
| 549 jm = g_new0(JabberMessage, 1); | |
| 550 jm->js = gc->proto_data; | |
| 551 jm->type = JABBER_MESSAGE_CHAT; | |
| 552 jm->to = g_strdup(who); | |
| 553 | |
| 554 if(typing == GAIM_TYPING) | |
| 555 jm->events = JABBER_MESSAGE_EVENT_COMPOSING; | |
| 556 | |
| 557 jabber_message_send(jm); | |
| 558 jabber_message_free(jm); | |
| 559 | |
| 560 return JABBER_TYPING_NOTIFY_INT; | |
| 561 } | |
| 562 |
