2007-06-03 Christian Kellner <ckellner@openismus.com>
authorChristian Kellner <ckellner@openismus.com>
Sun, 3 Jun 2007 11:33:58 +0000 (11:33 +0000)
committerChristian Kellner <ckellner@openismus.com>
Sun, 3 Jun 2007 11:33:58 +0000 (11:33 +0000)
* libmodest-dbus-client/libmodest-dbus-client.h:
* libmodest-dbus-client/libmodest-dbus-client.c:
(libmodest_dbus_client_delete_message):
Implement deletion of messages (Client side).

(modest_search_hit_free),
(modest_search_hit_list_free):
Utility functions to free the result hits.

* src/dbus_api/modest-dbus-api.h:
* src/dbus_api/modest-dbus-callbacks.c:
(on_delete_message),
(modest_dbus_req_handler):
Implement deletion of messages (Server side).

* tests/dbus_api/test_search.c: (main):
Free the hits.

* tests/dbus_api/Makefile.am:
* tests/dbus_api/test_delete_message:
Add little test for the message deletion logic

pmo-trunk-r2054

ChangeLog2
libmodest-dbus-client/libmodest-dbus-client.c
libmodest-dbus-client/libmodest-dbus-client.h
src/dbus_api/modest-dbus-api.h
src/dbus_api/modest-dbus-callbacks.c
tests/dbus_api/Makefile.am
tests/dbus_api/test_delete_message.c [new file with mode: 0644]
tests/dbus_api/test_search.c

index 6d4ff91..eb21ecf 100644 (file)
@@ -1,3 +1,27 @@
+2007-06-03  Christian Kellner  <ckellner@openismus.com>
+
+       * libmodest-dbus-client/libmodest-dbus-client.h:
+       * libmodest-dbus-client/libmodest-dbus-client.c:
+       (libmodest_dbus_client_delete_message):
+       Implement deletion of messages (Client side).
+
+       (modest_search_hit_free),
+       (modest_search_hit_list_free):
+       Utility functions to free the result hits.
+
+       * src/dbus_api/modest-dbus-api.h:
+       * src/dbus_api/modest-dbus-callbacks.c:
+       (on_delete_message),
+       (modest_dbus_req_handler):
+       Implement deletion of messages (Server side).
+       
+       * tests/dbus_api/test_search.c: (main):
+       Free the hits.
+
+       * tests/dbus_api/Makefile.am:
+       * tests/dbus_api/test_delete_message:
+       Add little test for the message deletion logic
+
 2007-06-03  Armin Burgmeier  <armin@openismus.com>
 
        * src/modest-mail-operation-queue.c: Fixed a deadlock in finalize()
index 0e96687..2590c39 100644 (file)
@@ -171,14 +171,48 @@ libmodest_dbus_client_send_and_receive (osso_context_t *osso_context)
        return TRUE;
 }
 
-static void
+gboolean
+libmodest_dbus_client_delete_message (osso_context_t   *osso_ctx,
+                                     const char       *msg_uri)
+{
+       osso_rpc_t    retval;
+       osso_return_t ret;
+       
+       ret = osso_rpc_run_with_defaults (osso_ctx, 
+                                         MODEST_DBUS_NAME, 
+                                         MODEST_DBUS_METHOD_DELETE_MESSAGE, &retval, 
+                                         DBUS_TYPE_STRING, msg_uri, 
+                                         DBUS_TYPE_INVALID);
+               
+       if (ret != OSSO_OK) {
+               g_debug ("debug: osso_rpc_run() failed.\n");
+       } else {
+               g_debug ("debug: osso_rpc_run() succeeded.\n");
+       }
+       
+       osso_rpc_free_val (&retval);
+
+       return ret == OSSO_OK;
+}
+
+void
 modest_search_hit_free (ModestSearchHit *hit)
 {
        g_free (hit->msgid);
-
        g_slice_free (ModestSearchHit, hit);
 }
 
+void
+modest_search_hit_list_free (GList *hits)
+{
+       GList *iter;
+
+       for (iter = hits; iter; iter = iter->next) {
+               modest_search_hit_free ((ModestSearchHit *) iter->data);
+       }
+
+       g_list_free (hits);
+}
 
 static char *
 _dbus_iter_get_string_or_null (DBusMessageIter *iter)
index 2795f76..c78fa06 100644 (file)
@@ -74,15 +74,20 @@ typedef struct {
 
 } ModestSearchHit;
 
-gboolean
-libmodest_dbus_client_search (osso_context_t          *osso_ctx,
-                             const gchar             *query,
-                             const gchar             *folder,
-                             time_t                   start_date,
-                             time_t                   end_date,
-                             guint32                  min_size,
-                             ModestDBusSearchFlags    flags,
-                             GList                  **hits);
 
+void modest_search_hit_free      (ModestSearchHit *hit);
+void modest_search_hit_list_free (GList *hits);
+
+
+gboolean       libmodest_dbus_client_search            (osso_context_t          *osso_ctx,
+                                                       const gchar             *query,
+                                                       const gchar             *folder,
+                                                       time_t                   start_date,
+                                                       time_t                   end_date,
+                                                       guint32                  min_size,
+                                                       ModestDBusSearchFlags    flags,
+                                                       GList                  **hits);
 
+gboolean        libmodest_dbus_client_delete_message   (osso_context_t   *osso_ctx,
+                                                       const char       *msg_uri);
 #endif /* __LIBMODEST_DBUS_CLIENT_H__ */
index 1469d81..7d8c0c5 100644 (file)
@@ -82,6 +82,12 @@ enum ModestDbusComposeMailArguments
 
 #define MODEST_DBUS_METHOD_SEARCH "Search"
 
+#define MODEST_DBUS_METHOD_DELETE_MESSAGE "DeleteMessage"
+enum ModestDbusDeleteMessageArguments
+{
+       MODEST_DEBUS_DELETE_MESSAGE_ARG_URI,
+       MODEST_DEBUS_DELETE_MESSAGE_ARGS_COUNT
+};
 
 
 
index 63b6f99..f4813ad 100644 (file)
 #include <stdio.h>
 #include <string.h>
 
+#include <tny-list.h>
+#include <tny-iterator.h>
+#include <tny-simple-list.h>
+
 typedef struct 
 {
        gchar *to;
@@ -627,6 +631,104 @@ static gint on_open_message(GArray * arguments, gpointer data, osso_rpc_t * retv
 }
 
 
+static gint
+on_delete_message (GArray *arguments, gpointer data, osso_rpc_t *retval)
+{
+       TnyList      *headers;
+       TnyFolder    *folder;
+       TnyIterator  *iter; 
+       TnyHeader    *header;
+       TnyHeader    *msg_header;
+       TnyMsg       *msg;
+       TnyAccount   *account;
+       GError       *error;
+       osso_rpc_t    val;
+       const char   *uri;
+       const char   *uid;
+       gint          res;
+
+       if (arguments->len != MODEST_DEBUS_DELETE_MESSAGE_ARGS_COUNT) {
+               return OSSO_ERROR;
+       }
+
+       val = g_array_index (arguments,
+                            osso_rpc_t,
+                            MODEST_DEBUS_DELETE_MESSAGE_ARG_URI);
+
+       uri = (const char *) val.value.s;
+
+       g_debug ("Searching message (delete message)");
+       
+       msg = find_message_by_url (uri, &account);
+
+       if (msg == NULL) {
+               return OSSO_ERROR;
+       }
+
+       g_debug ("Found message");
+       
+       msg_header = tny_msg_get_header (msg);
+       uid = tny_header_get_uid (msg_header);
+       folder = tny_msg_get_folder (msg);
+
+
+       /* tny_msg_get_header () flaw:
+        * From tinythingy doc: You can't use the returned instance with the
+        * TnyFolder operations
+        *
+        * To get a header instance that will work with these folder methods,
+        * you can use tny_folder_get_headers.
+        *
+        * Ok, we will do so then. Sigh.
+        * */
+       headers = tny_simple_list_new ();
+
+       tny_folder_get_headers (folder, headers, TRUE, NULL);
+       iter = tny_list_create_iterator (headers);
+       header = NULL;
+
+       g_debug ("Searching header for msg in folder");
+       while (!tny_iterator_is_done (iter)) {
+               const char *cur_id;
+
+               header = TNY_HEADER (tny_iterator_get_current (iter));
+               cur_id = tny_header_get_uid (header);
+               
+               if (cur_id && uid && g_str_equal (cur_id, uid)) {
+                       g_debug ("Found correspoding header from folder");
+                       break;
+               }
+
+               header = NULL;
+               g_object_unref (header);
+               tny_iterator_next (iter);
+       }
+
+       g_object_unref (iter);
+       g_object_unref (headers);
+       
+       g_object_unref (msg_header);
+       g_object_unref (msg);
+
+       if (header == NULL) {
+               g_object_unref (folder);
+               return OSSO_ERROR;
+       }
+
+
+       error = NULL;
+       res = OSSO_OK;
+       tny_folder_remove_msg (folder, header, &error);
+
+       if (error != NULL) {
+               res = OSSO_ERROR;
+               g_error_free (error);
+       }
+
+       g_object_unref (folder);
+       return res;
+}
+
 static gboolean
 on_idle_send_receive(gpointer user_data)
 {
@@ -662,8 +764,8 @@ gint modest_dbus_req_handler(const gchar * interface, const gchar * method,
                       osso_rpc_t * retval)
 {
        
-       printf("debug: modest_dbus_req_handler()\n");
-       printf("debug: method received: %s\n", method);
+       g_debug ("modest_dbus_req_handler()\n");
+       g_debug ("debug: method received: %s\n", method);
        
        if (g_ascii_strcasecmp(method, MODEST_DBUS_METHOD_SEND_MAIL) == 0) {
                return on_send_mail (arguments, data, retval);
@@ -675,8 +777,10 @@ gint modest_dbus_req_handler(const gchar * interface, const gchar * method,
                return on_send_receive (arguments, data, retval);
        } else if (g_ascii_strcasecmp(method, MODEST_DBUS_METHOD_COMPOSE_MAIL) == 0) {
                return on_compose_mail (arguments, data, retval);
+       } else if (g_ascii_strcasecmp(method, MODEST_DBUS_METHOD_DELETE_MESSAGE) == 0) {
+               return on_delete_message (arguments,data, retval);
        }
-       else {
+       else { 
                /* We need to return INVALID here so
                 * osso is returning DBUS_HANDLER_RESULT_NOT_YET_HANDLED 
                 * so our modest_dbus_req_filter can kick in!
index a4a53cd..7c5abbd 100644 (file)
@@ -16,7 +16,11 @@ objects=\
         $(MODEST_LIBTINYMAIL_MAEMO_LIBS) \
         ${top_srcdir}/libmodest-dbus-client/libmodest-dbus-client-1.0.la
         
-noinst_PROGRAMS = test_send_mail test_mail_to test_open_message test_search
+noinst_PROGRAMS = test_send_mail      \
+                 test_mail_to        \
+                 test_open_message   \
+                 test_search         \
+                 test_delete_message
 
 test_send_mail_SOURCES = test_send_mail.c
 test_send_mail_LDADD = $(objects)
@@ -30,4 +34,7 @@ test_open_message_LDADD = $(objects)
 test_search_SOURCES = test_search.c
 test_search_LDADD = $(objects)
 
+test_delete_message_SOURCES = test_delete_message.c
+test_delete_message_LDADD = $(objects)
+
 
diff --git a/tests/dbus_api/test_delete_message.c b/tests/dbus_api/test_delete_message.c
new file mode 100644 (file)
index 0000000..9f46f30
--- /dev/null
@@ -0,0 +1,39 @@
+#include <libmodest-dbus-client/libmodest-dbus-client.h>
+#include <stdio.h>
+
+int
+main (int argc, char *argv[])
+{
+       osso_context_t *osso_context;
+       const char *url;
+       gboolean ret; 
+
+       osso_context = osso_initialize ("test_delete_msg",
+                                       "0.0.1",
+                                       TRUE,
+                                       NULL);
+              
+       if (osso_context == NULL) {
+               g_printerr ("osso_initialize() failed.\n");
+           return -1;
+       }
+       
+       if (argc == 2) {
+               url = argv[1];
+       } else {
+               url = "local://???FIXME???";
+       }
+
+       g_print ("Trying to delete msg: %s\n", url);
+       ret = libmodest_dbus_client_delete_message (osso_context,
+                                                   url);
+
+       if (!ret) {
+               g_printerr ("libmodest_dbus_client_delete_message() failed.\n");
+       } else {
+               g_print ("libmodest_dbus_client_delete_message() succeeded.\n");
+       }
+               
+    return ret ? 0 : -1;
+
+}
index 13c3322..af45ce7 100644 (file)
@@ -51,5 +51,7 @@ int main (int argc, char *argv[])
 
        }
 
+       modest_search_hit_list_free (hits);
+
        return res ? 0 : -1;
 }