From e471e521c0a544c1d1fe346ba1ce11c0781b56ae Mon Sep 17 00:00:00 2001 From: Christian Kellner Date: Sun, 3 Jun 2007 11:33:58 +0000 Subject: [PATCH] 2007-06-03 Christian Kellner * 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 | 24 ++++++ libmodest-dbus-client/libmodest-dbus-client.c | 38 ++++++++- libmodest-dbus-client/libmodest-dbus-client.h | 23 ++++-- src/dbus_api/modest-dbus-api.h | 6 ++ src/dbus_api/modest-dbus-callbacks.c | 110 ++++++++++++++++++++++++- tests/dbus_api/Makefile.am | 9 +- tests/dbus_api/test_delete_message.c | 39 +++++++++ tests/dbus_api/test_search.c | 2 + 8 files changed, 236 insertions(+), 15 deletions(-) create mode 100644 tests/dbus_api/test_delete_message.c diff --git a/ChangeLog2 b/ChangeLog2 index 6d4ff91..eb21ecf 100644 --- a/ChangeLog2 +++ b/ChangeLog2 @@ -1,3 +1,27 @@ +2007-06-03 Christian Kellner + + * 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 * src/modest-mail-operation-queue.c: Fixed a deadlock in finalize() diff --git a/libmodest-dbus-client/libmodest-dbus-client.c b/libmodest-dbus-client/libmodest-dbus-client.c index 0e96687..2590c39 100644 --- a/libmodest-dbus-client/libmodest-dbus-client.c +++ b/libmodest-dbus-client/libmodest-dbus-client.c @@ -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) diff --git a/libmodest-dbus-client/libmodest-dbus-client.h b/libmodest-dbus-client/libmodest-dbus-client.h index 2795f76..c78fa06 100644 --- a/libmodest-dbus-client/libmodest-dbus-client.h +++ b/libmodest-dbus-client/libmodest-dbus-client.h @@ -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__ */ diff --git a/src/dbus_api/modest-dbus-api.h b/src/dbus_api/modest-dbus-api.h index 1469d81..7d8c0c5 100644 --- a/src/dbus_api/modest-dbus-api.h +++ b/src/dbus_api/modest-dbus-api.h @@ -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 +}; diff --git a/src/dbus_api/modest-dbus-callbacks.c b/src/dbus_api/modest-dbus-callbacks.c index 63b6f99..f4813ad 100644 --- a/src/dbus_api/modest-dbus-callbacks.c +++ b/src/dbus_api/modest-dbus-callbacks.c @@ -41,6 +41,10 @@ #include #include +#include +#include +#include + 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! diff --git a/tests/dbus_api/Makefile.am b/tests/dbus_api/Makefile.am index a4a53cd..7c5abbd 100644 --- a/tests/dbus_api/Makefile.am +++ b/tests/dbus_api/Makefile.am @@ -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 index 0000000..9f46f30 --- /dev/null +++ b/tests/dbus_api/test_delete_message.c @@ -0,0 +1,39 @@ +#include +#include + +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; + +} diff --git a/tests/dbus_api/test_search.c b/tests/dbus_api/test_search.c index 13c3322..af45ce7 100644 --- a/tests/dbus_api/test_search.c +++ b/tests/dbus_api/test_search.c @@ -51,5 +51,7 @@ int main (int argc, char *argv[]) } + modest_search_hit_list_free (hits); + return res ? 0 : -1; } -- 1.7.9.5