From e9da2f8904e6645cfdc4d41c2d6bc2649a61d8df Mon Sep 17 00:00:00 2001 From: Pierre Pronchery Date: Sun, 21 Aug 2011 00:11:56 +0000 Subject: [PATCH] Hopefully delete messages correctly --- include/Phone/modem.h | 18 +++-- po/fr.po | 154 ++++++++++++++++++++++-------------------- src/modem.c | 1 + src/modems/debug.c | 27 +++++++- src/modems/hayes.c | 39 +++++++++++ src/phone.c | 32 +++++++++ 6 files changed, 190 insertions(+), 81 deletions(-) diff --git a/include/Phone/modem.h b/include/Phone/modem.h index df30bd7..fde5a1e 100644 --- a/include/Phone/modem.h +++ b/include/Phone/modem.h @@ -67,6 +67,14 @@ typedef enum _ModemCallType MODEM_CALL_TYPE_DATA } ModemCallType; +typedef enum _ModemContactStatus +{ + MODEM_CONTACT_STATUS_OFFLINE = 0, + MODEM_CONTACT_STATUS_ONLINE, + MODEM_CONTACT_STATUS_AWAY, + MODEM_CONTACT_STATUS_IDLE +} ModemContactStatus; + typedef enum _ModemMessageEncoding { MODEM_MESSAGE_ENCODING_NONE = 0, @@ -137,6 +145,7 @@ typedef enum _ModemEventType MODEM_EVENT_TYPE_CONNECTION, MODEM_EVENT_TYPE_CONTACT, MODEM_EVENT_TYPE_MESSAGE, + MODEM_EVENT_TYPE_MESSAGE_DELETED, MODEM_EVENT_TYPE_MESSAGE_SENT, MODEM_EVENT_TYPE_MODEL, MODEM_EVENT_TYPE_REGISTRATION, @@ -198,6 +207,7 @@ typedef union _ModemEvent { ModemEventType type; unsigned int id; + ModemContactStatus status; char const * name; char const * number; } contact; @@ -216,12 +226,12 @@ typedef union _ModemEvent char const * content; } message; - /* MODEM_EVENT_TYPE_MESSAGE_SENT */ + /* MODEM_EVENT_TYPE_MESSAGE_DELETED, MODEM_EVENT_TYPE_MESSAGE_SENT */ struct { ModemEventType type; unsigned int id; - } message_sent; + } message_deleted, message_sent; /* MODEM_EVENT_TYPE_MODEL */ struct @@ -321,12 +331,12 @@ typedef union _ModemRequest unsigned int id; } contact, contact_delete; - /* MODEM_REQUEST_MESSAGE */ + /* MODEM_REQUEST_MESSAGE, MODEM_REQUEST_MESSAGE_DELETE */ struct { ModemRequestType type; unsigned int id; - } message; + } message, message_delete; /* MODEM_REQUEST_MESSAGE_SEND */ struct diff --git a/po/fr.po b/po/fr.po index 01d1d96..d279152 100644 --- a/po/fr.po +++ b/po/fr.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Phone 0.0.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-08-21 01:15+0200\n" +"POT-Creation-Date: 2011-08-21 02:10+0200\n" "PO-Revision-Date: 2010-04-24 02:07+0200\n" "Last-Translator: Pierre Pronchery \n" "Language-Team: DeforaOS development (French) \n" @@ -27,304 +27,308 @@ msgstr "" " -m\tNom du greffon modem à charger\n" " -r\tDélai entre deux tentatives d'accès au modem (ms)\n" -#: ../src/phone.c:332 +#: ../src/phone.c:333 msgid "All" msgstr "Tous" -#: ../src/phone.c:333 +#: ../src/phone.c:334 msgid "Inbox" msgstr "Reçus" -#: ../src/phone.c:334 +#: ../src/phone.c:335 msgid "Sent" msgstr "Envoyés" -#: ../src/phone.c:335 +#: ../src/phone.c:336 msgid "Drafts" msgstr "Brouillons" -#: ../src/phone.c:336 +#: ../src/phone.c:337 msgid "Trash" msgstr "Corbeille" -#: ../src/phone.c:489 ../src/phone.c:2473 +#: ../src/phone.c:490 ../src/phone.c:2476 msgid "System preferences" msgstr "Préférences système" -#: ../src/phone.c:500 ../src/phone.c:1902 +#: ../src/phone.c:501 ../src/phone.c:1905 msgid "Plug-ins" msgstr "Greffons" -#: ../src/phone.c:665 +#: ../src/phone.c:666 #, c-format msgid "Checking %s..." msgstr "Vérification %s..." -#: ../src/phone.c:728 +#: ../src/phone.c:729 msgid "Delete this contact?" msgstr "Supprimer ce contact?" -#: ../src/phone.c:1030 ../src/phone.c:1195 +#: ../src/phone.c:1031 ../src/phone.c:1197 msgid "Delete this message?" msgstr "Supprimer ce message?" -#: ../src/phone.c:1036 ../src/phone.c:1200 +#: ../src/phone.c:1037 ../src/phone.c:1202 msgid "Deleting message..." msgstr "Suppression du message..." -#: ../src/phone.c:1296 +#: ../src/phone.c:1299 msgid "Unknown contact" msgstr "Contact inconnu" -#: ../src/phone.c:1303 +#: ../src/phone.c:1306 msgid "Unknown number" msgstr "Numéro inconnu" -#: ../src/phone.c:1315 +#: ../src/phone.c:1318 msgid "In conversation" msgstr "En conversation" -#: ../src/phone.c:1326 +#: ../src/phone.c:1329 msgid "Incoming call" msgstr "Appel entrant" -#: ../src/phone.c:1336 +#: ../src/phone.c:1339 msgid "Outgoing call" msgstr "Appel sortant" -#: ../src/phone.c:1347 +#: ../src/phone.c:1350 msgid "Call finished" msgstr "Appel terminé" -#: ../src/phone.c:1377 +#: ../src/phone.c:1380 msgid "_Answer" msgstr "_Répondre" -#: ../src/phone.c:1382 +#: ../src/phone.c:1385 msgid "_Hangup" msgstr "Ra_ccrocher" -#: ../src/phone.c:1387 +#: ../src/phone.c:1390 msgid "_Reject" msgstr "Re_jeter" -#: ../src/phone.c:1407 +#: ../src/phone.c:1410 msgid "Loudspeaker" msgstr "Haut-parleur" -#: ../src/phone.c:1415 +#: ../src/phone.c:1418 msgid "Mute microphone" msgstr "Couper le microphone" -#: ../src/phone.c:1457 +#: ../src/phone.c:1460 #, c-format msgid "Enter %s" msgstr "Entrer %s" -#: ../src/phone.c:1500 +#: ../src/phone.c:1503 msgid "Enter" msgstr "Entrer" -#: ../src/phone.c:1502 +#: ../src/phone.c:1505 msgid "Skip" msgstr "Ignorer" -#: ../src/phone.c:1530 +#: ../src/phone.c:1533 msgid "Contacts" msgstr "Contacts" -#: ../src/phone.c:1536 ../src/phone.c:1647 ../src/phone.c:1683 -#: ../src/phone.c:1798 ../src/phone.c:2154 +#: ../src/phone.c:1539 ../src/phone.c:1650 ../src/phone.c:1686 +#: ../src/phone.c:1801 ../src/phone.c:2157 msgid "Call" msgstr "Appeler" -#: ../src/phone.c:1542 +#: ../src/phone.c:1545 msgid "Write" msgstr "Écrire" -#: ../src/phone.c:1576 ../src/phone.c:1933 ../src/phone.c:2265 +#: ../src/phone.c:1579 ../src/phone.c:1936 ../src/phone.c:2268 msgid "Name" msgstr "Nom" -#: ../src/phone.c:1622 +#: ../src/phone.c:1625 msgid "Dialer" msgstr "Composer" -#: ../src/phone.c:1649 +#: ../src/phone.c:1652 msgid "Hang up" msgstr "Raccrocher" -#: ../src/phone.c:1677 +#: ../src/phone.c:1680 msgid "Phone logs" msgstr "Journal d'appels" -#: ../src/phone.c:1689 +#: ../src/phone.c:1692 msgid "Message" msgstr "Message" -#: ../src/phone.c:1720 +#: ../src/phone.c:1723 msgid "Direction" msgstr "Direction" -#: ../src/phone.c:1725 ../src/phone.c:1844 +#: ../src/phone.c:1728 ../src/phone.c:1847 msgid "To/From" msgstr "Vers/De" -#: ../src/phone.c:1731 ../src/phone.c:1852 +#: ../src/phone.c:1734 ../src/phone.c:1855 msgid "Date" msgstr "Date" -#: ../src/phone.c:1792 +#: ../src/phone.c:1795 msgid "Messages" msgstr "Messages" -#: ../src/phone.c:1803 +#: ../src/phone.c:1806 msgid "New message" msgstr "Nouveau message" -#: ../src/phone.c:1809 ../src/phone.c:2160 +#: ../src/phone.c:1812 ../src/phone.c:2163 msgid "Reply" msgstr "Répondre" -#: ../src/phone.c:1921 +#: ../src/phone.c:1924 msgid "Enabled" msgstr "Activé" -#: ../src/phone.c:2148 +#: ../src/phone.c:2151 msgid "Read message" msgstr "Lire le message" -#: ../src/phone.c:2166 +#: ../src/phone.c:2169 msgid "Forward" msgstr "Transmettre" -#: ../src/phone.c:2240 +#: ../src/phone.c:2243 msgid "Phone settings" msgstr "Paramètres du téléphone" -#: ../src/phone.c:2317 +#: ../src/phone.c:2320 msgid "missed calls" msgstr "appels manqués" -#: ../src/phone.c:2317 +#: ../src/phone.c:2320 msgid "missed call" msgstr "appel manqué" -#: ../src/phone.c:2326 +#: ../src/phone.c:2329 msgid "new messages" msgstr "nouveaux messages" -#: ../src/phone.c:2327 +#: ../src/phone.c:2330 msgid "new message" msgstr "nouveau message" -#: ../src/phone.c:2345 ../src/phone.c:3250 ../src/phone.c:3254 +#: ../src/phone.c:2348 ../src/phone.c:3253 ../src/phone.c:3257 msgid "Information" msgstr "Information" -#: ../src/phone.c:2355 +#: ../src/phone.c:2358 msgid "Status" msgstr "État" -#: ../src/phone.c:2379 +#: ../src/phone.c:2382 msgid "_View" msgstr "_Vue" -#: ../src/phone.c:2398 +#: ../src/phone.c:2401 msgid "_Read" msgstr "_Lire" -#: ../src/phone.c:2499 +#: ../src/phone.c:2502 msgid "Open file..." msgstr "Ouvrir fichier..." -#: ../src/phone.c:2685 +#: ../src/phone.c:2688 msgid "Write message" msgstr "Écrire un message" -#: ../src/phone.c:2691 +#: ../src/phone.c:2694 msgid "Send" msgstr "Envoyer" -#: ../src/phone.c:2697 +#: ../src/phone.c:2700 msgid "Attach" msgstr "Joindre" -#: ../src/phone.c:2813 +#: ../src/phone.c:2816 msgid "Attach file..." msgstr "Joindre un fichier..." -#: ../src/phone.c:2884 +#: ../src/phone.c:2887 #, c-format msgid "%d message%s, %d/%d characters" msgstr "%d message%s, %d/%d caractères" -#: ../src/phone.c:2885 +#: ../src/phone.c:2888 msgid "s" msgstr "s" -#: ../src/phone.c:2949 +#: ../src/phone.c:2952 msgid "Sending message..." msgstr "Envoi du message..." -#: ../src/phone.c:2978 +#: ../src/phone.c:2981 msgid "Outgoing" msgstr "Sortant" -#: ../src/phone.c:3164 +#: ../src/phone.c:3167 msgid "Operation in progress..." msgstr "Opération en cours..." -#: ../src/phone.c:3202 ../src/phone.c:3206 +#: ../src/phone.c:3205 ../src/phone.c:3209 msgid "Question" msgstr "Question" -#: ../src/phone.c:3226 ../src/phone.c:3230 +#: ../src/phone.c:3229 ../src/phone.c:3233 msgid "Error" msgstr "Erreur" -#: ../src/phone.c:3456 +#: ../src/phone.c:3459 msgid "Name: " msgstr "Nom: " -#: ../src/phone.c:3465 +#: ../src/phone.c:3468 msgid "Number: " msgstr "Numéro: " -#: ../src/phone.c:3481 +#: ../src/phone.c:3484 msgid "New contact" msgstr "Nouveau contact" -#: ../src/phone.c:3483 +#: ../src/phone.c:3486 msgid "Edit contact: " msgstr "Modifier contact: " -#: ../src/phone.c:3510 +#: ../src/phone.c:3513 msgid "The name cannot be empty" msgstr "Le nom ne peut être vide" -#: ../src/phone.c:3515 +#: ../src/phone.c:3518 msgid "The number cannot be empty" msgstr "Le numéro ne peut être vide" -#: ../src/phone.c:3646 +#: ../src/phone.c:3653 msgid "Message sent" msgstr "Message envoyé" -#: ../src/phone.c:3682 +#: ../src/phone.c:3689 #, c-format msgid "Wrong %s" msgstr "Mauvais %s" -#: ../src/phone.c:3689 +#: ../src/phone.c:3696 #, c-format msgid "%s is valid" msgstr "%s valide" -#: ../src/phone.c:3752 +#: ../src/phone.c:3759 msgid "Raw data (not shown)" msgstr "Données brutes (non affichées)" +#: ../src/phone.c:3792 +msgid "Message deleted" +msgstr "Message effacé" + #: ../src/phonectl.c:44 msgid "" "Usage: phonectl -C\n" diff --git a/src/modem.c b/src/modem.c index e1df1d9..8df6451 100644 --- a/src/modem.c +++ b/src/modem.c @@ -208,6 +208,7 @@ int modem_request_type(Modem * modem, ModemRequestType type, ...) request.contact_delete.id = va_arg(ap, unsigned int); break; case MODEM_REQUEST_MESSAGE: + case MODEM_REQUEST_MESSAGE_DELETE: request.message.id = va_arg(ap, unsigned int); break; case MODEM_REQUEST_MESSAGE_SEND: diff --git a/src/modems/debug.c b/src/modems/debug.c index fa035fb..61ebb90 100644 --- a/src/modems/debug.c +++ b/src/modems/debug.c @@ -48,6 +48,7 @@ static int _debug_init(ModemPlugin * modem); static int _debug_destroy(ModemPlugin * modem); static int _debug_start(ModemPlugin * modem, unsigned int retry); static int _debug_stop(ModemPlugin * modem); +static int _debug_request(ModemPlugin * modem, ModemRequest * request); /* accessors */ static void _debug_set_status(ModemPlugin * modem, char const * status); @@ -69,7 +70,7 @@ ModemPlugin plugin = _debug_destroy, _debug_start, _debug_stop, - NULL, + _debug_request, NULL, NULL }; @@ -126,7 +127,7 @@ static int _debug_init(ModemPlugin * modem) debug->folder = gtk_combo_box_new_text(); gtk_combo_box_append_text(GTK_COMBO_BOX(debug->folder), "Unknown"); gtk_combo_box_append_text(GTK_COMBO_BOX(debug->folder), "Inbox"); - gtk_combo_box_append_text(GTK_COMBO_BOX(debug->folder), "Outbox"); + gtk_combo_box_append_text(GTK_COMBO_BOX(debug->folder), "Sent"); gtk_combo_box_append_text(GTK_COMBO_BOX(debug->folder), "Drafts"); gtk_combo_box_append_text(GTK_COMBO_BOX(debug->folder), "Trash"); gtk_combo_box_set_active(GTK_COMBO_BOX(debug->folder), 1); @@ -215,6 +216,28 @@ static gboolean _stop_on_idle(gpointer data) } +/* debug_request */ +static int _debug_request(ModemPlugin * modem, ModemRequest * request) +{ + ModemEvent event; + + if(request == NULL) + return -1; + memset(&event, 0, sizeof(event)); + switch(request->type) + { + case MODEM_REQUEST_MESSAGE_DELETE: + event.type = MODEM_EVENT_TYPE_MESSAGE_DELETED; + event.message_deleted.id = request->message_delete.id; + modem->helper->event(modem->helper->modem, &event); + break; + default: + break; + } + return 0; +} + + /* accessors */ /* debug_set_status */ static void _debug_set_status(ModemPlugin * modem, char const * status) diff --git a/src/modems/hayes.c b/src/modems/hayes.c index 5237c62..d66cd33 100644 --- a/src/modems/hayes.c +++ b/src/modems/hayes.c @@ -281,6 +281,8 @@ static HayesCommandStatus _on_request_generic(HayesCommand * command, HayesCommandStatus status, void * priv); static HayesCommandStatus _on_request_message(HayesCommand * command, HayesCommandStatus status, void * priv); +static HayesCommandStatus _on_request_message_delete(HayesCommand * command, + HayesCommandStatus status, void * priv); static HayesCommandStatus _on_request_message_list(HayesCommand * command, HayesCommandStatus status, void * priv); static HayesCommandStatus _on_request_message_send(HayesCommand * command, @@ -494,6 +496,8 @@ static HayesRequestHandler _hayes_request_handlers[] = _on_request_contact_list }, { MODEM_REQUEST_MESSAGE, NULL, _on_request_message }, + { MODEM_REQUEST_MESSAGE_DELETE, NULL, + _on_request_message_delete }, { MODEM_REQUEST_MESSAGE_LIST, "AT+CMGL=4", _on_request_message_list }, { MODEM_REQUEST_MESSAGE_SEND, NULL, @@ -609,6 +613,8 @@ static char * _request_attention_contact_list(ModemRequest * request); static char * _request_attention_gprs(ModemPlugin * modem, char const * username, char const * password); static char * _request_attention_message(ModemPlugin * modem, unsigned int id); +static char * _request_attention_message_delete(ModemPlugin * modem, + unsigned int id); static char * _request_attention_message_send(ModemPlugin * modem, char const * number, ModemMessageEncoding encoding, size_t length, char const * content); @@ -697,6 +703,9 @@ static char * _request_attention(ModemPlugin * modem, ModemRequest * request) case MODEM_REQUEST_MESSAGE: return _request_attention_message(modem, request->message.id); + case MODEM_REQUEST_MESSAGE_DELETE: + return _request_attention_message_delete(modem, + request->message.id); case MODEM_REQUEST_MESSAGE_SEND: return _request_attention_message_send(modem, request->message_send.number, @@ -818,6 +827,19 @@ static char * _request_attention_message(ModemPlugin * modem, unsigned int id) return strdup(buf); } +static char * _request_attention_message_delete(ModemPlugin * modem, + unsigned int id) +{ + Hayes * hayes = modem->priv; + char const cmd[] = "AT+CMGD="; + char buf[32]; + + /* FIXME store in the command itself */ + hayes->events[MODEM_EVENT_TYPE_MESSAGE_DELETED].message_deleted.id = id; + snprintf(buf, sizeof(buf), "%s%u", cmd, id); + return strdup(buf); +} + static char * _request_attention_message_send(ModemPlugin * modem, char const * number, ModemMessageEncoding encoding, size_t length, char const * content) @@ -1049,6 +1071,7 @@ static int _hayes_trigger(ModemPlugin * modem, ModemEventType event) break; case MODEM_EVENT_TYPE_ERROR: /* do not make sense */ case MODEM_EVENT_TYPE_MESSAGE: + case MODEM_EVENT_TYPE_MESSAGE_DELETED: case MODEM_EVENT_TYPE_MESSAGE_SENT: ret = -1; break; @@ -2332,6 +2355,21 @@ static HayesCommandStatus _on_request_message(HayesCommand * command, } +/* on_request_message_delete */ +static HayesCommandStatus _on_request_message_delete(HayesCommand * command, + HayesCommandStatus status, void * priv) +{ + ModemPlugin * modem = priv; + Hayes * hayes = modem->priv; + ModemEvent * event = &hayes->events[MODEM_EVENT_TYPE_MESSAGE_DELETED]; + + if((status = _on_request_generic(command, status, priv)) != HCS_SUCCESS) + return status; + modem->helper->event(modem->helper->modem, event); + return status; +} + + /* on_request_message_list */ static HayesCommandStatus _on_request_message_list(HayesCommand * command, HayesCommandStatus status, void * priv) @@ -3130,6 +3168,7 @@ static void _on_trigger_cpbr(ModemPlugin * modem, char const * answer) free(hayes->contact_name); hayes->contact_name = strdup(name); event->contact.name = hayes->contact_name; + event->contact.status = MODEM_CONTACT_STATUS_OFFLINE; /* send event */ modem->helper->event(modem->helper->modem, event); } diff --git a/src/phone.c b/src/phone.c index adf3304..830620a 100644 --- a/src/phone.c +++ b/src/phone.c @@ -132,6 +132,7 @@ typedef enum _PhoneSettingsColumn typedef enum _PhoneTrack { PHONE_TRACK_CODE_ENTERED = 0, + PHONE_TRACK_MESSAGE_DELETED, PHONE_TRACK_MESSAGE_LIST, PHONE_TRACK_MESSAGE_SENT } PhoneTrack; @@ -1034,6 +1035,7 @@ void phone_messages_delete_selected(Phone * phone) phone_show_read(phone, FALSE); phone->me_progress = _phone_create_progress(phone->me_window, _("Deleting message...")); + _phone_track(phone, PHONE_TRACK_MESSAGE_DELETED, TRUE); modem_request_type(phone->modem, MODEM_REQUEST_MESSAGE_DELETE, index); } @@ -1198,6 +1200,7 @@ void phone_read_delete(Phone * phone) phone_show_read(phone, FALSE); phone->me_progress = _phone_create_progress(phone->me_window, _("Deleting message...")); + _phone_track(phone, PHONE_TRACK_MESSAGE_DELETED, TRUE); modem_request_type(phone->modem, MODEM_REQUEST_MESSAGE_DELETE, phone->re_index); } @@ -3610,6 +3613,7 @@ static void _modem_event_authentication(Phone * phone, ModemEvent * event); static void _modem_event_call(Phone * phone, ModemEvent * event); static void _modem_event_error(Phone * phone, ModemEvent * event); static void _modem_event_message(Phone * phone, ModemEvent * event); +static void _modem_event_message_deleted(Phone * phone, ModemEvent * event); static void _phone_modem_event(void * priv, ModemEvent * event) { @@ -3639,6 +3643,9 @@ static void _phone_modem_event(void * priv, ModemEvent * event) case MODEM_EVENT_TYPE_MESSAGE: _modem_event_message(phone, event); break; + case MODEM_EVENT_TYPE_MESSAGE_DELETED: + _modem_event_message_deleted(phone, event); + break; case MODEM_EVENT_TYPE_MESSAGE_SENT: _phone_track(phone, PHONE_TRACK_MESSAGE_SENT, FALSE); phone->wr_progress = _phone_progress_delete( @@ -3762,6 +3769,29 @@ static void _modem_event_message(Phone * phone, ModemEvent * event) phone_show_status(phone, TRUE, 0, 1); } +static void _modem_event_message_deleted(Phone * phone, ModemEvent * event) +{ + GtkTreeModel * model = GTK_TREE_MODEL(phone->me_store); + GtkTreeIter iter; + gboolean valid; + unsigned int id; + + for(valid = gtk_tree_model_get_iter_first(model, &iter); 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.id) + { + gtk_list_store_remove(phone->me_store, &iter); + break; + } + } + _phone_track(phone, PHONE_TRACK_MESSAGE_DELETED, FALSE); + phone->me_progress = _phone_progress_delete(phone->me_progress); + _phone_info(phone, phone->me_window, _("Message deleted"), NULL); +} + /* phone_modem_event_authentication */ static void _phone_modem_event_authentication(GtkWidget * widget, gint response, @@ -3781,6 +3811,8 @@ static gboolean _phone_timeout_track(gpointer data) if(phone->tracks[PHONE_TRACK_CODE_ENTERED]) _phone_progress_pulse(phone->en_progress); + if(phone->tracks[PHONE_TRACK_MESSAGE_DELETED]) + _phone_progress_pulse(phone->me_progress); if(phone->tracks[PHONE_TRACK_MESSAGE_LIST]) { _phone_track(phone, PHONE_TRACK_MESSAGE_LIST, FALSE);