Mercurial > hg
comparison mcabber/src/jabglue.c @ 213:4fcdbfdf7c20
[/trunk] Changeset 225 by mikael
* Fix a crash when renaming to a non-7bit name (same with group name)
* Move all utf-8 usage to jabglue
author | mikael |
---|---|
date | Sun, 08 May 2005 20:27:14 +0000 |
parents | 8b08f34922c5 |
children | 73f6ce668ba8 |
comparison
equal
deleted
inserted
replaced
212:465d98d2f8e3 | 213:4fcdbfdf7c20 |
---|---|
24 #include "../libjabber/jabber.h" | 24 #include "../libjabber/jabber.h" |
25 #include "jabglue.h" | 25 #include "jabglue.h" |
26 #include "roster.h" | 26 #include "roster.h" |
27 #include "screen.h" | 27 #include "screen.h" |
28 #include "hooks.h" | 28 #include "hooks.h" |
29 #include "utf8.h" | |
29 #include "utils.h" | 30 #include "utils.h" |
30 | 31 |
31 #define JABBERPORT 5222 | 32 #define JABBERPORT 5222 |
32 #define JABBERSSLPORT 5223 | 33 #define JABBERSSLPORT 5223 |
33 | 34 |
288 mystatus = st; | 289 mystatus = st; |
289 } | 290 } |
290 | 291 |
291 void jb_send_msg(const char *jid, const char *text) | 292 void jb_send_msg(const char *jid, const char *text) |
292 { | 293 { |
293 xmlnode x = jutil_msgnew(TMSG_CHAT, (char*)jid, 0, (char*)text); | 294 char *buffer = utf8_encode(text); |
295 xmlnode x = jutil_msgnew(TMSG_CHAT, (char*)jid, 0, (char*)buffer); | |
294 jab_send(jc, x); | 296 jab_send(jc, x); |
295 xmlnode_free(x); | 297 xmlnode_free(x); |
298 free(buffer); | |
296 jb_reset_keepalive(); | 299 jb_reset_keepalive(); |
297 } | 300 } |
298 | 301 |
302 // Note: the caller should check the jid is correct | |
299 void jb_addbuddy(const char *jid, const char *group) | 303 void jb_addbuddy(const char *jid, const char *group) |
300 { | 304 { |
301 xmlnode x, y, z; | 305 xmlnode x, y, z; |
302 char *cleanjid; | 306 char *cleanjid; |
303 | 307 |
315 y = xmlnode_get_tag(x, "query"); | 319 y = xmlnode_get_tag(x, "query"); |
316 z = xmlnode_insert_tag(y, "item"); | 320 z = xmlnode_insert_tag(y, "item"); |
317 xmlnode_put_attrib(z, "jid", jid); | 321 xmlnode_put_attrib(z, "jid", jid); |
318 | 322 |
319 if (group) { | 323 if (group) { |
324 char *group_utf8 = utf8_encode(group); | |
320 z = xmlnode_insert_tag(z, "group"); | 325 z = xmlnode_insert_tag(z, "group"); |
321 xmlnode_insert_cdata(z, group, (unsigned) -1); | 326 xmlnode_insert_cdata(z, group_utf8, (unsigned) -1); |
327 free(group_utf8); | |
322 } | 328 } |
323 | 329 |
324 jab_send(jc, x); | 330 jab_send(jc, x); |
325 xmlnode_free(x); | 331 xmlnode_free(x); |
326 | 332 |
327 cleanjid = jidtodisp(jid); | 333 cleanjid = jidtodisp(jid); |
328 roster_add_user(cleanjid, NULL, group, ROSTER_TYPE_USER); | 334 roster_add_user(cleanjid, NULL, group, ROSTER_TYPE_USER); |
329 g_free(cleanjid); | 335 g_free(cleanjid); |
330 buddylist_build(); | 336 buddylist_build(); |
331 | 337 |
332 // maybe not needed: if user appears his status will change | 338 // useless IMHO: if user appears his status will change |
333 //update_roster = TRUE; | 339 //update_roster = TRUE; |
334 } | 340 } |
335 | 341 |
336 void jb_delbuddy(const char *jid) | 342 void jb_delbuddy(const char *jid) |
337 { | 343 { |
377 | 383 |
378 void jb_updatebuddy(const char *jid, const char *name, const char *group) | 384 void jb_updatebuddy(const char *jid, const char *name, const char *group) |
379 { | 385 { |
380 xmlnode x, y; | 386 xmlnode x, y; |
381 char *cleanjid; | 387 char *cleanjid; |
388 char *name_utf8; | |
382 | 389 |
383 if (!online) return; | 390 if (!online) return; |
384 | 391 |
385 // XXX We should check name's and group's correctness | 392 // XXX We should check name's and group's correctness |
386 | 393 |
387 cleanjid = jidtodisp(jid); | 394 cleanjid = jidtodisp(jid); |
395 name_utf8 = utf8_encode(name); | |
388 | 396 |
389 x = jutil_iqnew(JPACKET__SET, NS_ROSTER); | 397 x = jutil_iqnew(JPACKET__SET, NS_ROSTER); |
390 y = xmlnode_insert_tag(xmlnode_get_tag(x, "query"), "item"); | 398 y = xmlnode_insert_tag(xmlnode_get_tag(x, "query"), "item"); |
391 xmlnode_put_attrib(y, "jid", cleanjid); | 399 xmlnode_put_attrib(y, "jid", cleanjid); |
392 xmlnode_put_attrib(y, "name", name); | 400 xmlnode_put_attrib(y, "name", name_utf8); |
393 | 401 |
394 if (group) { | 402 if (group) { |
403 char *group_utf8 = utf8_encode(group); | |
395 y = xmlnode_insert_tag(y, "group"); | 404 y = xmlnode_insert_tag(y, "group"); |
396 xmlnode_insert_cdata(y, group, (unsigned) -1); | 405 xmlnode_insert_cdata(y, group_utf8, (unsigned) -1); |
406 free(group_utf8); | |
397 } | 407 } |
398 | 408 |
399 jab_send(jc, x); | 409 jab_send(jc, x); |
400 xmlnode_free(x); | 410 xmlnode_free(x); |
411 free(name_utf8); | |
401 g_free(cleanjid); | 412 g_free(cleanjid); |
402 } | 413 } |
403 | 414 |
404 void postlogin() | 415 void postlogin() |
405 { | 416 { |
474 | 485 |
475 for (y = xmlnode_get_tag(x, "item"); y; y = xmlnode_get_nextsibling(y)) { | 486 for (y = xmlnode_get_tag(x, "item"); y; y = xmlnode_get_nextsibling(y)) { |
476 const char *alias = xmlnode_get_attrib(y, "jid"); | 487 const char *alias = xmlnode_get_attrib(y, "jid"); |
477 //const char *sub = xmlnode_get_attrib(y, "subscription"); // TODO Not used | 488 //const char *sub = xmlnode_get_attrib(y, "subscription"); // TODO Not used |
478 const char *name = xmlnode_get_attrib(y, "name"); | 489 const char *name = xmlnode_get_attrib(y, "name"); |
479 const char *group = NULL; | 490 char *group = NULL; |
480 | 491 |
481 z = xmlnode_get_tag(y, "group"); | 492 z = xmlnode_get_tag(y, "group"); |
482 if (z) group = xmlnode_get_data(z); | 493 if (z) group = xmlnode_get_data(z); |
483 | 494 |
484 if (alias) { | 495 if (alias) { |
485 char *buddyname; | 496 char *buddyname; |
486 char *cleanalias = jidtodisp(alias); | 497 char *cleanalias = jidtodisp(alias); |
487 if (name) | 498 char *name_noutf8 = NULL; |
488 buddyname = (char*)name; | 499 char *group_noutf8 = NULL; |
489 else | 500 |
501 if (name) { | |
502 name_noutf8 = utf8_decode(name); | |
503 buddyname = name_noutf8; | |
504 } else | |
490 buddyname = cleanalias; | 505 buddyname = cleanalias; |
491 | 506 |
492 roster_add_user(cleanalias, buddyname, group, ROSTER_TYPE_USER); | 507 if (group) group_noutf8 = utf8_decode(group); |
508 roster_add_user(cleanalias, buddyname, group_noutf8, ROSTER_TYPE_USER); | |
509 if (name_noutf8) free(name_noutf8); | |
510 if (group_noutf8) free(group_noutf8); | |
493 g_free(cleanalias); | 511 g_free(cleanalias); |
494 } | 512 } |
495 } | 513 } |
496 | 514 |
497 postlogin(); | 515 postlogin(); |
499 | 517 |
500 void gotmessage(char *type, const char *from, const char *body, | 518 void gotmessage(char *type, const char *from, const char *body, |
501 const char *enc) | 519 const char *enc) |
502 { | 520 { |
503 char *jid; | 521 char *jid; |
522 char *buffer = utf8_decode(body); | |
504 | 523 |
505 /* | 524 /* |
506 //char *u, *h, *r; | 525 //char *u, *h, *r; |
507 //jidsplit(from, &u, &h, &r); | 526 //jidsplit(from, &u, &h, &r); |
508 // Maybe we should remember the resource? | 527 // Maybe we should remember the resource? |
510 scr_LogPrint("There is an extra part in message (resource?): %s", r); | 529 scr_LogPrint("There is an extra part in message (resource?): %s", r); |
511 //scr_LogPrint("Msg from <%s>, type=%s", jidtodisp(from), type); | 530 //scr_LogPrint("Msg from <%s>, type=%s", jidtodisp(from), type); |
512 */ | 531 */ |
513 | 532 |
514 jid = jidtodisp(from); | 533 jid = jidtodisp(from); |
515 hk_message_in(jid, 0, body); | 534 hk_message_in(jid, 0, buffer); |
516 g_free(jid); | 535 g_free(jid); |
536 free(buffer); | |
517 } | 537 } |
518 | 538 |
519 void statehandler(jconn conn, int state) | 539 void statehandler(jconn conn, int state) |
520 { | 540 { |
521 static int previous_state = -1; | 541 static int previous_state = -1; |