mirror of git://git.sysmocom.de/ofono
sms: store pending tx pdus on disk
Based on patch from Kristen Carlson Accardi <kristen@linux.intel.com>
This commit is contained in:
parent
304ab32817
commit
8305ddf321
21
src/sms.c
21
src/sms.c
|
@ -65,6 +65,7 @@ struct ofono_sms {
|
||||||
struct sms_assembly *assembly;
|
struct sms_assembly *assembly;
|
||||||
guint ref;
|
guint ref;
|
||||||
GQueue *txq;
|
GQueue *txq;
|
||||||
|
unsigned long tx_counter;
|
||||||
guint tx_source;
|
guint tx_source;
|
||||||
struct ofono_message_waiting *mw;
|
struct ofono_message_waiting *mw;
|
||||||
unsigned int mw_watch;
|
unsigned int mw_watch;
|
||||||
|
@ -103,6 +104,7 @@ struct tx_queue_entry {
|
||||||
ofono_sms_txq_submit_cb_t cb;
|
ofono_sms_txq_submit_cb_t cb;
|
||||||
void *data;
|
void *data;
|
||||||
ofono_destroy_func destroy;
|
ofono_destroy_func destroy;
|
||||||
|
unsigned long id;
|
||||||
};
|
};
|
||||||
|
|
||||||
static gboolean uuid_equal(gconstpointer v1, gconstpointer v2)
|
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;
|
sms->ref = sms->ref + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
entry->id = sms->tx_counter++;
|
||||||
|
|
||||||
g_queue_push_tail(sms->txq, entry);
|
g_queue_push_tail(sms->txq, entry);
|
||||||
|
|
||||||
if (sms->registered && g_queue_get_length(sms->txq) == 1)
|
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)
|
if (uuid)
|
||||||
memcpy(uuid, &entry->uuid, sizeof(*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)
|
if (cb)
|
||||||
cb(sms, &entry->uuid, data);
|
cb(sms, &entry->uuid, data);
|
||||||
|
|
||||||
|
|
|
@ -48,6 +48,10 @@
|
||||||
#define SMS_SR_BACKUP_PATH STORAGEDIR "/%s/sms_sr"
|
#define SMS_SR_BACKUP_PATH STORAGEDIR "/%s/sms_sr"
|
||||||
#define SMS_SR_BACKUP_PATH_FILE SMS_SR_BACKUP_PATH "/%s-%s"
|
#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_ADDR_FMT "%24[0-9A-F]"
|
||||||
#define SMS_MSGID_FMT "%40[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)
|
static inline GSList *sms_list_append(GSList *l, const struct sms *in)
|
||||||
{
|
{
|
||||||
struct sms *sms;
|
struct sms *sms;
|
||||||
|
|
|
@ -517,6 +517,10 @@ void status_report_assembly_add_fragment(struct status_report_assembly
|
||||||
void status_report_assembly_expire(struct status_report_assembly *assembly,
|
void status_report_assembly_expire(struct status_report_assembly *assembly,
|
||||||
time_t before);
|
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,
|
GSList *sms_text_prepare(const char *to, const char *utf8, guint16 ref,
|
||||||
gboolean use_16bit,
|
gboolean use_16bit,
|
||||||
gboolean use_delivery_reports);
|
gboolean use_delivery_reports);
|
||||||
|
|
Loading…
Reference in New Issue