1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
2 /*
3  * Copyright (C) 2016 Red Hat, Inc. (www.redhat.com)
4  *
5  * This library is free software: you can redistribute it and/or modify it
6  * under the terms of the GNU Lesser General Public License as published by
7  * the Free Software Foundation.
8  *
9  * This library is distributed in the hope that it will be useful, but
10  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
11  * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
12  * for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public License
15  * along with this library. If not, see <http://www.gnu.org/licenses/>.
16  */
17 
18 #if !defined (__CAMEL_H_INSIDE__) && !defined (CAMEL_COMPILATION)
19 #error "Only <camel/camel.h> can be included directly."
20 #endif
21 
22 #ifndef CAMEL_MESSAGE_INFO_H
23 #define CAMEL_MESSAGE_INFO_H
24 
25 #include <glib-object.h>
26 
27 #include <camel/camel-named-flags.h>
28 #include <camel/camel-name-value-array.h>
29 
30 /* Standard GObject macros */
31 #define CAMEL_TYPE_MESSAGE_INFO \
32 	(camel_message_info_get_type ())
33 #define CAMEL_MESSAGE_INFO(obj) \
34 	(G_TYPE_CHECK_INSTANCE_CAST \
35 	((obj), CAMEL_TYPE_MESSAGE_INFO, CamelMessageInfo))
36 #define CAMEL_MESSAGE_INFO_CLASS(cls) \
37 	(G_TYPE_CHECK_CLASS_CAST \
38 	((cls), CAMEL_TYPE_MESSAGE_INFO, CamelMessageInfoClass))
39 #define CAMEL_IS_MESSAGE_INFO(obj) \
40 	(G_TYPE_CHECK_INSTANCE_TYPE \
41 	((obj), CAMEL_TYPE_MESSAGE_INFO))
42 #define CAMEL_IS_MESSAGE_INFO_CLASS(cls) \
43 	(G_TYPE_CHECK_CLASS_TYPE \
44 	((cls), CAMEL_TYPE_MESSAGE_INFO))
45 #define CAMEL_MESSAGE_INFO_GET_CLASS(obj) \
46 	(G_TYPE_INSTANCE_GET_CLASS \
47 	((obj), CAMEL_TYPE_MESSAGE_INFO, CamelMessageInfoClass))
48 
49 G_BEGIN_DECLS
50 
51 /* Forward declarations */
52 struct _CamelFolderSummary;
53 struct _CamelMIRecord;
54 
55 /* A summary messageid is a 64 bit identifier (partial md5 hash) */
56 typedef struct _CamelSummaryMessageID {
57 	union {
58 		guint64 id;
59 		guchar hash[8];
60 		struct {
61 			guint32 hi;
62 			guint32 lo;
63 		} part;
64 	} id;
65 } CamelSummaryMessageID;
66 
67 /* system flag bits */
68 typedef enum _CamelMessageFlags {
69 	CAMEL_MESSAGE_ANSWERED = 1 << 0,
70 	CAMEL_MESSAGE_DELETED = 1 << 1,
71 	CAMEL_MESSAGE_DRAFT = 1 << 2,
72 	CAMEL_MESSAGE_FLAGGED = 1 << 3,
73 	CAMEL_MESSAGE_SEEN = 1 << 4,
74 
75 	/* these aren't really system flag bits, but are convenience flags */
76 	CAMEL_MESSAGE_ATTACHMENTS = 1 << 5,
77 	CAMEL_MESSAGE_ANSWERED_ALL = 1 << 6,
78 	CAMEL_MESSAGE_JUNK = 1 << 7,
79 	CAMEL_MESSAGE_SECURE = 1 << 8,
80 	CAMEL_MESSAGE_NOTJUNK = 1 << 9,
81 	CAMEL_MESSAGE_FORWARDED = 1 << 10,
82 
83 	/* following flags are for the folder, and are not really permanent flags */
84 	CAMEL_MESSAGE_FOLDER_FLAGGED = 1 << 16, /* for use by the folder implementation */
85 	/* flags after 1 << 16 are used by camel providers,
86 	 * if adding non permanent flags, add them to the end  */
87 
88 	CAMEL_MESSAGE_JUNK_LEARN = 1 << 30, /* used when setting CAMEL_MESSAGE_JUNK flag
89 					     * to say that we request junk plugin
90 					     * to learn that message as junk/non junk */
91 	CAMEL_MESSAGE_USER = 1u << 31 /* supports user flags */
92 } CamelMessageFlags;
93 
94 /* Changes to system flags will NOT trigger a folder changed event */
95 #define CAMEL_MESSAGE_SYSTEM_MASK (0xffff << 16)
96 
97 typedef struct _CamelMessageInfo CamelMessageInfo;
98 typedef struct _CamelMessageInfoClass CamelMessageInfoClass;
99 typedef struct _CamelMessageInfoPrivate CamelMessageInfoPrivate;
100 
101 struct _CamelMessageInfo {
102 	GObject parent;
103 	CamelMessageInfoPrivate *priv;
104 };
105 
106 struct _CamelMessageInfoClass {
107 	GObjectClass parent_class;
108 
109 	CamelMessageInfo *	(* clone)	(const CamelMessageInfo *mi,
110 						 struct _CamelFolderSummary *assign_summary);
111 	gboolean		(* load)	(CamelMessageInfo *mi,
112 						 const struct _CamelMIRecord *record,
113 						 /* const */ gchar **bdata_ptr);
114 	gboolean		(* save)	(const CamelMessageInfo *mi,
115 						 struct _CamelMIRecord *record,
116 						 GString *bdata_str);
117 	guint32			(* get_flags)	(const CamelMessageInfo *mi);
118 	gboolean		(* set_flags)	(CamelMessageInfo *mi,
119 						 guint32 mask,
120 						 guint32 set);
121 	gboolean		(* get_user_flag)
122 						(const CamelMessageInfo *mi,
123 						 const gchar *name);
124 	gboolean		(* set_user_flag)
125 						(CamelMessageInfo *mi,
126 						 const gchar *name,
127 						 gboolean state);
128 	const CamelNamedFlags *	(* get_user_flags)
129 						(const CamelMessageInfo *mi);
130 	CamelNamedFlags *	(* dup_user_flags)
131 						(const CamelMessageInfo *mi);
132 	gboolean		(* take_user_flags)
133 						(CamelMessageInfo *mi,
134 						 CamelNamedFlags *user_flags);
135 	const gchar *		(* get_user_tag)(const CamelMessageInfo *mi,
136 						 const gchar *name);
137 	gboolean		(* set_user_tag)(CamelMessageInfo *mi,
138 						 const gchar *name,
139 						 const gchar *value);
140 	const CamelNameValueArray *
141 				(* get_user_tags)
142 						(const CamelMessageInfo *mi);
143 	CamelNameValueArray *	(* dup_user_tags)
144 						(const CamelMessageInfo *mi);
145 	gboolean		(* take_user_tags)
146 						(CamelMessageInfo *mi,
147 						 CamelNameValueArray *user_tags);
148 	const gchar *		(* get_subject)	(const CamelMessageInfo *mi);
149 	gboolean		(* set_subject)	(CamelMessageInfo *mi,
150 						 const gchar *subject);
151 	const gchar *		(* get_from)	(const CamelMessageInfo *mi);
152 	gboolean		(* set_from)	(CamelMessageInfo *mi,
153 						 const gchar *from);
154 	const gchar *		(* get_to)	(const CamelMessageInfo *mi);
155 	gboolean		(* set_to)	(CamelMessageInfo *mi,
156 						 const gchar *to);
157 	const gchar *		(* get_cc)	(const CamelMessageInfo *mi);
158 	gboolean		(* set_cc)	(CamelMessageInfo *mi,
159 						 const gchar *cc);
160 	const gchar *		(* get_mlist)	(const CamelMessageInfo *mi);
161 	gboolean		(* set_mlist)	(CamelMessageInfo *mi,
162 						 const gchar *mlist);
163 	guint32			(* get_size)	(const CamelMessageInfo *mi);
164 	gboolean		(* set_size)	(CamelMessageInfo *mi,
165 						 guint32 size);
166 	gint64			(* get_date_sent)
167 						(const CamelMessageInfo *mi);
168 	gboolean		(* set_date_sent)
169 						(CamelMessageInfo *mi,
170 						 gint64 date_sent);
171 	gint64			(* get_date_received)
172 						(const CamelMessageInfo *mi);
173 	gboolean		(* set_date_received)
174 						(CamelMessageInfo *mi,
175 						 gint64 date_received);
176 	guint64			(* get_message_id)
177 						(const CamelMessageInfo *mi);
178 	gboolean		(* set_message_id)
179 						(CamelMessageInfo *mi,
180 						 guint64 message_id);
181 	const GArray *		(* get_references)
182 						(const CamelMessageInfo *mi);
183 	gboolean		(* take_references)
184 						(CamelMessageInfo *mi,
185 						 GArray *references);
186 	const CamelNameValueArray *
187 				(* get_headers)	(const CamelMessageInfo *mi);
188 	gboolean		(* take_headers)(CamelMessageInfo *mi,
189 						 CamelNameValueArray *headers);
190 	const gchar *		(* get_user_header)
191 						(const CamelMessageInfo *mi,
192 						 const gchar *name);
193 	gboolean		(* set_user_header)
194 						(CamelMessageInfo *mi,
195 						 const gchar *name,
196 						 const gchar *value);
197 	const CamelNameValueArray *
198 				(* get_user_headers)
199 						(const CamelMessageInfo *mi);
200 	gboolean		(* take_user_headers)
201 						(CamelMessageInfo *mi,
202 						 CamelNameValueArray *headers);
203 	const gchar *		(* get_preview)	(const CamelMessageInfo *mi);
204 	gboolean		(* set_preview) (CamelMessageInfo *mi,
205 						 const gchar *preview);
206 
207 	/* Padding for future expansion */
208 	gpointer reserved[14];
209 };
210 
211 GType		camel_message_info_get_type	(void);
212 CamelMessageInfo *
213 		camel_message_info_new		(struct _CamelFolderSummary *summary);
214 CamelMessageInfo *
215 		camel_message_info_clone	(const CamelMessageInfo *mi,
216 						 struct _CamelFolderSummary *assign_summary);
217 gboolean	camel_message_info_load		(CamelMessageInfo *mi,
218 						 const struct _CamelMIRecord *record,
219 						 /* const */ gchar **bdata_ptr);
220 gboolean	camel_message_info_save		(const CamelMessageInfo *mi,
221 						 struct _CamelMIRecord *record,
222 						 GString *bdata_str);
223 struct _CamelFolderSummary *
224 		camel_message_info_ref_summary	(const CamelMessageInfo *mi);
225 void		camel_message_info_property_lock
226 						(const CamelMessageInfo *mi);
227 void		camel_message_info_property_unlock
228 						(const CamelMessageInfo *mi);
229 gboolean	camel_message_info_get_dirty	(const CamelMessageInfo *mi);
230 void		camel_message_info_set_dirty	(CamelMessageInfo *mi,
231 						 gboolean dirty);
232 gboolean	camel_message_info_get_folder_flagged
233 						(const CamelMessageInfo *mi);
234 gboolean	camel_message_info_set_folder_flagged
235 						(CamelMessageInfo *mi,
236 						 gboolean folder_flagged);
237 guint		camel_message_info_get_folder_flagged_stamp
238 						(const CamelMessageInfo *mi);
239 gboolean	camel_message_info_get_abort_notifications
240 						(const CamelMessageInfo *mi);
241 void		camel_message_info_set_abort_notifications
242 						(CamelMessageInfo *mi,
243 						 gboolean abort_notifications);
244 void		camel_message_info_freeze_notifications
245 						(CamelMessageInfo *mi);
246 void		camel_message_info_thaw_notifications
247 						(CamelMessageInfo *mi);
248 gboolean	camel_message_info_get_notifications_frozen
249 						(const CamelMessageInfo *mi);
250 const gchar *	camel_message_info_get_uid	(const CamelMessageInfo *mi);
251 const gchar *	camel_message_info_pooldup_uid	(const CamelMessageInfo *mi);
252 gboolean	camel_message_info_set_uid	(CamelMessageInfo *mi,
253 						 const gchar *uid);
254 guint32		camel_message_info_get_flags	(const CamelMessageInfo *mi);
255 gboolean	camel_message_info_set_flags	(CamelMessageInfo *mi,
256 						 guint32 mask,
257 						 guint32 set);
258 gboolean	camel_message_info_get_user_flag
259 						(const CamelMessageInfo *mi,
260 						 const gchar *name);
261 gboolean	camel_message_info_set_user_flag
262 						(CamelMessageInfo *mi,
263 						 const gchar *name,
264 						 gboolean state);
265 const CamelNamedFlags *
266 		camel_message_info_get_user_flags
267 						(const CamelMessageInfo *mi);
268 CamelNamedFlags *
269 		camel_message_info_dup_user_flags
270 						(const CamelMessageInfo *mi);
271 gboolean
272 		camel_message_info_take_user_flags
273 						(CamelMessageInfo *mi,
274 						 CamelNamedFlags *user_flags);
275 const gchar *	camel_message_info_get_user_tag	(const CamelMessageInfo *mi,
276 						 const gchar *name);
277 gchar *		camel_message_info_dup_user_tag	(const CamelMessageInfo *mi,
278 						 const gchar *name);
279 gboolean	camel_message_info_set_user_tag	(CamelMessageInfo *mi,
280 						 const gchar *name,
281 						 const gchar *value);
282 const CamelNameValueArray *
283 		camel_message_info_get_user_tags
284 						(const CamelMessageInfo *mi);
285 CamelNameValueArray *
286 		camel_message_info_dup_user_tags
287 						(const CamelMessageInfo *mi);
288 gboolean	camel_message_info_take_user_tags
289 						(CamelMessageInfo *mi,
290 						 CamelNameValueArray *user_tags);
291 const gchar *	camel_message_info_get_subject	(const CamelMessageInfo *mi);
292 gboolean	camel_message_info_set_subject	(CamelMessageInfo *mi,
293 						 const gchar *subject);
294 const gchar *	camel_message_info_get_from	(const CamelMessageInfo *mi);
295 gboolean	camel_message_info_set_from	(CamelMessageInfo *mi,
296 						 const gchar *from);
297 const gchar *	camel_message_info_get_to	(const CamelMessageInfo *mi);
298 gboolean	camel_message_info_set_to	(CamelMessageInfo *mi,
299 						 const gchar *to);
300 const gchar *	camel_message_info_get_cc	(const CamelMessageInfo *mi);
301 gboolean	camel_message_info_set_cc	(CamelMessageInfo *mi,
302 						 const gchar *cc);
303 const gchar *	camel_message_info_get_mlist	(const CamelMessageInfo *mi);
304 gboolean	camel_message_info_set_mlist	(CamelMessageInfo *mi,
305 						 const gchar *mlist);
306 guint32		camel_message_info_get_size	(const CamelMessageInfo *mi);
307 gboolean	camel_message_info_set_size	(CamelMessageInfo *mi,
308 						 guint32 size);
309 gint64		camel_message_info_get_date_sent
310 						(const CamelMessageInfo *mi);
311 gboolean	camel_message_info_set_date_sent
312 						(CamelMessageInfo *mi,
313 						 gint64 date_sent);
314 gint64		camel_message_info_get_date_received
315 						(const CamelMessageInfo *mi);
316 gboolean	camel_message_info_set_date_received
317 						(CamelMessageInfo *mi,
318 						 gint64 date_received);
319 guint64		camel_message_info_get_message_id
320 						(const CamelMessageInfo *mi);
321 gboolean	camel_message_info_set_message_id
322 						(CamelMessageInfo *mi,
323 						 guint64 message_id);
324 const GArray *	camel_message_info_get_references
325 						(const CamelMessageInfo *mi);
326 GArray *	camel_message_info_dup_references
327 						(const CamelMessageInfo *mi);
328 gboolean	camel_message_info_take_references
329 						(CamelMessageInfo *mi,
330 						 GArray *references);
331 const CamelNameValueArray *
332 		camel_message_info_get_headers	(const CamelMessageInfo *mi);
333 CamelNameValueArray *
334 		camel_message_info_dup_headers	(const CamelMessageInfo *mi);
335 gboolean	camel_message_info_take_headers	(CamelMessageInfo *mi,
336 						 CamelNameValueArray *headers);
337 const gchar *	camel_message_info_get_user_header
338 						(const CamelMessageInfo *mi,
339 						 const gchar *name);
340 gchar *		camel_message_info_dup_user_header
341 						(const CamelMessageInfo *mi,
342 						 const gchar *name);
343 gboolean	camel_message_info_set_user_header
344 						(CamelMessageInfo *mi,
345 						 const gchar *name,
346 						 const gchar *value);
347 const CamelNameValueArray *
348 		camel_message_info_get_user_headers
349 						(const CamelMessageInfo *mi);
350 CamelNameValueArray *
351 		camel_message_info_dup_user_headers
352 						(const CamelMessageInfo *mi);
353 gboolean	camel_message_info_take_user_headers
354 						(CamelMessageInfo *mi,
355 						 CamelNameValueArray *headers);
356 const gchar *	camel_message_info_get_preview	(const CamelMessageInfo *mi);
357 gchar *		camel_message_info_dup_preview	(const CamelMessageInfo *mi);
358 gboolean	camel_message_info_set_preview	(CamelMessageInfo *mi,
359 						 const gchar *preview);
360 
361 /* Debugging functions */
362 void		camel_message_info_dump		(CamelMessageInfo *mi);
363 
364 G_END_DECLS
365 
366 #endif /* CAMEL_MESSAGE_INFO_H */
367