Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • messagelist.c

    r66a8cd6 r219f52c  
    11#include "owl.h"
    2 #include <stdlib.h>
    3 #include <string.h>
    42
    5 int owl_messagelist_create(owl_messagelist *ml)
     3CALLER_OWN owl_messagelist *owl_messagelist_new(void)
    64{
    7   owl_list_create(&(ml->list));
    8   return(0);
     5  owl_messagelist *ml = g_new(owl_messagelist, 1);
     6  ml->list = g_ptr_array_new();
     7  return ml;
     8}
     9
     10void owl_messagelist_delete(owl_messagelist *ml, bool free_messages)
     11{
     12  if (free_messages)
     13    g_ptr_array_foreach(ml->list, (GFunc)owl_message_delete, NULL);
     14  g_ptr_array_free(ml->list, true);
     15  g_free(ml);
    916}
    1017
    1118int owl_messagelist_get_size(const owl_messagelist *ml)
    1219{
    13   return(owl_list_get_size(&(ml->list)));
     20  return ml->list->len;
    1421}
    1522
    1623void *owl_messagelist_get_element(const owl_messagelist *ml, int n)
    1724{
    18   return(owl_list_get_element(&(ml->list), n));
     25  /* we assume things like owl_view_get_element(v, owl_global_get_curmsg(&g))
     26   * work even when there are no messages in the message list.  So don't
     27   * segfault if someone asks for the zeroth element of an empty list.
     28   */
     29  if (n >= ml->list->len) return NULL;
     30  return ml->list->pdata[n];
    1931}
    2032
    21 owl_message *owl_messagelist_get_by_id(const owl_messagelist *ml, int target_id)
     33int owl_messagelist_get_index_by_id(const owl_messagelist *ml, int target_id)
    2234{
    23   /* return the message with id == 'id'.  If it doesn't exist return NULL. */
     35  /* return the message index with id == 'id'.  If it doesn't exist return -1. */
    2436  int first, last, mid, msg_id;
    2537  owl_message *m;
    2638
    2739  first = 0;
    28   last = owl_list_get_size(&(ml->list)) - 1;
     40  last = ml->list->len - 1;
    2941  while (first <= last) {
    3042    mid = (first + last) / 2;
    31     m = owl_list_get_element(&(ml->list), mid);
     43    m = ml->list->pdata[mid];
    3244    msg_id = owl_message_get_id(m);
    3345    if (msg_id == target_id) {
    34       return(m);
     46      return mid;
    3547    } else if (msg_id < target_id) {
    3648      first = mid + 1;
     
    3951    }
    4052  }
    41   return(NULL);
     53  return -1;
    4254}
    4355
    44 int owl_messagelist_append_element(owl_messagelist *ml, void *element)
     56owl_message *owl_messagelist_get_by_id(const owl_messagelist *ml, int target_id)
    4557{
    46   return(owl_list_append_element(&(ml->list), element));
     58  /* return the message with id == 'id'.  If it doesn't exist return NULL. */
     59  int n = owl_messagelist_get_index_by_id(ml, target_id);
     60  if (n < 0) return NULL;
     61  return ml->list->pdata[n];
     62}
     63
     64void owl_messagelist_append_element(owl_messagelist *ml, void *element)
     65{
     66  g_ptr_array_add(ml->list, element);
    4767}
    4868
     
    5171{
    5272  /* mark a message as deleted */
    53   owl_message_mark_delete(owl_list_get_element(&(ml->list), n));
     73  owl_message_mark_delete(ml->list->pdata[n]);
    5474  return(0);
    5575}
     
    5878{
    5979  /* mark a message as deleted */
    60   owl_message_unmark_delete(owl_list_get_element(&(ml->list), n));
     80  owl_message_unmark_delete(ml->list->pdata[n]);
    6181  return(0);
     82}
     83
     84void owl_messagelist_delete_and_expunge_element(owl_messagelist *ml, int n)
     85{
     86  owl_message_delete(g_ptr_array_remove_index(ml->list, n));
    6287}
    6388
     
    6590{
    6691  /* expunge deleted messages */
    67   int i, j;
    68   owl_list newlist;
     92  int i;
     93  GPtrArray *newlist;
    6994  owl_message *m;
    7095
    71   owl_list_create(&newlist);
     96  newlist = g_ptr_array_new();
    7297  /*create a new list without messages marked as deleted */
    73   j=owl_list_get_size(&(ml->list));
    74   for (i=0; i<j; i++) {
    75     m=owl_list_get_element(&(ml->list), i);
     98  for (i = 0; i < ml->list->len; i++) {
     99    m = ml->list->pdata[i];
    76100    if (owl_message_is_delete(m)) {
    77101      owl_message_delete(m);
    78102    } else {
    79       owl_list_append_element(&newlist, m);
     103      g_ptr_array_add(newlist, m);
    80104    }
    81105  }
    82106
    83107  /* free the old list */
    84   owl_list_cleanup(&(ml->list), NULL);
     108  g_ptr_array_free(ml->list, true);
    85109
    86110  /* copy the new list to the old list */
     
    92116void owl_messagelist_invalidate_formats(const owl_messagelist *ml)
    93117{
    94   int i, j;
     118  int i;
    95119  owl_message *m;
    96120
    97   j=owl_list_get_size(&(ml->list));
    98   for (i=0; i<j; i++) {
    99     m=owl_list_get_element(&(ml->list), i);
     121  for (i = 0; i < ml->list->len; i++) {
     122    m = ml->list->pdata[i];
    100123    owl_message_invalidate_format(m);
    101124  }
Note: See TracChangeset for help on using the changeset viewer.