smsutil: status_report_expiration
authorPetteri Tikander <petteri.tikander@ixonos.com>
Fri, 10 Sep 2010 14:28:19 +0000 (17:28 +0300)
committerDenis Kenzior <denkenz@gmail.com>
Fri, 10 Sep 2010 15:31:10 +0000 (10:31 -0500)
src/smsutil.c
src/smsutil.h

index 0de420b..ae8f1ef 100644 (file)
@@ -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)
index 3c6b3ae..0e0ddf4 100644 (file)
@@ -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,