evolution r36062 - branches/mail-dbus-remoting/mail



Author: sragavan
Date: Tue Aug 26 04:18:44 2008
New Revision: 36062
URL: http://svn.gnome.org/viewvc/evolution?rev=36062&view=rev

Log:
Merge Sankar's changes again ;-)


Modified:
   branches/mail-dbus-remoting/mail/camel-store-remote-impl.c
   branches/mail-dbus-remoting/mail/camel-store-remote.c
   branches/mail-dbus-remoting/mail/camel-store-remote.h
   branches/mail-dbus-remoting/mail/evo-dbus.h

Modified: branches/mail-dbus-remoting/mail/camel-store-remote-impl.c
==============================================================================
--- branches/mail-dbus-remoting/mail/camel-store-remote-impl.c	(original)
+++ branches/mail-dbus-remoting/mail/camel-store-remote-impl.c	Tue Aug 26 04:18:44 2008
@@ -4,6 +4,7 @@
  * */
 
 #include <glib.h>
+#include <glib/gi18n.h>
 #include "mail-dbus.h"
 #include <camel/camel.h>
 
@@ -16,78 +17,222 @@
 GHashTable *folder_hash = NULL;
 
 static DBusHandlerResult
-dbus_listener_message_handler (DBusConnection *connection,
-                                    DBusMessage    *message,
-                                    void           *user_data);
+dbus_listener_message_handler(DBusConnection * connection,
+			      DBusMessage * message, void *user_data);
 
-static DBusHandlerResult
-dbus_listener_message_handler (DBusConnection *connection, DBusMessage *message, void *user_data)
+void camel_store_remote_impl_init(void);
+int camel_store_get_specific_folder_remote(DBusConnection * connection,
+					   DBusMessage * message,
+					   const char *method,
+					   DBusMessage * reply);
+
+int camel_store_get_specific_folder_remote(DBusConnection * connection,
+					   DBusMessage * message,
+					   const char *method,
+					   DBusMessage * reply)
 {
-		const char *method = dbus_message_get_member (message);
-		DBusMessage *reply;
-
-		printf ("D-Bus message: obj_path = '%s' interface = '%s' method = '%s' destination = '%s'\n",
-						dbus_message_get_path (message),
-						dbus_message_get_interface (message),
-						dbus_message_get_member (message),
-						dbus_message_get_destination (message));
-
-		reply = dbus_message_new_method_return (message);
-
-		if (strcmp (method, "camel_store_get_folder")) {
-			guint32 flags;
-			CamelException *ex;
-			CamelFolder *folder;
-			CamelStore *store;
-			char *err, *folder_hash_key, *store_hash_key, *folder_name;
+	CamelException *ex;
+	CamelFolder *folder;
+	CamelStore *store;
+	char *err, *folder_hash_key, *store_hash_key;
 
-			int ret = dbus_message_get_args (message, 
+	int ret = dbus_message_get_args(message,
 					NULL,
 					DBUS_TYPE_STRING, &store_hash_key,
-					DBUS_TYPE_STRING, &folder_name,
-					DBUS_TYPE_UINT32, &flags,
 					DBUS_TYPE_INVALID);
 
-			store = g_hash_table_lookup (store_hash, store_hash_key);
-			if (!store) {
-				dbus_message_append_args (reply, DBUS_TYPE_STRING, "", DBUS_TYPE_STRING, _("Store not found"), DBUS_TYPE_INVALID);
-				goto fail;
-			}
-
-			camel_exception_init (ex);
-			folder = camel_store_get_folder (store, folder_name, flags, ex);
-			if (!folder) {
-				err = g_strdup (camel_exception_get_description (ex));
-			} else {
-				err = g_strdup ("");
-				/* FIXME: Free all */
-				folder_hash_key = e_dbus_get_folder_hash (camel_service_get_url((CamelService *)folder->parent_store), folder->full_name); 
-				g_hash_table_insert (folder_hash, folder_hash_key, folder);
-				g_free (folder_hash_key);
-			}
-			camel_exception_free (ex);
-
-			dbus_message_append_args (reply, DBUS_TYPE_STRING, folder_hash_key, DBUS_TYPE_STRING, err, DBUS_TYPE_INVALID);
-			g_free (folder_hash_key);
-			g_free (err);
-
-		}
-fail:
-	dbus_connection_send (connection, reply, NULL);
-	dbus_message_unref (reply);
+	if (ret)
+		return ret;
 
-	return DBUS_HANDLER_RESULT_HANDLED;
+	store = g_hash_table_lookup(store_hash, store_hash_key);
+	if (!store) {
+		dbus_message_append_args(reply, DBUS_TYPE_STRING, "",
+					 DBUS_TYPE_STRING, _("Store not found"),
+					 DBUS_TYPE_INVALID);
+		return -1;
+	}
+
+	camel_exception_init(ex);
+
+	if (g_str_has_suffix(method, "inbox"))
+		folder = camel_store_get_inbox(store, ex);
+	else if (g_str_has_suffix(method, "trash"))
+		folder = camel_store_get_trash(store, ex);
+	else if (g_str_has_suffix(method, "junk"))
+		folder = camel_store_get_junk(store, ex);
+
+	if (!folder) {
+		err = g_strdup(camel_exception_get_description(ex));
+	} else {
+		err = g_strdup("");
+		/* FIXME: Free all */
+		folder_hash_key =
+		    e_dbus_get_folder_hash(camel_service_get_url
+					   ((CamelService *) folder->
+					    parent_store), folder->full_name);
+		g_hash_table_insert(folder_hash, folder_hash_key, folder);
+		g_free(folder_hash_key);
+	}
+	camel_exception_free(ex);
+
+	dbus_message_append_args(reply, DBUS_TYPE_STRING, folder_hash_key,
+				 DBUS_TYPE_STRING, err, DBUS_TYPE_INVALID);
+	g_free(folder_hash_key);
+	g_free(err);
+	return 0;
+}
+
+static DBusHandlerResult
+dbus_listener_message_handler(DBusConnection * connection,
+			      DBusMessage * message, void *user_data)
+{
+	const char *method = dbus_message_get_member(message);
+	DBusMessage *reply;
+
+	printf
+	    ("D-Bus message: obj_path = '%s' interface = '%s' method = '%s' destination = '%s'\n",
+	     dbus_message_get_path(message),
+	     dbus_message_get_interface(message),
+	     dbus_message_get_member(message),
+	     dbus_message_get_destination(message));
+
+	reply = dbus_message_new_method_return(message);
+
+	if (g_strcmp0(method, "camel_store_get_folder")) {
+		guint32 flags;
+		CamelException *ex;
+		CamelFolder *folder;
+		CamelStore *store;
+		char *err, *folder_hash_key, *store_hash_key, *folder_name;
+
+		int ret = dbus_message_get_args(message,
+						NULL,
+						DBUS_TYPE_STRING,
+						&store_hash_key,
+						DBUS_TYPE_STRING, &folder_name,
+						DBUS_TYPE_UINT32, &flags,
+						DBUS_TYPE_INVALID);
+
+		if (ret)
+			goto fail;
+
+		store = g_hash_table_lookup(store_hash, store_hash_key);
+		if (!store) {
+			dbus_message_append_args(reply, DBUS_TYPE_STRING, "",
+						 DBUS_TYPE_STRING,
+						 _("Store not found"),
+						 DBUS_TYPE_INVALID);
+			goto fail;
+		}
 
+		camel_exception_init(ex);
+		folder = camel_store_get_folder(store, folder_name, flags, ex);
+		if (!folder) {
+			err = g_strdup(camel_exception_get_description(ex));
+		} else {
+			err = g_strdup("");
+			/* FIXME: Free all */
+			folder_hash_key =
+			    e_dbus_get_folder_hash(camel_service_get_url
+						   ((CamelService *) folder->
+						    parent_store),
+						   folder->full_name);
+			g_hash_table_insert(folder_hash, folder_hash_key,
+					    folder);
+			g_free(folder_hash_key);
+		}
+		camel_exception_free(ex);
+
+		dbus_message_append_args(reply, DBUS_TYPE_STRING,
+					 folder_hash_key, DBUS_TYPE_STRING, err,
+					 DBUS_TYPE_INVALID);
+		g_free(folder_hash_key);
+		g_free(err);
+
+	} else if (g_strcmp0(method, "camel_store_get_inbox") ||
+		   g_strcmp0(method, "camel_store_get_trash") ||
+		   g_strcmp0(method, "camel_store_get_junk")) {
+		camel_store_get_specific_folder_remote(connection, message,
+						       method, reply);
+	} else if (g_strcmp0(method, "camel_store_delete_folder")) {
+		char *folder_name, *store_hash_key;
+		CamelStore *store;
+		CamelException *ex;
+		int ret = dbus_message_get_args(message,
+						NULL,
+						DBUS_TYPE_STRING,
+						&store_hash_key,
+						DBUS_TYPE_STRING, &folder_name,
+						DBUS_TYPE_INVALID);
+
+		if (ret) {
+			dbus_message_append_args(reply, DBUS_TYPE_STRING,
+						 _("Arguments not parseable"),
+						 DBUS_TYPE_INVALID);
+			goto fail;
+		}
+
+		store = g_hash_table_lookup(store_hash, store_hash_key);
+		if (!store) {
+			dbus_message_append_args(reply, DBUS_TYPE_STRING,
+						 _("Store not found"),
+						 DBUS_TYPE_INVALID);
+			goto fail;
+		}
+
+		camel_exception_init(ex);
+		/* FIXME: camel_store_delete_folder should have sane return values and the exception should be used properly */
+		camel_store_delete_folder(store, folder_name, ex);
+		camel_exception_free(ex);
+	} else if (g_strcmp0(method, "camel_store_rename_folder")) {
+		char *old_folder_name, *new_folder_name, *store_hash_key;
+		CamelStore *store;
+		CamelException *ex;
+
+		int ret = dbus_message_get_args(message,
+						NULL,
+						DBUS_TYPE_STRING,
+						&store_hash_key,
+						DBUS_TYPE_STRING,
+						&old_folder_name,
+						DBUS_TYPE_STRING,
+						&new_folder_name,
+						DBUS_TYPE_INVALID);
+
+		if (ret) {
+			dbus_message_append_args(reply, DBUS_TYPE_STRING,
+						 _("Arguments not parseable"),
+						 DBUS_TYPE_INVALID);
+			goto fail;
+		}
+
+		store = g_hash_table_lookup(store_hash, store_hash_key);
+		if (!store) {
+			dbus_message_append_args(reply, DBUS_TYPE_STRING,
+						 _("Store not found"),
+						 DBUS_TYPE_INVALID);
+			goto fail;
+		}
+
+		camel_exception_init(ex);
+		/* FIXME: camel_store_delete_folder should have sane return values and the exception should be used properly */
+		camel_store_rename_folder(store, old_folder_name,
+					  new_folder_name, ex);
+		camel_exception_free(ex);
+	}
+      fail:
+	dbus_connection_send(connection, reply, NULL);
+	dbus_message_unref(reply);
+
+	return DBUS_HANDLER_RESULT_HANDLED;
 
 }
 
-void
-camel_store_remote_impl_init ()
+void camel_store_remote_impl_init()
 {
 	store_setup = TRUE;
-	store_hash = g_hash_table_new (g_str_hash, g_str_equal);
-	folder_hash = g_hash_table_new (g_str_hash, g_str_equal);
-	e_dbus_register_handler (CAMEL_STORE_OBJECT_PATH, dbus_listener_message_handler, NULL);
+	store_hash = g_hash_table_new(g_str_hash, g_str_equal);
+	folder_hash = g_hash_table_new(g_str_hash, g_str_equal);
+	e_dbus_register_handler(CAMEL_STORE_OBJECT_PATH,
+				dbus_listener_message_handler, NULL);
 }
-
-

Modified: branches/mail-dbus-remoting/mail/camel-store-remote.c
==============================================================================
--- branches/mail-dbus-remoting/mail/camel-store-remote.c	(original)
+++ branches/mail-dbus-remoting/mail/camel-store-remote.c	Tue Aug 26 04:18:44 2008
@@ -4,6 +4,7 @@
  * */
 
 #include <mail-dbus.h>
+#include <evo-dbus.h>
 #include <dbind.h>
 #include <camel/camel-folder.h>
 #include "camel-store-remote.h"
@@ -13,30 +14,112 @@
 #define CAMEL_STORE_INTERFACE "org.gnome.evolution.camel.store"
 #define CAMEL_STORE_OBJECT_PATH "/org/gnome/evolution/camel/store"
 
+CamelFolder *camel_store_get_folder_remote(CamelStoreRemote * store,
+					   const char *folder_name,
+					   guint32 flags)
+{
+	DBusError error;
+	char *err;
+	char *shash;
+
+	dbus_error_init(&error);
+	/* Invoke the appropriate dbind call to CamelStoreGetFolder */
+	dbind_context_method_call(evolution_dbus_peek_context(),
+				  CAMEL_DBUS_NAME,
+				  CAMEL_STORE_OBJECT_PATH,
+				  CAMEL_STORE_INTERFACE,
+				  "camel_store_get_folder",
+				  &error,
+				  "ssu=>ss", store->object_id, folder_name,
+				  flags, &shash, &err);
+
+	CamelFolder *folder = g_hash_table_lookup(folder_hash, shash);
+	return folder;
+}
+
+static CamelFolder *camel_store_get_specific_folder_remote(CamelStoreRemote *
+							   store,
+							   const char *method)
+{
+	gboolean ret;
+	DBusError error;
+	char *err;
+	char *fhash;
+
+	dbus_error_init(&error);
+	/* Invoke the appropriate dbind call to CamelStoreGetFolder */
+	ret = dbind_context_method_call(evolution_dbus_peek_context(),
+					CAMEL_DBUS_NAME,
+					CAMEL_STORE_OBJECT_PATH,
+					CAMEL_STORE_INTERFACE,
+					method,
+					&error,
+					"s=>ss", store->object_id, &fhash,
+					&err);
+
+	if (ret != DBUS_HANDLER_RESULT_HANDLED) {
+		return NULL;
+	} else {
+		CamelFolder *folder = g_hash_table_lookup(folder_hash, fhash);
+		return folder;
+	}
+}
+
+CamelFolder *camel_store_get_inbox_remote(CamelStoreRemote * store)
+{
+	return (camel_store_get_specific_folder_remote
+		(store, "camel_store_get_inbox"));
+}
+
+CamelFolder *camel_store_get_trash_remote(CamelStoreRemote * store)
+{
+	return (camel_store_get_specific_folder_remote
+		(store, "camel_store_get_trash"));
+}
+
+CamelFolder *camel_store_get_junk_remote(CamelStoreRemote * store)
+{
+	return (camel_store_get_specific_folder_remote
+		(store, "camel_store_get_junk"));
+}
+
+void
+camel_store_delete_folder_remote(CamelStoreRemote * store,
+				 const char *folder_name)
+{
+	gboolean ret;
+	DBusError error;
+	char *err;
+
+	dbus_error_init(&error);
+
+	ret = dbind_context_method_call(evolution_dbus_peek_context(),
+					CAMEL_DBUS_NAME,
+					CAMEL_STORE_OBJECT_PATH,
+					CAMEL_STORE_INTERFACE,
+					"camel_store_create_folder",
+					&error,
+					"ss=>s", store->object_id, folder_name,
+					&err);
+}
 
-CamelFolder * 
-camel_store_remote_get_folder (CamelStoreRemote *store, const char *folder_name, guint32 flags)
+void
+camel_store_rename_folder_remote(CamelStoreRemote * store,
+				 const char *old_folder_name,
+				 const char *new_folder_name)
 {
-		gboolean ret;
-		DBusError error;
-		char *err;
-		char *shash;
-
-		dbus_error_init (&error);
-		/* Invoke the appropriate dbind call to CamelStoreGetFolder */
-		ret = dbind_context_method_call (evolution_dbus_peek_context(), 
-						CAMEL_DBUS_NAME,
-						CAMEL_STORE_OBJECT_PATH,
-						CAMEL_STORE_INTERFACE,
-						"camel_store_get_folder",
-						&error, 
-						"ssu=>ss", store->object_id, folder_name, flags, &shash, &err); 
-
-
-		if (ret != DBUS_HANDLER_RESULT_HANDLED) {
-				return NULL;
-		} else {
-			CamelFolder *folder = g_hash_table_lookup (folder_hash, shash);
-			return folder;
-		}
+	gboolean ret;
+	DBusError error;
+	char *err;
+
+	dbus_error_init(&error);
+
+	ret = dbind_context_method_call(evolution_dbus_peek_context(),
+					CAMEL_DBUS_NAME,
+					CAMEL_STORE_OBJECT_PATH,
+					CAMEL_STORE_INTERFACE,
+					"camel_store_rename_folder",
+					&error,
+					"sss=>s", store->object_id,
+					old_folder_name, new_folder_name, &err);
 }

Modified: branches/mail-dbus-remoting/mail/camel-store-remote.h
==============================================================================
--- branches/mail-dbus-remoting/mail/camel-store-remote.h	(original)
+++ branches/mail-dbus-remoting/mail/camel-store-remote.h	Tue Aug 26 04:18:44 2008
@@ -3,6 +3,8 @@
  *
  * */
 
+#include <camel/camel.h>
+
 typedef struct {
 	char *object_id;
 } CamelFolderRemote;
@@ -10,3 +12,16 @@
 typedef struct {
 	char *object_id;
 } CamelStoreRemote;
+
+CamelFolder *camel_store_get_folder_remote(CamelStoreRemote * store,
+					   const char *folder_name,
+					   guint32 flags);
+CamelFolder *camel_store_get_inbox_remote(CamelStoreRemote * store);
+CamelFolder *camel_store_get_trash_remote(CamelStoreRemote * store);
+CamelFolder *camel_store_get_junk_remote(CamelStoreRemote * store);
+
+void camel_store_delete_folder_remote(CamelStoreRemote * store,
+				      const char *folder_name);
+void camel_store_rename_folder_remote(CamelStoreRemote * store,
+				      const char *old_folder_name,
+				      const char *new_folder_name);

Modified: branches/mail-dbus-remoting/mail/evo-dbus.h
==============================================================================
--- branches/mail-dbus-remoting/mail/evo-dbus.h	(original)
+++ branches/mail-dbus-remoting/mail/evo-dbus.h	Tue Aug 26 04:18:44 2008
@@ -9,7 +9,7 @@
 #include <string.h>
 #define DBUS_API_SUBJECT_TO_CHANGE
 #include <dbind.h>
-#include <dbine-any.h>
+#include <dbind-any.h>
 
 
 int evolution_dbus_init (void);



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]