[evolution-data-server] Added support for GroupWise soap threading.
- From: Chenthill Palanisamy <pchen src gnome org>
- To: svn-commits-list gnome org
- Subject: [evolution-data-server] Added support for GroupWise soap threading.
- Date: Fri, 5 Jun 2009 05:32:58 -0400 (EDT)
commit 68b18667105809dde360c587929947f0152ff954
Author: Chenthill Palanisamy <pchenthill novell com>
Date: Fri Jun 5 14:56:13 2009 +0530
Added support for GroupWise soap threading.
---
camel/providers/groupwise/camel-groupwise-folder.c | 82 +++++++++++++++++++-
camel/providers/groupwise/camel-groupwise-folder.h | 1 -
.../groupwise/camel-groupwise-transport.c | 10 ++-
servers/groupwise/e-gw-connection.c | 1 +
servers/groupwise/e-gw-item.c | 37 +++++++++
servers/groupwise/e-gw-item.h | 4 +
6 files changed, 127 insertions(+), 8 deletions(-)
diff --git a/camel/providers/groupwise/camel-groupwise-folder.c b/camel/providers/groupwise/camel-groupwise-folder.c
index f19bb00..71fdd09 100644
--- a/camel/providers/groupwise/camel-groupwise-folder.c
+++ b/camel/providers/groupwise/camel-groupwise-folder.c
@@ -1428,6 +1428,67 @@ end1:
return;
}
+static guint8*
+get_md5_digest (const guchar *str)
+{
+ guint8 *digest;
+ gsize length;
+ GChecksum *checksum;
+
+ length = g_checksum_type_get_length (G_CHECKSUM_MD5);
+ digest = g_alloca (length);
+
+ checksum = g_checksum_new (G_CHECKSUM_MD5);
+ g_checksum_update (checksum, str, -1);
+ g_checksum_get_digest (checksum, digest, &length);
+ g_checksum_free (checksum);
+
+ return digest;
+}
+
+static void
+groupwise_folder_set_threading_data (CamelGroupwiseMessageInfo *mi, EGwItem *item)
+{
+ const gchar *parent_threads;
+ gint count = 0;
+ const gchar *message_id = e_gw_item_get_message_id (item);
+ struct _camel_header_references *refs, *scan;
+ guint8 *digest;
+ gchar *msgid;
+
+
+ if (!message_id)
+ return;
+
+ /* set message id */
+ msgid = camel_header_msgid_decode(message_id);
+ digest = get_md5_digest (msgid);
+ memcpy(mi->info.message_id.id.hash, digest, sizeof(mi->info.message_id.id.hash));
+ g_free (msgid);
+
+ parent_threads = e_gw_item_get_parent_thread_ids (item);
+
+ if (!parent_threads)
+ return;
+
+ refs = camel_header_references_decode (parent_threads);
+ count = camel_header_references_list_size(&refs);
+ mi->info.references = g_malloc(sizeof(*mi->info.references) + ((count-1) * sizeof(mi->info.references->references[0])));
+ scan = refs;
+ count = 0;
+
+ while (scan) {
+ digest = get_md5_digest ((const guchar *) scan->id);
+ memcpy(mi->info.references->references [count].id.hash, digest, sizeof(mi->info.message_id.id.hash));
+
+ count++;
+ scan = scan->next;
+ }
+
+ mi->info.references->size = count;
+ camel_header_references_list_clear(&refs);
+}
+
/* Update the GroupWise cache with the list of items passed. should happen in thread. */
static void
gw_update_cache (CamelFolder *folder, GList *list, CamelException *ex, gboolean uid_flag)
@@ -1620,7 +1681,8 @@ gw_update_cache (CamelFolder *folder, GList *list, CamelException *ex, gboolean
mi->info.uid = camel_pstring_strdup (e_gw_item_get_id(item));
mi->info.size = e_gw_item_get_mail_size (item);
mi->info.subject = camel_pstring_strdup(e_gw_item_get_subject(item));
-
+ groupwise_folder_set_threading_data (mi, item);
+
camel_folder_summary_add (folder->summary,(CamelMessageInfo *)mi);
camel_folder_change_info_add_uid (changes, mi->info.uid);
camel_folder_change_info_recent_uid (changes, mi->info.uid);
@@ -1844,6 +1906,7 @@ gw_update_summary ( CamelFolder *folder, GList *list,CamelException *ex)
if (!exists)
mi->info.size = e_gw_item_get_mail_size (item);
mi->info.subject = camel_pstring_strdup(e_gw_item_get_subject(item));
+ groupwise_folder_set_threading_data (mi, item);
if (exists) {
camel_folder_change_info_change_uid (changes, e_gw_item_get_id (item));
@@ -1879,7 +1942,7 @@ groupwise_folder_item_to_msg( CamelFolder *folder,
CamelMultipart *multipart = NULL;
gchar *body = NULL;
gint body_len = 0;
- const gchar *uid = NULL;
+ const gchar *uid = NULL, *message_id, *parent_threads;
gboolean is_text_html = FALSE;
gboolean has_mime_822 = FALSE, ignore_mime_822 = FALSE;
gboolean is_text_html_embed = FALSE;
@@ -1990,7 +2053,20 @@ groupwise_folder_item_to_msg( CamelFolder *folder,
multipart = camel_multipart_new ();
}
- camel_mime_message_set_message_id (msg, uid);
+ if (!has_mime_822 ) {
+ /* Set Message Id */
+ message_id = e_gw_item_get_message_id (item);
+ camel_medium_add_header (CAMEL_MEDIUM (msg), "Message-Id", message_id);
+
+ /* Set parent threads */
+ parent_threads = e_gw_item_get_parent_thread_ids (item);
+ if (parent_threads)
+ camel_medium_add_header (CAMEL_MEDIUM (msg), "References", parent_threads);
+ }
+
+ /* set item id */
+ camel_medium_add_header (CAMEL_MEDIUM (msg), "X-GW-ITEM-ID", uid);
+
type = e_gw_item_get_item_type (item);
if (type == E_GW_ITEM_TYPE_NOTIFICATION)
camel_medium_add_header ( CAMEL_MEDIUM (msg), "X-Notification", "shared-folder");
diff --git a/camel/providers/groupwise/camel-groupwise-folder.h b/camel/providers/groupwise/camel-groupwise-folder.h
index e1a5544..a79fda1 100644
--- a/camel/providers/groupwise/camel-groupwise-folder.h
+++ b/camel/providers/groupwise/camel-groupwise-folder.h
@@ -80,7 +80,6 @@ CamelType camel_groupwise_folder_get_type (void);
/* implemented */
CamelFolder * camel_gw_folder_new(CamelStore *store, const gchar *folder_dir, const gchar *folder_name, CamelException *ex);
void gw_update_summary ( CamelFolder *folder, GList *item_list,CamelException *ex);
-void groupwise_refresh_folder(CamelFolder *folder, CamelException *ex);
G_END_DECLS
diff --git a/camel/providers/groupwise/camel-groupwise-transport.c b/camel/providers/groupwise/camel-groupwise-transport.c
index 75a386e..3aa65af 100644
--- a/camel/providers/groupwise/camel-groupwise-transport.c
+++ b/camel/providers/groupwise/camel-groupwise-transport.c
@@ -44,6 +44,8 @@
#include "camel-groupwise-transport.h"
#include "camel-groupwise-utils.h"
+#define REPLY_VIEW "default message attachments threading"
+
static gboolean groupwise_send_to (CamelTransport *transport,
CamelMimeMessage *message,
CamelAddress *from,
@@ -186,16 +188,16 @@ groupwise_send_to (CamelTransport *transport,
}
item = camel_groupwise_util_item_from_message (cnc, message, from);
-
- reply_request = (gchar *)camel_medium_get_header (CAMEL_MEDIUM (message), "In-Reply-To");
+
+ reply_request = (gchar *)camel_medium_get_header (CAMEL_MEDIUM (message), "X-GW-ORIG-ITEM-ID");
if (reply_request) {
gchar *id;
gint len = strlen (reply_request);
id = (gchar *)g_malloc0 (len-1);
id = memcpy(id, reply_request+2, len-3);
- status = e_gw_connection_reply_item (cnc, id, NULL, &temp_item);
- if (status != E_GW_CONNECTION_STATUS_OK)
+ status = e_gw_connection_reply_item (cnc, id, REPLY_VIEW, &temp_item);
+ if (status != E_GW_CONNECTION_STATUS_OK)
g_warning ("Could not send a replyRequest...continuing without!!\n");
else {
info = e_gw_item_get_link_info (temp_item);
diff --git a/servers/groupwise/e-gw-connection.c b/servers/groupwise/e-gw-connection.c
index ae41722..bb08519 100644
--- a/servers/groupwise/e-gw-connection.c
+++ b/servers/groupwise/e-gw-connection.c
@@ -494,6 +494,7 @@ form_login_request (const gchar *uri, const gchar * username, const gchar * pass
/* build the SOAP message */
msg = e_gw_message_new_with_header (uri, NULL, "loginRequest");
e_gw_message_write_string_parameter (msg, "application", "types", build_timestamp);
+ e_gw_message_write_string_parameter (msg, "version", NULL, "1.02");
soup_soap_message_start_element (msg, "auth", "types", NULL);
soup_soap_message_add_attribute (msg, "type", "types:PlainText", "xsi",
"http://www.w3.org/2001/XMLSchema-instance");
diff --git a/servers/groupwise/e-gw-item.c b/servers/groupwise/e-gw-item.c
index 5ffc568..7be1d15 100644
--- a/servers/groupwise/e-gw-item.c
+++ b/servers/groupwise/e-gw-item.c
@@ -128,6 +128,10 @@ struct _EGwItemPrivate {
gboolean internet;
+ /* Message Threading */
+ gchar *message_id;
+ gchar *parent_threads;
+
/*padding*/
guint padding[10];
};
@@ -482,6 +486,16 @@ e_gw_item_dispose (GObject *object)
g_free (priv->creation_date);
priv->creation_date = NULL;
}
+
+ if (priv->message_id) {
+ g_free (priv->message_id);
+ priv->message_id = NULL;
+ }
+
+ if (priv->parent_threads) {
+ g_free (priv->parent_threads);
+ priv->parent_threads = NULL;
+ }
free_changes (priv->additions);
free_changes (priv->deletions);
@@ -565,6 +579,8 @@ e_gw_item_init (EGwItem *item, EGwItemClass *klass)
priv->msg_body_id = NULL;
priv->has_attachment = FALSE;
priv->internet = FALSE;
+ priv->message_id = NULL;
+ priv->parent_threads = NULL;
item->priv = priv;
@@ -949,6 +965,18 @@ e_gw_item_get_category_name (EGwItem *item)
return item->priv->category_name;
}
+const gchar*
+e_gw_item_get_parent_thread_ids (EGwItem *item)
+{
+ return item->priv->parent_threads;
+}
+
+const gchar*
+e_gw_item_get_message_id (EGwItem *item)
+{
+ return item->priv->message_id;
+}
+
void e_gw_item_set_change (EGwItem *item, EGwItemChangeType change_type, const gchar *field_name, gpointer field_value)
{
GHashTable *hash_table;
@@ -2084,6 +2112,15 @@ e_gw_item_new_from_soap_parameter (const gchar *email, const gchar *container, S
g_free (value);
}
g_free (enabled);
+ } else if (!g_ascii_strcasecmp (name, "threading")) {
+ SoupSoapParameter *subparam;
+
+ subparam = soup_soap_parameter_get_first_child_by_name (child, "parent") ;
+ if (subparam)
+ item->priv->parent_threads = soup_soap_parameter_get_string_value (subparam);
+
+ } else if (!g_ascii_strcasecmp (name, "messageId")) {
+ item->priv->message_id = soup_soap_parameter_get_string_value (child);
}
}
diff --git a/servers/groupwise/e-gw-item.h b/servers/groupwise/e-gw-item.h
index 016af61..8293c0c 100644
--- a/servers/groupwise/e-gw-item.h
+++ b/servers/groupwise/e-gw-item.h
@@ -304,6 +304,10 @@ gboolean e_gw_item_has_attachment (EGwItem *item);
gboolean e_gw_item_is_from_internet (EGwItem *item);
+const gchar *e_gw_item_get_parent_thread_ids (EGwItem *item);
+const gchar* e_gw_item_get_message_id (EGwItem *item);
+
+
typedef struct {
gchar *email;
gchar *display_name;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]