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