Remove the message from the list when deleted

This commit is contained in:
Pierre Pronchery 2010-06-05 10:51:40 +00:00
parent df16ab82c2
commit 5ae625c4d9
4 changed files with 61 additions and 16 deletions

View File

@ -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 */ /* gsm_enter_sim_pin */
int gsm_enter_sim_pin(GSM * gsm, char const * code) 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 *); event->message.content = va_arg(ap, char const *);
break; break;
case GSM_EVENT_TYPE_MESSAGE_DELETED: case GSM_EVENT_TYPE_MESSAGE_DELETED:
event->message.index = va_arg(ap, unsigned int);
break; break;
case GSM_EVENT_TYPE_MESSAGE_LIST: case GSM_EVENT_TYPE_MESSAGE_LIST:
event->message_list.start = va_arg(ap, unsigned int); event->message_list.start = va_arg(ap, unsigned int);

View File

@ -274,6 +274,13 @@ typedef union _GSMEvent
char const * content; char const * content;
} message; } message;
/* GSM_EVENT_TYPE_MESSAGE_DELETED */
struct
{
GSMEventType type;
unsigned int index;
} message_deleted;
/* GSM_EVENT_TYPE_MESSAGE_SENT */ /* GSM_EVENT_TYPE_MESSAGE_SENT */
struct 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_hangup(GSM * gsm);
int gsm_call_reject(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); int gsm_enter_sim_pin(GSM * gsm, char const * code);
/* event */ /* event */

View File

@ -303,7 +303,6 @@ int gsm_modem_get_message(GSMModem * gsmm, unsigned int index)
snprintf(cmd, sizeof(cmd), "%s%u", "AT+CMGR=", index); snprintf(cmd, sizeof(cmd), "%s%u", "AT+CMGR=", index);
if((gsmc = gsm_command_new(cmd)) == NULL) if((gsmc = gsm_command_new(cmd)) == NULL)
return 1; return 1;
gsm_command_set_priority(gsmc, GSM_PRIORITY_NORMAL);
gsm_command_set_error(gsmc, GSM_ERROR_MESSAGE_FETCH_FAILED); gsm_command_set_error(gsmc, GSM_ERROR_MESSAGE_FETCH_FAILED);
gsm_command_set_data(gsmc, (void *)i); /* XXX ugly */ gsm_command_set_data(gsmc, (void *)i); /* XXX ugly */
/* XXX race condition here if the user forces out of PDU mode */ /* 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 */ /* gsm_modem_message_delete */
static void _modem_message_delete_callback(GSM * gsm);
int gsm_modem_message_delete(GSMModem * gsmm, unsigned int index) int gsm_modem_message_delete(GSMModem * gsmm, unsigned int index)
{ {
GSMCommand * gsmc;
char cmd[32]; char cmd[32];
unsigned long i = index;
snprintf(cmd, sizeof(cmd), "%s%u", "AT+CMGD=", index); snprintf(cmd, sizeof(cmd), "%s%u", "AT+CMGD=", index);
return gsm_queue_full(gsmm->gsm, GSM_PRIORITY_NORMAL, cmd, if((gsmc = gsm_command_new(cmd)) == NULL)
GSM_ERROR_MESSAGE_DELETE_FAILED, return 1;
_modem_message_delete_callback); 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);
static void _modem_message_delete_callback(GSM * gsm) if(gsm_queue_command(gsmm->gsm, gsmc) == 0)
{ return 0;
gsm_event(gsm, GSM_EVENT_TYPE_MESSAGE_DELETED); gsm_command_delete(gsmc);
return 1;
} }

View File

@ -2372,6 +2372,7 @@ static void _phone_track(Phone * phone, PhoneTrack what, gboolean track)
/* phone_gsm_event */ /* phone_gsm_event */
static int _gsm_event_error(Phone * phone, GSMEvent * event); static int _gsm_event_error(Phone * phone, GSMEvent * event);
static int _gsm_event_message(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 int _gsm_event_phone_activity(Phone * phone, GSMPhoneActivity activity);
static void _on_sim_pin_valid_response(GtkWidget * widget, gint response, static void _on_sim_pin_valid_response(GtkWidget * widget, gint response,
gpointer data); gpointer data);
@ -2446,11 +2447,7 @@ static int _phone_gsm_event(GSMEvent * event, gpointer data)
case GSM_EVENT_TYPE_MESSAGE: case GSM_EVENT_TYPE_MESSAGE:
return _gsm_event_message(phone, event); return _gsm_event_message(phone, event);
case GSM_EVENT_TYPE_MESSAGE_DELETED: case GSM_EVENT_TYPE_MESSAGE_DELETED:
phone->me_progress = _phone_progress_delete( return _gsm_event_message_deleted(phone, event);
phone->me_progress);
_phone_info(phone, phone->me_window,
_("Message deleted"), NULL);
return 0;
case GSM_EVENT_TYPE_MESSAGE_LIST: case GSM_EVENT_TYPE_MESSAGE_LIST:
_phone_fetch_messages(phone, event->message_list.start, _phone_fetch_messages(phone, event->message_list.start,
event->message_list.end); event->message_list.end);
@ -2573,6 +2570,29 @@ static int _gsm_event_message(Phone * phone, GSMEvent * event)
return 0; 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) static int _gsm_event_phone_activity(Phone * phone, GSMPhoneActivity activity)
{ {
switch(activity) switch(activity)