Statistics
| Revision:

root / libsylph / folder.h @ 578

History | View | Annotate | Download (9.9 kB)

1
/*
2
 * LibSylph -- E-Mail client library
3
 * Copyright (C) 1999-2005 Hiroyuki Yamamoto
4
 *
5
 * This library is free software; you can redistribute it and/or
6
 * modify it under the terms of the GNU Lesser General Public
7
 * License as published by the Free Software Foundation; either
8
 * version 2.1 of the License, or (at your option) any later version.
9
 *
10
 * This library is distributed in the hope that it will be useful,
11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13
 * Lesser General Public License for more details.
14
 *
15
 * You should have received a copy of the GNU Lesser General Public
16
 * License along with this library; if not, write to the Free Software
17
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
18
 */
19
20
#ifndef __FOLDER_H__
21
#define __FOLDER_H__
22
23
#include <glib.h>
24
#include <time.h>
25
26
typedef struct _Folder                Folder;
27
typedef struct _FolderClass        FolderClass;
28
29
typedef struct _LocalFolder        LocalFolder;
30
typedef struct _RemoteFolder        RemoteFolder;
31
#if 0
32
typedef struct _MboxFolder        MboxFolder;
33
typedef struct _MaildirFolder        MaildirFolder;
34
#endif
35
36
typedef struct _FolderItem        FolderItem;
37
38
#define FOLDER(obj)                ((Folder *)obj)
39
#define FOLDER_CLASS(obj)        (FOLDER(obj)->klass)
40
#define FOLDER_TYPE(obj)        (FOLDER(obj)->klass->type)
41
42
#define LOCAL_FOLDER(obj)        ((LocalFolder *)obj)
43
#define REMOTE_FOLDER(obj)        ((RemoteFolder *)obj)
44
45
#define FOLDER_IS_LOCAL(obj)        (FOLDER_TYPE(obj) == F_MH      || \
46
                                 FOLDER_TYPE(obj) == F_MBOX    || \
47
                                 FOLDER_TYPE(obj) == F_MAILDIR)
48
49
#if 0
50
#define MBOX_FOLDER(obj)        ((MboxFolder *)obj)
51
#define MAILDIR_FOLDER(obj)        ((MaildirFolder *)obj)
52
#endif
53
54
#define FOLDER_ITEM(obj)        ((FolderItem *)obj)
55
56
#define FOLDER_ITEM_CAN_ADD(obj)                                        \
57
                ((obj) && FOLDER_ITEM(obj)->folder &&                        \
58
                 FOLDER_ITEM(obj)->path &&                                \
59
                 (FOLDER_IS_LOCAL(FOLDER_ITEM(obj)->folder) ||                \
60
                  FOLDER_TYPE(FOLDER_ITEM(obj)->folder) == F_IMAP) &&        \
61
                 !FOLDER_ITEM(obj)->no_select)
62
63
typedef enum
64
{
65
        F_MH,
66
        F_MBOX,
67
        F_MAILDIR,
68
        F_IMAP,
69
        F_NEWS,
70
        F_UNKNOWN
71
} FolderType;
72
73
typedef enum
74
{
75
        F_NORMAL,
76
        F_INBOX,
77
        F_OUTBOX,
78
        F_DRAFT,
79
        F_QUEUE,
80
        F_TRASH
81
} SpecialFolderItemType;
82
83
typedef enum
84
{
85
        SORT_BY_NONE,
86
        SORT_BY_NUMBER,
87
        SORT_BY_SIZE,
88
        SORT_BY_DATE,
89
        SORT_BY_TDATE,
90
        SORT_BY_FROM,
91
        SORT_BY_SUBJECT,
92
        SORT_BY_SCORE,
93
        SORT_BY_LABEL,
94
        SORT_BY_MARK,
95
        SORT_BY_UNREAD,
96
        SORT_BY_MIME,
97
        SORT_BY_TO
98
} FolderSortKey;
99
100
typedef enum
101
{
102
        SORT_ASCENDING,
103
        SORT_DESCENDING
104
} FolderSortType;
105
106
typedef void (*FolderUIFunc)                (Folder                *folder,
107
                                         FolderItem        *item,
108
                                         gpointer         data);
109
typedef void (*FolderDestroyNotify)        (Folder                *folder,
110
                                         FolderItem        *item,
111
                                         gpointer         data);
112
113
#include "prefs_account.h"
114
#include "session.h"
115
#include "procmsg.h"
116
117
struct _Folder
118
{
119
        FolderClass *klass;
120
121
        gchar *name;
122
        PrefsAccount *account;
123
124
        FolderItem *inbox;
125
        FolderItem *outbox;
126
        FolderItem *draft;
127
        FolderItem *queue;
128
        FolderItem *trash;
129
130
        FolderUIFunc ui_func;
131
        gpointer     ui_func_data;
132
133
        GNode *node;
134
135
        gpointer data;
136
};
137
138
struct _FolderClass
139
{
140
        FolderType type;
141
142
        /* virtual functions */
143
        Folder * (*folder_new)                (const gchar        *name,
144
                                         const gchar        *path);
145
        void     (*destroy)                (Folder                *folder);
146
147
        gint     (*scan_tree)                (Folder                *folder);
148
        gint     (*create_tree)                (Folder                *folder);
149
150
        GSList * (*get_msg_list)        (Folder                *folder,
151
                                         FolderItem        *item,
152
                                         gboolean         use_cache);
153
        /* return value is locale charset */
154
        gchar *  (*fetch_msg)                (Folder                *folder,
155
                                         FolderItem        *item,
156
                                         gint                 num);
157
        MsgInfo * (*get_msginfo)        (Folder                *folder,
158
                                         FolderItem        *item,
159
                                         gint                 num);
160
        gint     (*add_msg)                (Folder                *folder,
161
                                         FolderItem        *dest,
162
                                         const gchar        *file,
163
                                         MsgFlags        *flags,
164
                                         gboolean         remove_source);
165
        gint     (*add_msgs)                (Folder                *folder,
166
                                         FolderItem        *dest,
167
                                         GSList                *file_list,
168
                                         gboolean         remove_source,
169
                                         gint                *first);
170
        gint     (*move_msg)                (Folder                *folder,
171
                                         FolderItem        *dest,
172
                                         MsgInfo        *msginfo);
173
        gint     (*move_msgs)                (Folder                *folder,
174
                                         FolderItem        *dest,
175
                                         GSList                *msglist);
176
        gint     (*copy_msg)                (Folder                *folder,
177
                                         FolderItem        *dest,
178
                                         MsgInfo        *msginfo);
179
        gint     (*copy_msgs)                (Folder                *folder,
180
                                         FolderItem        *dest,
181
                                         GSList                *msglist);
182
        gint     (*remove_msg)                (Folder                *folder,
183
                                         FolderItem        *item,
184
                                         MsgInfo        *msginfo);
185
        gint     (*remove_msgs)                (Folder                *folder,
186
                                         FolderItem        *item,
187
                                         GSList                *msglist);
188
        gint     (*remove_all_msg)        (Folder                *folder,
189
                                         FolderItem        *item);
190
        gboolean (*is_msg_changed)        (Folder                *folder,
191
                                         FolderItem        *item,
192
                                         MsgInfo        *msginfo);
193
        gint     (*close)                (Folder                *folder,
194
                                         FolderItem        *item);
195
        gint     (*scan)                (Folder                *folder,
196
                                         FolderItem        *item);
197
198
        FolderItem * (*create_folder)        (Folder                *folder,
199
                                         FolderItem        *parent,
200
                                         const gchar        *name);
201
        gint     (*rename_folder)        (Folder                *folder,
202
                                         FolderItem        *item,
203
                                         const gchar        *name);
204
        gint     (*move_folder)                (Folder                *folder,
205
                                         FolderItem        *item,
206
                                         FolderItem        *new_parent);
207
        gint     (*remove_folder)        (Folder                *folder,
208
                                         FolderItem        *item);
209
};
210
211
struct _LocalFolder
212
{
213
        Folder folder;
214
215
        gchar *rootpath;
216
};
217
218
struct _RemoteFolder
219
{
220
        Folder folder;
221
222
        Session *session;
223
};
224
225
#if 0
226
struct _MboxFolder
227
{
228
        LocalFolder lfolder;
229
};
230
231
struct _MaildirFolder
232
{
233
        LocalFolder lfolder;
234
};
235
#endif
236
237
struct _FolderItem
238
{
239
        SpecialFolderItemType stype;
240
241
        gchar *name; /* UTF-8 */
242
        gchar *path; /* UTF-8 */
243
244
        time_t mtime;
245
246
        gint new;
247
        gint unread;
248
        gint total;
249
        gint unmarked_num;
250
251
        gint last_num;
252
253
        /* special flags */
254
        guint no_sub    : 1; /* no child allowed?    */
255
        guint no_select : 1; /* not selectable?      */
256
        guint collapsed : 1; /* collapsed item       */
257
        guint threaded  : 1; /* threaded folder view */
258
259
        guint opened    : 1; /* opened by summary view */
260
        guint updated   : 1; /* folderview should be updated */
261
262
        guint cache_dirty : 1; /* cache file needs to be updated */
263
        guint mark_dirty  : 1; /* mark file needs to be updated */
264
265
        FolderSortKey sort_key;
266
        FolderSortType sort_type;
267
268
        GNode *node;
269
270
        FolderItem *parent;
271
272
        Folder *folder;
273
274
        PrefsAccount *account;
275
276
        gboolean ac_apply_sub;
277
278
        gchar *auto_to;
279
        gboolean use_auto_to_on_reply;
280
        gchar *auto_cc;
281
        gchar *auto_bcc;
282
        gchar *auto_replyto;
283
284
        gboolean trim_summary_subject;
285
        gboolean trim_compose_subject;
286
287
        GSList *mark_queue;
288
289
        gpointer data;
290
};
291
292
Folder     *folder_new                        (FolderType         type,
293
                                         const gchar        *name,
294
                                         const gchar        *path);
295
void        folder_local_folder_init        (Folder                *folder,
296
                                         const gchar        *name,
297
                                         const gchar        *path);
298
void        folder_remote_folder_init        (Folder                *folder,
299
                                         const gchar        *name,
300
                                         const gchar        *path);
301
302
void        folder_destroy                (Folder                *folder);
303
void        folder_local_folder_destroy        (LocalFolder        *lfolder);
304
void        folder_remote_folder_destroy(RemoteFolder        *rfolder);
305
306
FolderItem *folder_item_new                (const gchar        *name,
307
                                         const gchar        *path);
308
void        folder_item_append                (FolderItem        *parent,
309
                                         FolderItem        *item);
310
void        folder_item_remove                (FolderItem        *item);
311
void        folder_item_remove_children        (FolderItem        *item);
312
void        folder_item_destroy                (FolderItem        *item);
313
314
gint        folder_item_compare                (FolderItem        *item_a,
315
                                         FolderItem        *item_b);
316
317
void        folder_set_ui_func        (Folder                *folder,
318
                                 FolderUIFunc         func,
319
                                 gpointer         data);
320
void        folder_set_name        (Folder                *folder,
321
                                 const gchar        *name);
322
void        folder_tree_destroy        (Folder                *folder);
323
324
void   folder_add                (Folder                *folder);
325
326
GList *folder_get_list                (void);
327
gint   folder_read_list                (void);
328
void   folder_write_list        (void);
329
330
gchar *folder_get_status        (GPtrArray        *folders,
331
                                 gboolean         full);
332
333
Folder     *folder_find_from_path                (const gchar        *path);
334
Folder     *folder_find_from_name                (const gchar        *name,
335
                                                 FolderType         type);
336
FolderItem *folder_find_item_from_path                (const gchar        *path);
337
FolderItem *folder_find_child_item_by_name        (FolderItem        *item,
338
                                                 const gchar        *name);
339
gchar      *folder_get_identifier                (Folder                *folder);
340
gchar      *folder_item_get_identifier                (FolderItem        *item);
341
FolderItem *folder_find_item_from_identifier        (const gchar        *identifier);
342
343
Folder     *folder_get_default_folder        (void);
344
FolderItem *folder_get_default_inbox        (void);
345
FolderItem *folder_get_default_outbox        (void);
346
FolderItem *folder_get_default_draft        (void);
347
FolderItem *folder_get_default_queue        (void);
348
FolderItem *folder_get_default_trash        (void);
349
350
void folder_set_missing_folders                (void);
351
void folder_unref_account_all                (PrefsAccount        *account);
352
353
/* return value is locale encoded file name */
354
gchar *folder_get_path                        (Folder                *folder);
355
gchar *folder_item_get_path                (FolderItem        *item);
356
357
gint   folder_item_scan                        (FolderItem        *item);
358
void   folder_item_scan_foreach                (GHashTable        *table);
359
GSList *folder_item_get_msg_list        (FolderItem        *item,
360
                                         gboolean         use_cache);
361
/* return value is locale charset */
362
gchar *folder_item_fetch_msg                (FolderItem        *item,
363
                                         gint                 num);
364
gint   folder_item_fetch_all_msg        (FolderItem        *item);
365
MsgInfo *folder_item_get_msginfo        (FolderItem        *item,
366
                                         gint                 num);
367
gint   folder_item_add_msg                (FolderItem        *dest,
368
                                         const gchar        *file,
369
                                         MsgFlags        *flags,
370
                                         gboolean         remove_source);
371
gint   folder_item_add_msgs                (FolderItem        *dest,
372
                                         GSList                *file_list,
373
                                         gboolean         remove_source,
374
                                         gint                *first);
375
gint   folder_item_move_msg                (FolderItem        *dest,
376
                                         MsgInfo        *msginfo);
377
gint   folder_item_move_msgs                (FolderItem        *dest,
378
                                         GSList                *msglist);
379
gint   folder_item_copy_msg                (FolderItem        *dest,
380
                                         MsgInfo        *msginfo);
381
gint   folder_item_copy_msgs                (FolderItem        *dest,
382
                                         GSList                *msglist);
383
gint   folder_item_remove_msg                (FolderItem        *item,
384
                                         MsgInfo        *msginfo);
385
gint   folder_item_remove_msgs                (FolderItem        *item,
386
                                         GSList                *msglist);
387
gint   folder_item_remove_all_msg        (FolderItem        *item);
388
gboolean folder_item_is_msg_changed        (FolderItem        *item,
389
                                         MsgInfo        *msginfo);
390
/* return value is locale chaset */
391
gchar *folder_item_get_cache_file        (FolderItem        *item);
392
gchar *folder_item_get_mark_file        (FolderItem        *item);
393
394
gint   folder_item_close                (FolderItem        *item);
395
396
#endif /* __FOLDER_H__ */