diff options
author | Marius Halden <marius.h@lden.org> | 2016-11-12 10:50:46 +0100 |
---|---|---|
committer | Marius Halden <marius.h@lden.org> | 2016-11-12 10:50:46 +0100 |
commit | d54c742b856702377d713b490d07e23facac6288 (patch) | |
tree | 7db5bede175590c1f54242b3015aa9c78df730fa | |
parent | 5f35d535f22aaf747956aafafd301442a07626a4 (diff) | |
parent | fca468311f1fd9880ed2ae4991b2ecc261fd34d5 (diff) |
Merge branch 'master' into patched-master
-rw-r--r-- | irc.h | 1 | ||||
-rw-r--r-- | irc_im.c | 4 | ||||
-rw-r--r-- | lib/misc.c | 12 | ||||
-rw-r--r-- | otr.c | 6 | ||||
-rw-r--r-- | protocols/purple/bpurple.h | 1 | ||||
-rw-r--r-- | protocols/purple/purple.c | 45 | ||||
-rw-r--r-- | tests/Makefile | 2 | ||||
-rw-r--r-- | tests/check_util.c | 5 |
8 files changed, 63 insertions, 13 deletions
@@ -36,6 +36,7 @@ #define IRC_MAX_LINE 512 #define IRC_MAX_ARGS 16 +#define IRC_WORD_WRAP 425 #define IRC_LOGIN_TIMEOUT 60 #define IRC_PING_STRING "PinglBee" @@ -310,7 +310,7 @@ static gboolean bee_irc_user_msg(bee_t *bee, bee_user_t *bu, const char *msg_, g msg = s; } - wrapped = word_wrap(msg, 425); + wrapped = word_wrap(msg, IRC_WORD_WRAP); irc_send_tagged_msg(src_iu, message_type, dst, wrapped, prefix, tags); g_free(wrapped); @@ -692,7 +692,7 @@ static gboolean bee_irc_chat_msg(bee_t *bee, struct groupchat *c, bee_user_t *bu ts = irc_format_timestamp(irc, sent_at); } - wrapped = word_wrap(msg, 425); + wrapped = word_wrap(msg, IRC_WORD_WRAP); irc_send_tagged_msg(iu, "PRIVMSG", ic->name, wrapped, ts, tags); g_free(ts); g_free(wrapped); @@ -548,7 +548,6 @@ void srv_free(struct ns_srv_reply **srv) g_free(srv); } -/* Word wrapping. Yes, I know this isn't UTF-8 clean. I'm willing to take the risk. */ char *word_wrap(const char *msg, int line_len) { GString *ret = g_string_sized_new(strlen(msg) + 16); @@ -581,9 +580,16 @@ char *word_wrap(const char *msg, int line_len) } } if (i == 0) { - g_string_append_len(ret, msg, line_len); + const char *end; + size_t len; + + g_utf8_validate(msg, line_len, &end); + + len = (end != msg) ? end - msg : line_len; + + g_string_append_len(ret, msg, len); g_string_append_c(ret, '\n'); - msg += line_len; + msg += len; } } g_string_append(ret, msg); @@ -1399,6 +1399,7 @@ void log_otr_message(void *opdata, const char *fmt, ...) void display_otr_message(void *opdata, ConnContext *ctx, const char *fmt, ...) { + char *msg_, *msg; struct im_connection *ic = check_imc(opdata, ctx->accountname, ctx->protocol); irc_t *irc = ic->bee->ui_data; @@ -1406,9 +1407,11 @@ void display_otr_message(void *opdata, ConnContext *ctx, const char *fmt, ...) va_list va; va_start(va, fmt); - char *msg = g_strdup_vprintf(fmt, va); + msg_ = g_strdup_vprintf(fmt, va); va_end(va); + msg = word_wrap(msg_, IRC_WORD_WRAP); + if (u) { /* just show this as a regular message */ irc_usermsg(u, "<<\002OTR\002>> %s", msg); @@ -1416,6 +1419,7 @@ void display_otr_message(void *opdata, ConnContext *ctx, const char *fmt, ...) irc_rootmsg(irc, "[otr] %s", msg); } + g_free(msg_); g_free(msg); } diff --git a/protocols/purple/bpurple.h b/protocols/purple/bpurple.h index 39677b86..8225f0b8 100644 --- a/protocols/purple/bpurple.h +++ b/protocols/purple/bpurple.h @@ -12,6 +12,7 @@ struct purple_data GHashTable *input_requests; guint next_request_id; + char *chat_list_server; }; #endif /* !BPURPLE_H */ diff --git a/protocols/purple/purple.c b/protocols/purple/purple.c index db523ada..ce3c1f97 100644 --- a/protocols/purple/purple.c +++ b/protocols/purple/purple.c @@ -100,9 +100,21 @@ static gboolean purple_menu_cmp(const char *a, const char *b) return (*a == '\0' && *b == '\0'); } +static char *purple_get_account_prpl_id(account_t *acc) +{ + /* "oscar" is how non-purple bitlbee calls it, + * and it might be icq or aim, depending on the username */ + if (g_strcmp0(acc->prpl->name, "oscar") == 0) { + return (g_ascii_isdigit(acc->user[0])) ? "prpl-icq" : "prpl-aim"; + } + + return acc->prpl->data; +} + static void purple_init(account_t *acc) { - PurplePlugin *prpl = purple_plugins_find_with_id((char *) acc->prpl->data); + char *prpl_id = purple_get_account_prpl_id(acc); + PurplePlugin *prpl = purple_plugins_find_with_id(prpl_id); PurplePluginProtocolInfo *pi = prpl->info->extra_info; PurpleAccount *pa; GList *i, *st; @@ -268,7 +280,7 @@ static void purple_init(account_t *acc) /* Go through all away states to figure out if away/status messages are possible. */ - pa = purple_account_new(acc->user, (char *) acc->prpl->data); + pa = purple_account_new(acc->user, prpl_id); for (st = purple_account_get_status_types(pa); st; st = st->next) { PurpleStatusPrimitive prim = purple_status_type_get_primitive(st->data); @@ -358,7 +370,7 @@ static void purple_login(account_t *acc) purple_connections = g_slist_prepend(purple_connections, ic); ic->proto_data = pd = g_new0(struct purple_data, 1); - pd->account = purple_account_new(acc->user, (char *) acc->prpl->data); + pd->account = purple_account_new(acc->user, purple_get_account_prpl_id(acc)); pd->input_requests = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, g_free); pd->next_request_id = 0; @@ -390,6 +402,7 @@ static void purple_logout(struct im_connection *ic) purple_connections = g_slist_remove(purple_connections, ic); purple_accounts_remove(pd->account); imcb_chat_list_free(ic); + g_free(pd->chat_list_server); g_hash_table_destroy(pd->input_requests); g_free(pd); } @@ -784,6 +797,9 @@ void purple_chat_list(struct im_connection *ic, const char *server) return; } + g_free(pd->chat_list_server); + pd->chat_list_server = (server && *server) ? g_strdup(server) : NULL; + list = purple_roomlist_get_list(pd->account->gc); if (list) { @@ -1231,8 +1247,19 @@ void* prplcb_request_input(const char *title, const char *primary, { struct im_connection *ic = purple_ic_by_pa(account); struct purple_data *pd = ic->proto_data; - struct request_input_data *ri = g_new0(struct request_input_data, 1); - guint id = pd->next_request_id++; + struct request_input_data *ri; + guint id; + + /* hack so that jabber's chat list doesn't ask for conference server twice */ + if (pd->chat_list_server && title && g_strcmp0(title, "Enter a Conference Server") == 0) { + ((ri_callback_t) ok_cb)(user_data, pd->chat_list_server); + g_free(pd->chat_list_server); + pd->chat_list_server = NULL; + return NULL; + } + + id = pd->next_request_id++; + ri = g_new0(struct request_input_data, 1); ri->id = id; ri->ic = ic; @@ -1393,6 +1420,7 @@ static void prplcb_roomlist_add_room(PurpleRoomlist *list, PurpleRoomlistRoom *r static void prplcb_roomlist_in_progress(PurpleRoomlist *list, gboolean in_progress) { struct im_connection *ic; + struct purple_data *pd; struct purple_roomlist_data *rld = list->ui_data; if (in_progress || !rld) { @@ -1402,6 +1430,10 @@ static void prplcb_roomlist_in_progress(PurpleRoomlist *list, gboolean in_progre ic = purple_ic_by_pa(list->account); imcb_chat_list_free(ic); + pd = ic->proto_data; + g_free(pd->chat_list_server); + pd->chat_list_server = NULL; + ic->chatlist = g_slist_reverse(rld->chats); rld->chats = NULL; @@ -1722,7 +1754,8 @@ void purple_initmodule() /*if (g_strcasecmp(prot->info->id, "prpl-aim") == 0) { ret = g_memdup(&funcs, sizeof(funcs)); ret->name = "oscar"; - ret->data = prot->info->id; + /* purple_get_account_prpl_id() determines the actual protocol ID (icq/aim) */ + ret->data = NULL; register_protocol(ret); }*/ } diff --git a/tests/Makefile b/tests/Makefile index 7756c17f..09763e0c 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -14,7 +14,7 @@ clean: distclean: clean -main_objs = bitlbee.o conf.o dcc.o help.o ipc.o irc.o irc_cap.o irc_channel.o irc_commands.o irc_im.o irc_send.o irc_user.o irc_util.o irc_commands.o log.o nick.o query.o root_commands.o set.o storage.o storage_xml.o auth.o auth_pam.o auth_ldap.o +main_objs = bitlbee.o conf.o dcc.o help.o ipc.o irc.o irc_cap.o irc_channel.o irc_commands.o irc_im.o irc_send.o irc_user.o irc_util.o irc_commands.o log.o nick.o query.o root_commands.o set.o storage.o $(STORAGE_OBJS) auth.o $(AUTH_OBJS) test_objs = check.o check_util.o check_nick.o check_md5.o check_arc.o check_irc.o check_help.o check_user.o check_set.o check_jabber_sasl.o check_jabber_util.o diff --git a/tests/check_util.c b/tests/check_util.c index 006ad02a..44a223ae 100644 --- a/tests/check_util.c +++ b/tests/check_util.c @@ -138,6 +138,11 @@ struct { "aaaaa\naaaaa\naaaaa\naaaaa\naaaaa\naaaaa\naaaaa\na", }, { + "áááááááááá", + 11, + "ááááá\nááááá", + }, + { NULL } }; |