Cześć,
jestem nowy na tej grupie, więc chciałbym wszystkich serdecznie pozdrowić.
Korzystam z Pidgina i trafiłem na następujący problem: jeżeli użytkownik AQQ
wyśle mi linka zawierającego znaki "&", ten dochodzi do mnie zdeformowany.
Np. link postaci "http://allegro.pl/listing.php/search?sg=0&string=test"
otrzymam jako "http://allegro.pl/listing.php/search?sg=0=test".
Pierwsza rzecz, którą odkryłem to to, że AQQ nie zamienia znaków "&" na
"&".
Ustaliłem też, że Pidgin korzysta z plaintextowej wersji wiadomości, czyli
przepuszczonej przez gg_message_html_to_text(). Ta funkcja niestety trochę
inaczej się zachowuje, niż oryginalny klient. GG10 jeżeli dostanie
niedokończoną encję, po prostu ją wyświetli w postaci kodu. Libgadu takie
wycina.
Udało mi się zmodyfikować tą funkcję tak, że wszystko działa jak należy -
patch w załączniku. Czy jest szansa na wrzucenie tego do kolejnej wersji
biblioteki, czy może powinienem to rozwiązać inaczej? Mogę podesłać wersję
patcha bez funkcji pomocniczej, ale to jest moim zdaniem za dużo copy-paste.
Pozdrawiam,
Tomek
Index: src/message.c
===================================================================
--- src/message.c (wersja 1091)
+++ src/message.c (kopia robocza)
@@ -557,6 +557,25 @@
}
/**
+ * \internal Kopiuje zawartość jednego buforu w określone miejsce innego.
+ * Aktualizuje aktualną pozycję do zapisu.
+ *
+ * \param dst Bufor wynikowy (może być \c NULL)
+ * \param dst_offset Wskaźnik na aktualną pozycję w buforze wynikowym
+ * \param src Bufor wejściowy
+ * \param src_length Ilość znaków do skopiowania z bufora wejściowego
+ *
+ * \note To jest funkcja pomocnicza dla gg_message_html_to_text.
+ */
+static void buffcpy(char *dst, size_t *dst_offset, const char *src,
+ size_t src_length)
+{
+ if (dst != NULL)
+ strncpy(dst + (*dst_offset), src, src_length);
+ (*dst_offset) += src_length;
+}
+
+/**
* \internal Zamienia tekst w formacie HTML na czysty tekst.
*
* \param dst Bufor wynikowy (może być \c NULL)
@@ -585,8 +604,11 @@
for (src = html; *src != 0; src++) {
if (*src == '<') {
+ if (in_entity)
+ buffcpy(dst, &len, entity, src - entity);
tag = src;
in_tag = 1;
+ in_entity = 0;
continue;
}
@@ -603,7 +625,9 @@
if (in_tag)
continue;
- if (*src == '&') {
+ if (*src == '&' && !in_tag) {
+ if (in_entity)
+ buffcpy(dst, &len, entity, src - entity);
in_entity = 1;
entity = src;
continue;
@@ -637,8 +661,10 @@
continue;
}
- if (in_entity && !(isalnum(*src) || *src == '#'))
+ if (in_entity && !(isalnum(*src) || *src == '#')) {
+ buffcpy(dst, &len, entity, src - entity);
in_entity = 0;
+ }
if (in_entity)
continue;
_______________________________________________
libgadu-devel mailing list
[email protected]
http://lists.ziew.org/mailman/listinfo/libgadu-devel