diff --git a/src/sms.c b/src/sms.c index 7224bdf5..87283d30 100644 --- a/src/sms.c +++ b/src/sms.c @@ -65,6 +65,7 @@ struct ofono_sms { struct sms_assembly *assembly; guint ref; GQueue *txq; + unsigned long tx_counter; guint tx_source; struct ofono_message_waiting *mw; unsigned int mw_watch; @@ -103,6 +104,7 @@ struct tx_queue_entry { ofono_sms_txq_submit_cb_t cb; void *data; ofono_destroy_func destroy; + unsigned long id; }; static gboolean uuid_equal(gconstpointer v1, gconstpointer v2) @@ -1814,6 +1816,8 @@ int __ofono_sms_txq_submit(struct ofono_sms *sms, GSList *list, sms->ref = sms->ref + 1; } + entry->id = sms->tx_counter++; + g_queue_push_tail(sms->txq, entry); if (sms->registered && g_queue_get_length(sms->txq) == 1) @@ -1822,6 +1826,23 @@ int __ofono_sms_txq_submit(struct ofono_sms *sms, GSList *list, if (uuid) memcpy(uuid, &entry->uuid, sizeof(*uuid)); + if (flags & OFONO_SMS_SUBMIT_FLAG_EXPOSE_DBUS) { + const char *uuid_str; + unsigned char i; + + uuid_str = ofono_uuid_to_str(&entry->uuid); + + for (i = 0; i < entry->num_pdus; i++) { + struct pending_pdu *pdu; + + pdu = &entry->pdus[i]; + + sms_tx_backup_store(sms->imsi, entry->id, entry->flags, + uuid_str, i, pdu->pdu, + pdu->pdu_len, pdu->tpdu_len); + } + } + if (cb) cb(sms, &entry->uuid, data); diff --git a/src/smsutil.c b/src/smsutil.c index 3a54fe65..3e5b7cd0 100644 --- a/src/smsutil.c +++ b/src/smsutil.c @@ -48,6 +48,10 @@ #define SMS_SR_BACKUP_PATH STORAGEDIR "/%s/sms_sr" #define SMS_SR_BACKUP_PATH_FILE SMS_SR_BACKUP_PATH "/%s-%s" +#define SMS_TX_BACKUP_PATH STORAGEDIR "/%s/tx_queue" +#define SMS_TX_BACKUP_PATH_DIR SMS_TX_BACKUP_PATH "/%lu-%lu-%s" +#define SMS_TX_BACKUP_PATH_FILE SMS_TX_BACKUP_PATH_DIR "/%03i" + #define SMS_ADDR_FMT "%24[0-9A-F]" #define SMS_MSGID_FMT "%40[0-9A-F]" @@ -3143,6 +3147,31 @@ void status_report_assembly_expire(struct status_report_assembly *assembly, } } +gboolean sms_tx_backup_store(const char *imsi, unsigned long id, + unsigned long flags, const char *uuid, + guint8 seq, const unsigned char *pdu, + int pdu_len, int tpdu_len) +{ + unsigned char buf[177]; + int len; + + if (!imsi) + return FALSE; + + memcpy(buf + 1, pdu, pdu_len); + buf[0] = tpdu_len; + len = pdu_len + 1; + + /* + * file name is: imsi/tx_queue/order-flags-uuid/pdu + */ + if (write_file(buf, len, SMS_BACKUP_MODE, SMS_TX_BACKUP_PATH_FILE, + imsi, id, flags, uuid, seq) != len) + return FALSE; + + return TRUE; +} + static inline GSList *sms_list_append(GSList *l, const struct sms *in) { struct sms *sms; diff --git a/src/smsutil.h b/src/smsutil.h index dd658846..2ae35d7f 100644 --- a/src/smsutil.h +++ b/src/smsutil.h @@ -517,6 +517,10 @@ void status_report_assembly_add_fragment(struct status_report_assembly void status_report_assembly_expire(struct status_report_assembly *assembly, time_t before); +gboolean sms_tx_backup_store(const char *imsi, unsigned long id, + unsigned long flags, const char *uuid, + guint8 seq, const unsigned char *pdu, + int pdu_len, int tpdu_len); GSList *sms_text_prepare(const char *to, const char *utf8, guint16 ref, gboolean use_16bit, gboolean use_delivery_reports);