aboutsummaryrefslogtreecommitdiffstats
path: root/camel/gmime-utils.c
diff options
context:
space:
mode:
Diffstat (limited to 'camel/gmime-utils.c')
-rw-r--r--camel/gmime-utils.c135
1 files changed, 92 insertions, 43 deletions
diff --git a/camel/gmime-utils.c b/camel/gmime-utils.c
index 8c3db96cd4..27cc6b9674 100644
--- a/camel/gmime-utils.c
+++ b/camel/gmime-utils.c
@@ -23,58 +23,65 @@
#include <config.h>
#include "gmime-utils.h"
-#include "gstring-util.h"
+#include "string-utils.h"
#include "camel-log.h"
#include "camel-stream.h"
void
-gmime_write_header_pair_to_stream (CamelStream *stream, gchar* name, GString *value)
+gmime_write_header_pair_to_stream (CamelStream *stream, const gchar* name, const gchar *value)
{
- GString *strtmp;
+ gchar *strtmp;
guint len;
-
+ CAMEL_LOG_FULL_DEBUG ( "gmime_write_header_pair_to_stream:: Entering\n");
g_assert(name);
-
- if (!value || !(value->str)) return;
- len = strlen (name) + strlen (value->str) +3;
+#warning use g_strdup_printf instead
+
+ if (!value) return;
+ len = strlen (name) + strlen (value) +3;
/* 3 is for ": " and "\n" */
- strtmp = g_string_sized_new (len);
+ strtmp = g_new (gchar, len);
- sprintf(strtmp->str, "%s: %s\n", name, value->str);
- camel_stream_write (stream, strtmp->str, len);
- CAMEL_LOG (FULL_DEBUG, "gmime_write_header_pair_to_stream:\n writing %s\n", strtmp->str);
- g_string_free (strtmp, FALSE);
+ sprintf (strtmp, "%s: %s\n", name, value);
+ camel_stream_write (stream, strtmp, len);
+ CAMEL_LOG_FULL_DEBUG ( "gmime_write_header_pair_to_stream:\n writing %s\n", strtmp);
+ g_free (strtmp);
+ CAMEL_LOG_FULL_DEBUG ( "gmime_write_header_pair_to_stream:: Leaving\n");
+
}
static void
_write_one_header_to_stream (gpointer key, gpointer value, gpointer user_data)
{
- GString *header_name = (GString *)key;
- GString *header_value = (GString *)value;
+ gchar *header_name = (gchar *)key;
+ gchar *header_value = (gchar *)value;
CamelStream *stream = (CamelStream *)user_data;
- if ( (header_name) && (header_name->str) &&
- (header_value) && (header_value->str) )
- gmime_write_header_pair_to_stream (stream, header_name->str, header_value);
+ CAMEL_LOG_FULL_DEBUG ( "_write_one_header_to_stream:: Entering\n");
+ if ((header_name) && (header_value))
+ gmime_write_header_pair_to_stream (stream, header_name, header_value);
+ CAMEL_LOG_FULL_DEBUG ( "_write_one_header_to_stream:: Leaving\n");
}
void
write_header_table_to_stream (CamelStream *stream, GHashTable *header_table)
{
+ CAMEL_LOG_FULL_DEBUG ( "write_header_table_to_stream:: Entering\n");
g_hash_table_foreach (header_table,
_write_one_header_to_stream,
(gpointer)stream);
+ CAMEL_LOG_FULL_DEBUG ( "write_header_table_to_stream:: Leaving\n");
}
void
-write_header_with_glist_to_stream (CamelStream *stream, gchar *header_name, GList *header_values, gchar *separator)
+write_header_with_glist_to_stream (CamelStream *stream, const gchar *header_name, GList *header_values, const gchar *separator)
{
- GString *current;
-
+ gchar *current;
+
+ CAMEL_LOG_FULL_DEBUG ( "write_header_with_glist_to_stream:: entering\n");
if ( (header_name) && (header_values) )
{
gboolean first;
@@ -83,16 +90,17 @@ write_header_with_glist_to_stream (CamelStream *stream, gchar *header_name, GLis
camel_stream_write (stream, ": ", 2);
first = TRUE;
while (header_values) {
- current = (GString *)header_values->data;
- if ( (current) && (current->str) ) {
+ current = (gchar *)header_values->data;
+ if (current) {
if (!first) camel_stream_write_string (stream, separator);
else first = FALSE;
- camel_stream_write (stream, current->str, strlen (current->str));
+ camel_stream_write (stream, current, strlen (current));
}
header_values = g_list_next(header_values);
}
camel_stream_write (stream, "\n", 1);
}
+ CAMEL_LOG_FULL_DEBUG ( "write_header_with_glist_to_stream:: leaving\n");
}
@@ -104,29 +112,30 @@ write_header_with_glist_to_stream (CamelStream *stream, gchar *header_name, GLis
/* scanning functions */
static void
-_store_header_pair_from_gstring (GHashTable *header_table, GString *header_line)
+_store_header_pair_from_string (GHashTable *header_table, gchar *header_line)
{
gchar dich_result;
- GString *header_name, *header_value;
+ gchar *header_name, *header_value;
+ CAMEL_LOG_FULL_DEBUG ( "_store_header_pair_from_string:: Entering\n");
g_assert (header_table);
- if ( (header_line) && (header_line->str) ) {
- dich_result = g_string_dichotomy (
- header_line, ':', &header_name, &header_value,
- GSTRING_DICHOTOMY_NONE);
+ g_assert (header_line);
+ if (header_line) {
+ dich_result = string_dichotomy ( header_line, ':',
+ &header_name, &header_value,
+ STRING_DICHOTOMY_NONE);
if (dich_result != 'o')
- camel_log(WARNING,
- "store_header_pair_from_gstring : dichotomy result is %c"
- "header line is :\n--\n%s\n--\n");
-
+ CAMEL_LOG_WARNING (
+ "store_header_pair_from_string : dichotomy result is %c"
+ "header line is :\n--\n%s\n--\n");
else {
- g_string_trim (
- header_value, " \t",
- GSTRING_TRIM_STRIP_LEADING | GSTRING_TRIM_STRIP_TRAILING);
+ string_trim (header_value, " \t",
+ STRING_TRIM_STRIP_LEADING | STRING_TRIM_STRIP_TRAILING);
g_hash_table_insert (header_table, header_name, header_value);
}
}
-
+ CAMEL_LOG_FULL_DEBUG ( "_store_header_pair_from_string:: Leaving\n");
+
}
@@ -135,6 +144,10 @@ _store_header_pair_from_gstring (GHashTable *header_table, GString *header_line)
GHashTable *
get_header_table_from_stream (CamelStream *stream)
{
+#warning Correct Lazy Implementation
+ /* should not use GString. */
+ /* should read the header line by line */
+ /* and not char by char */
gchar next_char;
gboolean crlf = FALSE;
@@ -142,12 +155,14 @@ get_header_table_from_stream (CamelStream *stream)
gboolean end_of_headers = FALSE;
gboolean end_of_file = FALSE;
GString *header_line=NULL;
+ gchar *str_header_line;
GHashTable *header_table;
-
- header_table = g_hash_table_new (g_string_hash, g_string_equal_for_hash);
+#warning Correct a bug here. Should use return value of camel_stream_read instead of looking for next_char!=-1
+ CAMEL_LOG_FULL_DEBUG ( "gmime-utils:: Entering get_header_table_from_stream\n");
+ header_table = g_hash_table_new (g_str_hash, g_str_equal);
camel_stream_read (stream, &next_char, 1);
do {
- header_line = g_string_new("");
+ header_line = g_string_new ("");
end_of_header_line = FALSE;
crlf = FALSE;
@@ -182,13 +197,47 @@ get_header_table_from_stream (CamelStream *stream)
if (!end_of_header_line) camel_stream_read (stream, &next_char, 1);
} while ( !end_of_header_line );
- if ( strlen(header_line->str) )
- _store_header_pair_from_gstring (header_table, header_line);
+ if ( strlen(header_line->str) ) {
+ str_header_line = g_strdup (header_line->str);
+ _store_header_pair_from_string (header_table, str_header_line);
+ }
g_string_free (header_line, FALSE);
} while ( (!end_of_headers) && (!end_of_file) );
-
+
+ CAMEL_LOG_FULL_DEBUG ( "gmime-utils:: Leaving get_header_table_from_stream\n");
return header_table;
}
+gchar *
+gmime_read_line_from_stream (CamelStream *stream)
+{
+ GString *new_line;
+ gchar *result;
+ gchar next_char;
+ gboolean end_of_line = FALSE;
+ gboolean end_of_stream = FALSE;
+ gint nb_char_read;
+
+ new_line = g_string_new ("");
+ do {
+ nb_char_read = camel_stream_read (stream, &next_char, 1);
+ if (nb_char_read>0) {
+ switch (next_char) {
+ case '\n':
+ end_of_line = TRUE;
+ /* g_string_append_c (new_line, next_char); */
+ break;
+ default:
+ g_string_append_c (new_line, next_char);
+ }
+ } else end_of_stream = TRUE;
+ } while (!end_of_line && !end_of_stream);
+
+ if ( (new_line->str[0]) != '\0')
+ result = g_strdup (new_line->str);
+ else result=NULL;
+ g_string_free (new_line, TRUE);
+ return result;
+}