Бесполезные новые строки на входящих сообщениях в pidgin при использовании pidgin-sipe
При использовании pidgin-sipe с pidgin входящие сообщения имеют огромное количество пробелов вокруг фактического сообщения. Включение / отключение форматирования входящих сообщений не имеет значения. Посмотреть здесь:
Светло-зеленый - это я (без пробелов), темно-зеленый - это мой друг, использующий клиент Skype для бизнеса. С его стороны все выглядит нормально. Почему вокруг входящих сообщений так много пробелов (пустых строк)? Как это можно исправить?
1 ответ
Решение
Я исправил это, взломав pidgin-sipe самостоятельно. Это, вероятно, плохой код, но я плохо разбираюсь в C. Все, что он делает, это удаляет вхождения <BR>
в сообщениях. Вот патч, на случай, если кто-то еще столкнется с той же проблемой:
*** purple-im.c 2016-12-18 18:19:07.000000000 +0100
--- /tmp/purple-im.c 2018-04-18 15:49:48.915516011 +0200
***************
*** 43,60 ****
#include "sipe-core.h"
#include "sipe-nls.h"
void sipe_backend_im_message(struct sipe_core_public *sipe_public,
const gchar *from,
const gchar *html)
{
struct sipe_backend_private *purple_private = sipe_public->backend_private;
purple_serv_got_im(purple_private->gc,
from,
! html,
0,
time(NULL));
}
void sipe_backend_im_topic(struct sipe_core_public *sipe_public,
const gchar *with,
const gchar *topic)
--- 43,102 ----
#include "sipe-core.h"
#include "sipe-nls.h"
+ static void str_replace(gchar *target, const gchar *needle, const gchar *replacement)
+ {
+
+ gchar buffer[1024] = { 0 };
+ gchar *insert_point = &buffer[0];
+ const gchar *tmp = target;
+ size_t needle_len = strlen(needle);
+ size_t repl_len = strlen(replacement);
+
+ while (1) {
+ const gchar *p = strstr(tmp, needle);
+
+ // walked past last occurrence of needle; copy remaining part
+ if (p == NULL) {
+ strcpy(insert_point, tmp);
+ break;
+ }
+
+ // copy part before needle
+ memcpy(insert_point, tmp, p - tmp);
+ insert_point += p - tmp;
+
+ // copy replacement string
+ memcpy(insert_point, replacement, repl_len);
+ insert_point += repl_len;
+
+ // adjust pointers, move on
+ tmp = p + needle_len;
+ }
+
+ // write altered string back to target
+ strcpy(target, buffer);
+ }
+
void sipe_backend_im_message(struct sipe_core_public *sipe_public,
const gchar *from,
const gchar *html)
{
struct sipe_backend_private *purple_private = sipe_public->backend_private;
+
+ const size_t target_size = strlen(html) + 1;
+ gchar copy_of_html[target_size];
+ strncpy(copy_of_html, html, target_size);
+
+ str_replace(copy_of_html, "<BR>", "");
+
purple_serv_got_im(purple_private->gc,
from,
! copy_of_html,
0,
time(NULL));
}
+
void sipe_backend_im_topic(struct sipe_core_public *sipe_public,
const gchar *with,
const gchar *topic)