diff options
author | Petteri Tikander <petteri.tikander@ixonos.com> | 2010-09-10 17:28:19 +0300 |
---|---|---|
committer | Denis Kenzior <denkenz@gmail.com> | 2010-09-10 10:31:10 -0500 |
commit | df058085ea6f8b3c3b630aa295282a321f28ecb2 (patch) | |
tree | 726c986902fcc00f273042ab41df1e423f108b51 /src/smsutil.c | |
parent | b7f1733fe41bfc3688baf6fb105b0a943f482fd6 (diff) | |
download | ofono-df058085ea6f8b3c3b630aa295282a321f28ecb2.tar.bz2 |
smsutil: status_report_expiration
Diffstat (limited to 'src/smsutil.c')
-rw-r--r-- | src/smsutil.c | 51 |
1 files changed, 48 insertions, 3 deletions
diff --git a/src/smsutil.c b/src/smsutil.c index 0de420be..ae8f1efd 100644 --- a/src/smsutil.c +++ b/src/smsutil.c @@ -2961,10 +2961,55 @@ void status_report_assembly_add_fragment( } void status_report_assembly_expire(struct status_report_assembly *assembly, - time_t before, GFunc foreach_func, - gpointer data) + time_t before) { - /*TODO*/ + GHashTable *id_table; + GHashTableIter iter_addr, iter_node; + struct sms_address addr; + char *straddr; + gpointer key; + unsigned int msg_id; + struct id_table_node *node; + + g_hash_table_iter_init(&iter_addr, assembly->assembly_table); + + /* + * Go through different addresses. Each address can relate to + * 1-n msg_ids. + */ + while (g_hash_table_iter_next(&iter_addr, (gpointer) &straddr, + (gpointer) &id_table)) { + + sms_address_from_string(&addr, straddr); + g_hash_table_iter_init(&iter_node, id_table); + + /* Go through different messages. */ + while (g_hash_table_iter_next(&iter_node, &key, + (gpointer) &node)) { + msg_id = *(unsigned int *) key; + + /* + * If message is expired, removed it from the + * hash-table and remove the backup-file + */ + if (node->expiration <= before) { + g_hash_table_iter_remove(&iter_node); + + sr_assembly_remove_fragment_backup( + assembly->imsi, + node, + &addr, + msg_id); + } + } + + /* + * If all messages are removed, remove address + * from the hash-table. + */ + if (g_hash_table_size(id_table) == 0) + g_hash_table_iter_remove(&iter_addr); + } } static inline GSList *sms_list_append(GSList *l, const struct sms *in) |