X-Git-Url: http://git.maemo.org/git/?a=blobdiff_plain;f=src%2Fdbus_api%2Fmodest-dbus-callbacks.c;h=455bb326c57ca22ffc5ae13b02fecad4b782ff60;hb=f4a2ef4903adbe27130f424d0567dd9ac948d9fb;hp=63b6f999ee3816ffe18f10617c7405d7da963462;hpb=b91f5d417772ff0ae30acb9b955ad90ad89e1699;p=modest diff --git a/src/dbus_api/modest-dbus-callbacks.c b/src/dbus_api/modest-dbus-callbacks.c index 63b6f99..455bb32 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! @@ -713,39 +817,26 @@ search_result_to_messsage (DBusMessage *reply, for (hit_iter = hits; hit_iter; hit_iter = hit_iter->next) { DBusMessageIter struct_iter; - TnyFolder *tf; - TnyHeader *header; - TnyHeaderFlags flags; - char *msg_url = ""; - const char *subject = ""; - const char *folder = ""; - const char *sender = ""; - guint64 size = 0; - gboolean has_attachemnt = FALSE; - gboolean is_unread = FALSE; - gint64 ts = 0; - char *furl; - const char *uid; - - g_debug ("Marshalling hit ...(%s)", - TNY_IS_HEADER (hit_iter->data) ? "yes" : "no"); - - header = TNY_HEADER (hit_iter->data); - tf = tny_header_get_folder (header); - furl = tny_folder_get_url_string (tf); - - uid = tny_header_get_uid (header); - msg_url = g_strdup_printf ("%s/%s", furl, uid); - - subject = tny_header_get_subject (header); - folder = furl; - sender = tny_header_get_from (header); - size = tny_header_get_message_size (header); - - flags = tny_header_get_flags (header); - has_attachemnt = flags & TNY_HEADER_FLAG_ATTACHMENTS; - is_unread = ! (flags & TNY_HEADER_FLAG_SEEN); - ts = tny_header_get_date_received (header); + ModestSearchHit *hit; + char *msg_url; + const char *subject; + const char *folder; + const char *sender; + guint64 size; + gboolean has_attachment; + gboolean is_unread; + gint64 ts; + + hit = (ModestSearchHit *) hit_iter->data; + + msg_url = hit->msgid; + subject = hit->subject; + folder = hit->folder; + sender = hit->sender; + size = hit->msize; + has_attachment = hit->has_attachment; + is_unread = hit->is_unread; + ts = hit->timestamp; g_debug ("Adding hit: %s", msg_url); @@ -776,7 +867,7 @@ search_result_to_messsage (DBusMessage *reply, dbus_message_iter_append_basic (&struct_iter, DBUS_TYPE_BOOLEAN, - &has_attachemnt); + &has_attachment); dbus_message_iter_append_basic (&struct_iter, DBUS_TYPE_BOOLEAN, @@ -789,12 +880,12 @@ search_result_to_messsage (DBusMessage *reply, dbus_message_iter_close_container (&array_iter, &struct_iter); + g_free (hit->msgid); + g_free (hit->subject); + g_free (hit->folder); + g_free (hit->sender); - g_free (msg_url); - g_free (furl); - - /* Also unref the header, we don't need it anymore */ - g_object_unref (header); + g_slice_free (ModestSearchHit, hit); } dbus_message_iter_close_container (&iter, &array_iter); @@ -850,7 +941,9 @@ modest_dbus_req_filter (DBusConnection *con, end_date = (time_t) ed_v; memset (&search, 0, sizeof (search)); +#ifdef MODEST_HAVE_OGS search.query = query; +#endif search.before = start_date; search.after = end_date; search.flags = 0; @@ -892,16 +985,14 @@ modest_dbus_req_filter (DBusConnection *con, #ifdef MODEST_HAVE_OGS search.flags |= MODEST_SEARCH_USE_OGS; -#endif - g_debug ("Starting search for %s", search.query); - +#endif hits = modest_search_all_accounts (&search); reply = dbus_message_new_method_return (message); search_result_to_messsage (reply, hits); - + if (reply == NULL) { g_warning ("Could not create reply"); } @@ -912,6 +1003,8 @@ modest_dbus_req_filter (DBusConnection *con, dbus_message_unref (reply); } + g_list_free (hits); + }