diff --git a/src/gsm.c b/src/gsm.c index bcbd36c..a116bb7 100644 --- a/src/gsm.c +++ b/src/gsm.c @@ -586,6 +586,20 @@ int gsm_call_reject(GSM * gsm) } +/* callbacks */ +/* gsm_callback_on_message_deleted */ +void gsm_callback_on_message_deleted(GSM * gsm) +{ + GSMCommand * gsmc; + unsigned long index; + + if((gsmc = g_slist_nth_data(gsm->queue, 0)) == NULL) + return; + index = (unsigned long)gsm_command_get_data(gsmc); + gsm_event(gsm, GSM_EVENT_TYPE_MESSAGE_DELETED, index); +} + + /* gsm_enter_sim_pin */ int gsm_enter_sim_pin(GSM * gsm, char const * code) { @@ -657,6 +671,7 @@ int gsm_event(GSM * gsm, GSMEventType type, ...) event->message.content = va_arg(ap, char const *); break; case GSM_EVENT_TYPE_MESSAGE_DELETED: + event->message.index = va_arg(ap, unsigned int); break; case GSM_EVENT_TYPE_MESSAGE_LIST: event->message_list.start = va_arg(ap, unsigned int); diff --git a/src/gsm.h b/src/gsm.h index d70553d..e97d15d 100644 --- a/src/gsm.h +++ b/src/gsm.h @@ -274,6 +274,13 @@ typedef union _GSMEvent char const * content; } message; + /* GSM_EVENT_TYPE_MESSAGE_DELETED */ + struct + { + GSMEventType type; + unsigned int index; + } message_deleted; + /* GSM_EVENT_TYPE_MESSAGE_SENT */ struct { @@ -364,6 +371,9 @@ int gsm_call_contact(GSM * gsm, GSMCallType calltype, unsigned int index); int gsm_call_hangup(GSM * gsm); int gsm_call_reject(GSM * gsm); +/* callbacks */ +void gsm_callback_on_message_deleted(GSM * gsm); + int gsm_enter_sim_pin(GSM * gsm, char const * code); /* event */ diff --git a/src/modem.c b/src/modem.c index acbbca6..a828d53 100644 --- a/src/modem.c +++ b/src/modem.c @@ -303,7 +303,6 @@ int gsm_modem_get_message(GSMModem * gsmm, unsigned int index) snprintf(cmd, sizeof(cmd), "%s%u", "AT+CMGR=", index); if((gsmc = gsm_command_new(cmd)) == NULL) return 1; - gsm_command_set_priority(gsmc, GSM_PRIORITY_NORMAL); gsm_command_set_error(gsmc, GSM_ERROR_MESSAGE_FETCH_FAILED); gsm_command_set_data(gsmc, (void *)i); /* XXX ugly */ /* XXX race condition here if the user forces out of PDU mode */ @@ -430,21 +429,22 @@ 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) { + GSMCommand * gsmc; char cmd[32]; + unsigned long i = index; snprintf(cmd, sizeof(cmd), "%s%u", "AT+CMGD=", index); - return gsm_queue_full(gsmm->gsm, GSM_PRIORITY_NORMAL, cmd, - 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); + if((gsmc = gsm_command_new(cmd)) == NULL) + return 1; + gsm_command_set_error(gsmc, GSM_ERROR_MESSAGE_DELETE_FAILED); + gsm_command_set_data(gsmc, (void *)i); /* XXX ugly */ + gsm_command_set_callback(gsmc, gsm_callback_on_message_deleted); + if(gsm_queue_command(gsmm->gsm, gsmc) == 0) + return 0; + gsm_command_delete(gsmc); + return 1; } diff --git a/src/phone.c b/src/phone.c index 7cb9569..4742997 100644 --- a/src/phone.c +++ b/src/phone.c @@ -2372,6 +2372,7 @@ static void _phone_track(Phone * phone, PhoneTrack what, gboolean track) /* phone_gsm_event */ static int _gsm_event_error(Phone * phone, GSMEvent * event); static int _gsm_event_message(Phone * phone, GSMEvent * event); +static int _gsm_event_message_deleted(Phone * phone, GSMEvent * event); static int _gsm_event_phone_activity(Phone * phone, GSMPhoneActivity activity); static void _on_sim_pin_valid_response(GtkWidget * widget, gint response, gpointer data); @@ -2446,11 +2447,7 @@ static int _phone_gsm_event(GSMEvent * event, gpointer data) 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; + return _gsm_event_message_deleted(phone, event); case GSM_EVENT_TYPE_MESSAGE_LIST: _phone_fetch_messages(phone, event->message_list.start, event->message_list.end); @@ -2573,6 +2570,29 @@ static int _gsm_event_message(Phone * phone, GSMEvent * event) return 0; } +static int _gsm_event_message_deleted(Phone * phone, GSMEvent * event) +{ + GtkTreeModel * model = GTK_TREE_MODEL(phone->me_store); + GtkTreeIter iter; + gboolean valid; + unsigned int id; + + phone->me_progress = _phone_progress_delete(phone->me_progress); + _phone_info(phone, phone->me_window, _("Message deleted"), NULL); + valid = gtk_tree_model_get_iter_first(model, &iter); + for(; valid == TRUE; valid = gtk_tree_model_iter_next(model, &iter)) + { + gtk_tree_model_get(model, &iter, PHONE_MESSAGE_COLUMN_ID, &id, + -1); + if(id == event->message_deleted.index) + break; + } + if(valid != TRUE) + return 1; /* not found */ + gtk_list_store_remove(phone->me_store, &iter); + return 0; +} + static int _gsm_event_phone_activity(Phone * phone, GSMPhoneActivity activity) { switch(activity)