source: messagelist.c @ 30428a9

release-1.8release-1.9
Last change on this file since 30428a9 was efeec7f, checked in by Jason Gross <jgross@mit.edu>, 10 years ago
Added a delete-and-expunge command. This command is analogous to the delete command, except that it also expunges only the {current,given} message. It also takes an optional --quiet parameter, because I plan to use it internally and don't want spew on success. Perhaps there's a better way to accomplish this... I couldn't figure out how the existing delete command is supposed to work internally. The logic behind the delete-and-expunge command is as follows: We always update both the message list and the display. So model the command that will do much of the work, owl_function_delete_and_expunge_message, off of owl_function_expunge. owl_function_delete_and_expunge_message takes one argument, which is the position of the item in the message list. It deletes it from the message list with a new function owl_messagelist_delete_and_expunge_element. This calls delete on the underlying owl_list, so the errors (if any) on an index that is too big might be unhelpful. owl_function_delete_and_expunge_cur and owl_function_delete_and_expunge_by_id both get the index of the relevant message (and a function owl_messagelist_get_index_by_id is added to messagelist.c to help the latter). They owl_function_error if no such message exists, and conditionally owl_function_makemsg on success.
  • Property mode set to 100644
File size: 2.9 KB
Line 
1#include "owl.h"
2#include <stdlib.h>
3#include <string.h>
4
5void owl_messagelist_create(owl_messagelist *ml)
6{
7  ml->list = g_ptr_array_new();
8}
9
10void owl_messagelist_cleanup(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}
16
17int owl_messagelist_get_size(const owl_messagelist *ml)
18{
19  return ml->list->len;
20}
21
22void *owl_messagelist_get_element(const owl_messagelist *ml, int n)
23{
24  /* we assume things like owl_view_get_element(v, owl_global_get_curmsg(&g))
25   * work even when there are no messages in the message list.  So don't
26   * segfault if someone asks for the zeroth element of an empty list.
27   */
28  if (n >= ml->list->len) return NULL;
29  return ml->list->pdata[n];
30}
31
32int owl_messagelist_get_index_by_id(const owl_messagelist *ml, int target_id)
33{
34  /* return the message index with id == 'id'.  If it doesn't exist return -1. */
35  int first, last, mid, msg_id;
36  owl_message *m;
37
38  first = 0;
39  last = ml->list->len - 1;
40  while (first <= last) {
41    mid = (first + last) / 2;
42    m = ml->list->pdata[mid];
43    msg_id = owl_message_get_id(m);
44    if (msg_id == target_id) {
45      return mid;
46    } else if (msg_id < target_id) {
47      first = mid + 1;
48    } else {
49      last = mid - 1;
50    }
51  }
52  return -1;
53}
54
55owl_message *owl_messagelist_get_by_id(const owl_messagelist *ml, int target_id)
56{
57  /* return the message with id == 'id'.  If it doesn't exist return NULL. */
58  int n = owl_messagelist_get_index_by_id(ml, target_id);
59  if (n < 0) return NULL;
60  return ml->list->pdata[n];
61}
62
63void owl_messagelist_append_element(owl_messagelist *ml, void *element)
64{
65  g_ptr_array_add(ml->list, element);
66}
67
68/* do we really still want this? */
69int owl_messagelist_delete_element(owl_messagelist *ml, int n)
70{
71  /* mark a message as deleted */
72  owl_message_mark_delete(ml->list->pdata[n]);
73  return(0);
74}
75
76int owl_messagelist_undelete_element(owl_messagelist *ml, int n)
77{
78  /* mark a message as deleted */
79  owl_message_unmark_delete(ml->list->pdata[n]);
80  return(0);
81}
82
83void owl_messagelist_delete_and_expunge_element(owl_messagelist *ml, int n)
84{
85  owl_message_delete(g_ptr_array_remove_index(ml->list, n));
86}
87
88int owl_messagelist_expunge(owl_messagelist *ml)
89{
90  /* expunge deleted messages */
91  int i;
92  GPtrArray *newlist;
93  owl_message *m;
94
95  newlist = g_ptr_array_new();
96  /*create a new list without messages marked as deleted */
97  for (i = 0; i < ml->list->len; i++) {
98    m = ml->list->pdata[i];
99    if (owl_message_is_delete(m)) {
100      owl_message_delete(m);
101    } else {
102      g_ptr_array_add(newlist, m);
103    }
104  }
105
106  /* free the old list */
107  g_ptr_array_free(ml->list, true);
108
109  /* copy the new list to the old list */
110  ml->list = newlist;
111
112  return(0);
113}
114
115void owl_messagelist_invalidate_formats(const owl_messagelist *ml)
116{
117  int i;
118  owl_message *m;
119
120  for (i = 0; i < ml->list->len; i++) {
121    m = ml->list->pdata[i];
122    owl_message_invalidate_format(m);
123  }
124}
Note: See TracBrowser for help on using the repository browser.