#include <modest-ui-constants.h>
#include <modest-selector-picker.h>
#include <modest-icon-names.h>
+#include <modest-count-stream.h>
#ifdef MODEST_HAVE_MCE
#include <mce/dbus-names.h>
#define MODEST_ALARMD_APPID PACKAGE_NAME
-static void _modest_platform_play_email_tone (void);
+static void modest_platform_play_email_tone (void);
static void
static gboolean
check_required_files (void)
{
- FILE *mcc_file = modest_utils_open_mcc_mapping_file (NULL);
+ FILE *mcc_file = modest_utils_open_mcc_mapping_file (FALSE, NULL);
if (!mcc_file) {
- g_printerr ("modest: check for mcc file failed\n");
+ g_printerr ("modest: check for mcc file (for LANG) failed\n");
+ return FALSE;
+ } else
+ fclose (mcc_file);
+
+ mcc_file = modest_utils_open_mcc_mapping_file (TRUE, NULL);
+ if (!mcc_file) {
+ g_printerr ("modest: check for mcc file (for LC_MESSAGES) failed\n");
return FALSE;
} else
fclose (mcc_file);
if (response != GTK_RESPONSE_ACCEPT)
return;
-
+
/* Get entry */
entry = g_object_get_data (G_OBJECT (dialog), COMMON_FOLDER_DIALOG_ENTRY);
picker = g_object_get_data (G_OBJECT (dialog), COMMON_FOLDER_DIALOG_ACCOUNT_PICKER);
-
+
parent = TNY_FOLDER_STORE (user_data);
new_name = gtk_entry_get_text (GTK_ENTRY (entry));
exists = FALSE;
-
- if (picker != NULL) {
+ if (picker != NULL)
parent = g_object_get_data (G_OBJECT (picker), FOLDER_PICKER_CURRENT_FOLDER);
- }
/* Look for another folder with the same name */
- if (modest_tny_folder_has_subfolder_with_name (parent,
- new_name,
- TRUE)) {
+ if (!TNY_IS_MERGE_FOLDER (parent) &&
+ modest_tny_folder_has_subfolder_with_name (parent, new_name, TRUE))
exists = TRUE;
- }
-
+
if (!exists) {
if (TNY_IS_ACCOUNT (parent) &&
modest_tny_account_is_virtual_local_folders (TNY_ACCOUNT (parent)) &&
exists = TRUE;
}
}
-
+
if (exists) {
-
/* Show an error */
hildon_banner_show_information (gtk_widget_get_parent (GTK_WIDGET (dialog)),
NULL, _CS("ckdg_ib_folder_already_exists"));
/* Do not close the dialog */
g_signal_stop_emission_by_name (dialog, "response");
}
-
}
typedef struct _FolderChooserData {
}
static TnyFolderStore *
-folder_chooser_dialog_run (ModestFolderView *original)
+folder_chooser_dialog_run (ModestFolderView *original, TnyFolderStore *current)
{
GtkWidget *folder_view;
FolderChooserData userdata = {NULL, NULL};
GtkWidget *pannable;
- const gchar *visible_id = NULL;
+ gchar *visible_id = NULL;
userdata.dialog = hildon_dialog_new ();
pannable = hildon_pannable_area_new ();
modest_folder_view_copy_model (MODEST_FOLDER_VIEW (original),
MODEST_FOLDER_VIEW (folder_view));
- visible_id =
- modest_folder_view_get_account_id_of_visible_server_account (MODEST_FOLDER_VIEW(original));
+ if (TNY_IS_FOLDER_STORE (current)) {
+ if (TNY_IS_ACCOUNT (current)) {
+ visible_id = g_strdup (tny_account_get_id (TNY_ACCOUNT (current)));
+ } else if (TNY_IS_FOLDER (current)) {
+ TnyAccount *account;
+
+ account = tny_folder_get_account (TNY_FOLDER (current));
+ if (account) {
+ visible_id = g_strdup (tny_account_get_id (TNY_ACCOUNT (current)));
+ }
+ }
+ }
+
+ if (visible_id == NULL) {
+ visible_id = g_strdup (
+ modest_folder_view_get_account_id_of_visible_server_account (MODEST_FOLDER_VIEW(original)));
+ }
+
modest_folder_view_set_account_id_of_visible_server_account (MODEST_FOLDER_VIEW(folder_view),
visible_id);
+ g_free (visible_id);
gtk_container_add (GTK_CONTAINER (GTK_DIALOG (userdata.dialog)->vbox), pannable);
gtk_container_add (GTK_CONTAINER (pannable), folder_view);
} else {
GtkWidget *image;
- g_object_ref (store);
- g_object_set_data_full (G_OBJECT (button), FOLDER_PICKER_CURRENT_FOLDER,
- store, (GDestroyNotify) g_object_unref);
+ g_object_set_data_full (G_OBJECT (button), FOLDER_PICKER_CURRENT_FOLDER,
+ g_object_ref (store),
+ (GDestroyNotify) g_object_unref);
name = folder_store_get_display_name (store);
hildon_button_set_value (HILDON_BUTTON (button), name);
g_free (name);
folder_picker_clicked (GtkButton *button,
FolderPickerHelper *helper)
{
- TnyFolderStore *store;
+ TnyFolderStore *store, *current;
- store = folder_chooser_dialog_run (helper->folder_view);
+ current = g_object_get_data (G_OBJECT (button), FOLDER_PICKER_CURRENT_FOLDER);
+
+ store = folder_chooser_dialog_run (helper->folder_view, current);
if (store) {
const gchar *current_name;
- gboolean exists;
+ gboolean exists = FALSE;
folder_picker_set_store (GTK_BUTTON (button), store);
/* Update the name of the folder */
current_name = gtk_entry_get_text (helper->entry);
- exists = modest_tny_folder_has_subfolder_with_name (store,
- current_name,
- TRUE);
+
+ if (TNY_IS_FOLDER_STORE (store))
+ exists = modest_tny_folder_has_subfolder_with_name (store,
+ current_name,
+ TRUE);
if (exists) {
gchar *new_name = get_next_folder_name (NULL, store);
gtk_entry_set_text (helper->entry, new_name);
hildon_button_set_alignment (HILDON_BUTTON (button), 0.0, 0.5, 1.0, 1.0);
- if (suggested) {
+ if (suggested)
folder_picker_set_store (GTK_BUTTON (button), suggested);
- }
g_signal_connect (G_OBJECT (button), "clicked",
G_CALLBACK (folder_picker_clicked),
gint result;
ModestTnyAccountStore *acc_store;
TnyAccount *account;
+ gboolean do_free = FALSE;
real_suggested_name = get_next_folder_name ((const gchar *) suggested_name,
suggested_folder);
}
/* If there is not archive folder then fallback to local folders account */
- if (!suggested_folder)
+ if (!suggested_folder) {
+ do_free = TRUE;
suggested_folder = (TnyFolderStore *)
modest_tny_account_store_get_local_folders_account (acc_store);
+ }
result = modest_platform_run_folder_common_dialog (parent_window,
suggested_folder,
folder_name,
parent_folder);
+ if (do_free)
+ g_object_unref (suggested_folder);
+
g_free(real_suggested_name);
return result;
foreground we don't show anything */
if (!(screen_on && app_in_foreground)) {
- _modest_platform_play_email_tone ();
+ modest_platform_play_email_tone ();
/* Activate LED. This must be deactivated by
modest_platform_remove_new_mail_notifications */
}
}
-void
-modest_platform_on_new_headers_received (TnyList *header_list,
+void
+modest_platform_on_new_headers_received (GList *URI_list,
gboolean show_visual)
{
- g_return_if_fail (TNY_IS_LIST(header_list));
-
- if (tny_list_get_length(header_list) == 0) {
- g_warning ("%s: header list is empty", __FUNCTION__);
+ if (g_list_length (URI_list) == 0)
return;
- }
- if (!show_visual) {
- modest_platform_push_email_notification ();
- /* We do a return here to avoid indentation with an else */
+ /* If the window is in the foreground don't do anything */
+ if (hildon_program_get_is_topmost (hildon_program_get_instance ()))
return;
- }
#ifdef MODEST_HAVE_HILDON_NOTIFY
+ /* For any other case issue a notification */
HildonNotification *notification;
- TnyIterator *iter;
+ GList *iter;
GSList *notifications_list = NULL;
/* Get previous notifications ids */
MODEST_CONF_NOTIFICATION_IDS,
MODEST_CONF_VALUE_INT, NULL);
- iter = tny_list_create_iterator (header_list);
- while (!tny_iterator_is_done (iter)) {
- gchar *url = NULL, *display_address = NULL;
- TnyHeader *header = TNY_HEADER (tny_iterator_get_current (iter));
- TnyFolder *folder = tny_header_get_folder (header);
+ iter = URI_list;
+ while (iter) {
+ ModestMsgNotificationData *data;
gboolean first_notification = TRUE;
gint notif_id;
- gchar *str;
+ gchar *from;
+
+ data = (ModestMsgNotificationData *) iter->data;
- display_address = tny_header_dup_from (header);
- /* string is changed in-place */
- modest_text_utils_get_display_address (display_address);
+ /* String is changed in-place. There is no need to
+ actually dup the data->from string but we just do
+ it in order not to modify the original contents */
+ from = g_strdup (data->from);
+ modest_text_utils_get_display_address (from);
- str = tny_header_dup_subject (header);
- notification = hildon_notification_new (display_address,
- str,
+ notification = hildon_notification_new (from,
+ data->subject,
"qgn_list_messagin",
MODEST_NOTIFICATION_CATEGORY);
- g_free (str);
- /* Create the message URL */
- str = tny_header_dup_uid (header);
- url = g_strdup_printf ("%s/%s", tny_folder_get_url_string (folder),
- str);
- g_free (str);
+ g_free (from);
hildon_notification_add_dbus_action(notification,
"default",
MODEST_DBUS_OBJECT,
MODEST_DBUS_IFACE,
MODEST_DBUS_METHOD_OPEN_MESSAGE,
- G_TYPE_STRING, url,
+ G_TYPE_STRING, data->uri,
-1);
/* Play sound if the user wants. Show the LED
pattern. Show and play just one */
if (G_UNLIKELY (first_notification)) {
+ TnyAccountStore *acc_store;
TnyAccount *account;
first_notification = FALSE;
- /* Set the led pattern */
+ /* Set the led pattern and make the notification persistent */
notify_notification_set_hint_int32 (NOTIFY_NOTIFICATION (notification),
"dialog-type", 4);
notify_notification_set_hint_string(NOTIFY_NOTIFICATION (notification),
"led-pattern",
MODEST_NEW_MAIL_LIGHTING_PATTERN);
+ notify_notification_set_hint_byte (NOTIFY_NOTIFICATION (notification),
+ "persistent", TRUE);
/* Set the account of the headers */
- account = tny_folder_get_account (folder);
+ acc_store = (TnyAccountStore *) modest_runtime_get_account_store ();
+ account = tny_account_store_find_account (acc_store, data->uri);
if (account) {
+ const gchar *acc_name;
+ acc_name =
+ modest_tny_account_get_parent_modest_account_name_for_server_account (account);
notify_notification_set_hint_string(NOTIFY_NOTIFICATION (notification),
"email-account",
- tny_account_get_id (account));
+ acc_name);
g_object_unref (account);
}
+
+ /* Play sound */
+ modest_platform_play_email_tone ();
}
/* Notify. We need to do this in an idle because this function
/* We don't listen for the "closed" signal, because we
don't care about if the notification was removed or
not to store the list in gconf */
-
+
/* Free & carry on */
- g_free (display_address);
- g_free (url);
- g_object_unref (folder);
- g_object_unref (header);
- tny_iterator_next (iter);
+ iter = g_list_next (iter);
}
- g_object_unref (iter);
/* Save the ids */
modest_conf_set_list (modest_runtime_get_conf (), MODEST_CONF_NOTIFICATION_IDS,
notifications_list, MODEST_CONF_VALUE_INT, NULL);
g_slist_free (notifications_list);
-
+
#endif /*MODEST_HAVE_HILDON_NOTIFY*/
}
}
}
-GtkWidget *
-modest_platform_create_folder_view (TnyFolderStoreQuery *query)
+static GtkWidget *
+modest_platform_create_folder_view_full (TnyFolderStoreQuery *query, gboolean do_refresh)
{
- GtkWidget *widget = modest_folder_view_new (query);
+ GtkWidget *widget = modest_folder_view_new_full (query, do_refresh);
/* Show one account by default */
modest_folder_view_set_style (MODEST_FOLDER_VIEW (widget),
return widget;
}
+GtkWidget *
+modest_platform_create_folder_view (TnyFolderStoreQuery *query)
+{
+ return modest_platform_create_folder_view_full (query, TRUE);
+}
+
void
banner_finish (gpointer data, GObject *object)
{
dialog);
}
+typedef struct _HeaderDetailsGetSizeInfo {
+ GtkWidget *dialog;
+ TnyMimePart *part;
+ guint total;
+} HeaderDetailsGetSizeInfo;
+
+static void
+header_details_dialog_destroy (gpointer userdata,
+ GObject *object)
+{
+ HeaderDetailsGetSizeInfo *info = (HeaderDetailsGetSizeInfo *) userdata;
+
+ info->dialog = NULL;
+}
+
+static gboolean
+idle_get_mime_part_size_cb (gpointer userdata)
+{
+ HeaderDetailsGetSizeInfo *info = (HeaderDetailsGetSizeInfo *) userdata;
+ gdk_threads_enter ();
+
+ if (info->dialog && GTK_WIDGET_VISIBLE (info->dialog)) {
+ modest_details_dialog_set_message_size (MODEST_DETAILS_DIALOG (info->dialog),
+ info->total);
+ }
+
+ if (info->dialog) {
+ g_object_weak_unref (G_OBJECT (info->dialog), header_details_dialog_destroy, info);
+ info->dialog = NULL;
+ }
+ g_object_unref (info->part);
+ g_slice_free (HeaderDetailsGetSizeInfo, info);
+
+ gdk_threads_leave ();
+
+ return FALSE;
+}
+
+static gpointer
+get_mime_part_size_thread (gpointer thr_user_data)
+{
+ HeaderDetailsGetSizeInfo *info = (HeaderDetailsGetSizeInfo *) thr_user_data;
+ gssize result = 0;
+ TnyStream *count_stream;
+
+ count_stream = modest_count_stream_new ();
+ result = tny_mime_part_decode_to_stream (info->part, count_stream, NULL);
+ info->total = modest_count_stream_get_count(MODEST_COUNT_STREAM (count_stream));
+ if (info->total == 0) {
+ modest_count_stream_reset_count(MODEST_COUNT_STREAM (count_stream));
+ result = tny_mime_part_write_to_stream (info->part, count_stream, NULL);
+ info->total = modest_count_stream_get_count(MODEST_COUNT_STREAM (count_stream));
+ }
+
+ /* if there was an error, don't set the size (this is pretty uncommon) */
+ if (result < 0) {
+ g_warning ("%s: error while writing mime part to stream\n", __FUNCTION__);
+ }
+ g_idle_add (idle_get_mime_part_size_cb, info);
+
+ return NULL;
+}
+
void
modest_platform_run_header_details_dialog (GtkWindow *parent_window,
- TnyHeader *header)
+ TnyHeader *header,
+ gboolean async_get_size,
+ TnyMsg *msg)
{
GtkWidget *dialog;
/* Create dialog */
- dialog = modest_hildon2_details_dialog_new_with_header (parent_window, header);
+ dialog = modest_hildon2_details_dialog_new_with_header (parent_window, header, !async_get_size);
+
+ if (async_get_size && msg && TNY_IS_MSG (msg)) {
+ HeaderDetailsGetSizeInfo *info;
+ info = g_slice_new (HeaderDetailsGetSizeInfo);
+ info->dialog = dialog;
+ info->total = 0;
+ info->part = TNY_MIME_PART (g_object_ref (msg));
+
+ g_object_weak_ref (G_OBJECT (dialog), header_details_dialog_destroy, info);
+ g_thread_create (get_mime_part_size_thread, info, FALSE, NULL);
+ }
/* Run dialog */
- modest_window_mgr_set_modal (modest_runtime_get_window_mgr (),
+ modest_window_mgr_set_modal (modest_runtime_get_window_mgr (),
GTK_WINDOW (dialog),
parent_window);
gtk_widget_show_all (dialog);
}
static void
-_modest_platform_play_email_tone (void)
+modest_platform_play_email_tone (void)
{
gchar *mail_tone;
gint mail_volume_int;
GtkWidget *action_button;
GtkWidget *image = NULL;
TnyAccount *account;
- gchar *account_name = NULL;
+ gchar *account_name = NULL, *short_name = NULL;
action_button = GTK_WIDGET (g_object_get_data (G_OBJECT (dialog), MOVE_TO_DIALOG_ACTION_BUTTON));
g_object_unref (account);
/* Set title of button: account or folder name */
- if (TNY_IS_FOLDER (folder_store)) {
- hildon_button_set_title (HILDON_BUTTON (action_button),
- tny_folder_get_name (TNY_FOLDER (folder_store)));
- } else {
- hildon_button_set_title (HILDON_BUTTON (action_button), account_name);
- }
+ if (TNY_IS_FOLDER (folder_store))
+ short_name = folder_store_get_display_name (folder_store);
+ else
+ short_name = g_strdup (account_name);
+
+ hildon_button_set_title (HILDON_BUTTON (action_button), short_name);
/* Set value of button, folder full name */
if (TNY_IS_CAMEL_FOLDER (folder_store)) {
- gchar *full_name = g_strconcat (account_name, MOVE_TO_FOLDER_SEPARATOR,
- tny_camel_folder_get_full_name (TNY_CAMEL_FOLDER (folder_store)),
- NULL);
+ const gchar *camel_full_name;
+ gchar *last_slash, *full_name;
+
+ camel_full_name = tny_camel_folder_get_full_name (TNY_CAMEL_FOLDER (folder_store));
+ last_slash = g_strrstr (camel_full_name, "/");
+ if (last_slash) {
+ gchar *prefix = g_strndup (camel_full_name, last_slash - camel_full_name + 1);
+ full_name = g_strconcat (account_name, MOVE_TO_FOLDER_SEPARATOR, prefix, short_name, NULL);
+ g_free (prefix);
+ } else {
+ full_name = g_strconcat (account_name, MOVE_TO_FOLDER_SEPARATOR,
+ short_name,
+ NULL);
+ }
hildon_button_set_value (HILDON_BUTTON (action_button), full_name);
g_free (full_name);
}
g_free (account_name);
+ g_free (short_name);
/* Set image for the button */
image = get_image_for_folder_store (folder_store, MODEST_ICON_SIZE_BIG);
on_move_to_dialog_action_clicked (GtkButton *selection,
gpointer user_data)
{
- TnyFolderStore *selected;
GtkWidget *dialog;
- GtkWidget *folder_view;
gboolean showing_folders;
dialog = (GtkWidget *) user_data;
showing_folders = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (dialog), MOVE_TO_DIALOG_SHOWING_FOLDERS));
if (showing_folders) {
+ TnyFolderStore *selected;
+ GtkWidget *folder_view;
+
folder_view = GTK_WIDGET (g_object_get_data (G_OBJECT (dialog), MOVE_TO_DIALOG_FOLDER_VIEW));
selected = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view));
- if (selected)
+ if (selected) {
gtk_dialog_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK);
+ g_object_unref (selected);
+ }
}
}
+static void
+move_to_dialog_activity_changed (ModestFolderView *folder_view, gboolean activity, GtkDialog *dialog)
+{
+ hildon_gtk_window_set_progress_indicator (GTK_WINDOW (dialog), activity?1:0);
+}
+
GtkWidget *
modest_platform_create_move_to_dialog (GtkWindow *parent_window,
GtkWidget **folder_view)
top_vbox = gtk_vbox_new (FALSE, MODEST_MARGIN_HALF);
/* Create folder view */
- *folder_view = modest_platform_create_folder_view (NULL);
+ *folder_view = modest_platform_create_folder_view_full (NULL, FALSE);
+ g_signal_connect (G_OBJECT (*folder_view), "activity-changed", G_CALLBACK (move_to_dialog_activity_changed),
+ dialog);
modest_folder_view_set_cell_style (MODEST_FOLDER_VIEW (*folder_view),
MODEST_FOLDER_VIEW_CELL_STYLE_COMPACT);