Changes in messagelist.c [66a8cd6:219f52c]
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
messagelist.c
r66a8cd6 r219f52c 1 1 #include "owl.h" 2 #include <stdlib.h>3 #include <string.h>4 2 5 int owl_messagelist_create(owl_messagelist *ml)3 CALLER_OWN owl_messagelist *owl_messagelist_new(void) 6 4 { 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 10 void 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); 9 16 } 10 17 11 18 int owl_messagelist_get_size(const owl_messagelist *ml) 12 19 { 13 return (owl_list_get_size(&(ml->list)));20 return ml->list->len; 14 21 } 15 22 16 23 void *owl_messagelist_get_element(const owl_messagelist *ml, int n) 17 24 { 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]; 19 31 } 20 32 21 owl_message *owl_messagelist_get_by_id(const owl_messagelist *ml, int target_id)33 int owl_messagelist_get_index_by_id(const owl_messagelist *ml, int target_id) 22 34 { 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. */ 24 36 int first, last, mid, msg_id; 25 37 owl_message *m; 26 38 27 39 first = 0; 28 last = owl_list_get_size(&(ml->list))- 1;40 last = ml->list->len - 1; 29 41 while (first <= last) { 30 42 mid = (first + last) / 2; 31 m = owl_list_get_element(&(ml->list), mid);43 m = ml->list->pdata[mid]; 32 44 msg_id = owl_message_get_id(m); 33 45 if (msg_id == target_id) { 34 return (m);46 return mid; 35 47 } else if (msg_id < target_id) { 36 48 first = mid + 1; … … 39 51 } 40 52 } 41 return (NULL);53 return -1; 42 54 } 43 55 44 int owl_messagelist_append_element(owl_messagelist *ml, void *element)56 owl_message *owl_messagelist_get_by_id(const owl_messagelist *ml, int target_id) 45 57 { 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 64 void owl_messagelist_append_element(owl_messagelist *ml, void *element) 65 { 66 g_ptr_array_add(ml->list, element); 47 67 } 48 68 … … 51 71 { 52 72 /* 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]); 54 74 return(0); 55 75 } … … 58 78 { 59 79 /* 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]); 61 81 return(0); 82 } 83 84 void owl_messagelist_delete_and_expunge_element(owl_messagelist *ml, int n) 85 { 86 owl_message_delete(g_ptr_array_remove_index(ml->list, n)); 62 87 } 63 88 … … 65 90 { 66 91 /* expunge deleted messages */ 67 int i , j;68 owl_listnewlist;92 int i; 93 GPtrArray *newlist; 69 94 owl_message *m; 70 95 71 owl_list_create(&newlist);96 newlist = g_ptr_array_new(); 72 97 /*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]; 76 100 if (owl_message_is_delete(m)) { 77 101 owl_message_delete(m); 78 102 } else { 79 owl_list_append_element(&newlist, m);103 g_ptr_array_add(newlist, m); 80 104 } 81 105 } 82 106 83 107 /* free the old list */ 84 owl_list_cleanup(&(ml->list), NULL);108 g_ptr_array_free(ml->list, true); 85 109 86 110 /* copy the new list to the old list */ … … 92 116 void owl_messagelist_invalidate_formats(const owl_messagelist *ml) 93 117 { 94 int i , j;118 int i; 95 119 owl_message *m; 96 120 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]; 100 123 owl_message_invalidate_format(m); 101 124 }
Note: See TracChangeset
for help on using the changeset viewer.