1 /* Copyright (c) 2013-2018 Dovecot authors, see the included COPYING file */
2
3 #include "lib.h"
4 #include "dsync-mail.h"
5 #include "dsync-ibc-private.h"
6
dsync_ibc_deinit(struct dsync_ibc ** _ibc)7 void dsync_ibc_deinit(struct dsync_ibc **_ibc)
8 {
9 struct dsync_ibc *ibc = *_ibc;
10
11 *_ibc = NULL;
12 ibc->v.deinit(ibc);
13 }
14
dsync_ibc_set_io_callback(struct dsync_ibc * ibc,io_callback_t * callback,void * context)15 void dsync_ibc_set_io_callback(struct dsync_ibc *ibc,
16 io_callback_t *callback, void *context)
17 {
18 ibc->io_callback = callback;
19 ibc->io_context = context;
20 }
21
dsync_ibc_send_handshake(struct dsync_ibc * ibc,const struct dsync_ibc_settings * set)22 void dsync_ibc_send_handshake(struct dsync_ibc *ibc,
23 const struct dsync_ibc_settings *set)
24 {
25 ibc->v.send_handshake(ibc, set);
26 }
27
28 enum dsync_ibc_recv_ret
dsync_ibc_recv_handshake(struct dsync_ibc * ibc,const struct dsync_ibc_settings ** set_r)29 dsync_ibc_recv_handshake(struct dsync_ibc *ibc,
30 const struct dsync_ibc_settings **set_r)
31 {
32 return ibc->v.recv_handshake(ibc, set_r);
33 }
34
35 static enum dsync_ibc_send_ret
dsync_ibc_send_ret(struct dsync_ibc * ibc)36 dsync_ibc_send_ret(struct dsync_ibc *ibc)
37 {
38 return ibc->v.is_send_queue_full(ibc) ?
39 DSYNC_IBC_SEND_RET_FULL :
40 DSYNC_IBC_SEND_RET_OK;
41 }
42
43 enum dsync_ibc_send_ret
dsync_ibc_send_end_of_list(struct dsync_ibc * ibc,enum dsync_ibc_eol_type type)44 dsync_ibc_send_end_of_list(struct dsync_ibc *ibc, enum dsync_ibc_eol_type type)
45 {
46 ibc->v.send_end_of_list(ibc, type);
47 return dsync_ibc_send_ret(ibc);
48 }
49
50 enum dsync_ibc_send_ret
dsync_ibc_send_mailbox_state(struct dsync_ibc * ibc,const struct dsync_mailbox_state * state)51 dsync_ibc_send_mailbox_state(struct dsync_ibc *ibc,
52 const struct dsync_mailbox_state *state)
53 {
54 T_BEGIN {
55 ibc->v.send_mailbox_state(ibc, state);
56 } T_END;
57 return dsync_ibc_send_ret(ibc);
58 }
59
60 enum dsync_ibc_recv_ret
dsync_ibc_recv_mailbox_state(struct dsync_ibc * ibc,struct dsync_mailbox_state * state_r)61 dsync_ibc_recv_mailbox_state(struct dsync_ibc *ibc,
62 struct dsync_mailbox_state *state_r)
63 {
64 return ibc->v.recv_mailbox_state(ibc, state_r);
65 }
66
67 enum dsync_ibc_send_ret
dsync_ibc_send_mailbox_tree_node(struct dsync_ibc * ibc,const char * const * name,const struct dsync_mailbox_node * node)68 dsync_ibc_send_mailbox_tree_node(struct dsync_ibc *ibc,
69 const char *const *name,
70 const struct dsync_mailbox_node *node)
71 {
72 i_assert(*name != NULL);
73
74 T_BEGIN {
75 ibc->v.send_mailbox_tree_node(ibc, name, node);
76 } T_END;
77 return dsync_ibc_send_ret(ibc);
78 }
79
80 enum dsync_ibc_recv_ret
dsync_ibc_recv_mailbox_tree_node(struct dsync_ibc * ibc,const char * const ** name_r,const struct dsync_mailbox_node ** node_r)81 dsync_ibc_recv_mailbox_tree_node(struct dsync_ibc *ibc,
82 const char *const **name_r,
83 const struct dsync_mailbox_node **node_r)
84 {
85 return ibc->v.recv_mailbox_tree_node(ibc, name_r, node_r);
86 }
87
88 enum dsync_ibc_send_ret
dsync_ibc_send_mailbox_deletes(struct dsync_ibc * ibc,const struct dsync_mailbox_delete * deletes,unsigned int count,char hierarchy_sep)89 dsync_ibc_send_mailbox_deletes(struct dsync_ibc *ibc,
90 const struct dsync_mailbox_delete *deletes,
91 unsigned int count, char hierarchy_sep)
92 {
93 T_BEGIN {
94 ibc->v.send_mailbox_deletes(ibc, deletes, count,
95 hierarchy_sep);
96 } T_END;
97 return dsync_ibc_send_ret(ibc);
98 }
99
100 enum dsync_ibc_recv_ret
dsync_ibc_recv_mailbox_deletes(struct dsync_ibc * ibc,const struct dsync_mailbox_delete ** deletes_r,unsigned int * count_r,char * hierarchy_sep_r)101 dsync_ibc_recv_mailbox_deletes(struct dsync_ibc *ibc,
102 const struct dsync_mailbox_delete **deletes_r,
103 unsigned int *count_r, char *hierarchy_sep_r)
104 {
105 return ibc->v.recv_mailbox_deletes(ibc, deletes_r, count_r,
106 hierarchy_sep_r);
107 }
108
109 enum dsync_ibc_send_ret
dsync_ibc_send_mailbox(struct dsync_ibc * ibc,const struct dsync_mailbox * dsync_box)110 dsync_ibc_send_mailbox(struct dsync_ibc *ibc,
111 const struct dsync_mailbox *dsync_box)
112 {
113 T_BEGIN {
114 ibc->v.send_mailbox(ibc, dsync_box);
115 } T_END;
116 return dsync_ibc_send_ret(ibc);
117 }
118
119 enum dsync_ibc_recv_ret
dsync_ibc_recv_mailbox(struct dsync_ibc * ibc,const struct dsync_mailbox ** dsync_box_r)120 dsync_ibc_recv_mailbox(struct dsync_ibc *ibc,
121 const struct dsync_mailbox **dsync_box_r)
122 {
123 return ibc->v.recv_mailbox(ibc, dsync_box_r);
124 }
125
126 enum dsync_ibc_send_ret ATTR_NOWARN_UNUSED_RESULT
dsync_ibc_send_mailbox_attribute(struct dsync_ibc * ibc,const struct dsync_mailbox_attribute * attr)127 dsync_ibc_send_mailbox_attribute(struct dsync_ibc *ibc,
128 const struct dsync_mailbox_attribute *attr)
129 {
130 T_BEGIN {
131 ibc->v.send_mailbox_attribute(ibc, attr);
132 } T_END;
133 return dsync_ibc_send_ret(ibc);
134 }
135
136 enum dsync_ibc_recv_ret
dsync_ibc_recv_mailbox_attribute(struct dsync_ibc * ibc,const struct dsync_mailbox_attribute ** attr_r)137 dsync_ibc_recv_mailbox_attribute(struct dsync_ibc *ibc,
138 const struct dsync_mailbox_attribute **attr_r)
139 {
140 return ibc->v.recv_mailbox_attribute(ibc, attr_r);
141 }
142
143 enum dsync_ibc_send_ret
dsync_ibc_send_change(struct dsync_ibc * ibc,const struct dsync_mail_change * change)144 dsync_ibc_send_change(struct dsync_ibc *ibc,
145 const struct dsync_mail_change *change)
146 {
147 i_assert(change->uid > 0);
148
149 T_BEGIN {
150 ibc->v.send_change(ibc, change);
151 } T_END;
152 return dsync_ibc_send_ret(ibc);
153 }
154
155 enum dsync_ibc_recv_ret
dsync_ibc_recv_change(struct dsync_ibc * ibc,const struct dsync_mail_change ** change_r)156 dsync_ibc_recv_change(struct dsync_ibc *ibc,
157 const struct dsync_mail_change **change_r)
158 {
159 return ibc->v.recv_change(ibc, change_r);
160 }
161
162 enum dsync_ibc_send_ret
dsync_ibc_send_mail_request(struct dsync_ibc * ibc,const struct dsync_mail_request * request)163 dsync_ibc_send_mail_request(struct dsync_ibc *ibc,
164 const struct dsync_mail_request *request)
165 {
166 i_assert(request->guid != NULL || request->uid != 0);
167
168 T_BEGIN {
169 ibc->v.send_mail_request(ibc, request);
170 } T_END;
171 return dsync_ibc_send_ret(ibc);
172 }
173
174 enum dsync_ibc_recv_ret
dsync_ibc_recv_mail_request(struct dsync_ibc * ibc,const struct dsync_mail_request ** request_r)175 dsync_ibc_recv_mail_request(struct dsync_ibc *ibc,
176 const struct dsync_mail_request **request_r)
177 {
178 return ibc->v.recv_mail_request(ibc, request_r);
179 }
180
181 enum dsync_ibc_send_ret
dsync_ibc_send_mail(struct dsync_ibc * ibc,const struct dsync_mail * mail)182 dsync_ibc_send_mail(struct dsync_ibc *ibc, const struct dsync_mail *mail)
183 {
184 i_assert(*mail->guid != '\0' || mail->uid != 0);
185
186 T_BEGIN {
187 ibc->v.send_mail(ibc, mail);
188 } T_END;
189 return dsync_ibc_send_ret(ibc);
190 }
191
192 enum dsync_ibc_recv_ret
dsync_ibc_recv_mail(struct dsync_ibc * ibc,struct dsync_mail ** mail_r)193 dsync_ibc_recv_mail(struct dsync_ibc *ibc, struct dsync_mail **mail_r)
194 {
195 return ibc->v.recv_mail(ibc, mail_r);
196 }
197
dsync_ibc_send_finish(struct dsync_ibc * ibc,const char * error,enum mail_error mail_error,bool require_full_resync)198 void dsync_ibc_send_finish(struct dsync_ibc *ibc, const char *error,
199 enum mail_error mail_error,
200 bool require_full_resync)
201 {
202 ibc->v.send_finish(ibc, error, mail_error, require_full_resync);
203 }
204
205 enum dsync_ibc_recv_ret
dsync_ibc_recv_finish(struct dsync_ibc * ibc,const char ** error_r,enum mail_error * mail_error_r,bool * require_full_resync_r)206 dsync_ibc_recv_finish(struct dsync_ibc *ibc, const char **error_r,
207 enum mail_error *mail_error_r,
208 bool *require_full_resync_r)
209 {
210 return ibc->v.recv_finish(ibc, error_r, mail_error_r,
211 require_full_resync_r);
212 }
213
dsync_ibc_close_mail_streams(struct dsync_ibc * ibc)214 void dsync_ibc_close_mail_streams(struct dsync_ibc *ibc)
215 {
216 ibc->v.close_mail_streams(ibc);
217 }
218
dsync_ibc_has_failed(struct dsync_ibc * ibc)219 bool dsync_ibc_has_failed(struct dsync_ibc *ibc)
220 {
221 return ibc->failed;
222 }
223
dsync_ibc_has_timed_out(struct dsync_ibc * ibc)224 bool dsync_ibc_has_timed_out(struct dsync_ibc *ibc)
225 {
226 return ibc->timeout;
227 }
228
dsync_ibc_is_send_queue_full(struct dsync_ibc * ibc)229 bool dsync_ibc_is_send_queue_full(struct dsync_ibc *ibc)
230 {
231 return ibc->v.is_send_queue_full(ibc);
232 }
233
dsync_ibc_has_pending_data(struct dsync_ibc * ibc)234 bool dsync_ibc_has_pending_data(struct dsync_ibc *ibc)
235 {
236 return ibc->v.has_pending_data(ibc);
237 }
238