summaryrefslogtreecommitdiffstats
path: root/src/smsutil.c
diff options
context:
space:
mode:
authorPetteri Tikander <petteri.tikander@ixonos.com>2010-09-10 17:28:19 +0300
committerDenis Kenzior <denkenz@gmail.com>2010-09-10 10:31:10 -0500
commitdf058085ea6f8b3c3b630aa295282a321f28ecb2 (patch)
tree726c986902fcc00f273042ab41df1e423f108b51 /src/smsutil.c
parentb7f1733fe41bfc3688baf6fb105b0a943f482fd6 (diff)
downloadofono-df058085ea6f8b3c3b630aa295282a321f28ecb2.tar.bz2
smsutil: status_report_expiration
Diffstat (limited to 'src/smsutil.c')
-rw-r--r--src/smsutil.c51
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)