From 5c655fe692b9152fe5db6ca47cb82209d9e84b32 Mon Sep 17 00:00:00 2001 From: Pierre Pronchery Date: Sat, 5 Jun 2010 09:16:13 +0000 Subject: [PATCH] Asking for confirmation before deleting a message (untested) --- src/gsm.c | 2 ++ src/gsm.h | 1 + src/modem.c | 10 +++++++++- src/phone.c | 50 +++++++++++++++++++++++++++++++++++++++++++++++--- 4 files changed, 59 insertions(+), 4 deletions(-) diff --git a/src/gsm.c b/src/gsm.c index 62925bb..99b5851 100644 --- a/src/gsm.c +++ b/src/gsm.c @@ -656,6 +656,8 @@ int gsm_event(GSM * gsm, GSMEventType type, ...) event->message.length = va_arg(ap, unsigned int); event->message.content = va_arg(ap, char const *); break; + case GSM_EVENT_TYPE_MESSAGE_DELETED: + break; case GSM_EVENT_TYPE_MESSAGE_LIST: event->message_list.start = va_arg(ap, unsigned int); event->message_list.end = va_arg(ap, unsigned int); diff --git a/src/gsm.h b/src/gsm.h index d84d6b8..d70553d 100644 --- a/src/gsm.h +++ b/src/gsm.h @@ -61,6 +61,7 @@ typedef enum _GSMEventType GSM_EVENT_TYPE_INCOMING_CALL, GSM_EVENT_TYPE_INCOMING_MESSAGE, GSM_EVENT_TYPE_MESSAGE, + GSM_EVENT_TYPE_MESSAGE_DELETED, GSM_EVENT_TYPE_MESSAGE_LIST, GSM_EVENT_TYPE_MESSAGE_SENT, GSM_EVENT_TYPE_MUTE, diff --git a/src/modem.c b/src/modem.c index 37d0619..acbbca6 100644 --- a/src/modem.c +++ b/src/modem.c @@ -430,13 +430,21 @@ int gsm_modem_is_registered(GSMModem * gsmm) /* gsm_modem_message_delete */ +static void _modem_message_delete_callback(GSM * gsm); + int gsm_modem_message_delete(GSMModem * gsmm, unsigned int index) { char cmd[32]; snprintf(cmd, sizeof(cmd), "%s%u", "AT+CMGD=", index); return gsm_queue_full(gsmm->gsm, GSM_PRIORITY_NORMAL, cmd, - GSM_ERROR_MESSAGE_DELETE_FAILED, NULL); + GSM_ERROR_MESSAGE_DELETE_FAILED, + _modem_message_delete_callback); +} + +static void _modem_message_delete_callback(GSM * gsm) +{ + gsm_event(gsm, GSM_EVENT_TYPE_MESSAGE_DELETED); } diff --git a/src/phone.c b/src/phone.c index 38468ec..09ed3fc 100644 --- a/src/phone.c +++ b/src/phone.c @@ -164,6 +164,7 @@ struct _Phone GtkWidget * me_window; GtkListStore * me_store; GtkWidget * me_view; + GtkWidget * me_progress; /* read */ unsigned int re_index; @@ -210,6 +211,8 @@ static GtkWidget * _phone_create_dialpad(Phone * phone, static GtkWidget * _phone_create_progress(GtkWidget * parent, char const * text); +static int _phone_confirm(Phone * phone, GtkWidget * window, + char const * message); static void _phone_error(GtkWidget * window, char const * message); static void _phone_fetch_contacts(Phone * phone, unsigned int start, @@ -865,10 +868,14 @@ void phone_messages_delete_selected(Phone * phone) return; gtk_tree_model_get(GTK_TREE_MODEL(phone->me_store), &iter, PHONE_MESSAGE_COLUMN_ID, &index, -1); - /* FIXME ask for confirmation first, add a progress window */ - gsm_message_delete(phone->gsm, index); + if(_phone_confirm(phone, phone->me_window, _("Delete this message?")) + != 0) + return; if(phone->re_index == index) phone_show_read(phone, FALSE); + phone->me_progress = _phone_create_progress(phone->me_window, + _("Deleting message...")); + gsm_message_delete(phone->gsm, index); } @@ -933,9 +940,15 @@ void phone_read_call(Phone * phone) /* phone_read_delete */ void phone_read_delete(Phone * phone) { - /* FIXME ask for confirmation first, add a progress window */ + if(_phone_confirm(phone, phone->re_window, _("Delete this message?")) + != 0) + return; + phone_show_read(phone, FALSE); gsm_message_delete(phone->gsm, phone->re_index); phone_show_read(phone, FALSE); + phone->me_progress = _phone_create_progress(phone->me_window, + _("Deleting message...")); + gsm_message_delete(phone->gsm, phone->re_index); } @@ -2110,6 +2123,31 @@ static GtkWidget * _phone_create_progress(GtkWidget * parent, char const * text) } +/* phone_confirm */ +static int _phone_confirm(Phone * phone, GtkWidget * window, + char const * message) +{ + GtkWidget * dialog; + int res; + + dialog = gtk_message_dialog_new(GTK_WINDOW(window), + GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO, "%s", +#if GTK_CHECK_VERSION(2, 8, 0) + _("Question")); + gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog), + "%s", +#endif + message); + gtk_window_set_title(GTK_WINDOW(dialog), _("Question")); + res = gtk_dialog_run(GTK_DIALOG(dialog)); + gtk_widget_destroy(dialog); + if(res == GTK_RESPONSE_YES) + return 0; + return 1; +} + + /* phone_error */ static void _phone_error(GtkWidget * window, char const * message) { @@ -2407,6 +2445,12 @@ static int _phone_gsm_event(GSMEvent * event, gpointer data) return 0; case GSM_EVENT_TYPE_MESSAGE: return _gsm_event_message(phone, event); + case GSM_EVENT_TYPE_MESSAGE_DELETED: + phone->me_progress = _phone_progress_delete( + phone->me_progress); + _phone_info(phone, phone->me_window, + _("Message deleted"), NULL); + return 0; case GSM_EVENT_TYPE_MESSAGE_LIST: _phone_fetch_messages(phone, event->message_list.start, event->message_list.end);