X-Git-Url: http://git.maemo.org/git/?p=modest;a=blobdiff_plain;f=src%2Fdbus_api%2Fmodest-dbus-callbacks.c;h=601387d89455cb87decd221a81c9665ee132ce97;hp=b7c9af36355380a72e90fcb2e9d7ac328b64ebe4;hb=362784ce756b3f0e31cd451d9ac5e69b909d4053;hpb=703965f6f52fab28c9762f1b5603c6feeec5a680 diff --git a/src/dbus_api/modest-dbus-callbacks.c b/src/dbus_api/modest-dbus-callbacks.c index b7c9af3..601387d 100644 --- a/src/dbus_api/modest-dbus-callbacks.c +++ b/src/dbus_api/modest-dbus-callbacks.c @@ -53,6 +53,7 @@ #include #include #include +#include typedef struct { @@ -260,7 +261,7 @@ on_idle_mail_to(gpointer user_data) tny_folder_add_msg (folder, msg, NULL); /* TODO: check err */ gdk_threads_enter (); - ModestWindow *win = modest_msg_edit_window_new (msg, account_name); + ModestWindow *win = modest_msg_edit_window_new (msg, account_name, FALSE); modest_window_mgr_register_window (modest_runtime_get_window_mgr (), win); gtk_widget_show_all (GTK_WIDGET (win)); @@ -365,7 +366,7 @@ on_idle_compose_mail(gpointer user_data) gdk_threads_enter (); - ModestWindow *win = modest_msg_edit_window_new (msg, account_name); + ModestWindow *win = modest_msg_edit_window_new (msg, account_name, FALSE); /* it seems Sketch at least sends a leading ',' -- take that into account, * ie strip that ,*/ @@ -377,7 +378,7 @@ on_idle_compose_mail(gpointer user_data) list = g_strsplit(idle_data->attachments, ",", 0); for (i=0; list[i] != NULL; i++) { - modest_msg_edit_window_attach_file_noninteractive( + modest_msg_edit_window_attach_file_one( (ModestMsgEditWindow *)win, list[i]); } g_strfreev(list); @@ -469,7 +470,8 @@ find_message_by_url (const char *uri, TnyAccount **ac_out) uri); if (account == NULL) { - g_debug ("%s: tny_account_store_find_account() failed.\n", __FUNCTION__); + g_debug ("%s: tny_account_store_find_account() failed for\n uri=%s\n", + __FUNCTION__, uri); return NULL; } @@ -487,7 +489,7 @@ find_message_by_url (const char *uri, TnyAccount **ac_out) &err); if (folder == NULL) { - g_debug ("%s: tny_store_account_find_folder() failed\naccount=%s, uri=%s.\n", __FUNCTION__, + g_debug ("%s: tny_store_account_find_folder() failed for\n account=%s, uri=%s.\n", __FUNCTION__, tny_account_get_id (TNY_ACCOUNT(account)), uri); goto out; } @@ -519,7 +521,6 @@ out: static gboolean on_idle_open_message (gpointer user_data) { - ModestWindow *msg_view = NULL; TnyMsg *msg = NULL; TnyAccount *account = NULL; TnyHeader *header = NULL; @@ -540,34 +541,67 @@ on_idle_open_message (gpointer user_data) } g_debug ("modest: %s: Found message.", __FUNCTION__); + folder = tny_msg_get_folder (msg); - if (modest_tny_folder_get_local_folder_type (folder) == TNY_FOLDER_TYPE_DRAFTS) { - g_debug ("TODO: draft messages should be opened in edit mode... "); + + /* Drafts will be opened in the editor, instead of the viewer, as per the UI spec: */ + /* FIXME: same should happen for Outbox; not enabling that, as the handling + * of edited messages is not clear in that case */ + gboolean is_draft = FALSE; + if (folder && modest_tny_folder_is_local_folder (folder) && + (modest_tny_folder_get_local_or_mmc_folder_type (folder) == TNY_FOLDER_TYPE_DRAFTS)) { + is_draft = TRUE; } header = tny_msg_get_header (msg); + /* TODO: The modest_tny_folder_get_header_unique_id() documentation warns against + * using it with tny_msg_get_header(), and there is a + * " camel_folder_get_full_name: assertion `CAMEL_IS_FOLDER (folder)' failed" runtime warning, + * but it seems to work. + */ msg_uid = modest_tny_folder_get_header_unique_id(header); -/* FIXME: modest_tny_folder_get_header_unique_id warns against this */ + win_mgr = modest_runtime_get_window_mgr (); gdk_threads_enter (); + gboolean already_opened = FALSE; + ModestWindow *msg_view = NULL; if (modest_window_mgr_find_registered_header (win_mgr, header, &msg_view)) { - g_debug ("modest: %s: A window for this messsage is open already.", __FUNCTION__); - if (!MODEST_IS_MSG_VIEW_WINDOW(msg_view)) - g_debug (" DEBUG: But the window is not a msg view"); + if (msg_view) { + g_debug ("modest: %s: A window for this message is open already: type=%s", + __FUNCTION__, G_OBJECT_TYPE_NAME (msg_view)); + } + + if (!msg_view) + g_debug ("modest_window_mgr_find_registered_header(): Returned TRUE, but msg_view is NULL"); + else if (!MODEST_IS_MSG_VIEW_WINDOW (msg_view) && !MODEST_IS_MSG_EDIT_WINDOW (msg_view)) + g_debug (" DEBUG: But the window is not a msg view or edit window."); else { gtk_window_present (GTK_WINDOW(msg_view)); + already_opened = TRUE; } - } else { + } + + if (!already_opened) { /* g_debug ("creating new window for this msg"); */ modest_window_mgr_register_header (win_mgr, header); const gchar *modest_account_name = modest_tny_account_get_parent_modest_account_name_for_server_account (account); - msg_view = modest_msg_view_window_new (msg, modest_account_name, + + /* Drafts will be opened in the editor, and others will be opened in the viewer, + * as per the UI spec: */ + if (is_draft) { + /* TODO: Maybe the msg_uid should be registered for edit windows too, + * so we can open the same window again next time: */ + msg_view = modest_msg_edit_window_new (msg, modest_account_name, TRUE); + } else { + msg_view = modest_msg_view_window_new (msg, modest_account_name, msg_uid); + } + modest_window_mgr_register_window (win_mgr, msg_view); gtk_widget_show_all (GTK_WIDGET (msg_view)); } @@ -603,17 +637,17 @@ static gint on_open_message(GArray * arguments, gpointer data, osso_rpc_t * retv static gboolean on_idle_delete_message (gpointer user_data) { - TnyList *headers; - TnyFolder *folder; - TnyIterator *iter; - TnyHeader *header; - TnyHeader *msg_header; - TnyMsg *msg; - TnyAccount *account; - GError *error; - const char *uri; - const char *uid; - gint res; + TnyList *headers = NULL; + TnyFolder *folder = NULL; + TnyIterator *iter = NULL; + TnyHeader *header = NULL; + TnyHeader *msg_header = NULL; + TnyMsg *msg = NULL; + TnyAccount *account = NULL; + GError *error = NULL; + const char *uri = NULL; + const char *uid = NULL; + gint res = 0; uri = (char *) user_data; @@ -649,18 +683,22 @@ on_idle_delete_message (gpointer user_data) /* g_debug ("Searching header for msg in folder"); */ while (!tny_iterator_is_done (iter)) { - const char *cur_id; + const char *cur_id = NULL; header = TNY_HEADER (tny_iterator_get_current (iter)); - cur_id = tny_header_get_uid (header); + if (header) + cur_id = tny_header_get_uid (header); if (cur_id && uid && g_str_equal (cur_id, uid)) { /* g_debug ("Found corresponding header from folder"); */ break; } - header = NULL; - g_object_unref (header); + if (header) { + g_object_unref (header); + header = NULL; + } + tny_iterator_next (iter); } @@ -675,7 +713,9 @@ on_idle_delete_message (gpointer user_data) msg = NULL; if (header == NULL) { - g_object_unref (folder); + if (folder) + g_object_unref (folder); + return OSSO_ERROR; } @@ -702,11 +742,39 @@ on_idle_delete_message (gpointer user_data) gdk_threads_leave (); - g_object_unref (header); - g_object_unref (folder); + if (header) + g_object_unref (header); + + if (folder) { + /* Trick: do a poke status in order to speed up the signaling + of observers. + A delete via the menu does this, in do_headers_action(), + though I don't know why. + */ + tny_folder_poke_status (folder); + + g_object_unref (folder); + } + + if (account) + g_object_unref (account); + + /* Refilter the header view explicitly, to make sure that + * deleted emails are really removed from view. + * (They are not really deleted until contact is made with the server, + * so they would appear with a strike-through until then): + */ + ModestHeaderView *header_view = MODEST_HEADER_VIEW(modest_main_window_get_child_widget ( + MODEST_MAIN_WINDOW(win), MODEST_WIDGET_TYPE_HEADER_VIEW)); + if (header_view && MODEST_IS_HEADER_VIEW (header_view)) + modest_header_view_refilter (header_view); + return res; } + + + static gint on_delete_message (GArray *arguments, gpointer data, osso_rpc_t *retval) { @@ -739,6 +807,11 @@ on_idle_send_receive(gpointer user_data) /* Pick the main window if it exists */ win = modest_window_mgr_get_main_window (modest_runtime_get_window_mgr ()); + /* This seems to be necessary to show new messages in the current window. + * I would expect this to be after the send_receive, but maybe + * this makes a connection too. murrayc. */ + modest_do_refresh_current_folder (win); + /* Send & receive all if "Update automatically" is set */ /* TODO: check the auto-update parameter in the configuration */ modest_ui_actions_do_send_receive_all (win); @@ -750,6 +823,7 @@ on_idle_send_receive(gpointer user_data) static gint on_send_receive(GArray * arguments, gpointer data, osso_rpc_t * retval) { + printf("DEBUG: modest: %s\n", __FUNCTION__); /* Use g_idle to context-switch into the application's thread: */ /* This method has no arguments. */ @@ -762,6 +836,8 @@ static gint on_send_receive(GArray * arguments, gpointer data, osso_rpc_t * retv return OSSO_OK; } +static gboolean on_idle_top_application (gpointer user_data); + static gboolean on_idle_open_default_inbox(gpointer user_data) { @@ -777,6 +853,10 @@ on_idle_open_default_inbox(gpointer user_data) gdk_threads_leave (); + /* This D-Bus method is obviously meant to result in the UI being visible, + * so show it, by calling this idle handler directly: */ + on_idle_top_application(user_data); + return FALSE; /* Do not call this callback again. */ } @@ -848,8 +928,6 @@ gint modest_dbus_req_handler(const gchar * interface, const gchar * method, return on_top_application (arguments, data, retval); } else { - g_debug (" debug: %s: Unexpected D-Bus method: %s\n", __FUNCTION__, method); - /* We need to return INVALID here so * libosso will return DBUS_HANDLER_RESULT_NOT_YET_HANDLED, * so that our modest_dbus_req_filter will then be tried instead. @@ -1149,6 +1227,20 @@ add_single_folder_to_list (TnyFolder *folder, GList** list) if (!folder) return; + if (TNY_IS_MERGE_FOLDER (folder)) { + /* Ignore these because their IDs ares + * a) not always unique or sensible. + * b) not human-readable, and currently need a human-readable + * ID here, because the osso-email-interface API does not allow + * us to return both an ID and a display name. + * + * This is actually the merged outbox folder. + * We could hack our D-Bus API to understand "outbox" as the merged outboxes, + * but that seems unwise. murrayc. + */ + return; + } + /* Add this folder to the list: */ /* const gchar * folder_name = tny_folder_get_name (folder); @@ -1206,15 +1298,20 @@ add_folders_to_list (TnyFolderStore *folder_store, GList** list) * be generally unsuitable for Modest. */ TnyFolder *folder = TNY_FOLDER (tny_iterator_get_current (iter)); - add_single_folder_to_list (TNY_FOLDER (folder), list); - - #if 0 - if (TNY_IS_FOLDER_STORE (folder)) - add_folders_to_list (TNY_FOLDER_STORE (folder), list); - else { + if (folder) { add_single_folder_to_list (TNY_FOLDER (folder), list); + + #if 0 + if (TNY_IS_FOLDER_STORE (folder)) + add_folders_to_list (TNY_FOLDER_STORE (folder), list); + else { + add_single_folder_to_list (TNY_FOLDER (folder), list); + } + #endif + + /* tny_iterator_get_current() gave us a reference. */ + g_object_unref (folder); } - #endif tny_iterator_next (iter); } @@ -1255,14 +1352,12 @@ on_dbus_method_get_folders (DBusConnection *con, DBusMessage *message) g_object_unref (account); account = NULL; - /* Also add the folders from the local folders account, * because they are (currently) used with all accounts: * TODO: This is not working. It seems to get only the Merged Folder (with an ID of "" (not NULL)). */ TnyAccount *account_local = - modest_tny_account_store_get_local_folders_account ( - TNY_ACCOUNT_STORE (modest_runtime_get_account_store())); + modest_tny_account_store_get_local_folders_account (modest_runtime_get_account_store()); add_folders_to_list (TNY_FOLDER_STORE (account_local), &folder_names); g_object_unref (account_local); @@ -1305,14 +1400,22 @@ modest_dbus_req_filter (DBusConnection *con, if (dbus_message_is_method_call (message, MODEST_DBUS_IFACE, MODEST_DBUS_METHOD_SEARCH)) { + printf (" DEBUG1: %s\n", __FUNCTION__); on_dbus_method_search (con, message); handled = TRUE; } else if (dbus_message_is_method_call (message, MODEST_DBUS_IFACE, MODEST_DBUS_METHOD_GET_FOLDERS)) { + printf (" DEBUG2: %s\n", __FUNCTION__); on_dbus_method_get_folders (con, message); handled = TRUE; } + else { + /* Note that this mentions methods that were already handled in modest_dbus_req_handler(). */ + g_debug (" debug: %s: Unexpected (maybe already handled) D-Bus method:\n Interface=%s, Member=%s\n", + __FUNCTION__, dbus_message_get_interface (message), + dbus_message_get_member(message)); + } return (handled ? DBUS_HANDLER_RESULT_HANDLED :