Hi Petteri,

On 08/16/2010 02:08 AM, Petteri Tikander wrote:
> ---
>  src/smsutil.c |  158 
> +++++++++++++++++++++++++++++++++------------------------
>  1 files changed, 92 insertions(+), 66 deletions(-)
> 
> diff --git a/src/smsutil.c b/src/smsutil.c
> index 25e405c..a12bede 100644
> --- a/src/smsutil.c
> +++ b/src/smsutil.c
> @@ -57,6 +57,15 @@ static GSList *sms_assembly_add_fragment_backup(struct 
> sms_assembly *assembly,
>                                       guint16 ref, guint8 max, guint8 seq,
>                                       gboolean backup);
>  
> +static void sr_assembly_add_fragment_backup(
> +                                     struct status_report_assembly *assembly,
> +                                     unsigned int msg_id, time_t ts,
> +                                     const struct sms_address *to,
> +                                     unsigned int *mrs,
> +                                     unsigned char total_mrs,
> +                                     unsigned char sent_mrs,
> +                                     gboolean backup);
> +

Please avoid forward-declarations unless absolutely necessary.  It is
better to just move the function upwards.

>  /*
>   * This function uses the meanings of digits 10..15 according to the rules
>   * defined in 23.040 Section 9.1.2.3 and 24.008 Table 10.5.118
> @@ -2646,22 +2655,19 @@ void sms_assembly_expire(struct sms_assembly 
> *assembly, time_t before)
>       }
>  }
>  
> -static void sr_assembly_load_backup(GHashTable *assembly_table,
> -                                     const char *imsi,
> -                                     const struct dirent *addr_dir)
> +static void sr_assembly_load_backup(
> +                             struct status_report_assembly *assembly_table,
> +                             const struct dirent *addr_dir)
>  {
>       char *path;
>       struct dirent **ids;
>       struct sms_address addr;
>       DECLARE_SMS_ADDR_STR(straddr);
>       struct id_table_node *node;
> -     GHashTable *id_table;
>       int len;
>       int r;
>       unsigned char buf[sizeof(node->mrs) + sizeof(node->total_mrs) +
>                       sizeof(node->sent_mrs) + sizeof(node->deliverable)];
> -     char *assembly_table_key;
> -     unsigned int *id_table_key;
>       struct stat segment_stat;
>  
>       if (addr_dir->d_type != DT_DIR)
> @@ -2675,7 +2681,7 @@ static void sr_assembly_load_backup(GHashTable 
> *assembly_table,
>               return;
>  
>       /* Go through different msg_ids. */
> -     path = g_strdup_printf(SMS_SR_BACKUP_PATH "/%s", imsi,
> +     path = g_strdup_printf(SMS_SR_BACKUP_PATH "/%s", assembly_table->imsi,
>                                                       addr_dir->d_name);
>       len = scandir(path, &ids, NULL, versionsort);
>  
> @@ -2684,22 +2690,13 @@ static void sr_assembly_load_backup(GHashTable 
> *assembly_table,
>       if (len < 0)
>               return;
>  
> -     id_table = g_hash_table_new_full(g_int_hash, g_int_equal,
> -                                                     g_free, g_free);
> -
> -     assembly_table_key = g_try_malloc(sizeof(addr.address));
> -
> -     if (assembly_table_key == NULL)
> -             return;
> -
> -     g_strlcpy(assembly_table_key, addr.address, sizeof(addr.address));
> -     g_hash_table_insert(assembly_table, assembly_table_key, id_table);
> -
>       while (len--) {
>               path = g_strdup_printf(SMS_SR_BACKUP_PATH "/%s/%s",
> -                             imsi, addr_dir->d_name, ids[len]->d_name);
> +                             assembly_table->imsi, addr_dir->d_name,
> +                             ids[len]->d_name);
>               r = read_file(buf, sizeof(buf), SMS_SR_BACKUP_PATH "/%s/%s",
> -                             imsi, addr_dir->d_name, ids[len]->d_name);
> +                             assembly_table->imsi, addr_dir->d_name,
> +                             ids[len]->d_name);
>  
>               if (r < 0) {
>                       g_free(path);
> @@ -2714,29 +2711,21 @@ static void sr_assembly_load_backup(GHashTable 
> *assembly_table,
>                       g_free(ids[len]);
>                       continue;
>               }
> -             /* Gather the data for id_table node */
> -             node = g_new0(struct id_table_node, 1);
> -             memcpy(&node->to, &addr, sizeof(addr));
> -             node->expiration = segment_stat.st_mtime;
> -             memcpy(node->mrs, buf, sizeof(node->mrs));
> -             memcpy(&node->total_mrs, buf + sizeof(node->mrs),
> -                                             sizeof(node->total_mrs));
> -             memcpy(&node->sent_mrs,
> -                     buf + sizeof(node->mrs) + sizeof(node->total_mrs),
> -                     sizeof(node->sent_mrs));
> -
> -             memcpy(&node->deliverable, buf + sizeof(node->mrs) +
> -                     sizeof(node->total_mrs) + sizeof(node->sent_mrs),
> -                     sizeof(node->deliverable));
> -             /* Node ready, create key and add them to the table */
> -             id_table_key = g_new0(unsigned int, 1);
> -             *id_table_key = atoi(ids[len]->d_name);
>  
> -             g_hash_table_insert(id_table, id_table_key, node);
> +             sr_assembly_add_fragment_backup(assembly_table,
> +                                             atoi(ids[len]->d_name),
> +                                             segment_stat.st_mtime,
> +                                             &addr,
> +                                             (unsigned int *) &buf[0],
> +                                             buf[sizeof(node->mrs)],
> +                                             buf[sizeof(node->mrs) +
> +                                             sizeof(node->total_mrs)],
> +                                             FALSE);
>  

If we can write / read the node structure directly, then I'm actually
thinking we won't be needing this patch at all.

>               g_free(path);
>               g_free(ids[len]);
>       }
> +
>       g_free(ids);
>  }
>  
> @@ -2767,8 +2756,7 @@ struct status_report_assembly 
> *status_report_assembly_new(const char *imsi)
>                * 1-n msg_ids.
>                */
>               while (len--) {
> -                     sr_assembly_load_backup(ret->assembly_table, imsi,
> -                                                             addresses[len]);
> +                     sr_assembly_load_backup(ret, addresses[len]);
>                       g_free(addresses[len]);
>               }
>  
> @@ -2778,16 +2766,17 @@ struct status_report_assembly 
> *status_report_assembly_new(const char *imsi)
>       return ret;
>  }
>  
> -static gboolean sr_assembly_add_fragment_backup(const char *imsi,
> -                                     const struct id_table_node *node,
> -                                     unsigned int msg_id)
> +static gboolean sr_assembly_backup_store(
> +                             struct status_report_assembly *assembly,
> +                             const struct id_table_node *node,
> +                             unsigned int msg_id)
>  {
>       int len = sizeof(node->mrs) + sizeof(node->total_mrs) +
>                       sizeof(node->sent_mrs) + sizeof(node->deliverable);
>       unsigned char buf[len];
>       DECLARE_SMS_ADDR_STR(straddr);
>  
> -     if (!imsi)
> +     if (!assembly->imsi)
>               return FALSE;
>  
>       if (sms_address_to_hex_string(&node->to, straddr) == FALSE)
> @@ -2805,32 +2794,35 @@ static gboolean sr_assembly_add_fragment_backup(const 
> char *imsi,
>       sizeof(node->sent_mrs), &node->deliverable, sizeof(node->deliverable));
>  
>       /* storagedir/%s/sms_sr/%s/%i */
> -     if (write_file(buf, len, SMS_BACKUP_MODE, SMS_SR_BACKUP_PATH_FILE, imsi,
> +     if (write_file(buf, len, SMS_BACKUP_MODE,
> +                     SMS_SR_BACKUP_PATH_FILE, assembly->imsi,
>                       straddr, msg_id) != len)
>               return FALSE;
>  
>       return TRUE;
>  }
>  
> -static gboolean sr_assembly_remove_fragment_backup(const char *imsi,
> +static gboolean sr_assembly_backup_free(struct status_report_assembly 
> *assembly,
>                                       const struct id_table_node *node,
>                                       unsigned int msg_id)
>  {
>       char *path;
>       DECLARE_SMS_ADDR_STR(straddr);
>  
> -     if (!imsi)
> +     if (!assembly->imsi)
>               return FALSE;
>  
>       if (sms_address_to_hex_string(&node->to, straddr) == FALSE)
>               return FALSE;
>  
> -     path = g_strdup_printf(SMS_SR_BACKUP_PATH_FILE, imsi, straddr, msg_id);
> +     path = g_strdup_printf(SMS_SR_BACKUP_PATH_FILE, assembly->imsi,
> +                             straddr, msg_id);
>  
>       unlink(path);
>       g_free(path);
>  
> -     path = g_strdup_printf(SMS_SR_BACKUP_PATH_DIR, imsi, straddr);
> +     path = g_strdup_printf(SMS_SR_BACKUP_PATH_DIR, assembly->imsi,
> +                             straddr);
>  
>       /* If the address does not have relating msg_ids anymore, remove it */
>       rmdir(path);
> @@ -2928,8 +2920,8 @@ gboolean status_report_assembly_report(struct 
> status_report_assembly *assembly,
>               /* More status reports expected, and already received
>                  reports completed. Update backup file.
>                */
> -             sr_assembly_add_fragment_backup(assembly->imsi, node,
> -                                             *((unsigned int *) key));
> +             sr_assembly_backup_store(assembly, node,
> +                                      *((unsigned int *) key));
>  
>               return FALSE;
>       }
> @@ -2940,8 +2932,7 @@ gboolean status_report_assembly_report(struct 
> status_report_assembly *assembly,
>       if (out_id)
>               *out_id = *((unsigned int *) key);
>  
> -     sr_assembly_remove_fragment_backup(assembly->imsi, node,
> -                                             *((unsigned int *) key));
> +     sr_assembly_backup_free(assembly, node, *((unsigned int *) key));
>  
>       g_hash_table_iter_remove(&iter);
>  
> @@ -2952,18 +2943,18 @@ gboolean status_report_assembly_report(struct 
> status_report_assembly *assembly,
>       return TRUE;
>  }
>  
> -void status_report_assembly_add_fragment(
> -                                     struct status_report_assembly *assembly,
> -                                     unsigned int msg_id,
> -                                     const struct sms_address *to,
> -                                     unsigned char mr, time_t expiration,
> -                                     unsigned char total_mrs)
> +static void sr_assembly_add_fragment_backup(
> +                             struct status_report_assembly *assembly,
> +                             unsigned int msg_id, time_t ts,
> +                             const struct sms_address *to,
> +                             unsigned int *mrs, unsigned char total_mrs,
> +                             unsigned char sent_mrs, gboolean backup)
>  {
> -     unsigned int offset = mr / 32;
> -     unsigned int bit = 1 << (mr % 32);
>       GHashTable *id_table;
>       struct id_table_node *node;
>       unsigned int *id_table_key;
> +     int i;
> +     int len = sizeof(node->mrs) / sizeof(node->mrs[0]);
>  
>       id_table = g_hash_table_lookup(assembly->assembly_table,
>                                       sms_address_to_string(to));
> @@ -2971,7 +2962,7 @@ void status_report_assembly_add_fragment(
>       /* Create hashtable keyed by the to address if required */
>       if (id_table == NULL) {
>               id_table = g_hash_table_new_full(g_int_hash, g_int_equal,
> -                                                             g_free, g_free);
> +                                             g_free, g_free);
>               g_hash_table_insert(assembly->assembly_table,
>                                       g_strdup(sms_address_to_string(to)),
>                                       id_table);
> @@ -2993,10 +2984,45 @@ void status_report_assembly_add_fragment(
>       }
>  
>       /* id_table and node both exists */
> -     node->mrs[offset] |= bit;
> -     node->expiration = expiration;
> -     node->sent_mrs++;
> -     sr_assembly_add_fragment_backup(assembly->imsi, node, msg_id);
> +
> +     for (i = 0; i < len; i++)
> +             node->mrs[i] |= mrs[i];
> +
> +     node->expiration = ts;
> +
> +     /* storing to the backup-file is needed, when new SMS-message is sent */
> +     if (backup) {
> +             node->sent_mrs++;
> +             sr_assembly_backup_store(assembly, node, msg_id);
> +     }
> +     /* storing to the backup-file is not needed, when backup is loaded */
> +     else
> +             node->sent_mrs = sent_mrs;
> +}
> +
> +void status_report_assembly_add_fragment(
> +                             struct status_report_assembly *assembly,
> +                             unsigned int msg_id,
> +                             const struct sms_address *to,
> +                             unsigned char mr, time_t expiration,
> +                             unsigned char total_mrs)
> +{
> +     struct id_table_node *node;
> +     unsigned int offset = mr / 32;
> +     unsigned int bit = 1 << (mr % 32);
> +     int len = sizeof(node->mrs) / sizeof(node->mrs[0]);
> +     unsigned int mrs[len];
> +
> +     memset(mrs, 0, len);
> +
> +     /* set correct bit corresponding to the
> +      *  received mr-number in mr-buffer
> +      */
> +     mrs[offset] |= bit;
> +

The memset above and this looks fishy to me...

> +     sr_assembly_add_fragment_backup(assembly, msg_id, expiration,
> +                                     to, mrs, total_mrs,
> +                                     FALSE, TRUE);
>  }
>  
>  void status_report_assembly_expire(struct status_report_assembly *assembly,

Regards,
-Denis
_______________________________________________
ofono mailing list
ofono@ofono.org
http://lists.ofono.org/listinfo/ofono

Reply via email to