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) diff --git a/src/smsutil.h b/src/smsutil.h index 3c6b3aea..0e0ddf45 100644 --- a/src/smsutil.h +++ b/src/smsutil.h @@ -513,8 +513,7 @@ void status_report_assembly_add_fragment(struct status_report_assembly unsigned char mr, time_t expiration, unsigned char total_mrs); void status_report_assembly_expire(struct status_report_assembly *assembly, - time_t before, GFunc foreach_func, - gpointer data); + time_t before); GSList *sms_text_prepare(const char *utf8, guint16 ref, gboolean use_16bit, int *ref_offset,