Useless newlines on incoming messages in pidgin when using pidgin-sipe
By David Jones •
When using pidgin-sipe with pidgin, incoming messages have a huge amount of whitespace around the actual message. Enabling/disabling formatting on incoming messages makes no difference. See here:
Light green is me (no whitespace), dark green is my friend using the Skype for Business client. On his end everything looks normal. Why is there so much whitespace (empty lines) around incoming messages? How can this be fixed?
1 Answer
I fixed this by hacking pidgin-sipe myself. It's probably bad code, but hey, I'm bad at C. All it does is remove occurrences of <BR> in messages. Here's the patch, in case anyone else encounters the same problem:
*** 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) 1 More in general
"Zoraya ter Beek, age 29, just died by assisted suicide in the Netherlands. She was physically healthy, but psychologically depressed. It's an abomination that an entire society would actively facilitate, even encourage, someone ending their own life because they had no hope. Th…"