438 lines
18 KiB
Diff
438 lines
18 KiB
Diff
Index: camel/providers/groupwise/camel-groupwise-folder.c
|
|
===================================================================
|
|
RCS file: /cvs/gnome/evolution-data-server/camel/providers/groupwise/camel-groupwise-folder.c,v
|
|
retrieving revision 1.114.2.11
|
|
diff -u -r1.114.2.11 camel/providers/groupwise/camel-groupwise-folder.c
|
|
--- camel/providers/groupwise/camel-groupwise-folder.c 24 Apr 2006 09:59:12 -0000 1.114.2.11
|
|
+++ camel/providers/groupwise/camel-groupwise-folder.c 15 May 2006 18:01:10 -0000
|
|
@@ -1777,7 +1777,6 @@
|
|
CamelGroupwiseStore *gw_store= CAMEL_GROUPWISE_STORE(folder->parent_store);
|
|
CamelGroupwiseStorePrivate *priv = gw_store->priv;
|
|
CamelOfflineStore *offline = (CamelOfflineStore *) folder->parent_store;
|
|
- CamelAddress *recipients;
|
|
EGwConnectionStatus status;
|
|
EGwConnection *cnc;
|
|
EGwItem *item;
|
|
@@ -1804,14 +1803,8 @@
|
|
CAMEL_SERVICE_LOCK (folder->parent_store, connect_lock);
|
|
/*Get the container id*/
|
|
container_id = camel_groupwise_store_container_id_lookup (gw_store, folder->full_name) ;
|
|
-
|
|
- /* FIXME Separate To/CC/BCC? */
|
|
- recipients = CAMEL_ADDRESS (camel_internet_address_new ());
|
|
- camel_address_cat (recipients, CAMEL_ADDRESS (camel_mime_message_get_recipients (message, CAMEL_RECIPIENT_TYPE_TO)));
|
|
- camel_address_cat (recipients, CAMEL_ADDRESS (camel_mime_message_get_recipients (message, CAMEL_RECIPIENT_TYPE_CC)));
|
|
- camel_address_cat (recipients, CAMEL_ADDRESS (camel_mime_message_get_recipients (message, CAMEL_RECIPIENT_TYPE_BCC)));
|
|
-
|
|
- item = camel_groupwise_util_item_from_message (cnc, message, CAMEL_ADDRESS (message->from), recipients);
|
|
+
|
|
+ item = camel_groupwise_util_item_from_message (cnc, message, CAMEL_ADDRESS (message->from));
|
|
/*Set the source*/
|
|
if (!strcmp (folder->name, RECEIVED))
|
|
e_gw_item_set_source (item, "received");
|
|
Index: camel/providers/groupwise/camel-groupwise-transport.c
|
|
===================================================================
|
|
RCS file: /cvs/gnome/evolution-data-server/camel/providers/groupwise/camel-groupwise-transport.c,v
|
|
retrieving revision 1.27
|
|
diff -u -r1.27 camel/providers/groupwise/camel-groupwise-transport.c
|
|
--- camel/providers/groupwise/camel-groupwise-transport.c 23 Jan 2006 10:37:24 -0000 1.27
|
|
+++ camel/providers/groupwise/camel-groupwise-transport.c 15 May 2006 18:01:10 -0000
|
|
@@ -180,7 +180,7 @@
|
|
}
|
|
|
|
|
|
- item = camel_groupwise_util_item_from_message (cnc, message, from, recipients);
|
|
+ item = camel_groupwise_util_item_from_message (cnc, message, from);
|
|
|
|
reply_request = (char *)camel_medium_get_header (CAMEL_MEDIUM (message), "In-Reply-To");
|
|
if (reply_request) {
|
|
Index: camel/providers/groupwise/camel-groupwise-utils.c
|
|
===================================================================
|
|
RCS file: /cvs/gnome/evolution-data-server/camel/providers/groupwise/camel-groupwise-utils.c,v
|
|
retrieving revision 1.29.2.1
|
|
diff -u -r1.29.2.1 camel/providers/groupwise/camel-groupwise-utils.c
|
|
--- camel/providers/groupwise/camel-groupwise-utils.c 21 Mar 2006 10:41:51 -0000 1.29.2.1
|
|
+++ camel/providers/groupwise/camel-groupwise-utils.c 15 May 2006 18:01:10 -0000
|
|
@@ -35,6 +35,8 @@
|
|
#include "camel/camel-multipart.h"
|
|
#include "camel/camel-service.h"
|
|
#include "camel/camel-stream-mem.h"
|
|
+#include "camel/camel-stream-filter.h"
|
|
+#include "camel/camel-mime-filter-charset.h"
|
|
|
|
#include "camel-groupwise-utils.h"
|
|
|
|
@@ -261,7 +263,7 @@
|
|
return 0;
|
|
}
|
|
|
|
-GSList *
|
|
+static GSList *
|
|
add_recipients(GSList *recipient_list, CamelAddress *recipients, int recipient_type)
|
|
{
|
|
int total_add,i;
|
|
@@ -278,42 +280,31 @@
|
|
recipient->display_name = g_strdup (name);
|
|
recipient->type = recipient_type;
|
|
recipient->status = E_GW_ITEM_STAT_NONE;
|
|
- recipient_list= g_slist_append (recipient_list, recipient);
|
|
+ recipient_list = g_slist_prepend (recipient_list, recipient);
|
|
}
|
|
}
|
|
return recipient_list;
|
|
}
|
|
|
|
static void
|
|
-send_as_attachment (EGwConnection *cnc, EGwItem *item, CamelStreamMem *content, char *buffer, CamelContentType *type, CamelDataWrapper *dw, const char *filename, const char *encoding, const char *cid, GSList **attach_list)
|
|
+send_as_attachment (EGwConnection *cnc, EGwItem *item, CamelStreamMem *content, CamelContentType *type, CamelDataWrapper *dw, const char *filename, const char *cid, GSList **attach_list)
|
|
{
|
|
EGwItemLinkInfo *info = NULL;
|
|
EGwConnectionStatus status;
|
|
EGwItemAttachment *attachment;
|
|
EGwItem *temp_item;
|
|
-
|
|
- int len;
|
|
- len = content->buffer->len;
|
|
-
|
|
+
|
|
attachment = g_new0 (EGwItemAttachment, 1);
|
|
- attachment->contentType = g_strdup_printf ("%s/%s", type->type, type->subtype);
|
|
-
|
|
- if (cid) {
|
|
- gchar **t;
|
|
- //strip_lt_gt ((char **)&cid, 2, 3);
|
|
- t = g_strsplit_set (cid,"<>",-1);
|
|
- if (!t[1])
|
|
- attachment->contentid = g_strdup (cid);
|
|
- else
|
|
- attachment->contentid = g_strdup (t[1]);
|
|
- g_strfreev (t);
|
|
- }
|
|
-
|
|
+ attachment->contentType = camel_content_type_simple (type);
|
|
+
|
|
+ if (cid)
|
|
+ attachment->contentid = camel_header_contentid_decode (cid);
|
|
+
|
|
if (filename) {
|
|
- if (!strcmp (attachment->contentType, "application/pgp-signature")) {
|
|
+ if (camel_content_type_is (type, "application", "pgp-signature")) {
|
|
char *temp_str;
|
|
int temp_len;
|
|
- temp_str = soup_base64_encode (buffer, len);
|
|
+ temp_str = soup_base64_encode (content->buffer->data, content->buffer->len);
|
|
temp_len = strlen (temp_str);
|
|
attachment->data = g_strdup (temp_str);
|
|
attachment->size = temp_len;
|
|
@@ -321,23 +312,16 @@
|
|
temp_str = NULL;
|
|
temp_len = 0;
|
|
} else {
|
|
- if (strlen(encoding) > 0) {
|
|
- attachment->data = g_malloc0 (content->buffer->len+1);
|
|
- attachment->data = memcpy (attachment->data,
|
|
- content->buffer->data,
|
|
- content->buffer->len);
|
|
- attachment->size = content->buffer->len;
|
|
- } else {
|
|
- attachment->data = soup_base64_encode(content->buffer->data, content->buffer->len);
|
|
- attachment->size = strlen (attachment->data);
|
|
- }
|
|
+ attachment->data = soup_base64_encode(content->buffer->data, content->buffer->len);
|
|
+ attachment->size = strlen (attachment->data);
|
|
}
|
|
} else {
|
|
char *temp_str;
|
|
int temp_len;
|
|
if (!strcmp (attachment->contentType, "multipart/digest")) {
|
|
+ /* FIXME? */
|
|
} else {
|
|
- temp_str = soup_base64_encode (buffer, len);
|
|
+ temp_str = soup_base64_encode (content->buffer->data, content->buffer->len);
|
|
temp_len = strlen (temp_str);
|
|
attachment->data = g_strdup (temp_str);
|
|
attachment->size = temp_len;
|
|
@@ -347,28 +331,30 @@
|
|
}
|
|
}
|
|
|
|
- if (!strcmp (attachment->contentType, "text/html") || !(strcmp (attachment->contentType, "multipart/alternative"))) {
|
|
+ if (camel_content_type_is (type, "text", "html") || camel_content_type_is (type, "multipart", "alternative")) {
|
|
if (!filename)
|
|
filename = "text.htm";
|
|
- if (!(strcmp (attachment->contentType, "multipart/alternative"))) {
|
|
+ if (camel_content_type_is (type, "multipart", "alternative")) {
|
|
+ /* FIXME: this just feels so wrong... */
|
|
g_free (attachment->contentType);
|
|
attachment->contentType = g_strdup ("text/html");
|
|
}
|
|
}
|
|
|
|
attachment->name = g_strdup (filename ? filename : "");
|
|
- if (!g_ascii_strncasecmp (attachment->contentType, RFC_822, strlen (RFC_822))) {
|
|
- char *temp_id = NULL, *id = NULL;
|
|
- temp_id = (char *)camel_medium_get_header (CAMEL_MEDIUM ((CamelMimeMessage *)dw), "Message-Id");
|
|
- int len = strlen (temp_id);
|
|
-
|
|
- id = (char *)g_malloc0 (len-1);
|
|
- id = memcpy(id, temp_id+2, len-3);
|
|
-
|
|
- status = e_gw_connection_forward_item (cnc, id, NULL, TRUE, &temp_item);
|
|
- if (status != E_GW_CONNECTION_STATUS_OK)
|
|
+ if (camel_content_type_is (type, "message", "rfc822")) {
|
|
+ const char *message_id;
|
|
+ char *msgid;
|
|
+
|
|
+ message_id = camel_medium_get_header (CAMEL_MEDIUM (dw), "Message-Id");
|
|
+ msgid = camel_header_msgid_decode (message_id);
|
|
+
|
|
+ status = e_gw_connection_forward_item (cnc, msgid, NULL, TRUE, &temp_item);
|
|
+ g_free (msgid);
|
|
+
|
|
+ if (status != E_GW_CONNECTION_STATUS_OK) {
|
|
g_warning ("Could not send a forwardRequest...continuing without!!\n");
|
|
- else {
|
|
+ } else {
|
|
GSList *attach_list = e_gw_item_get_attach_id_list (temp_item);
|
|
EGwItemAttachment *temp_attach = (EGwItemAttachment *)attach_list->data;
|
|
attachment->id = g_strdup (temp_attach->id);
|
|
@@ -383,41 +369,36 @@
|
|
info = e_gw_item_get_link_info (temp_item);
|
|
e_gw_item_set_link_info (item, info);
|
|
}
|
|
- //attachment->id = g_strdup (id);
|
|
- g_free (id);
|
|
}
|
|
|
|
*attach_list = g_slist_append (*attach_list, attachment);
|
|
}
|
|
|
|
EGwItem *
|
|
-camel_groupwise_util_item_from_message (EGwConnection *cnc, CamelMimeMessage *message, CamelAddress *from, CamelAddress *recipients)
|
|
+camel_groupwise_util_item_from_message (EGwConnection *cnc, CamelMimeMessage *message, CamelAddress *from)
|
|
{
|
|
EGwItem *item;
|
|
EGwItemOrganizer *org = g_new0 (EGwItemOrganizer, 1);
|
|
-
|
|
const char *display_name = NULL, *email = NULL;
|
|
char *send_options = NULL;
|
|
CamelMultipart *mp;
|
|
- GSList *recipient_list = NULL, *attach_list = NULL;
|
|
+ GSList *recipient_list = NULL, *attach_list = NULL;
|
|
+ CamelAddress *recipients;
|
|
|
|
/*Egroupwise item*/
|
|
item = e_gw_item_new_empty ();
|
|
|
|
/*populate recipient list*/
|
|
- camel_address_remove(recipients,-1);
|
|
- camel_address_cat (recipients, CAMEL_ADDRESS (camel_mime_message_get_recipients (message, CAMEL_RECIPIENT_TYPE_TO)));
|
|
+ recipients = CAMEL_ADDRESS (camel_mime_message_get_recipients (message, CAMEL_RECIPIENT_TYPE_TO));
|
|
recipient_list=add_recipients(recipient_list,recipients,E_GW_ITEM_RECIPIENT_TO);
|
|
-
|
|
- camel_address_remove(recipients,-1);
|
|
- camel_address_cat (recipients, CAMEL_ADDRESS (camel_mime_message_get_recipients (message, CAMEL_RECIPIENT_TYPE_CC)));
|
|
+
|
|
+ recipients = CAMEL_ADDRESS (camel_mime_message_get_recipients (message, CAMEL_RECIPIENT_TYPE_CC));
|
|
recipient_list=add_recipients(recipient_list,recipients,E_GW_ITEM_RECIPIENT_CC);
|
|
|
|
- camel_address_remove(recipients,-1);
|
|
- camel_address_cat (recipients, CAMEL_ADDRESS (camel_mime_message_get_recipients (message, CAMEL_RECIPIENT_TYPE_BCC)));
|
|
+ recipients = CAMEL_ADDRESS (camel_mime_message_get_recipients (message, CAMEL_RECIPIENT_TYPE_BCC));
|
|
recipient_list=add_recipients(recipient_list,recipients,E_GW_ITEM_RECIPIENT_BC);
|
|
-
|
|
-
|
|
+ recipient_list = g_slist_reverse (recipient_list);
|
|
+
|
|
/** Get the mime parts from CamelMimemessge **/
|
|
mp = (CamelMultipart *)camel_medium_get_content_object (CAMEL_MEDIUM (message));
|
|
if(!mp) {
|
|
@@ -434,25 +415,43 @@
|
|
CamelStreamMem *content = (CamelStreamMem *)camel_stream_mem_new ();
|
|
CamelDataWrapper *dw = NULL;
|
|
CamelContentType *type;
|
|
- char *buffer = NULL;
|
|
- char *content_type = NULL;
|
|
-
|
|
+
|
|
dw = camel_medium_get_content_object (CAMEL_MEDIUM (message));
|
|
type = camel_mime_part_get_content_type((CamelMimePart *)message);
|
|
- content_type = g_strdup_printf ("%s/%s", type->type, type->subtype);
|
|
- camel_data_wrapper_write_to_stream(dw, (CamelStream *)content);
|
|
- buffer = g_malloc0 (content->buffer->len+1);
|
|
- buffer = memcpy (buffer, content->buffer->data, content->buffer->len);
|
|
|
|
- if (!strcmp(content_type, "text/plain")) {
|
|
- e_gw_item_set_content_type (item, content_type);
|
|
- e_gw_item_set_message (item, buffer);
|
|
+ if (camel_content_type_is (type, "text", "plain")) {
|
|
+ CamelStream *filtered_stream;
|
|
+ CamelMimeFilter *filter;
|
|
+ const char *charset;
|
|
+ char *content_type;
|
|
+
|
|
+ content_type = camel_content_type_simple (type);
|
|
+ e_gw_item_set_content_type (item, content_type);
|
|
+ g_free (content_type);
|
|
+
|
|
+ charset = camel_content_type_param (type, "charset");
|
|
+ if (charset && g_ascii_strcasecmp (charset, "US-ASCII") && g_ascii_strcasecmp (charset, "UTF-8")) {
|
|
+ filter = camel_mime_filter_charset_new_convert (charset, "UTF-8");
|
|
+ filtered_stream = camel_stream_filter_new_with_stream ((CamelStream *) content);
|
|
+ camel_stream_filter_add ((CamelStreamFilter *) filtered_stream, filter);
|
|
+ camel_object_unref (filter);
|
|
+ } else {
|
|
+ /* US-ASCII or UTF-8 */
|
|
+ filtered_stream = (CamelStream *) content;
|
|
+ camel_object_ref (content);
|
|
+ }
|
|
+
|
|
+ camel_data_wrapper_decode_to_stream (dw, filtered_stream);
|
|
+ camel_stream_flush (filtered_stream);
|
|
+ camel_object_unref (filtered_stream);
|
|
+
|
|
+ camel_stream_write ((CamelStream *) content, "", 1);
|
|
+ e_gw_item_set_message (item, content->buffer->data);
|
|
} else {
|
|
- send_as_attachment (cnc, item, content, buffer, type, dw, NULL, "", NULL, &attach_list);
|
|
+ camel_data_wrapper_decode_to_stream (dw, (CamelStream *) content);
|
|
+ send_as_attachment (cnc, item, content, type, dw, NULL, NULL, &attach_list);
|
|
}
|
|
-
|
|
- g_free (buffer);
|
|
- g_free (content_type);
|
|
+
|
|
camel_object_unref (content);
|
|
}
|
|
/*Populate EGwItem*/
|
|
@@ -589,10 +588,7 @@
|
|
CamelStreamMem *content = (CamelStreamMem *)camel_stream_mem_new ();
|
|
CamelDataWrapper *dw = NULL;
|
|
const char *disposition, *filename;
|
|
- char *buffer = NULL;
|
|
- char *mime_type = NULL;
|
|
const char *content_id = NULL;
|
|
- char *encoding;
|
|
gboolean is_alternative = FALSE;
|
|
/*
|
|
* XXX:
|
|
@@ -601,55 +597,71 @@
|
|
*/
|
|
part = camel_multipart_get_part (mp, i);
|
|
type = camel_mime_part_get_content_type(part);
|
|
- if (CAMEL_IS_MULTIPART ((CamelMultipart *)camel_medium_get_content_object (part))) {
|
|
- do_multipart (cnc, item, (CamelMultipart *)camel_medium_get_content_object (part), attach_list);
|
|
- continue;
|
|
- } else
|
|
dw = camel_medium_get_content_object (CAMEL_MEDIUM (part));
|
|
+
|
|
+ if (CAMEL_IS_MULTIPART (dw)) {
|
|
+ do_multipart (cnc, item, (CamelMultipart *) camel_medium_get_content_object ((CamelMedium *) part), attach_list);
|
|
+ continue;
|
|
+ }
|
|
+
|
|
if (type->subtype && !strcmp (type->subtype, "alternative")) {
|
|
+ /* eh... I don't think this code will ever get hit? */
|
|
CamelMimePart *temp_part;
|
|
const char *cid = NULL;
|
|
CamelStreamMem *temp_content = (CamelStreamMem *)camel_stream_mem_new ();
|
|
temp_part = camel_multipart_get_part ((CamelMultipart *)dw, 1);
|
|
CamelDataWrapper *temp_dw = NULL;
|
|
+
|
|
if (temp_part) {
|
|
is_alternative = TRUE;
|
|
temp_dw = camel_medium_get_content_object (CAMEL_MEDIUM (temp_part));
|
|
camel_data_wrapper_write_to_stream(temp_dw, (CamelStream *)temp_content);
|
|
- buffer = g_malloc0 (temp_content->buffer->len+1);
|
|
- buffer = memcpy (buffer, temp_content->buffer->data, temp_content->buffer->len);
|
|
filename = camel_mime_part_get_filename (temp_part);
|
|
disposition = camel_mime_part_get_disposition (temp_part);
|
|
- mime_type = camel_data_wrapper_get_mime_type (temp_dw);
|
|
cid = camel_mime_part_get_content_id (temp_part);
|
|
- g_print ("%s:%s\n",filename,camel_transfer_encoding_to_string(temp_part->encoding));
|
|
- send_as_attachment (cnc, item, temp_content, buffer, type, temp_dw, filename, "", cid, attach_list);
|
|
- g_free (buffer);
|
|
- g_free (mime_type);
|
|
+ send_as_attachment (cnc, item, temp_content, type, temp_dw, filename, cid, attach_list);
|
|
}
|
|
camel_object_unref (temp_content);
|
|
continue;
|
|
}
|
|
|
|
-
|
|
- camel_data_wrapper_write_to_stream(dw, (CamelStream *)content);
|
|
- buffer = g_malloc0 (content->buffer->len+1);
|
|
- encoding = camel_transfer_encoding_to_string (part->encoding);
|
|
- filename = camel_mime_part_get_filename (part);
|
|
- buffer = memcpy (buffer, content->buffer->data, content->buffer->len);
|
|
- disposition = camel_mime_part_get_disposition (part);
|
|
- mime_type = camel_data_wrapper_get_mime_type (dw);
|
|
- content_id = camel_mime_part_get_content_id (part);
|
|
-
|
|
- if (i == 0 && !strcmp (mime_type, "text/plain") ) {
|
|
- e_gw_item_set_content_type (item, mime_type);
|
|
- e_gw_item_set_message (item, buffer);
|
|
+ if (i == 0 && camel_content_type_is (type, "text", "plain")) {
|
|
+ CamelStream *filtered_stream;
|
|
+ CamelMimeFilter *filter;
|
|
+ const char *charset;
|
|
+ char *content_type;
|
|
+
|
|
+ content_type = camel_content_type_simple (type);
|
|
+ e_gw_item_set_content_type (item, content_type);
|
|
+ g_free (content_type);
|
|
+
|
|
+ charset = camel_content_type_param (type, "charset");
|
|
+ if (charset && g_ascii_strcasecmp (charset, "US-ASCII") && g_ascii_strcasecmp (charset, "UTF-8")) {
|
|
+ filter = camel_mime_filter_charset_new_convert (charset, "UTF-8");
|
|
+ filtered_stream = camel_stream_filter_new_with_stream ((CamelStream *) content);
|
|
+ camel_stream_filter_add ((CamelStreamFilter *) filtered_stream, filter);
|
|
+ camel_object_unref (filter);
|
|
+ } else {
|
|
+ /* US-ASCII or UTF-8 */
|
|
+ filtered_stream = (CamelStream *) content;
|
|
+ camel_object_ref (content);
|
|
+ }
|
|
+
|
|
+ camel_data_wrapper_decode_to_stream (dw, filtered_stream);
|
|
+ camel_stream_flush (filtered_stream);
|
|
+ camel_object_unref (filtered_stream);
|
|
+
|
|
+ camel_stream_write ((CamelStream *) content, "", 1);
|
|
+ e_gw_item_set_message (item, content->buffer->data);
|
|
} else {
|
|
- send_as_attachment (cnc, item, content, buffer, type, dw, filename, encoding, content_id, attach_list);
|
|
+ filename = camel_mime_part_get_filename (part);
|
|
+ disposition = camel_mime_part_get_disposition (part);
|
|
+ content_id = camel_mime_part_get_content_id (part);
|
|
+
|
|
+ camel_data_wrapper_decode_to_stream (dw, (CamelStream *) content);
|
|
+ send_as_attachment (cnc, item, content, type, dw, filename, content_id, attach_list);
|
|
}
|
|
-
|
|
- g_free (buffer);
|
|
- g_free (mime_type);
|
|
+
|
|
camel_object_unref (content);
|
|
} /*end of for*/
|
|
}
|
|
Index: camel/providers/groupwise/camel-groupwise-utils.h
|
|
===================================================================
|
|
RCS file: /cvs/gnome/evolution-data-server/camel/providers/groupwise/camel-groupwise-utils.h,v
|
|
retrieving revision 1.10
|
|
diff -u -r1.10 camel/providers/groupwise/camel-groupwise-utils.h
|
|
--- camel/providers/groupwise/camel-groupwise-utils.h 4 Jan 2006 16:48:35 -0000 1.10
|
|
+++ camel/providers/groupwise/camel-groupwise-utils.h 15 May 2006 18:01:10 -0000
|
|
@@ -71,9 +71,9 @@
|
|
int e_path_rmdir (const char *prefix, const char *vpath);
|
|
|
|
|
|
-EGwItem *camel_groupwise_util_item_from_message (EGwConnection *cnc, CamelMimeMessage *message, CamelAddress *from, CamelAddress *recipients);
|
|
+EGwItem *camel_groupwise_util_item_from_message (EGwConnection *cnc, CamelMimeMessage *message, CamelAddress *from);
|
|
+
|
|
void do_flags_diff (flags_diff_t *diff, guint32 old, guint32 _new);
|
|
-GSList *add_recipients(GSList *recipient_list, CamelAddress *recipients, int recipient_type);
|
|
char *gw_concat ( const char *prefix, const char *suffix);
|
|
void strip_lt_gt (char **string, int s_offset, int e_offset);
|
|
#endif
|