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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
7d0469858e6d Marked memory pools growing
Timo Sirainen <tss@iki.fi>
parents: 4848
diff changeset
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 }