aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarius Halden <marius.h@lden.org>2016-11-12 10:50:46 +0100
committerMarius Halden <marius.h@lden.org>2016-11-12 10:50:46 +0100
commitd54c742b856702377d713b490d07e23facac6288 (patch)
tree7db5bede175590c1f54242b3015aa9c78df730fa
parent5f35d535f22aaf747956aafafd301442a07626a4 (diff)
parentfca468311f1fd9880ed2ae4991b2ecc261fd34d5 (diff)
Merge branch 'master' into patched-master
-rw-r--r--irc.h1
-rw-r--r--irc_im.c4
-rw-r--r--lib/misc.c12
-rw-r--r--otr.c6
-rw-r--r--protocols/purple/bpurple.h1
-rw-r--r--protocols/purple/purple.c45
-rw-r--r--tests/Makefile2
-rw-r--r--tests/check_util.c5
8 files changed, 63 insertions, 13 deletions
diff --git a/irc.h b/irc.h
index 73430042..37e044e6 100644
--- a/irc.h
+++ b/irc.h
@@ -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"
diff --git a/irc_im.c b/irc_im.c
index c9bd5a54..b5da6d7d 100644
--- a/irc_im.c
+++ b/irc_im.c
@@ -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);
diff --git a/lib/misc.c b/lib/misc.c
index b4c02ed1..c611d99f 100644
--- a/lib/misc.c
+++ b/lib/misc.c
@@ -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);
diff --git a/otr.c b/otr.c
index 0328f478..d07617f7 100644
--- a/otr.c
+++ b/otr.c
@@ -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
}
};