Extending test-client-custom-summary to try e_book_client_get_contacts_uids()
[platform/upstream/evolution-data-server.git] / camel / camel-folder-summary.h
1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
2 /*
3  *  Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
4  *
5  *  Authors: Michael Zucchi <notzed@ximian.com>
6  *
7  * This program is free software; you can redistribute it and/or
8  * modify it under the terms of version 2 of the GNU Lesser General Public
9  * License as published by the Free Software Foundation.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this program; if not, write to the
18  * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
19  * Boston, MA 02110-1301, USA.
20  */
21
22 #if !defined (__CAMEL_H_INSIDE__) && !defined (CAMEL_COMPILATION)
23 #error "Only <camel/camel.h> can be included directly."
24 #endif
25
26 #ifndef CAMEL_FOLDER_SUMMARY_H
27 #define CAMEL_FOLDER_SUMMARY_H
28
29 #include <stdio.h>
30 #include <time.h>
31
32 #include <camel/camel-index.h>
33 #include <camel/camel-memchunk.h>
34 #include <camel/camel-mime-message.h>
35 #include <camel/camel-mime-parser.h>
36
37 /* Standard GObject macros */
38 #define CAMEL_TYPE_FOLDER_SUMMARY \
39         (camel_folder_summary_get_type ())
40 #define CAMEL_FOLDER_SUMMARY(obj) \
41         (G_TYPE_CHECK_INSTANCE_CAST \
42         ((obj), CAMEL_TYPE_FOLDER_SUMMARY, CamelFolderSummary))
43 #define CAMEL_FOLDER_SUMMARY_CLASS(cls) \
44         (G_TYPE_CHECK_CLASS_CAST \
45         ((cls), CAMEL_TYPE_FOLDER_SUMMARY, CamelFolderSummaryClass))
46 #define CAMEL_IS_FOLDER_SUMMARY(obj) \
47         (G_TYPE_CHECK_INSTANCE_TYPE \
48         ((obj), CAMEL_TYPE_FOLDER_SUMMARY))
49 #define CAMEL_IS_FOLDER_SUMMARY_CLASS(cls) \
50         (G_TYPE_CHECK_CLASS_TYPE \
51         ((cls), CAMEL_TYPE_FOLDER_SUMMARY))
52 #define CAMEL_FOLDER_SUMMARY_GET_CLASS(obj) \
53         (G_TYPE_INSTANCE_GET_CLASS \
54         ((obj), CAMEL_TYPE_FOLDER_SUMMARY, CamelFolderSummaryClass))
55
56 G_BEGIN_DECLS
57
58 struct _CamelFolder;
59 struct _CamelStore;
60
61 typedef struct _CamelFolderSummary CamelFolderSummary;
62 typedef struct _CamelFolderSummaryClass CamelFolderSummaryClass;
63 typedef struct _CamelFolderSummaryPrivate CamelFolderSummaryPrivate;
64
65 typedef struct _CamelMessageInfo CamelMessageInfo;
66 typedef struct _CamelMessageInfoBase CamelMessageInfoBase;
67
68 typedef struct _CamelMessageContentInfo CamelMessageContentInfo;
69
70 /* A tree of message content info structures
71  * describe the content structure of the message (if it has any) */
72 struct _CamelMessageContentInfo {
73         CamelMessageContentInfo *next;
74
75         CamelMessageContentInfo *childs;
76         CamelMessageContentInfo *parent;
77
78         CamelContentType *type;
79         gchar *id;
80         gchar *description;
81         gchar *encoding;                /* this should be an enum?? */
82         guint32 size;
83 };
84
85 /* system flag bits */
86 typedef enum _CamelMessageFlags {
87         CAMEL_MESSAGE_ANSWERED = 1 << 0,
88         CAMEL_MESSAGE_DELETED = 1 << 1,
89         CAMEL_MESSAGE_DRAFT = 1 << 2,
90         CAMEL_MESSAGE_FLAGGED = 1 << 3,
91         CAMEL_MESSAGE_SEEN = 1 << 4,
92
93         /* these aren't really system flag bits, but are convenience flags */
94         CAMEL_MESSAGE_ATTACHMENTS = 1 << 5,
95         CAMEL_MESSAGE_ANSWERED_ALL = 1 << 6,
96         CAMEL_MESSAGE_JUNK = 1 << 7,
97         CAMEL_MESSAGE_SECURE = 1 << 8,
98         CAMEL_MESSAGE_USER_NOT_DELETABLE = 1 << 9,
99         CAMEL_MESSAGE_HIDDEN = 1 << 10,
100         CAMEL_MESSAGE_NOTJUNK = 1 << 11,
101         CAMEL_MESSAGE_FORWARDED = 1 << 12,
102
103         /* following flags are for the folder, and are not really permanent flags */
104         CAMEL_MESSAGE_FOLDER_FLAGGED = 1 << 16, /* for use by the folder implementation */
105         /* flags after 1 << 16 are used by camel providers,
106  *         if adding non permanent flags, add them to the end  */
107
108         CAMEL_MESSAGE_JUNK_LEARN = 1 << 30, /* used when setting CAMEL_MESSAGE_JUNK flag
109                                              * to say that we request junk plugin
110                                              * to learn that message as junk/non junk */
111         CAMEL_MESSAGE_USER = 1 << 31 /* supports user flags */
112 } CamelMessageFlags;
113
114 /* Changes to system flags will NOT trigger a folder changed event */
115 #define CAMEL_MESSAGE_SYSTEM_MASK (0xffff << 16)
116
117 typedef struct _CamelFlag {
118         struct _CamelFlag *next;
119         gchar name[1];          /* name allocated as part of the structure */
120 } CamelFlag;
121
122 typedef struct _CamelTag {
123         struct _CamelTag *next;
124         gchar *value;
125         gchar name[1];          /* name allocated as part of the structure */
126 } CamelTag;
127
128 /* a summary messageid is a 64 bit identifier (partial md5 hash) */
129 typedef struct _CamelSummaryMessageID {
130         union {
131                 guint64 id;
132                 guchar hash[8];
133                 struct {
134                         guint32 hi;
135                         guint32 lo;
136                 } part;
137         } id;
138 } CamelSummaryMessageID;
139
140 /* summary references is a fixed size array of references */
141 typedef struct _CamelSummaryReferences {
142         gint size;
143         CamelSummaryMessageID references[1];
144 } CamelSummaryReferences;
145
146 /* accessor id's */
147 enum {
148         CAMEL_MESSAGE_INFO_SUBJECT,
149         CAMEL_MESSAGE_INFO_FROM,
150         CAMEL_MESSAGE_INFO_TO,
151         CAMEL_MESSAGE_INFO_CC,
152         CAMEL_MESSAGE_INFO_MLIST,
153
154         CAMEL_MESSAGE_INFO_FLAGS,
155         CAMEL_MESSAGE_INFO_SIZE,
156
157         CAMEL_MESSAGE_INFO_DATE_SENT,
158         CAMEL_MESSAGE_INFO_DATE_RECEIVED,
159
160         CAMEL_MESSAGE_INFO_MESSAGE_ID,
161         CAMEL_MESSAGE_INFO_REFERENCES,
162         CAMEL_MESSAGE_INFO_USER_FLAGS,
163         CAMEL_MESSAGE_INFO_USER_TAGS,
164
165         CAMEL_MESSAGE_INFO_HEADERS,
166         CAMEL_MESSAGE_INFO_PREVIEW,
167         CAMEL_MESSAGE_INFO_CONTENT,
168         CAMEL_MESSAGE_INFO_LAST
169 };
170
171 /* information about a given message, use accessors */
172 struct _CamelMessageInfo {
173         CamelFolderSummary *summary;
174
175         guint32 refcount;       /* ??? */
176         const gchar *uid;
177         /*FIXME: Make it work with the CAMEL_MESSADE_DB_DIRTY flag instead of another 4 bytes*/
178         guint dirty : 1;
179 };
180
181 /* For classes wishing to do the provided i/o, or for anonymous users,
182  * they must subclass or use this messageinfo structure */
183 /* Otherwise they can do their own thing entirely */
184 struct _CamelMessageInfoBase {
185         CamelFolderSummary *summary;
186
187         guint32 refcount;       /* ??? */
188         const gchar *uid;
189         /*FIXME: Make it work with the CAMEL_MESSADE_DB_DIRTY flag instead of another 4 bytes*/
190         guint dirty : 1;
191
192         const gchar *subject;
193         const gchar *from;
194         const gchar *to;
195         const gchar *cc;
196         const gchar *mlist;
197
198         CamelMessageFlags flags;
199         guint32 size;
200
201         time_t date_sent;
202         time_t date_received;
203
204         CamelSummaryMessageID message_id;
205         CamelSummaryReferences *references;/* from parent to root */
206
207         struct _CamelFlag *user_flags;
208         struct _CamelTag *user_tags;
209
210         /* tree of content description - NULL if it is not available */
211         CamelMessageContentInfo *content;
212         struct _camel_header_param *headers;
213         gchar *preview;
214         gchar *bodystructure;
215 };
216
217 /**
218  * CamelFolderSummaryFlags:
219  * @CAMEL_FOLDER_SUMMARY_DIRTY:
220  *    There are changes in summary, which should be saved.
221  * @CAMEL_FOLDER_SUMMARY_IN_MEMORY_ONLY:
222  *    Summary with this flag doesn't use DB for storing its content,
223  *    it is always created on the fly.
224  **/
225 typedef enum {
226         CAMEL_FOLDER_SUMMARY_DIRTY              = 1 << 0,
227         CAMEL_FOLDER_SUMMARY_IN_MEMORY_ONLY     = 1 << 1
228 } CamelFolderSummaryFlags;
229
230 /**
231  * CamelFolderSummaryLock:
232  *
233  * Since: 2.32
234  **/
235 typedef enum _CamelFolderSummaryLock {
236         CAMEL_FOLDER_SUMMARY_SUMMARY_LOCK,
237         CAMEL_FOLDER_SUMMARY_IO_LOCK,
238         CAMEL_FOLDER_SUMMARY_FILTER_LOCK,
239         CAMEL_FOLDER_SUMMARY_ALLOC_LOCK,
240         CAMEL_FOLDER_SUMMARY_REF_LOCK
241 } CamelFolderSummaryLock;
242
243 struct _CamelFolderSummary {
244         CamelObject parent;
245         CamelFolderSummaryPrivate *priv;
246
247         /* header info */
248         guint32 version;        /* version of file loaded/loading */
249         time_t time;            /* timestamp for this summary (for implementors to use) */
250         CamelFolderSummaryFlags flags;
251
252         const gchar *collate;
253         const gchar *sort_by;
254
255         /* Future ABI expansion */
256         gpointer later[4];
257 };
258
259 struct _CamelMIRecord;
260 struct _CamelFIRecord;
261
262 struct _CamelFolderSummaryClass {
263         CamelObjectClass parent_class;
264
265         /* sizes of memory objects */
266         gsize message_info_size;
267         gsize content_info_size;
268
269         /* Load/Save folder summary from DB*/
270         gboolean (*summary_header_from_db)(CamelFolderSummary *, struct _CamelFIRecord *);
271         struct _CamelFIRecord * (*summary_header_to_db)(CamelFolderSummary *, GError **error);
272         CamelMessageInfo * (*message_info_from_db) (CamelFolderSummary *, struct _CamelMIRecord *);
273         struct _CamelMIRecord * (*message_info_to_db) (CamelFolderSummary *, CamelMessageInfo *);
274         CamelMessageContentInfo * (*content_info_from_db) (CamelFolderSummary *, struct _CamelMIRecord *);
275         gboolean (*content_info_to_db) (CamelFolderSummary *, CamelMessageContentInfo *, struct _CamelMIRecord *);
276
277         /* create/save/load an individual message info */
278         CamelMessageInfo * (*message_info_new_from_header)(CamelFolderSummary *, struct _camel_header_raw *);
279         CamelMessageInfo * (*message_info_new_from_parser)(CamelFolderSummary *, CamelMimeParser *);
280         CamelMessageInfo * (*message_info_new_from_message)(CamelFolderSummary *, CamelMimeMessage *, const gchar *);
281         void               (*message_info_free)(CamelFolderSummary *, CamelMessageInfo *);
282         CamelMessageInfo * (*message_info_clone)(CamelFolderSummary *, const CamelMessageInfo *);
283
284         /* save/load individual content info's */
285         CamelMessageContentInfo * (*content_info_new_from_header)(CamelFolderSummary *, struct _camel_header_raw *);
286         CamelMessageContentInfo * (*content_info_new_from_parser)(CamelFolderSummary *, CamelMimeParser *);
287         CamelMessageContentInfo * (*content_info_new_from_message)(CamelFolderSummary *, CamelMimePart *);
288         void                      (*content_info_free)(CamelFolderSummary *, CamelMessageContentInfo *);
289         CamelMessageInfo * (*message_info_from_uid) (CamelFolderSummary *, const gchar *);
290         /* get the next uid */
291         gchar *(*next_uid_string)(CamelFolderSummary *);
292
293         /* virtual accessors on messageinfo's */
294         gconstpointer (*info_ptr)(const CamelMessageInfo *mi, gint id);
295         guint32     (*info_uint32)(const CamelMessageInfo *mi, gint id);
296         time_t      (*info_time)(const CamelMessageInfo *mi, gint id);
297
298         gboolean    (*info_user_flag)(const CamelMessageInfo *mi, const gchar *id);
299         const gchar *(*info_user_tag)(const CamelMessageInfo *mi, const gchar *id);
300
301         /* set accessors for the modifyable bits */
302         gboolean (*info_set_user_flag)(CamelMessageInfo *mi, const gchar *id, gboolean state);
303         gboolean (*info_set_user_tag)(CamelMessageInfo *mi, const gchar *id, const gchar *val);
304         gboolean (*info_set_flags)(CamelMessageInfo *mi, guint32 mask, guint32 set);
305 };
306
307 GType                   camel_folder_summary_get_type   (void);
308 CamelFolderSummary *    camel_folder_summary_new        (struct _CamelFolder *folder);
309
310 struct _CamelFolder *   camel_folder_summary_get_folder (CamelFolderSummary *summary);
311
312 guint32                 camel_folder_summary_get_saved_count
313                                                         (CamelFolderSummary *summary);
314 guint32                 camel_folder_summary_get_unread_count
315                                                         (CamelFolderSummary *summary);
316 guint32                 camel_folder_summary_get_deleted_count
317                                                         (CamelFolderSummary *summary);
318 guint32                 camel_folder_summary_get_junk_count
319                                                         (CamelFolderSummary *summary);
320 guint32                 camel_folder_summary_get_junk_not_deleted_count
321                                                         (CamelFolderSummary *summary);
322 guint32                 camel_folder_summary_get_visible_count
323                                                         (CamelFolderSummary *summary);
324
325 void                    camel_folder_summary_set_index  (CamelFolderSummary *summary,
326                                                          CamelIndex *index);
327 CamelIndex *            camel_folder_summary_get_index  (CamelFolderSummary *summary);
328 void                    camel_folder_summary_set_build_content
329                                                         (CamelFolderSummary *summary,
330                                                          gboolean state);
331 gboolean                camel_folder_summary_get_build_content
332                                                         (CamelFolderSummary *summary);
333 void                    camel_folder_summary_set_need_preview
334                                                         (CamelFolderSummary *summary,
335                                                          gboolean preview);
336 gboolean                camel_folder_summary_get_need_preview
337                                                         (CamelFolderSummary *summary);
338 guint32                 camel_folder_summary_next_uid   (CamelFolderSummary *summary);
339 void                    camel_folder_summary_set_next_uid
340                                                         (CamelFolderSummary *summary,
341                                                          guint32 uid);
342 guint32                 camel_folder_summary_get_next_uid
343                                                         (CamelFolderSummary *summary);
344 gchar *                 camel_folder_summary_next_uid_string
345                                                         (CamelFolderSummary *summary);
346
347 /* load/save the full summary from/to the db */
348 gboolean                camel_folder_summary_save_to_db (CamelFolderSummary *summary,
349                                                          GError **error);
350 gboolean                camel_folder_summary_load_from_db
351                                                         (CamelFolderSummary *summary,
352                                                          GError **error);
353
354 /* only load the header */
355 gboolean                camel_folder_summary_header_load_from_db
356                                                         (CamelFolderSummary *summary,
357                                                          struct _CamelStore *store,
358                                                          const gchar *folder_name,
359                                                          GError **error);
360 gboolean                camel_folder_summary_header_save_to_db
361                                                         (CamelFolderSummary *summary,
362                                                          GError **error);
363
364 /* set the dirty bit on the summary */
365 void                    camel_folder_summary_touch      (CamelFolderSummary *summary);
366
367 /* Just build raw summary items */
368 CamelMessageInfo *      camel_folder_summary_info_new_from_header
369                                                         (CamelFolderSummary *summary,
370                                                          struct _camel_header_raw *headers);
371 CamelMessageInfo *      camel_folder_summary_info_new_from_parser
372                                                         (CamelFolderSummary *summary,
373                                                          CamelMimeParser *parser);
374 CamelMessageInfo *      camel_folder_summary_info_new_from_message
375                                                         (CamelFolderSummary *summary,
376                                                          CamelMimeMessage *message,
377                                                          const gchar *bodystructure);
378
379 CamelMessageContentInfo *camel_folder_summary_content_info_new
380                                                         (CamelFolderSummary *summary);
381 void                    camel_folder_summary_content_info_free
382                                                         (CamelFolderSummary *summary,
383                                                          CamelMessageContentInfo *ci);
384
385 void                    camel_folder_summary_add_preview
386                                                         (CamelFolderSummary *summary,
387                                                          CamelMessageInfo *info);
388
389 /* build/add raw summary items */
390 CamelMessageInfo *      camel_folder_summary_add_from_header
391                                                         (CamelFolderSummary *summary,
392                                                          struct _camel_header_raw *headers);
393 CamelMessageInfo *      camel_folder_summary_add_from_parser
394                                                         (CamelFolderSummary *summary,
395                                                          CamelMimeParser *parser);
396 CamelMessageInfo *      camel_folder_summary_add_from_message
397                                                         (CamelFolderSummary *summary,
398                                                          CamelMimeMessage *message);
399
400 /* add a new raw summary item */
401 void                    camel_folder_summary_add        (CamelFolderSummary *summary,
402                                                          CamelMessageInfo *info);
403
404 /* insert mi to summary */
405 void                    camel_folder_summary_insert     (CamelFolderSummary *summary,
406                                                          CamelMessageInfo *info,
407                                                          gboolean load);
408
409 gboolean                camel_folder_summary_remove     (CamelFolderSummary *summary,
410                                                          CamelMessageInfo *info);
411
412 gboolean                camel_folder_summary_remove_uid (CamelFolderSummary *summary,
413                                                          const gchar *uid);
414 gboolean                camel_folder_summary_remove_uids (CamelFolderSummary *summary,
415                                                          GList *uids);
416
417 /* remove all items */
418 gboolean                camel_folder_summary_clear      (CamelFolderSummary *summary,
419                                                          GError **error);
420
421 /* lookup functions */
422 guint                   camel_folder_summary_count      (CamelFolderSummary *summary);
423
424 gboolean                camel_folder_summary_check_uid  (CamelFolderSummary *summary,
425                                                          const gchar *uid);
426 CamelMessageInfo *      camel_folder_summary_get        (CamelFolderSummary *summary,
427                                                          const gchar *uid);
428 GPtrArray *             camel_folder_summary_get_array  (CamelFolderSummary *summary);
429 void                    camel_folder_summary_free_array (GPtrArray *array);
430
431 GHashTable *            camel_folder_summary_get_hash   (CamelFolderSummary *summary);
432
433 gboolean                camel_folder_summary_replace_flags
434                                                         (CamelFolderSummary *summary,
435                                                          CamelMessageInfo *info);
436
437 /* Peek from mem only */
438 CamelMessageInfo *      camel_folder_summary_peek_loaded
439                                                         (CamelFolderSummary *summary,
440                                                          const gchar *uid);
441
442 /* Get only the uids of dirty/changed things to sync to server/db */
443 GPtrArray *             camel_folder_summary_get_changed
444                                                         (CamelFolderSummary *summary);
445
446 /* reload the summary at any required point if required */
447 void                    camel_folder_summary_prepare_fetch_all
448                                                         (CamelFolderSummary *summary,
449                                                          GError **error);
450
451 /* summary locking */
452 void                    camel_folder_summary_lock       (CamelFolderSummary *summary,
453                                                          CamelFolderSummaryLock lock);
454 void                    camel_folder_summary_unlock     (CamelFolderSummary *summary,
455                                                          CamelFolderSummaryLock lock);
456
457 /* message flag operations */
458 gboolean                camel_flag_get                  (CamelFlag **list,
459                                                          const gchar *name);
460 gboolean                camel_flag_set                  (CamelFlag **list,
461                                                          const gchar *name,
462                                                          gboolean value);
463 gboolean                camel_flag_list_copy            (CamelFlag **to,
464                                                          CamelFlag **from);
465 gint                    camel_flag_list_size            (CamelFlag **list);
466 void                    camel_flag_list_free            (CamelFlag **list);
467
468 CamelMessageFlags       camel_system_flag               (const gchar *name);
469 gboolean                camel_system_flag_get           (CamelMessageFlags flags,
470                                                          const gchar *name);
471
472 /* message tag operations */
473 const gchar *           camel_tag_get                   (CamelTag **list,
474                                                          const gchar *name);
475 gboolean                camel_tag_set                   (CamelTag **list,
476                                                          const gchar *name,
477                                                          const gchar *value);
478 gboolean                camel_tag_list_copy             (CamelTag **to,
479                                                          CamelTag **from);
480 gint                    camel_tag_list_size             (CamelTag **list);
481 void                    camel_tag_list_free             (CamelTag **list);
482
483 /* Summary may be null */
484 /* Use anonymous pointers to avoid tons of cast crap */
485 gpointer                camel_message_info_new          (CamelFolderSummary *summary);
486 gpointer                camel_message_info_ref          (gpointer info);
487 CamelMessageInfo *      camel_message_info_new_from_header
488                                                         (CamelFolderSummary *summary,
489                                                          struct _camel_header_raw *header);
490 void                    camel_message_info_free         (gpointer info);
491 gpointer                camel_message_info_clone        (gconstpointer info);
492
493 /* accessors */
494 gconstpointer           camel_message_info_ptr          (const CamelMessageInfo *mi,
495                                                          gint id);
496 guint32                 camel_message_info_uint32       (const CamelMessageInfo *mi,
497                                                          gint id);
498 time_t                  camel_message_info_time         (const CamelMessageInfo *mi,
499                                                          gint id);
500
501 #define camel_message_info_uid(mi) ((const gchar *)((const CamelMessageInfo *)mi)->uid)
502
503 #define camel_message_info_subject(mi) ((const gchar *)camel_message_info_ptr((const CamelMessageInfo *)mi, CAMEL_MESSAGE_INFO_SUBJECT))
504
505 /**
506  * camel_message_info_preview:
507  * @mi: a #CamelMessageInfo
508  *
509  * FIXME Document me!
510  *
511  * Since: 2.28
512  **/
513 #define camel_message_info_preview(mi) ((const gchar *)camel_message_info_ptr((const CamelMessageInfo *)mi, CAMEL_MESSAGE_INFO_PREVIEW))
514
515 #define camel_message_info_from(mi) ((const gchar *)camel_message_info_ptr((const CamelMessageInfo *)mi, CAMEL_MESSAGE_INFO_FROM))
516 #define camel_message_info_to(mi) ((const gchar *)camel_message_info_ptr((const CamelMessageInfo *)mi, CAMEL_MESSAGE_INFO_TO))
517 #define camel_message_info_cc(mi) ((const gchar *)camel_message_info_ptr((const CamelMessageInfo *)mi, CAMEL_MESSAGE_INFO_CC))
518 #define camel_message_info_mlist(mi) ((const gchar *)camel_message_info_ptr((const CamelMessageInfo *)mi, CAMEL_MESSAGE_INFO_MLIST))
519
520 #define camel_message_info_flags(mi) camel_message_info_uint32((const CamelMessageInfo *)mi, CAMEL_MESSAGE_INFO_FLAGS)
521 #define camel_message_info_size(mi) camel_message_info_uint32((const CamelMessageInfo *)mi, CAMEL_MESSAGE_INFO_SIZE)
522
523 #define camel_message_info_date_sent(mi) camel_message_info_time((const CamelMessageInfo *)mi, CAMEL_MESSAGE_INFO_DATE_SENT)
524 #define camel_message_info_date_received(mi) camel_message_info_time((const CamelMessageInfo *)mi, CAMEL_MESSAGE_INFO_DATE_RECEIVED)
525
526 #define camel_message_info_message_id(mi) ((const CamelSummaryMessageID *)camel_message_info_ptr((const CamelMessageInfo *)mi, CAMEL_MESSAGE_INFO_MESSAGE_ID))
527 #define camel_message_info_references(mi) ((const CamelSummaryReferences *)camel_message_info_ptr((const CamelMessageInfo *)mi, CAMEL_MESSAGE_INFO_REFERENCES))
528 #define camel_message_info_user_flags(mi) ((const CamelFlag *)camel_message_info_ptr((const CamelMessageInfo *)mi, CAMEL_MESSAGE_INFO_USER_FLAGS))
529 #define camel_message_info_user_tags(mi) ((const CamelTag *)camel_message_info_ptr((const CamelMessageInfo *)mi, CAMEL_MESSAGE_INFO_USER_TAGS))
530
531 /**
532  * camel_message_info_headers:
533  * @mi: a #CamelMessageInfo
534  *
535  * FIXME Document me!
536  *
537  * Since: 2.24
538  **/
539 #define camel_message_info_headers(mi) ((const struct _camel_header_param *)camel_message_info_ptr((const CamelMessageInfo *)mi, CAMEL_MESSAGE_INFO_HEADERS))
540
541 /**
542  * camel_message_info_content:
543  * @mi: a #CamelMessageInfo
544  *
545  * FIXME Document me!
546  *
547  * Since: 2.30
548  **/
549 #define camel_message_info_content(mi) ((const CamelMessageContentInfo *)camel_message_info_ptr((const CamelMessageInfo *)mi, CAMEL_MESSAGE_INFO_CONTENT))
550
551 gboolean                camel_message_info_user_flag    (const CamelMessageInfo *mi,
552                                                          const gchar *id);
553 const gchar *           camel_message_info_user_tag     (const CamelMessageInfo *mi,
554                                                          const gchar *id);
555
556 gboolean                camel_message_info_set_flags    (CamelMessageInfo *mi,
557                                                          CamelMessageFlags flags,
558                                                          guint32 set);
559 gboolean                camel_message_info_set_user_flag
560                                                         (CamelMessageInfo *mi,
561                                                          const gchar *id,
562                                                          gboolean state);
563 gboolean                camel_message_info_set_user_tag (CamelMessageInfo *mi,
564                                                          const gchar *id,
565                                                          const gchar *val);
566
567 const CamelMessageContentInfo *
568                         camel_folder_summary_guess_content_info
569                                                         (CamelMessageInfo *mi,
570                                                          CamelContentType *ctype);
571
572 /* debugging functions */
573 void                    camel_content_info_dump         (CamelMessageContentInfo *ci,
574                                                          gint depth);
575 void                    camel_message_info_dump         (CamelMessageInfo *mi);
576
577 /* utility functions for bdata string decomposition */
578 gint                    bdata_extract_digit             (/* const */ gchar **part);
579 gchar *                 bdata_extract_string            (/* const */ gchar **part);
580
581 G_END_DECLS
582
583 #endif /* CAMEL_FOLDER_SUMMARY_H */