X-Git-Url: http://git.maemo.org/git/?p=modest;a=blobdiff_plain;f=src%2Fhildon2%2Fmodest-maemo-utils.c;h=5b02b207aa6d8dba3db543c55d18d273d9a1b80a;hp=585f35b5d77eee4a5eaf67aa5aab5a627d5d96e0;hb=d35a1ca8a2e4e905cdb7d5925c73c078ba7da3e3;hpb=00ae0c2e5c1602c2f8b83efbb753a7c174e0e19a diff --git a/src/hildon2/modest-maemo-utils.c b/src/hildon2/modest-maemo-utils.c index 585f35b..5b02b20 100644 --- a/src/hildon2/modest-maemo-utils.c +++ b/src/hildon2/modest-maemo-utils.c @@ -52,6 +52,7 @@ #include "modest-text-utils.h" #include "modest-platform.h" #include "modest-ui-constants.h" +#include /* * For getting and tracking the Bluetooth name @@ -59,10 +60,10 @@ #define BTNAME_SERVICE "org.bluez" #define BTNAME_REQUEST_IF "org.bluez.Adapter" #define BTNAME_SIGNAL_IF "org.bluez.Adapter" -#define BTNAME_REQUEST_PATH "/org/bluez/hci0" #define BTNAME_SIGNAL_PATH "/org/bluez/hci0" -#define BTNAME_REQ_GET "GetName" +#define BTNAME_REQ_GET_PROPERTIES "GetProperties" +#define BTNAME_REQ_DEFAULT_ADAPTER "DefaultAdapter" #define BTNAME_SIG_CHANGED "NameChanged" #define BTNAME_MATCH_RULE "type='signal',interface='" BTNAME_SIGNAL_IF \ @@ -79,7 +80,7 @@ modest_maemo_utils_get_osso_context (void) { if (!__osso_context) g_warning ("%s: __osso_context == NULL", __FUNCTION__); - + return __osso_context; } @@ -90,67 +91,173 @@ modest_maemo_utils_set_osso_context (osso_context_t *osso_context) __osso_context = osso_context; } +/* static void */ +/* update_device_name_from_msg (DBusMessage *message) */ +/* { */ +/* DBusError error; */ +/* DBusMessageIter iter; */ + +/* dbus_error_init (&error); */ + +/* if (dbus_set_error_from_message (&error, message)) { */ +/* g_printerr ("modest: failed to get bluetooth name: %s\n", error.message); */ +/* dbus_error_free (&error); */ +/* } else { */ +/* const gchar *device_name; */ +/* if (!dbus_message_iter_init (message, &iter)) { */ +/* g_printerr ("modest: message did not have argument\n"); */ +/* return; */ +/* } */ +/* dbus_message_iter_get_basic (&iter, &device_name); */ +/* modest_conf_set_string (modest_runtime_get_conf(), */ +/* MODEST_CONF_DEVICE_NAME, device_name, */ +/* NULL); */ +/* } */ +/* } */ + + +/* static void */ +/* on_device_name_received (DBusPendingCall *call, void *user_data) */ +/* { */ +/* DBusMessage *message; */ + +/* g_return_if_fail (dbus_pending_call_get_completed (call)); */ + +/* message = dbus_pending_call_steal_reply (call); */ +/* if (!message) { */ +/* g_printerr ("modest: no reply on device name query\n"); */ +/* return; */ +/* } */ + +/* update_device_name_from_msg (message); */ +/* dbus_message_unref (message); */ +/* } */ + + +/* static DBusHandlerResult */ +/* handle_dbus_signal (DBusConnection *conn, DBusMessage *msg, gpointer data) */ +/* { */ +/* if (dbus_message_is_signal(msg, BTNAME_SIGNAL_IF, BTNAME_SIG_CHANGED)) */ +/* update_device_name_from_msg (msg); */ + +/* return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; */ +/* } */ + static void -update_device_name_from_msg (DBusMessage *message) +get_properties_cb (DBusPendingCall *call, + void *user_data) { - DBusError error; DBusMessageIter iter; + DBusMessageIter dict_iter; + DBusMessageIter dict_entry_iter; + DBusError err; + gchar *bt_name = NULL; + DBusMessage *message; + int key_type, array_type, msg_type; - dbus_error_init (&error); + if ( !dbus_pending_call_get_completed ( call ) ) + g_warning ("%s: Call not completed!", __FUNCTION__); - if (dbus_set_error_from_message (&error, message)) { - g_printerr ("modest: failed to get bluetooth name: %s\n", error.message); - dbus_error_free (&error); - } else { - const gchar *device_name; - if (!dbus_message_iter_init (message, &iter)) { - g_printerr ("modest: message did not have argument\n"); - return; + message = dbus_pending_call_steal_reply ( call ); + + if (message == NULL) + g_warning ("%s: Message is NULL", __FUNCTION__); + + + dbus_error_init(&err); + if (dbus_set_error_from_message (&err, message)) { + g_warning ("%s: %s", __FUNCTION__, err.message); + } + + + /* Get msg type */ + dbus_message_iter_init (message, &iter); + msg_type = dbus_message_iter_get_arg_type (&iter); + dbus_message_iter_recurse (&iter, &dict_iter); + + while ((array_type = dbus_message_iter_get_arg_type (&dict_iter)) == DBUS_TYPE_DICT_ENTRY) { + + dbus_message_iter_recurse (&dict_iter, &dict_entry_iter); + + while ((key_type = dbus_message_iter_get_arg_type (&dict_entry_iter)) == DBUS_TYPE_STRING) { + DBusMessageIter dict_entry_content_iter; + char *key; + char *value; + int dict_entry_type; + int dict_entry_content_type; + + dbus_message_iter_get_basic (&dict_entry_iter, &key); + dbus_message_iter_next (&dict_entry_iter); + dict_entry_type = dbus_message_iter_get_arg_type (&dict_entry_iter); + dbus_message_iter_recurse (&dict_entry_iter, &dict_entry_content_iter); + dict_entry_content_type = dbus_message_iter_get_arg_type (&dict_entry_content_iter); + + if (dict_entry_content_type == DBUS_TYPE_STRING) { + dbus_message_iter_get_basic ( &dict_entry_content_iter, &value ); + + if ( strcmp ( key, "Name" ) == 0 ) { + g_debug ("-------------Name %s", value); + break; + } + } + dbus_message_iter_next (&dict_entry_iter); } - dbus_message_iter_get_basic (&iter, &device_name); + + if (key_type != DBUS_TYPE_INVALID) + break; + + dbus_message_iter_next (&dict_iter); + } + + /* Save device name */ + if (bt_name) { modest_conf_set_string (modest_runtime_get_conf(), - MODEST_CONF_DEVICE_NAME, device_name, + MODEST_CONF_DEVICE_NAME, bt_name, NULL); } } - static void -on_device_name_received (DBusPendingCall *call, void *user_data) +get_default_adapter_cb (DBusPendingCall *call, + void *user_data) { DBusMessage *message; - - g_return_if_fail (dbus_pending_call_get_completed (call)); - - message = dbus_pending_call_steal_reply (call); - if (!message) { - g_printerr ("modest: no reply on device name query\n"); - return; - } + DBusMessageIter iter; + gchar* path = NULL; - update_device_name_from_msg (message); - dbus_message_unref (message); -} + message = dbus_pending_call_steal_reply(call); + // Todo extract msg info from here + dbus_message_iter_init ( message, &iter ); -static DBusHandlerResult -handle_dbus_signal (DBusConnection *conn, DBusMessage *msg, gpointer data) -{ - if (dbus_message_is_signal(msg, BTNAME_SIGNAL_IF, BTNAME_SIG_CHANGED)) - update_device_name_from_msg (msg); + dbus_message_iter_get_basic (&iter, &path); + if (path != NULL) { + DBusConnection *conn; + DBusMessage *adapterMsg = dbus_message_new_method_call(BTNAME_SERVICE, path, + BTNAME_REQUEST_IF, + BTNAME_REQ_GET_PROPERTIES); + DBusPendingCall *call = NULL; - return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; -} + conn = dbus_bus_get (DBUS_BUS_SYSTEM, NULL); + if (conn && dbus_connection_send_with_reply(conn, adapterMsg, &call, -1) ) { + dbus_pending_call_set_notify(call, get_properties_cb, NULL, NULL); + dbus_pending_call_block(call); + dbus_pending_call_unref(call); + } + } else { + g_warning ("Failed to get the default bluetooth adapter"); + } +} -static void -get_device_name_from_dbus () +void +modest_maemo_utils_get_device_name (void) { static DBusConnection *conn = NULL; DBusMessage *request; DBusError error; DBusPendingCall *call = NULL; - + dbus_error_init (&error); if (!conn) { conn = dbus_bus_get (DBUS_BUS_SYSTEM, &error); @@ -161,55 +268,66 @@ get_device_name_from_dbus () return; } } - - request = dbus_message_new_method_call (BTNAME_SERVICE, BTNAME_REQUEST_PATH, - BTNAME_REQUEST_IF, BTNAME_REQ_GET); - if (!request) { - /* should we free the connection? */ - g_printerr ("modest: dbus_message_new_method_call failed\n"); - return; - } - dbus_message_set_auto_start (request, TRUE); - if (dbus_connection_send_with_reply (conn, request, &call, -1)) { - dbus_pending_call_set_notify (call, on_device_name_received, - NULL, NULL); - dbus_pending_call_unref (call); - } - dbus_message_unref (request); - - dbus_connection_setup_with_g_main (conn, NULL); - dbus_bus_add_match (conn, BTNAME_MATCH_RULE, &error); - if (dbus_error_is_set(&error)) { - g_printerr ("modest: dbus_bus_add_match failed: %s\n", error.message); - dbus_error_free (&error); - } - if (!dbus_connection_add_filter(conn, handle_dbus_signal, NULL, NULL)) - g_printerr ("modest: dbus_connection_add_filter failed\n"); -} + /* Get the default adapter */ + request = dbus_message_new_method_call(BTNAME_SERVICE, "/" , + BTNAME_REQUEST_IF, + BTNAME_REQ_DEFAULT_ADAPTER); + if (dbus_connection_send_with_reply(conn, request, &call, -1)) { + dbus_pending_call_set_notify(call, get_default_adapter_cb, NULL, NULL); + dbus_pending_call_block(call); + dbus_pending_call_unref(call); + } -void -modest_maemo_utils_get_device_name (void) -{ - get_device_name_from_dbus (); +/* request = dbus_message_new_method_call (BTNAME_SERVICE, BTNAME_REQUEST_PATH, */ +/* BTNAME_REQUEST_IF, BTNAME_REQ_GET); */ +/* if (!request) { */ +/* /\* should we free the connection? *\/ */ +/* g_printerr ("modest: dbus_message_new_method_call failed\n"); */ +/* return; */ +/* } */ +/* dbus_message_set_auto_start (request, TRUE); */ +/* if (dbus_connection_send_with_reply (conn, request, &call, -1)) { */ +/* dbus_pending_call_set_notify (call, on_device_name_received, */ +/* NULL, NULL); */ +/* dbus_pending_call_unref (call); */ +/* } */ +/* dbus_message_unref (request); */ + +/* dbus_connection_setup_with_g_main (conn, NULL); */ +/* dbus_bus_add_match (conn, BTNAME_MATCH_RULE, &error); */ +/* if (dbus_error_is_set(&error)) { */ +/* g_printerr ("modest: dbus_bus_add_match failed: %s\n", error.message); */ +/* dbus_error_free (&error); */ +/* } */ + +/* if (!dbus_connection_add_filter(conn, handle_dbus_signal, NULL, NULL)) */ +/* g_printerr ("modest: dbus_connection_add_filter failed\n"); */ } void modest_maemo_utils_setup_images_filechooser (GtkFileChooser *chooser) { - gchar *images_folder; GtkFileFilter *file_filter; GList *image_mimetypes_list; GList *node; + gchar *conf_folder; g_return_if_fail (GTK_IS_FILE_CHOOSER (chooser)); - /* Set the default folder to images folder */ - images_folder = g_build_filename (g_getenv (MODEST_MAEMO_UTILS_MYDOCS_ENV), - MODEST_MAEMO_UTILS_DEFAULT_IMAGE_FOLDER, NULL); - gtk_file_chooser_set_current_folder (chooser, images_folder); - g_free (images_folder); + conf_folder = modest_conf_get_string (modest_runtime_get_conf (), MODEST_CONF_LATEST_INSERT_IMAGE_PATH, NULL); + if (conf_folder && conf_folder[0] != '\0') { + gtk_file_chooser_set_current_folder_uri (chooser, conf_folder); + } else { + gchar *images_folder; + /* Set the default folder to images folder */ + images_folder = g_build_filename (g_getenv (MODEST_MAEMO_UTILS_MYDOCS_ENV), + MODEST_MAEMO_UTILS_DEFAULT_IMAGE_FOLDER, NULL); + gtk_file_chooser_set_current_folder (chooser, images_folder); + g_free (images_folder); + } + g_free (conf_folder); /* Set the images mime filter */ file_filter = gtk_file_filter_new (); @@ -240,34 +358,6 @@ modest_maemo_set_thumbable_scrollbar (GtkScrolledWindow *win, #endif /* MODEST_HAVE_HILDON1_WIDGETS */ } -FILE* -modest_maemo_open_mcc_mapping_file (void) -{ - FILE* result; - - const gchar* path; - const gchar* path1 = MODEST_OPERATOR_WIZARD_MCC_MAPPING; - const gchar* path2 = MODEST_MCC_MAPPING; - - if (access(path1, R_OK) == 0) - path = path1; - else if (access(path2, R_OK) == 0) - path = path2; - else { - g_warning ("%s: neither '%s' nor '%s' is a readable mapping file", - __FUNCTION__, path1, path2); - return NULL; - } - - result = fopen (path, "r"); - if (!result) { - g_warning ("%s: error opening mapping file '%s': %s", - __FUNCTION__, path, strerror(errno)); - return NULL; - } - return result; -} - GtkWidget * modest_maemo_utils_get_manager_menubar_as_menu (GtkUIManager *manager, const gchar *item_name) @@ -317,7 +407,7 @@ modest_maemo_utils_create_captioned (GtkSizeGroup *title_size_group, title, use_markup, control, - HILDON_SIZE_FINGER_HEIGHT | HILDON_SIZE_AUTO_WIDTH); + 0); } /** @@ -343,6 +433,7 @@ modest_maemo_utils_create_captioned_with_size_type (GtkSizeGroup *title_size_ HildonSizeType size_type) { GtkWidget *label; + GtkWidget *align; GtkWidget *box; if (use_markup) { @@ -351,14 +442,18 @@ modest_maemo_utils_create_captioned_with_size_type (GtkSizeGroup *title_size_ } else { label = gtk_label_new (title); } + align = gtk_alignment_new (0.0, 0.0, 1.0, 1.0); + gtk_alignment_set_padding (GTK_ALIGNMENT (align), 0, 0, MODEST_MARGIN_DOUBLE, MODEST_MARGIN_TRIPLE); gtk_label_set_line_wrap (GTK_LABEL (label), TRUE); hildon_gtk_widget_set_theme_size (label, HILDON_SIZE_FINGER_HEIGHT); gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); gtk_widget_show (label); - box = gtk_hbox_new (FALSE, MODEST_MARGIN_HALF); - gtk_box_pack_start (GTK_BOX (box), label, FALSE, FALSE, MODEST_MARGIN_HALF); - gtk_box_pack_start (GTK_BOX (box), control, TRUE, TRUE, MODEST_MARGIN_HALF); + gtk_widget_show (align); + box = gtk_hbox_new (FALSE, 0); + gtk_container_add (GTK_CONTAINER (align), label); + gtk_box_pack_start (GTK_BOX (box), align, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX (box), control, TRUE, TRUE, 0); if (title_size_group) gtk_size_group_add_widget (title_size_group, label); if (value_size_group) @@ -459,3 +554,97 @@ modest_maemo_utils_create_group_box (const gchar *label_text, GtkWidget *content return box; } + +static gboolean match_all (TnyList *list, GObject *item, gpointer match_data) +{ + return TRUE; +} + +gboolean +modest_maemo_utils_select_attachments (GtkWindow *window, TnyList *att_list, gboolean include_msgs) +{ + GtkTreeModel *model; + TnyIterator *iterator; + GtkWidget *selector; + GtkCellRenderer *renderer; + GtkWidget *dialog; + gint response; + gboolean result = TRUE; + gint attachments_added = 0; + + model = GTK_TREE_MODEL (gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_OBJECT)); + for (iterator = tny_list_create_iterator (att_list); + !tny_iterator_is_done (iterator); + tny_iterator_next (iterator)) { + GtkTreeIter iter; + TnyMimePart *part; + gchar *filename = NULL; + + part = (TnyMimePart *) tny_iterator_get_current (iterator); + + /* Ignore purged attachments and messages if ignore is + set to TRUE */ + if (!(tny_mime_part_is_purged (part) || + (TNY_IS_MSG (part) && !include_msgs))) { + + if (TNY_IS_MSG (part)) { + TnyHeader *header = tny_msg_get_header (TNY_MSG (part)); + filename = tny_header_dup_subject (header); + if ((filename == NULL) || (filename[0] == '\0')) { + g_free (filename); + filename = g_strdup (_("mail_va_no_subject")); + } + g_object_unref (header); + } else { + filename = g_strdup (tny_mime_part_get_filename (part)); + } + gtk_list_store_append (GTK_LIST_STORE (model), &iter); + gtk_list_store_set (GTK_LIST_STORE (model), &iter, 0, filename, 1, part, -1); + attachments_added ++; + g_free (filename); + g_object_unref (part); + } + } + + selector = GTK_WIDGET (hildon_touch_selector_new ()); + renderer = gtk_cell_renderer_text_new (); + hildon_touch_selector_append_column (HILDON_TOUCH_SELECTOR (selector), model, renderer, + "text", 0, NULL); + hildon_touch_selector_set_column_selection_mode (HILDON_TOUCH_SELECTOR (selector), + HILDON_TOUCH_SELECTOR_SELECTION_MODE_MULTIPLE); + + dialog = hildon_picker_dialog_new (window); + gtk_window_set_title (GTK_WINDOW (dialog), (attachments_added > 1)? + _("mcen_ti_select_attachments_title"):_("mcen_ti_select_attachment_title")); + hildon_picker_dialog_set_selector (HILDON_PICKER_DIALOG (dialog), HILDON_TOUCH_SELECTOR (selector)); + hildon_picker_dialog_set_done_label (HILDON_PICKER_DIALOG (dialog), _HL("wdgt_bd_done")); + + response = gtk_dialog_run (GTK_DIALOG (dialog)); + + if (response == GTK_RESPONSE_OK) { + GList *selected_rows, *node; + + tny_list_remove_matches (att_list, match_all, NULL); + selected_rows = hildon_touch_selector_get_selected_rows (HILDON_TOUCH_SELECTOR (selector), 0); + for (node = selected_rows; node != NULL; node = g_list_next (node)) { + GtkTreePath *path; + GObject *selected; + GtkTreeIter iter; + + path = (GtkTreePath *) node->data; + gtk_tree_model_get_iter (model, &iter, path); + gtk_tree_model_get (model, &iter, 1, &selected, -1); + tny_list_append (att_list, selected); + } + if (tny_list_get_length (att_list) == 0) + result = FALSE; + } else { + result = FALSE; + } + + gtk_widget_destroy (dialog); + + g_object_unref (model); + + return result; +}