X-Git-Url: http://git.maemo.org/git/?p=modest;a=blobdiff_plain;f=src%2Fdbus_api%2Fmodest-dbus-callbacks.c;h=875eb092c627d3ee8f6cbd7724f4085740a89ca6;hp=9ef5ed9163f86e2f22f81c4b94d12adfc993d5ab;hb=be6ccffc543395f60cd1e8551d0df6f8f037a8d5;hpb=f0e59e582ece5beef0ddd0e5660bb47051476762 diff --git a/src/dbus_api/modest-dbus-callbacks.c b/src/dbus_api/modest-dbus-callbacks.c index 9ef5ed9..875eb09 100644 --- a/src/dbus_api/modest-dbus-callbacks.c +++ b/src/dbus_api/modest-dbus-callbacks.c @@ -33,6 +33,7 @@ #include "modest-account-mgr-helpers.h" #include "modest-tny-account.h" #include "modest-ui-actions.h" + #include "modest-search.h" #include "widgets/modest-msg-edit-window.h" #include "modest-tny-msg.h" @@ -40,6 +41,13 @@ #include #include #include +#include +#include +#include + +#include +#include +#include typedef struct { @@ -57,7 +65,7 @@ typedef struct gchar *bcc; gchar *subject; gchar *body; - GSList *attachments; + gchar *attachments; } ComposeMailIdleData; static gboolean @@ -96,6 +104,7 @@ on_idle_send_mail(gpointer user_data) modest_mail_operation_send_new_mail (mail_operation, transport_account, + NULL, from, /* from */ idle_data->to, idle_data->cc, idle_data->bcc, idle_data->subject, idle_data->body, /* plain_body */ @@ -388,10 +397,15 @@ static gint on_mail_to(GArray * arguments, gpointer data, osso_rpc_t * retval) } + + + static gboolean on_idle_compose_mail(gpointer user_data) { ComposeMailIdleData *idle_data = (ComposeMailIdleData*)user_data; + gchar **list = NULL; + gint i = 0; /* Get the TnyTransportAccount so we can instantiate a mail operation: */ ModestAccountMgr *account_mgr = modest_runtime_get_account_mgr(); @@ -407,18 +421,18 @@ on_idle_compose_mail(gpointer user_data) } if (!account) { - g_printerr ("modest: failed to get tny account folder'\n", account_name); + g_printerr ("modest: failed to get tny account folder'%s'\n", account_name); } else { gchar * from = modest_account_mgr_get_from_string (account_mgr, account_name); if (!from) { g_printerr ("modest: no from address for account '%s'\n", account_name); } else { - + /* Create the message: */ TnyMsg *msg = modest_tny_msg_new (idle_data->to, from, idle_data->cc, idle_data->bcc, idle_data->subject, idle_data->body, - idle_data->attachments); + NULL); /* NULL because m_t_m_n doesn't use it */ if (!msg) { g_printerr ("modest: failed to create message\n"); @@ -434,6 +448,14 @@ on_idle_compose_mail(gpointer user_data) tny_folder_add_msg (folder, msg, NULL); /* TODO: check err */ ModestWindow *win = modest_msg_edit_window_new (msg, account_name); + + list = g_strsplit(idle_data->attachments, ",", 0); + for (i=0; list[i] != NULL; i++) { + modest_msg_edit_window_attach_file_noninteractive( + (ModestMsgEditWindow *)win, list[i]); + } + g_strfreev(list); + gtk_widget_show_all (GTK_WIDGET (win)); g_object_unref (G_OBJECT(folder)); @@ -461,8 +483,7 @@ on_idle_compose_mail(gpointer user_data) static gint on_compose_mail(GArray * arguments, gpointer data, osso_rpc_t * retval) { - gchar **list = NULL; - gint i = 0; + if (arguments->len != MODEST_DEBUS_COMPOSE_MAIL_ARGS_COUNT) return OSSO_ERROR; @@ -487,17 +508,9 @@ static gint on_compose_mail(GArray * arguments, gpointer data, osso_rpc_t * retv idle_data->body = g_strdup (val.value.s); val = g_array_index(arguments, osso_rpc_t, MODEST_DEBUS_COMPOSE_MAIL_ARG_ATTACHMENTS); - gchar *attachments_str = g_strdup (val.value.s); + idle_data->attachments = g_strdup (val.value.s); - list = g_strsplit(attachments_str, ",", 0); - for (i=0; list[i] != NULL; i++) { - idle_data->attachments = g_slist_append(idle_data->attachments, g_strdup(list[i])); - } - g_strfreev(list); - - - /* printf(" debug: to=%s\n", idle_data->to); */ - g_idle_add(on_idle_compose_mail, (gpointer)idle_data); + g_idle_add(on_idle_compose_mail, (gpointer)idle_data); /* Note that we cannot report failures during sending, * because that would be asynchronous. */ @@ -627,6 +640,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 +773,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 +786,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 +826,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 +876,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 +889,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 +950,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,14 +994,14 @@ modest_dbus_req_filter (DBusConnection *con, #ifdef MODEST_HAVE_OGS search.flags |= MODEST_SEARCH_USE_OGS; + 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"); } @@ -910,6 +1012,8 @@ modest_dbus_req_filter (DBusConnection *con, dbus_message_unref (reply); } + g_list_free (hits); + }