Mercurial > dovecot > original-hg > dovecot-1.2
annotate src/lib-storage/mailbox-tree.c @ 9354:687ac828b964 HEAD
lib-index: modseqs weren't tracked properly within session when changes were done.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Tue, 01 Sep 2009 13:05:03 -0400 |
parents | b9faf4db2a9f |
children | 00cd9aacd03c |
rev | line source |
---|---|
8590
b9faf4db2a9f
Updated copyright notices to include year 2009.
Timo Sirainen <tss@iki.fi>
parents:
7553
diff
changeset
|
1 /* Copyright (c) 2003-2009 Dovecot authors, see the included COPYING file */ |
1650
bc76e08a9c9d
API change: Mailbox list sorting must now always done by storage itself if
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2 |
bc76e08a9c9d
API change: Mailbox list sorting must now always done by storage itself if
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
3 #include "lib.h" |
5547
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
4 #include "array.h" |
1650
bc76e08a9c9d
API change: Mailbox list sorting must now always done by storage itself if
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
5 #include "str.h" |
bc76e08a9c9d
API change: Mailbox list sorting must now always done by storage itself if
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
6 #include "mailbox-tree.h" |
bc76e08a9c9d
API change: Mailbox list sorting must now always done by storage itself if
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
7 |
bc76e08a9c9d
API change: Mailbox list sorting must now always done by storage itself if
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
8 struct mailbox_tree_context { |
bc76e08a9c9d
API change: Mailbox list sorting must now always done by storage itself if
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
9 pool_t pool; |
bc76e08a9c9d
API change: Mailbox list sorting must now always done by storage itself if
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
10 char separator; |
bc76e08a9c9d
API change: Mailbox list sorting must now always done by storage itself if
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
11 struct mailbox_node *nodes; |
bc76e08a9c9d
API change: Mailbox list sorting must now always done by storage itself if
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
12 }; |
bc76e08a9c9d
API change: Mailbox list sorting must now always done by storage itself if
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
13 |
5547
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
14 struct mailbox_tree_iterate_context { |
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
15 struct mailbox_node *root, *next_node; |
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
16 unsigned int flags_mask; |
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
17 |
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
18 char separator; |
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
19 |
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
20 ARRAY_DEFINE(node_path, struct mailbox_node *); |
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
21 string_t *path_str; |
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
22 size_t parent_pos; |
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
23 |
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
24 unsigned int first_child:1; |
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
25 }; |
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
26 |
1650
bc76e08a9c9d
API change: Mailbox list sorting must now always done by storage itself if
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
27 struct mailbox_tree_context *mailbox_tree_init(char separator) |
bc76e08a9c9d
API change: Mailbox list sorting must now always done by storage itself if
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
28 { |
5547
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
29 struct mailbox_tree_context *tree; |
1650
bc76e08a9c9d
API change: Mailbox list sorting must now always done by storage itself if
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
30 pool_t pool; |
bc76e08a9c9d
API change: Mailbox list sorting must now always done by storage itself if
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
31 |
5315 | 32 pool = pool_alloconly_create(MEMPOOL_GROWING"mailbox_tree", 10240); |
1650
bc76e08a9c9d
API change: Mailbox list sorting must now always done by storage itself if
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
33 |
5547
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
34 tree = p_new(pool, struct mailbox_tree_context, 1); |
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
35 tree->pool = pool; |
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
36 tree->separator = separator; |
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
37 return tree; |
1650
bc76e08a9c9d
API change: Mailbox list sorting must now always done by storage itself if
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
38 } |
bc76e08a9c9d
API change: Mailbox list sorting must now always done by storage itself if
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
39 |
5547
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
40 void mailbox_tree_deinit(struct mailbox_tree_context **_tree) |
1650
bc76e08a9c9d
API change: Mailbox list sorting must now always done by storage itself if
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
41 { |
5547
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
42 struct mailbox_tree_context *tree = *_tree; |
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
43 |
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
44 *_tree = NULL; |
6428
7cad076906eb
pool_unref() now takes ** pointer.
Timo Sirainen <tss@iki.fi>
parents:
5833
diff
changeset
|
45 pool_unref(&tree->pool); |
1650
bc76e08a9c9d
API change: Mailbox list sorting must now always done by storage itself if
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
46 } |
bc76e08a9c9d
API change: Mailbox list sorting must now always done by storage itself if
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
47 |
bc76e08a9c9d
API change: Mailbox list sorting must now always done by storage itself if
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
48 static struct mailbox_node * |
5547
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
49 mailbox_tree_traverse(struct mailbox_tree_context *tree, const char *path, |
3863
55df57c028d4
Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents:
1650
diff
changeset
|
50 bool create, bool *created) |
1650
bc76e08a9c9d
API change: Mailbox list sorting must now always done by storage itself if
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
51 { |
5829
1d73153584d2
Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents:
5548
diff
changeset
|
52 struct mailbox_node **node, *parent; |
1650
bc76e08a9c9d
API change: Mailbox list sorting must now always done by storage itself if
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
53 const char *name; |
bc76e08a9c9d
API change: Mailbox list sorting must now always done by storage itself if
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
54 string_t *str; |
bc76e08a9c9d
API change: Mailbox list sorting must now always done by storage itself if
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
55 |
bc76e08a9c9d
API change: Mailbox list sorting must now always done by storage itself if
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
56 if (created != NULL) |
bc76e08a9c9d
API change: Mailbox list sorting must now always done by storage itself if
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
57 *created = FALSE; |
bc76e08a9c9d
API change: Mailbox list sorting must now always done by storage itself if
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
58 |
bc76e08a9c9d
API change: Mailbox list sorting must now always done by storage itself if
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
59 if (path == NULL) |
5547
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
60 return tree->nodes; |
1650
bc76e08a9c9d
API change: Mailbox list sorting must now always done by storage itself if
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
61 |
bc76e08a9c9d
API change: Mailbox list sorting must now always done by storage itself if
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
62 if (strncasecmp(path, "INBOX", 5) == 0 && |
5547
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
63 (path[5] == '\0' || path[5] == tree->separator)) |
1650
bc76e08a9c9d
API change: Mailbox list sorting must now always done by storage itself if
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
64 path = t_strdup_printf("INBOX%s", path+5); |
bc76e08a9c9d
API change: Mailbox list sorting must now always done by storage itself if
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
65 |
5829
1d73153584d2
Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents:
5548
diff
changeset
|
66 parent = NULL; |
5547
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
67 node = &tree->nodes; |
1650
bc76e08a9c9d
API change: Mailbox list sorting must now always done by storage itself if
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
68 |
bc76e08a9c9d
API change: Mailbox list sorting must now always done by storage itself if
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
69 str = t_str_new(strlen(path)+1); |
bc76e08a9c9d
API change: Mailbox list sorting must now always done by storage itself if
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
70 for (name = path;; path++) { |
5547
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
71 if (*path != tree->separator && *path != '\0') |
1650
bc76e08a9c9d
API change: Mailbox list sorting must now always done by storage itself if
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
72 continue; |
bc76e08a9c9d
API change: Mailbox list sorting must now always done by storage itself if
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
73 |
bc76e08a9c9d
API change: Mailbox list sorting must now always done by storage itself if
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
74 str_truncate(str, 0); |
bc76e08a9c9d
API change: Mailbox list sorting must now always done by storage itself if
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
75 str_append_n(str, name, (size_t) (path - name)); |
bc76e08a9c9d
API change: Mailbox list sorting must now always done by storage itself if
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
76 name = str_c(str); |
bc76e08a9c9d
API change: Mailbox list sorting must now always done by storage itself if
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
77 |
bc76e08a9c9d
API change: Mailbox list sorting must now always done by storage itself if
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
78 /* find the node */ |
bc76e08a9c9d
API change: Mailbox list sorting must now always done by storage itself if
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
79 while (*node != NULL) { |
bc76e08a9c9d
API change: Mailbox list sorting must now always done by storage itself if
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
80 if (strcmp((*node)->name, name) == 0) |
bc76e08a9c9d
API change: Mailbox list sorting must now always done by storage itself if
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
81 break; |
bc76e08a9c9d
API change: Mailbox list sorting must now always done by storage itself if
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
82 |
bc76e08a9c9d
API change: Mailbox list sorting must now always done by storage itself if
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
83 node = &(*node)->next; |
bc76e08a9c9d
API change: Mailbox list sorting must now always done by storage itself if
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
84 } |
bc76e08a9c9d
API change: Mailbox list sorting must now always done by storage itself if
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
85 |
bc76e08a9c9d
API change: Mailbox list sorting must now always done by storage itself if
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
86 if (*node == NULL) { |
bc76e08a9c9d
API change: Mailbox list sorting must now always done by storage itself if
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
87 /* not found, create it */ |
bc76e08a9c9d
API change: Mailbox list sorting must now always done by storage itself if
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
88 if (!create) |
bc76e08a9c9d
API change: Mailbox list sorting must now always done by storage itself if
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
89 break; |
bc76e08a9c9d
API change: Mailbox list sorting must now always done by storage itself if
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
90 |
5547
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
91 *node = p_new(tree->pool, struct mailbox_node, 1); |
5829
1d73153584d2
Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents:
5548
diff
changeset
|
92 (*node)->parent = parent; |
5547
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
93 (*node)->name = p_strdup(tree->pool, name); |
1650
bc76e08a9c9d
API change: Mailbox list sorting must now always done by storage itself if
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
94 |
5833
8351aa73b4df
Don't add nonexistent/children flags automatically here.
Timo Sirainen <tss@iki.fi>
parents:
5829
diff
changeset
|
95 if (created != NULL) |
8351aa73b4df
Don't add nonexistent/children flags automatically here.
Timo Sirainen <tss@iki.fi>
parents:
5829
diff
changeset
|
96 *created = TRUE; |
1650
bc76e08a9c9d
API change: Mailbox list sorting must now always done by storage itself if
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
97 } |
bc76e08a9c9d
API change: Mailbox list sorting must now always done by storage itself if
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
98 |
bc76e08a9c9d
API change: Mailbox list sorting must now always done by storage itself if
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
99 if (*path == '\0') |
bc76e08a9c9d
API change: Mailbox list sorting must now always done by storage itself if
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
100 break; |
bc76e08a9c9d
API change: Mailbox list sorting must now always done by storage itself if
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
101 |
bc76e08a9c9d
API change: Mailbox list sorting must now always done by storage itself if
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
102 name = path+1; |
5829
1d73153584d2
Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents:
5548
diff
changeset
|
103 |
1d73153584d2
Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents:
5548
diff
changeset
|
104 parent = *node; |
1650
bc76e08a9c9d
API change: Mailbox list sorting must now always done by storage itself if
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
105 node = &(*node)->children; |
bc76e08a9c9d
API change: Mailbox list sorting must now always done by storage itself if
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
106 } |
bc76e08a9c9d
API change: Mailbox list sorting must now always done by storage itself if
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
107 |
bc76e08a9c9d
API change: Mailbox list sorting must now always done by storage itself if
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
108 return *node; |
bc76e08a9c9d
API change: Mailbox list sorting must now always done by storage itself if
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
109 } |
bc76e08a9c9d
API change: Mailbox list sorting must now always done by storage itself if
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
110 |
bc76e08a9c9d
API change: Mailbox list sorting must now always done by storage itself if
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
111 struct mailbox_node * |
5547
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
112 mailbox_tree_get(struct mailbox_tree_context *tree, const char *path, |
3863
55df57c028d4
Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents:
1650
diff
changeset
|
113 bool *created) |
1650
bc76e08a9c9d
API change: Mailbox list sorting must now always done by storage itself if
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
114 { |
6940
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
115 struct mailbox_node *node; |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
116 |
7226
e6693a0ec8e1
Renamed T_FRAME_BEGIN/END to T_BEGIN/END. Removed T_FRAME() macro and
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
117 T_BEGIN { |
6940
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
118 node = mailbox_tree_traverse(tree, path, TRUE, created); |
7226
e6693a0ec8e1
Renamed T_FRAME_BEGIN/END to T_BEGIN/END. Removed T_FRAME() macro and
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
119 } T_END; |
6940
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
120 return node; |
1650
bc76e08a9c9d
API change: Mailbox list sorting must now always done by storage itself if
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
121 } |
bc76e08a9c9d
API change: Mailbox list sorting must now always done by storage itself if
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
122 |
bc76e08a9c9d
API change: Mailbox list sorting must now always done by storage itself if
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
123 struct mailbox_node * |
5829
1d73153584d2
Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents:
5548
diff
changeset
|
124 mailbox_tree_lookup(struct mailbox_tree_context *tree, const char *path) |
5547
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
125 { |
6940
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
126 struct mailbox_node *node; |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
127 |
7226
e6693a0ec8e1
Renamed T_FRAME_BEGIN/END to T_BEGIN/END. Removed T_FRAME() macro and
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
128 T_BEGIN { |
6940
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
129 node = mailbox_tree_traverse(tree, path, FALSE, NULL); |
7226
e6693a0ec8e1
Renamed T_FRAME_BEGIN/END to T_BEGIN/END. Removed T_FRAME() macro and
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
130 } T_END; |
6940
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
131 return node; |
5547
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
132 } |
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
133 |
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
134 struct mailbox_tree_iterate_context * |
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
135 mailbox_tree_iterate_init(struct mailbox_tree_context *tree, |
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
136 struct mailbox_node *root, unsigned int flags_mask) |
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
137 { |
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
138 struct mailbox_tree_iterate_context *ctx; |
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
139 |
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
140 ctx = i_new(struct mailbox_tree_iterate_context, 1); |
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
141 ctx->separator = tree->separator; |
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
142 ctx->root = root != NULL ? root : mailbox_tree_get(tree, NULL, NULL); |
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
143 ctx->flags_mask = flags_mask; |
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
144 ctx->path_str = str_new(default_pool, 256); |
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
145 i_array_init(&ctx->node_path, 16); |
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
146 |
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
147 ctx->next_node = ctx->root; |
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
148 return ctx; |
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
149 } |
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
150 |
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
151 static void |
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
152 mailbox_tree_iterate_set_next_node(struct mailbox_tree_iterate_context *ctx) |
1650
bc76e08a9c9d
API change: Mailbox list sorting must now always done by storage itself if
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
153 { |
5547
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
154 struct mailbox_node *node = ctx->next_node; |
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
155 struct mailbox_node *const *nodes; |
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
156 unsigned int i, count; |
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
157 |
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
158 if (node->children != NULL) { |
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
159 array_append(&ctx->node_path, &node, 1); |
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
160 ctx->parent_pos = str_len(ctx->path_str); |
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
161 node = node->children; |
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
162 ctx->first_child = TRUE; |
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
163 } else if (node->next != NULL) { |
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
164 node = node->next; |
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
165 } else { |
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
166 nodes = array_get(&ctx->node_path, &count); |
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
167 node = NULL; |
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
168 for (i = count; i != 0; i--) { |
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
169 unsigned int len = strlen(nodes[i-1]->name) + 1; |
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
170 |
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
171 i_assert(len <= ctx->parent_pos); |
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
172 ctx->parent_pos -= len; |
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
173 if (nodes[i-1]->next != NULL) { |
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
174 node = nodes[i-1]->next; |
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
175 ctx->first_child = TRUE; |
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
176 i--; |
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
177 |
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
178 if (ctx->parent_pos != 0) |
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
179 ctx->parent_pos--; |
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
180 break; |
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
181 } |
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
182 } |
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
183 array_delete(&ctx->node_path, i, count - i); |
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
184 } |
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
185 |
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
186 ctx->next_node = node; |
1650
bc76e08a9c9d
API change: Mailbox list sorting must now always done by storage itself if
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
187 } |
5547
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
188 |
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
189 struct mailbox_node * |
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
190 mailbox_tree_iterate_next(struct mailbox_tree_iterate_context *ctx, |
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
191 const char **path_r) |
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
192 { |
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
193 struct mailbox_node *node; |
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
194 |
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
195 do { |
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
196 node = ctx->next_node; |
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
197 if (node == NULL) |
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
198 return NULL; |
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
199 |
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
200 str_truncate(ctx->path_str, ctx->parent_pos); |
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
201 if (ctx->first_child) { |
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
202 ctx->first_child = FALSE; |
7553
0e0054c0da66
Don't crash if subscribed mailbox begins with hierarchy separator.
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
203 if (node->parent != NULL) { |
5547
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
204 str_append_c(ctx->path_str, ctx->separator); |
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
205 ctx->parent_pos++; |
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
206 } |
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
207 } |
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
208 str_append(ctx->path_str, node->name); |
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
209 |
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
210 mailbox_tree_iterate_set_next_node(ctx); |
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
211 } while ((node->flags & ctx->flags_mask) != ctx->flags_mask); |
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
212 |
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
213 *path_r = str_c(ctx->path_str); |
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
214 return node; |
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
215 } |
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
216 |
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
217 void mailbox_tree_iterate_deinit(struct mailbox_tree_iterate_context **_ctx) |
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
218 { |
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
219 struct mailbox_tree_iterate_context *ctx = *_ctx; |
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
220 |
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
221 *_ctx = NULL; |
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
222 str_free(&ctx->path_str); |
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
223 array_free(&ctx->node_path); |
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
224 i_free(ctx); |
c03655b70b57
Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents:
5315
diff
changeset
|
225 } |