diff -r ce4f8a2129a4 -r 464be13343a9 mcabber/src/commands.c --- a/mcabber/src/commands.c Sat Mar 25 18:00:40 2006 +0100 +++ b/mcabber/src/commands.c Sat Mar 25 18:10:36 2006 +0100 @@ -65,7 +65,7 @@ // cmd_add() // Adds a command to the commands list and to the CMD completion list -void cmd_add(const char *name, const char *help, +static void cmd_add(const char *name, const char *help, guint flags_row1, guint flags_row2, void (*f)()) { cmd *n_cmd = g_new0(cmd, 1); @@ -80,7 +80,7 @@ } // cmd_init() -// ... +// Commands table initialization void cmd_init(void) { cmd_add("add", "Add a jabber user", COMPL_JID, 0, &do_add); @@ -511,13 +511,16 @@ (sm ? sm : "")); return; } + arg = to_utf8(arg); setstatus(NULL, arg); + g_free(arg); } static void do_status_to(char *arg) { char **paramlst; char *jid, *st, *msg; + char *jid_utf8 = NULL; paramlst = split_arg(arg, 3, 1); // jid, status, [message] jid = *paramlst; @@ -545,6 +548,7 @@ char *p = jid; for ( ; *p && *p != '/'; p++) *p = tolower(*p); + jid = jid_utf8 = to_utf8(jid); } } else { // Add the current buddy @@ -558,10 +562,13 @@ char *cmd; if (!msg) msg = ""; + msg = to_utf8(msg); cmd = g_strdup_printf("%s %s", st, msg); scr_LogPrint(LPRINT_LOGNORM, "Sending to <%s> /status %s", jid, cmd); setstatus(jid, cmd); + g_free(msg); g_free(cmd); + g_free(jid_utf8); } free_arg_lst(paramlst); } @@ -570,6 +577,7 @@ { char **paramlst; char *id, *nick; + char *jid_utf8 = NULL; if (!jb_getonline()) { scr_LogPrint(LPRINT_NORMAL, "You are not connected."); @@ -592,6 +600,9 @@ id = NULL; } else { mc_strtolower(id); + // Actually an UTF-8 id isn't needed because only the bare jid will + // be used. + id = jid_utf8 = to_utf8(id); } } else { // Add the current buddy @@ -601,12 +612,18 @@ scr_LogPrint(LPRINT_NORMAL, "Please specify a Jabber ID."); } + if (nick) + nick = to_utf8(nick); + if (id) { // 2nd parameter = optional nickname jb_addbuddy(id, nick, NULL); scr_LogPrint(LPRINT_LOGNORM, "Sent presence notification request to <%s>.", id); } + + g_free(jid_utf8); + g_free(nick); free_arg_lst(paramlst); } @@ -740,7 +757,9 @@ } buddy_setflags(bud, ROSTER_FLAG_LOCK, TRUE); + arg = to_utf8(arg); send_message(arg); + g_free(arg); } static void do_msay(char *arg) @@ -795,12 +814,20 @@ scr_set_chatmode(TRUE); if (!strcasecmp(subcmd, "send_to")) { + int err; + gchar *msg_utf8; // Let's send to the specified JID. We leave now if there // has been an error (so we don't leave multi-line mode). - if (send_message_to(arg, scr_get_multiline())) + arg = to_utf8(arg); + msg_utf8 = to_utf8(scr_get_multiline()); + err = send_message_to(arg, msg_utf8); + g_free(msg_utf8); + g_free(arg); + if (err) return; } else { // Send to currently selected buddy gpointer bud; + gchar *msg_utf8; if (!current_buddy) { scr_LogPrint(LPRINT_NORMAL, "Whom are you talking to?"); @@ -814,7 +841,9 @@ } buddy_setflags(bud, ROSTER_FLAG_LOCK, TRUE); - send_message(scr_get_multiline()); + msg_utf8 = to_utf8(scr_get_multiline()); + send_message(msg_utf8); + g_free(msg_utf8); } scr_set_multimode(FALSE); } @@ -839,7 +868,13 @@ return; } + jid = to_utf8(jid); + msg = to_utf8(msg); + send_message_to(jid, msg); + + g_free(jid); + g_free(msg); free_arg_lst(paramlst); } @@ -1090,6 +1125,7 @@ const char *jid, *group; guint type; char *newname, *p; + char *name_utf8; if (!*arg) { scr_LogPrint(LPRINT_NORMAL, "Please specify a Jabber ID to rename."); @@ -1115,9 +1151,11 @@ strip_arg_special_chars(newname); - buddy_setname(bud, newname); - jb_updatebuddy(jid, newname, group); + name_utf8 = to_utf8(newname); + buddy_setname(bud, name_utf8); + jb_updatebuddy(jid, name_utf8, group); + g_free(name_utf8); g_free(newname); update_roster = TRUE; } @@ -1128,6 +1166,7 @@ const char *jid, *name, *oldgroupname; guint type; char *newgroupname, *p; + char *group_utf8; if (!current_buddy) return; bud = BUDDATA(current_buddy); @@ -1150,12 +1189,14 @@ strip_arg_special_chars(newgroupname); - if (strcmp(oldgroupname, newgroupname)) { - jb_updatebuddy(jid, name, *newgroupname ? newgroupname : NULL); + group_utf8 = to_utf8(newgroupname); + if (strcmp(oldgroupname, group_utf8)) { + jb_updatebuddy(jid, name, *group_utf8 ? group_utf8 : NULL); scr_RosterUp(); - buddy_setgroup(bud, newgroupname); + buddy_setgroup(bud, group_utf8); } + g_free(group_utf8); g_free(newgroupname); update_roster = TRUE; } @@ -1164,19 +1205,22 @@ { guint assign; const gchar *option, *value; + gchar *option_utf8; assign = parse_assigment(arg, &option, &value); if (!option) { scr_LogPrint(LPRINT_NORMAL, "Set what option?"); return; } + option_utf8 = to_utf8(option); if (!assign) { // This is a query - value = settings_opt_get(option); + value = settings_opt_get(option_utf8); if (value) { - scr_LogPrint(LPRINT_NORMAL, "%s = [%s]", option, value); + scr_LogPrint(LPRINT_NORMAL, "%s = [%s]", option_utf8, value); } else - scr_LogPrint(LPRINT_NORMAL, "Option %s is not set", option); + scr_LogPrint(LPRINT_NORMAL, "Option %s is not set", option_utf8); + g_free(option_utf8); return; } // Update the option @@ -1184,10 +1228,13 @@ // (server, username, etc.). And we should catch some options here, too // (hide_offline_buddies for ex.) if (!value) { - settings_del(SETTINGS_TYPE_OPTION, option); + settings_del(SETTINGS_TYPE_OPTION, option_utf8); } else { - settings_set(SETTINGS_TYPE_OPTION, option, value); + gchar *value_utf8 = to_utf8(value); + settings_set(SETTINGS_TYPE_OPTION, option_utf8, value_utf8); + g_free(value_utf8); } + g_free(option_utf8); } static void do_alias(char *arg) @@ -1204,14 +1251,17 @@ // This is a query value = settings_get(SETTINGS_TYPE_ALIAS, alias); if (value) { - scr_LogPrint(LPRINT_NORMAL, "%s = %s", alias, value); + // XXX LPRINT_NOTUTF8 here, see below why it isn't encoded... + scr_LogPrint(LPRINT_NORMAL|LPRINT_NOTUTF8, "%s = %s", alias, value); } else - scr_LogPrint(LPRINT_NORMAL, "Alias '%s' does not exist", alias); + scr_LogPrint(LPRINT_NORMAL|LPRINT_NOTUTF8, + "Alias '%s' does not exist", alias); return; } // Check the alias does not conflict with a registered command if (cmd_get(alias)) { - scr_LogPrint(LPRINT_NORMAL, "'%s' is a reserved word!", alias); + scr_LogPrint(LPRINT_NORMAL|LPRINT_NOTUTF8, + "'%s' is a reserved word!", alias); return; } // Update the alias @@ -1222,7 +1272,11 @@ compl_del_category_word(COMPL_CMD, alias); } } else { - // Add alias to the completion list, if not already in + /* Add alias to the completion list, if not already in. + XXX We're not UTF8-encoding "alias" and "value" here because UTF-8 is + not yet supported in the UI... (and we use the values in the completion + system) + */ if (!settings_get(SETTINGS_TYPE_ALIAS, alias)) compl_add_category_word(COMPL_CMD, alias); settings_set(SETTINGS_TYPE_ALIAS, alias, value); @@ -1249,10 +1303,13 @@ return; } // Update the key binding - if (!value) + if (!value) { settings_del(SETTINGS_TYPE_BINDING, keycode); - else - settings_set(SETTINGS_TYPE_BINDING, keycode, value); + } else { + gchar *value_utf8 = to_utf8(value); + settings_set(SETTINGS_TYPE_BINDING, keycode, value_utf8); + g_free(value_utf8); + } } static void do_rawxml(char *arg) @@ -1360,10 +1417,13 @@ *p = 0; } } + } else { + nick = tmpnick = to_utf8(nick); } // If we still have no nickname, give up if (!nick || !*nick) { scr_LogPrint(LPRINT_NORMAL, "Please specify a nickname."); + g_free(tmpnick); free_arg_lst(paramlst); return; } @@ -1371,15 +1431,16 @@ // Note that roomname is part of the array allocated by split_arg(), // so we can modify it. mc_strtolower(roomname); + roomname = to_utf8(roomname); jb_room_join(roomname, nick); scr_LogPrint(LPRINT_LOGNORM, "Sent a join request to <%s>...", roomname); + g_free(roomname); + g_free(tmpnick); buddylist_build(); update_roster = TRUE; free_arg_lst(paramlst); - if (tmpnick) - g_free(tmpnick); } static void room_invite(gpointer bud, char *arg) @@ -1387,6 +1448,7 @@ char **paramlst; const gchar *roomname; char* jid; + gchar *reason_utf8; paramlst = split_arg(arg, 2, 1); // jid, [reason] jid = *paramlst; @@ -1402,8 +1464,10 @@ } roomname = buddy_getjid(bud); - jb_room_invite(roomname, jid, arg); + reason_utf8 = to_utf8(arg); + jb_room_invite(roomname, jid, reason_utf8); scr_LogPrint(LPRINT_LOGNORM, "Invitation sent to <%s>...", jid); + if (reason_utf8) g_free(reason_utf8); free_arg_lst(paramlst); } @@ -1431,9 +1495,14 @@ if (!strcasecmp(rolename, straffil[ra.val.affil])) break; - if (ra.val.affil < imaffiliation_size) - jb_room_setattrib(roomid, jid, NULL, ra, arg); - else + if (ra.val.affil < imaffiliation_size) { + gchar *jid_utf8, *reason_utf8; + jid_utf8 = to_utf8(jid); + reason_utf8 = to_utf8(arg); + jb_room_setattrib(roomid, jid_utf8, NULL, ra, reason_utf8); + if (jid_utf8) g_free(jid_utf8); + if (reason_utf8) g_free(reason_utf8); + } else scr_LogPrint(LPRINT_NORMAL, "Wrong affiliation parameter."); free_arg_lst(paramlst); @@ -1463,9 +1532,14 @@ if (!strcasecmp(rolename, strrole[ra.val.role])) break; - if (ra.val.role < imrole_size) - jb_room_setattrib(roomid, jid, NULL, ra, arg); - else + if (ra.val.role < imrole_size) { + gchar *jid_utf8, *reason_utf8; + jid_utf8 = to_utf8(jid); + reason_utf8 = to_utf8(arg); + jb_room_setattrib(roomid, jid_utf8, NULL, ra, reason_utf8); + if (jid_utf8) g_free(jid_utf8); + if (reason_utf8) g_free(reason_utf8); + } else scr_LogPrint(LPRINT_NORMAL, "Wrong role parameter."); free_arg_lst(paramlst); @@ -1477,6 +1551,7 @@ { char **paramlst; gchar *jid; + gchar *jid_utf8, *reason_utf8; struct role_affil ra; const char *roomid = buddy_getjid(bud); @@ -1493,7 +1568,11 @@ ra.type = type_affil; ra.val.affil = affil_outcast; - jb_room_setattrib(roomid, jid, NULL, ra, arg); + jid_utf8 = to_utf8(jid); + reason_utf8 = to_utf8(arg); + jb_room_setattrib(roomid, jid_utf8, NULL, ra, reason_utf8); + if (jid_utf8) g_free(jid_utf8); + if (reason_utf8) g_free(reason_utf8); free_arg_lst(paramlst); } @@ -1503,6 +1582,7 @@ { char **paramlst; gchar *nick; + gchar *nick_utf8, *reason_utf8; struct role_affil ra; const char *roomid = buddy_getjid(bud); @@ -1519,14 +1599,18 @@ ra.type = type_role; ra.val.affil = role_none; - jb_room_setattrib(roomid, NULL, nick, ra, arg); + nick_utf8 = to_utf8(nick); + reason_utf8 = to_utf8(arg); + jb_room_setattrib(roomid, NULL, nick_utf8, ra, reason_utf8); + if (nick_utf8) g_free(nick_utf8); + if (reason_utf8) g_free(reason_utf8); free_arg_lst(paramlst); } static void room_leave(gpointer bud, char *arg) { - gchar *roomid, *utf8_nickname; + gchar *roomid, *desc; const char *nickname; nickname = buddy_getnickname(bud); @@ -1535,10 +1619,10 @@ return; } - utf8_nickname = to_utf8(nickname); - roomid = g_strdup_printf("%s/%s", buddy_getjid(bud), utf8_nickname); - jb_setstatus(offline, roomid, arg); - g_free(utf8_nickname); + roomid = g_strdup_printf("%s/%s", buddy_getjid(bud), nickname); + desc = to_utf8(arg); + jb_setstatus(offline, roomid, desc); + g_free(desc); g_free(roomid); } @@ -1624,9 +1708,11 @@ return; } + arg = to_utf8(arg); // Set the topic msg = g_strdup_printf("/me has set the topic to: %s", arg); jb_send_msg(buddy_getjid(bud), msg, ROSTER_TYPE_ROOM, arg); + g_free(arg); g_free(msg); } @@ -1635,11 +1721,12 @@ gchar *msg; if (arg && *arg) - msg = arg; + msg = to_utf8(arg); else msg = NULL; jb_room_destroy(buddy_getjid(bud), NULL, msg); + if (msg) g_free(msg); } static void room_unlock(gpointer bud, char *arg) @@ -1812,6 +1899,7 @@ { char **paramlst; char *subcmd; + char *jid_utf8; if (!jb_getonline()) { scr_LogPrint(LPRINT_NORMAL, "You are not connected."); @@ -1849,32 +1937,38 @@ if (!current_buddy) return; bud = BUDDATA(current_buddy); - arg = (char*)buddy_getjid(bud); + jid_utf8 = arg = (char*)buddy_getjid(bud); type = buddy_gettype(bud); if (!(type & (ROSTER_TYPE_USER|ROSTER_TYPE_AGENT))) { scr_LogPrint(LPRINT_NORMAL, "Invalid buddy."); return; } + } else { + jid_utf8 = to_utf8(arg); } if (!strcasecmp(subcmd, "allow")) { - jb_subscr_send_auth(arg); + jb_subscr_send_auth(jid_utf8); scr_LogPrint(LPRINT_LOGNORM, - "<%s> is now allowed to receive your presence updates.", arg); + "<%s> is now allowed to receive your presence updates.", + jid_utf8); } else if (!strcasecmp(subcmd, "cancel")) { - jb_subscr_cancel_auth(arg); + jb_subscr_cancel_auth(jid_utf8); scr_LogPrint(LPRINT_LOGNORM, "<%s> will no longer receive your presence updates.", - arg); + jid_utf8); } else if (!strcasecmp(subcmd, "request")) { - jb_subscr_request_auth(arg); + jb_subscr_request_auth(jid_utf8); scr_LogPrint(LPRINT_LOGNORM, - "Sent presence notification request to <%s>...", arg); + "Sent presence notification request to <%s>...", jid_utf8); } else { scr_LogPrint(LPRINT_NORMAL, "Unrecognized parameter!"); } + // Only free jid_utf8 if it has been allocated, i.e. if != arg. + if (jid_utf8 && jid_utf8 != arg) + g_free(jid_utf8); free_arg_lst(paramlst); } @@ -1888,6 +1982,7 @@ char **paramlst; char *jid, *type; enum iqreq_type numtype = iqreq_none; + char *jid_utf8 = NULL; paramlst = split_arg(arg, 2, 0); // type, jid type = *paramlst; @@ -1925,9 +2020,10 @@ jid = NULL; } else { // Convert jid to lowercase - char *p = jid; - for ( ; *p && *p != '/'; p++) + char *p; + for (p = jid; *p && *p != '/'; p++) *p = tolower(*p); + jid = jid_utf8 = to_utf8(jid); } } else { // Add the current buddy @@ -1947,6 +2043,7 @@ break; } } + g_free(jid_utf8); free_arg_lst(paramlst); }