libpurple/protocols/irc/cmds.c

branch
irc-len-fix-bp
changeset 37954
b76dd48063d6
parent 35925
3edc70bf4e09
child 38240
0552f69f1996
child 38258
9a6551eba09c
equal deleted inserted replaced
37896:73c2a7635d5b 37954:b76dd48063d6
422 return 0; 422 return 0;
423 } 423 }
424 424
425 int irc_cmd_privmsg(struct irc_conn *irc, const char *cmd, const char *target, const char **args) 425 int irc_cmd_privmsg(struct irc_conn *irc, const char *cmd, const char *target, const char **args)
426 { 426 {
427 int max_privmsg_arg_len;
427 const char *cur, *end; 428 const char *cur, *end;
429 gchar *salvaged;
428 char *msg, *buf; 430 char *msg, *buf;
429 431
430 if (!args || !args[0] || !args[1]) 432 if (!args || !args[0] || !args[1])
431 return 0; 433 return 0;
432 434
433 cur = args[1]; 435 max_privmsg_arg_len = IRC_MAX_MSG_SIZE - strlen(args[0]) - 64;
434 end = args[1]; 436 salvaged = purple_utf8_salvage(args[1]);
437 cur = salvaged;
438 end = salvaged;
435 while (*end && *cur) { 439 while (*end && *cur) {
436 end = strchr(cur, '\n'); 440 end = strchr(cur, '\n');
437 if (!end) 441 if (!end)
438 end = cur + strlen(cur); 442 end = cur + strlen(cur);
443 if (end - cur > max_privmsg_arg_len) {
444 /* this call is used to find the last valid character position in the first
445 * max_privmsg_arg_len bytes of the utf-8 message
446 */
447 g_utf8_validate(cur, max_privmsg_arg_len, &end);
448 }
449
439 msg = g_strndup(cur, end - cur); 450 msg = g_strndup(cur, end - cur);
440 451
441 if(!strcmp(cmd, "notice")) 452 if(!strcmp(cmd, "notice"))
442 buf = irc_format(irc, "vt:", "NOTICE", args[0], msg); 453 buf = irc_format(irc, "vt:", "NOTICE", args[0], msg);
443 else 454 else
444 buf = irc_format(irc, "vt:", "PRIVMSG", args[0], msg); 455 buf = irc_format(irc, "vt:", "PRIVMSG", args[0], msg);
445 456
446 irc_send(irc, buf); 457 irc_send(irc, buf);
447 g_free(msg); 458 g_free(msg);
448 g_free(buf); 459 g_free(buf);
449 cur = end + 1; 460 cur = end;
450 } 461 if(*cur == '\n') {
462 cur++;
463 }
464 }
465
466 g_free(salvaged);
451 467
452 return 0; 468 return 0;
453 } 469 }
454 470
455 int irc_cmd_quit(struct irc_conn *irc, const char *cmd, const char *target, const char **args) 471 int irc_cmd_quit(struct irc_conn *irc, const char *cmd, const char *target, const char **args)

mercurial