/src/dovecot/src/lib-imap-client/imapc-msgmap.c
Line | Count | Source |
1 | | /* Copyright (c) 2011-2018 Dovecot authors, see the included COPYING file */ |
2 | | |
3 | | #include "lib.h" |
4 | | #include "array.h" |
5 | | #include "imapc-msgmap.h" |
6 | | #include "sort.h" |
7 | | |
8 | | struct imapc_msgmap { |
9 | | ARRAY_TYPE(uint32_t) uids; |
10 | | uint32_t uid_next; |
11 | | }; |
12 | | |
13 | | struct imapc_msgmap *imapc_msgmap_init(void) |
14 | 0 | { |
15 | 0 | struct imapc_msgmap *msgmap; |
16 | |
|
17 | 0 | msgmap = i_new(struct imapc_msgmap, 1); |
18 | 0 | i_array_init(&msgmap->uids, 128); |
19 | 0 | msgmap->uid_next = 1; |
20 | 0 | return msgmap; |
21 | 0 | } |
22 | | |
23 | | void imapc_msgmap_deinit(struct imapc_msgmap **_msgmap) |
24 | 0 | { |
25 | 0 | struct imapc_msgmap *msgmap = *_msgmap; |
26 | |
|
27 | 0 | *_msgmap = NULL; |
28 | |
|
29 | 0 | array_free(&msgmap->uids); |
30 | 0 | i_free(msgmap); |
31 | 0 | } |
32 | | |
33 | | uint32_t imapc_msgmap_count(struct imapc_msgmap *msgmap) |
34 | 0 | { |
35 | 0 | return array_count(&msgmap->uids); |
36 | 0 | } |
37 | | |
38 | | uint32_t imapc_msgmap_uidnext(struct imapc_msgmap *msgmap) |
39 | 0 | { |
40 | 0 | return msgmap->uid_next; |
41 | 0 | } |
42 | | |
43 | | uint32_t imapc_msgmap_rseq_to_uid(struct imapc_msgmap *msgmap, uint32_t rseq) |
44 | 0 | { |
45 | 0 | const uint32_t *uidp; |
46 | |
|
47 | 0 | uidp = array_idx(&msgmap->uids, rseq-1); |
48 | 0 | return *uidp; |
49 | 0 | } |
50 | | |
51 | | bool imapc_msgmap_uid_to_rseq(struct imapc_msgmap *msgmap, |
52 | | uint32_t uid, uint32_t *rseq_r) |
53 | 0 | { |
54 | 0 | const uint32_t *p, *first; |
55 | |
|
56 | 0 | p = array_bsearch(&msgmap->uids, &uid, uint32_cmp); |
57 | 0 | if (p == NULL) { |
58 | 0 | *rseq_r = 0; |
59 | 0 | return FALSE; |
60 | 0 | } |
61 | | |
62 | 0 | first = array_front(&msgmap->uids); |
63 | 0 | *rseq_r = (p - first) + 1; |
64 | 0 | return TRUE; |
65 | 0 | } |
66 | | |
67 | | void imapc_msgmap_append(struct imapc_msgmap *msgmap, |
68 | | uint32_t rseq, uint32_t uid) |
69 | 0 | { |
70 | 0 | i_assert(rseq == imapc_msgmap_count(msgmap) + 1); |
71 | 0 | i_assert(uid >= msgmap->uid_next); |
72 | | |
73 | 0 | msgmap->uid_next = uid + 1; |
74 | 0 | array_push_back(&msgmap->uids, &uid); |
75 | 0 | } |
76 | | |
77 | | void imapc_msgmap_expunge(struct imapc_msgmap *msgmap, uint32_t rseq) |
78 | 0 | { |
79 | 0 | i_assert(rseq > 0); |
80 | 0 | i_assert(rseq <= imapc_msgmap_count(msgmap)); |
81 | | |
82 | 0 | array_delete(&msgmap->uids, rseq-1, 1); |
83 | 0 | } |
84 | | |
85 | | void imapc_msgmap_reset(struct imapc_msgmap *msgmap) |
86 | 0 | { |
87 | 0 | array_clear(&msgmap->uids); |
88 | 0 | msgmap->uid_next = 1; |
89 | 0 | } |