- /* For pure HTML emails tny_camel_html_to_text_stream inserts
- a \n for every ">\n" found in the email including the HTML
- headers (<html>, <head> ...). For that reason we need to
- remove them from the resulting text as it is artificially
- added by the stream */
- if (is_html) {
- const guint BUFFER_SIZE = 1024;
- TnyStream *is;
- gboolean look_for_end_tag, found;
- gchar buffer [BUFFER_SIZE + 1];
- gchar *needle;
-
- is = g_object_ref (mp_stream);
- look_for_end_tag = FALSE;
- found = FALSE;
-
- /* This algorithm does not work if the body tag is
- spread along 2 different stream reads. But there
- are not a lot of changes for this to happen as the
- buffer size is big enough in most situations. In
- the worst case, when it's not found we just accept
- the original translation with the extra "\n" */
- while (!tny_stream_is_eos (is) && !found) {
- gint n_read;
-
- needle = NULL;
- memset (buffer, 0, BUFFER_SIZE);
- n_read = tny_stream_read (is, buffer, BUFFER_SIZE);
-
- if (G_UNLIKELY (n_read < 0))
- break;
-
- buffer[n_read] = '\0';
-
- /* If we found body,then look for the end of the tag */
- if (look_for_end_tag) {
- needle = strchr (buffer, '>');
-
- if (needle) {
- found = TRUE;
- lines += count_end_tag_lines (buffer, needle);
- break;
- }
- } else {
- gchar *closing;
-
- /* Try to find the <body> tag. There
- is no other HTML tag starting by
- "bo", and we can detect more cases
- were <body> tag falls into two
- different stream reads */
- needle = g_strstr_len (buffer, n_read, "<bo");
-
- if (needle)
- look_for_end_tag = TRUE;
- else
- needle = &(buffer[n_read]);
-
- lines += count_end_tag_lines (buffer, needle);
-
- closing = strchr (needle, '>');
- if (closing) {
- if (*(closing + 1) == '\n')
- lines++;
- found = TRUE;
- break;
- }
- }
- }
- if (!found)
- lines = 0;
- tny_stream_reset (is);
-
- g_object_unref (is);
- }
-