1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
|
/*
* $Id: flag.h 1142 2008-08-13 17:22:21Z hubert@u.washington.edu $
*
* ========================================================================
* Copyright 2006-2007 University of Washington
* Copyright 2013-2014 Eduardo Chappa
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* ========================================================================
*/
#ifndef PITH_FLAG_INCLUDED
#define PITH_FLAG_INCLUDED
#include "../pith/msgno.h"
/*
* Useful def's to specify interesting flags
*/
#define F_NONE 0x00000000
#define F_SEEN 0x00000001
#define F_UNSEEN 0x00000002
#define F_DEL 0x00000004
#define F_UNDEL 0x00000008
#define F_FLAG 0x00000010
#define F_UNFLAG 0x00000020
#define F_ANS 0x00000040
#define F_UNANS 0x00000080
#define F_FWD 0x00000100
#define F_UNFWD 0x00000200
#define F_RECENT 0x00000400
#define F_UNRECENT 0x00000800
#define F_DRAFT 0x00001000
#define F_UNDRAFT 0x00002000
#define F_SRCHBACK 0x00004000 /* search backwards instead of forw */
#define F_NOFILT 0x00008000 /* defer processing filters */
#define F_OR_SEEN 0x00010000
#define F_OR_UNSEEN 0x00020000
#define F_OR_DEL 0x00040000
#define F_OR_UNDEL 0x00080000
#define F_OR_FLAG 0x00100000
#define F_OR_UNFLAG 0x00200000
#define F_OR_ANS 0x00400000
#define F_OR_UNANS 0x00800000
#define F_OR_FWD 0x01000000
#define F_OR_UNFWD 0x02000000
#define F_OR_RECENT 0x04000000
#define F_OR_UNRECENT 0x08000000
#define F_KEYWORD 0x10000000
#define F_UNKEYWORD 0x20000000
#define F_COMMENT 0x40000000
/*
* Useful flag checking macro
*/
#define FLAG_MATCH(F,M,S) (((((F)&F_SEEN) ? (M)->seen \
: ((F)&F_UNSEEN) ? !(M)->seen : 1) \
&& (((F)&F_DEL) ? (M)->deleted \
: ((F)&F_UNDEL) ? !(M)->deleted : 1) \
&& (((F)&F_ANS) ? (M)->answered \
: ((F)&F_UNANS) ? !(M)->answered : 1) \
&& (((F)&F_FWD) ? ((S) && user_flag_is_set((S),(M)->msgno,FORWARDED_FLAG)) \
: ((F)&F_UNFWD) ? ((S) && !user_flag_is_set((S),(M)->msgno,FORWARDED_FLAG)) : 1) \
&& (((F)&F_FLAG) ? (M)->flagged \
: ((F)&F_UNFLAG) ? !(M)->flagged : 1) \
&& (((F)&F_RECENT) ? (M)->recent \
: ((F)&F_UNRECENT) ? !(M)->recent : 1)) \
|| ((((F)&F_OR_SEEN) ? (M)->seen \
: ((F)&F_OR_UNSEEN) ? !(M)->seen : 0) \
|| (((F)&F_OR_DEL) ? (M)->deleted \
: ((F)&F_OR_UNDEL) ? !(M)->deleted : 0) \
|| (((F)&F_OR_ANS) ? (M)->answered \
: ((F)&F_OR_UNANS) ? !(M)->answered : 0) \
|| (((F)&F_OR_FWD) ? ((S) && user_flag_is_set((S),(M)->msgno,FORWARDED_FLAG)) \
: ((F)&F_OR_UNFWD) ? !((S) && user_flag_is_set((S),(M)->msgno,FORWARDED_FLAG)) : 0) \
|| (((F)&F_OR_FLAG)? (M)->flagged \
: ((F)&F_OR_UNFLAG) ? !(M)->flagged : 0) \
|| (((F)&F_OR_RECENT)? (M)->recent \
: ((F)&F_OR_UNRECENT) ? !(M)->recent : 0)))
/*
* These are def's to help manage local, private flags pine uses
* to maintain it's mapping table (see MSGNO_S def). The local flags
* are actually stored in spare bits in c-client's per-message
* MESSAGECACHE struct. But they're private, you ask. Since the flags
* are tied to the actual message (independent of the mapping), storing
* them in the c-client means we don't have to worry about them during
* sorting and such. See {set,get}_lflags for more on local flags.
*
* MN_HIDE hides messages which are not visible due to Zooming.
* MN_EXLD hides messages which have been filtered away.
* MN_SLCT marks messages which have been Selected.
* MN_SRCH marks messages that are the result of a search
* MN_COLL marks a point in the thread tree where the view has been
* collapsed, hiding the messages below that point
* MN_CHID hides messages which are collapsed out of view
* MN_CHID2 is similar to CHID and is introduced for performance reasons.
* When using the separate-thread-index the toplevel messages are
* MN_COLL and everything else is MN_CHID. However, if we view a
* single thread from there, instead of marking all of those top
* level threads MN_HIDE (or something) we change the semantics
* of the flags. When viewing a single thread we mark the messages
* of the thread with MN_CHID2 for performance reasons.
*/
#define MN_NONE 0x0000 /* No Pine specific flags */
#define MN_HIDE 0x0001 /* Pine specific hidden */
#define MN_EXLD 0x0002 /* Pine specific excluded */
#define MN_SLCT 0x0004 /* Pine specific selected */
#define MN_COLL 0x0008 /* Pine specific collapsed */
#define MN_CHID 0x0010 /* A parent somewhere above us is collapsed */
#define MN_CHID2 0x0020 /* performance related */
#define MN_USOR 0x0040 /* New message which hasn't been sorted yet */
#define MN_STMP 0x0080 /* Temporary storage for a per-message bit */
#define MN_SRCH 0x0100 /* Search result */
/* next_sorted_flagged options */
#define NSF_TRUST_FLAGS 0x01 /* input flag, don't need to ping */
#define NSF_SKIP_CHID 0x02 /* input flag, skip MN_CHID messages */
#define NSF_SEARCH_BACK 0x04 /* input flag, search backward if none forw */
#define NSF_FLAG_MATCH 0x08 /* return flag, actually got a match */
/* first_sorted_flagged options */
#define FSF_LAST 0x01 /* last instead of first */
#define FSF_SKIP_CHID 0x02 /* skip MN_CHID messages */
typedef long MsgNo;
/* exported protoypes */
long count_flagged(MAILSTREAM *, long);
MsgNo first_sorted_flagged(unsigned long, MAILSTREAM *, long, int);
MsgNo next_sorted_flagged(unsigned long, MAILSTREAM *, long, int *);
int get_lflag(MAILSTREAM *, MSGNO_S *, long, int);
int set_lflag(MAILSTREAM *, MSGNO_S *, long, int, int);
void copy_lflags(MAILSTREAM *, MSGNO_S *, int, int);
void set_lflags(MAILSTREAM *, MSGNO_S *, int, int);
long any_lflagged(MSGNO_S *, int);
#endif /* PITH_FLAG_INCLUDED */
|