From cee85091a8782ef3921c1e1e775d9dcf99e0ce9e Mon Sep 17 00:00:00 2001 From: Bertrand Guiheneuf Date: Wed, 12 May 1999 19:07:54 +0000 Subject: disposition is now a full GMimeContentField object. * camel/camel-mime-part.h (struct ): disposition is now a full GMimeContentField object. * camel/gmime-content-field.c: new file handle "type/subtype ;parameter=value ; parameter=value ..." BNF grammar elements (gmime_content_field_write_to_file): new func * camel/gmime-utils.c (gmime_write_header_pair_to_file): namespace change Some work on mime stuff. Mime part can save itself into a file. This stuff is boring. svn path=/trunk/; revision=921 --- camel/Makefile.am | 6 ++- camel/camel-data-wrapper.h | 4 +- camel/camel-mime-part.c | 47 ++++++++++++++++++++--- camel/camel-mime-part.h | 2 +- camel/gmime-content-field.c | 91 +++++++++++++++++++++++++++++++++++++++++++++ camel/gmime-content-field.h | 54 +++++++++++++++++++++++++++ camel/gmime-utils.c | 4 +- camel/gmime-utils.h | 8 ++-- 8 files changed, 200 insertions(+), 16 deletions(-) create mode 100644 camel/gmime-content-field.c create mode 100644 camel/gmime-content-field.h (limited to 'camel') diff --git a/camel/Makefile.am b/camel/Makefile.am index bf82c40452..67278258cb 100644 --- a/camel/Makefile.am +++ b/camel/Makefile.am @@ -16,11 +16,12 @@ libcamel_la_SOURCES = \ camel-data-wrapper.c \ camel-folder.c \ camel-mime-part.c \ - camel-mime-utils.c \ camel-provider.c \ camel-service.c \ camel-session.c \ camel-store.c \ + gmime-content-field.c \ + gmime-utils.c \ gstring-util.c \ url-util.c @@ -29,11 +30,12 @@ libcamelinclude_HEADERS = \ camel-data-wrapper.h \ camel-folder.h \ camel-mime-part.h \ - camel-mime-utils.c \ camel-provider.h \ camel-service.h \ camel-session.h \ camel-store.h \ + gmime-content-field.h \ + gmime-utils.h \ gstring-util.h \ url-util.h diff --git a/camel/camel-data-wrapper.h b/camel/camel-data-wrapper.h index a4ec0220e2..7dc4be2cea 100644 --- a/camel/camel-data-wrapper.h +++ b/camel/camel-data-wrapper.h @@ -33,7 +33,7 @@ extern "C" { #include #include - +#include "gmime-content-field.h" @@ -47,7 +47,7 @@ typedef struct { GtkObject parent_object; - GString *mime_type; + GMimeContentField *content_type; } CamelDataWrapper; diff --git a/camel/camel-mime-part.c b/camel/camel-mime-part.c index 3427dccf8f..35fd0279ed 100644 --- a/camel/camel-mime-part.c +++ b/camel/camel-mime-part.c @@ -26,6 +26,8 @@ #include "camel-mime-part.h" #include +#include "gmime-content-field.h" + static CamelDataWrapperClass *parent_class=NULL; @@ -233,8 +235,11 @@ camel_mime_part_get_description (CamelMimePart *mime_part) static void _set_disposition (CamelMimePart *mime_part, GString *disposition) { - if (mime_part->disposition) g_free(mime_part->disposition); - mime_part->disposition = disposition; + //if (mime_part->disposition) g_free(mime_part->disposition); + if (!mime_part->disposition) + mime_part->disposition = g_new (GMimeContentField,1); + if ((mime_part->disposition)->type) g_free ((mime_part->disposition)->type); + (mime_part->disposition)->type = disposition; } @@ -249,7 +254,8 @@ camel_mime_part_set_disposition (CamelMimePart *mime_part, GString *disposition) static GString * _get_disposition (CamelMimePart *mime_part) { - return mime_part->disposition; + if (!mime_part->disposition) return NULL; + return (mime_part->disposition)->type; } @@ -444,14 +450,45 @@ camel_mime_part_get_content_object(CamelMimePart *mime_part) #ifdef WHPTF #warning : WHPTF is already defined !!!!!! #endif -#define WHPTF camel_mime_utils_write_header_pair_to_file +#define WHPTF gmime_write_header_pair_to_file + + +static void +_write_content_to_file (CamelMimePart *mime_part, FILE *file) +{ + guint buffer_size; + gchar *buffer; + gchar *encoded_buffer; + + CamelDataWrapper *content = mime_part->content; + // buffer_size = camel_data_wrapper_size (content); + buffer = g_malloc (buffer_size); + camel_data_wrapper_write_to_buffer (content, buffer); + + if (mime_part->encoding) { + // encoded_buffer_size = gmime_encoded_size(buffer, buffer_size, encoding); + // encoded_buffer = g_malloc (encoded_buffer_size); + // gmime_encode_buffer (buffer, encoded_buffer, encoding); + // fwrite (encoded_buffer, encoded_buffer_size, 1, file); + // g_free (encoded_buffer); + } else + fwrite (buffer, buffer_size, 1, file); + g_free (buffer); +} + static void _write_to_file(CamelDataWrapper *data_wrapper, FILE *file) { CamelMimePart *mp = CAMEL_MIME_PART (data_wrapper); - WHPTF (file, "Content-type", CAMEL_DATA_WRAPPER(mp)->mime_type); + gmime_content_field_write_to_file(data_wrapper->content_type, file); + gmime_content_field_write_to_file(mp->disposition, file); + WHPTF (file, "Content-Transfer-Encoding:", mp->encoding); WHPTF (file, "Content-Description", mp->description); + WHPTF (file, "Content-MD5", mp->content_MD5); + WHPTF (file, "Content-id", mp->content_id); + fprintf(file,"\n"); + camel_data_wrapper_write_to_file (mp->content, file); } diff --git a/camel/camel-mime-part.h b/camel/camel-mime-part.h index 8f067fd403..0e6f1a0b4d 100644 --- a/camel/camel-mime-part.h +++ b/camel/camel-mime-part.h @@ -49,7 +49,7 @@ typedef struct GHashTable *headers; GString *description; - GString *disposition; + GMimeContentField *disposition; GString *content_id; GString *content_MD5; GList *content_languages; diff --git a/camel/gmime-content-field.c b/camel/gmime-content-field.c new file mode 100644 index 0000000000..e5eb81155e --- /dev/null +++ b/camel/gmime-content-field.c @@ -0,0 +1,91 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* mime-content_field.c : mime content type field utilities */ + +/* + * + * Copyright (C) 1999 Bertrand Guiheneuf . + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + * USA + */ + + + + +#include "gmime-content-field.h" +#include "gstring-util.h" + +GMimeContentField * +gmime_content_field_new (GString *type, GString *subtype) +{ + GMimeContentField *ct; + + ct = g_new (GMimeContentField,1); + ct->type = type; + ct->subtype = subtype; + ct->parameters = g_hash_table_new(g_string_hash, g_string_equal_for_hash); + +} + + +void +gmime_content_field_set_parameter(GMimeContentField *content_field, GString *attribute, GString *value) +{ + gboolean attribute_exists; + GString *old_attribute; + GString *old_value; + + attribute_exists = g_hash_table_lookup_extended (content_field->parameters, + attribute, + (gpointer *) &old_attribute, + (gpointer *) &old_value); + if (attribute_exists) { + g_string_assign(old_value, value->str); + g_string_free (value, TRUE); + g_string_free (attribute, TRUE); + } else + g_hash_table_insert (content_field->parameters, attribute, value); +} + + +static void +_print_parameter (gpointer name, gpointer value, gpointer user_data) +{ + FILE *file = (FILE *)user_data; + + fprintf (file, "; \n %s=%s", ((GString *)name)->str, ((GString *)value)->str); +} + +/** + * gmime_content_field_write_to_file: write a mime content type to a file + * @content_field: content type object + * @file: file to write the content type field + * + * + **/ +void +gmime_content_field_write_to_file(GMimeContentField *content_field, FILE *file) +{ + g_assert(content_field); + if ((content_field->type) && ((content_field->type)->str)) { + fprintf (file, "Content-Type: %s", content_field->type->str); + if ((content_field->subtype) && ((content_field->subtype)->str)) { + fprintf (file, "/%s", content_field->subtype->str); + } + /* print all parameters */ + g_hash_table_foreach (content_field->parameters, _print_parameter, file); + fprintf (file, "\n"); + } +} diff --git a/camel/gmime-content-field.h b/camel/gmime-content-field.h new file mode 100644 index 0000000000..92328dcb2a --- /dev/null +++ b/camel/gmime-content-field.h @@ -0,0 +1,54 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* mime-content_field.h : mime content type field utilities */ + +/* + * + * Copyright (C) 1999 Bertrand Guiheneuf . + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + * USA + */ + + +#ifndef GMIME_CONTENT_FIELD_H +#define GMIME_CONTENT_FIELD_H 1 + + +#ifdef __cplusplus +extern "C" { +#pragma } +#endif /* __cplusplus }*/ + +#include +#include + +typedef struct { + + GString *type; + GString *subtype; + GHashTable *parameters; + +} GMimeContentField; + +GMimeContentField *gmime_content_field_new (GString *type, GString *subtype); +void gmime_content_field_set_parameter(GMimeContentField *content_field, GString *attribute, GString *value); +void gmime_content_field_write_to_file(GMimeContentField *content_field, FILE *file); + + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* GMIME_CONTENT_FIELD_H */ diff --git a/camel/gmime-utils.c b/camel/gmime-utils.c index fde9202730..b2ead8310c 100644 --- a/camel/gmime-utils.c +++ b/camel/gmime-utils.c @@ -23,9 +23,9 @@ -#include "camel-mime-utils.h" +#include "gmime-utils.h" void -camel_mime_utils_write_header_pair_to_file(FILE* file, gchar* name, GString *value) +gmime_write_header_pair_to_file(FILE* file, gchar* name, GString *value) { g_assert(name); diff --git a/camel/gmime-utils.h b/camel/gmime-utils.h index acc86de26e..ca175f4120 100644 --- a/camel/gmime-utils.h +++ b/camel/gmime-utils.h @@ -22,8 +22,8 @@ */ -#ifndef CAMEL_MIME_UTILS_H -#define CAMEL_MIME_UTILS_H 1 +#ifndef GMIME_UTILS_H +#define GMIME_UTILS_H 1 #ifdef __cplusplus @@ -34,7 +34,7 @@ extern "C" { #include #include -void camel_mime_utils_write_header_pair_to_file(FILE* file, gchar* name, GString *value); +void gmime_write_header_pair_to_file(FILE* file, gchar* name, GString *value); @@ -43,4 +43,4 @@ void camel_mime_utils_write_header_pair_to_file(FILE* file, gchar* name, GString } #endif /* __cplusplus */ -#endif /* CAMEL_MIME_UTILS_H */ +#endif /* GMIME_UTILS_H */ -- cgit v1.2.3