2
** Copyright (C) 2011 <djcb@djcbsoftware.nl>
4
** This program is free software; you can redistribute it and/or modify it
5
** under the terms of the GNU General Public License as published by the
6
** Free Software Foundation; either version 3, or (at your option) any
9
** This program is distributed in the hope that it will be useful,
10
** but WITHOUT ANY WARRANTY; without even the implied warranty of
11
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
** GNU General Public License for more details.
14
** You should have received a copy of the GNU General Public License
15
** along with this program; if not, write to the Free Software Foundation,
16
** Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
27
typedef struct _FlagInfo FlagInfo;
29
static const FlagInfo FLAG_INFO[] = {
31
/* NOTE: order of this is significant, due to optimizations
34
{ MU_FLAG_DRAFT, 'D', "draft", MU_FLAG_TYPE_MAILFILE },
35
{ MU_FLAG_FLAGGED, 'F', "flagged", MU_FLAG_TYPE_MAILFILE },
36
{ MU_FLAG_PASSED, 'P', "passed", MU_FLAG_TYPE_MAILFILE },
37
{ MU_FLAG_REPLIED, 'R', "replied", MU_FLAG_TYPE_MAILFILE },
38
{ MU_FLAG_SEEN, 'S', "seen", MU_FLAG_TYPE_MAILFILE },
39
{ MU_FLAG_TRASHED, 'T', "trashed", MU_FLAG_TYPE_MAILFILE },
41
{ MU_FLAG_NEW, 'N', "new", MU_FLAG_TYPE_MAILDIR },
43
{ MU_FLAG_SIGNED, 's', "signed", MU_FLAG_TYPE_CONTENT },
44
{ MU_FLAG_ENCRYPTED, 'x', "encrypted", MU_FLAG_TYPE_CONTENT },
45
{ MU_FLAG_HAS_ATTACH, 'a', "attach", MU_FLAG_TYPE_CONTENT },
47
{ MU_FLAG_UNREAD, 'u', "unread", MU_FLAG_TYPE_PSEUDO }
50
/* does not use FLAG_INFO, optimized */
52
mu_flag_type (MuFlags flag)
54
if (flag >= MU_FLAG_DRAFT && flag <= MU_FLAG_TRASHED)
55
return MU_FLAG_TYPE_MAILFILE;
56
if (flag == MU_FLAG_NEW)
57
return MU_FLAG_TYPE_MAILDIR;
58
if (flag == MU_FLAG_UNREAD)
59
return MU_FLAG_TYPE_PSEUDO;
60
if (flag >= MU_FLAG_SIGNED && flag <= MU_FLAG_HAS_ATTACH)
61
return MU_FLAG_TYPE_CONTENT;
63
return MU_FLAG_TYPE_INVALID;
67
/* does not use FLAG_INFO, optimized */
69
mu_flag_char (MuFlags flag)
73
case MU_FLAG_DRAFT: return 'D';
74
case MU_FLAG_FLAGGED: return 'F';
75
case MU_FLAG_PASSED: return 'P';
76
case MU_FLAG_REPLIED: return 'R';
77
case MU_FLAG_SEEN: return 'S';
78
case MU_FLAG_TRASHED: return 'T';
80
case MU_FLAG_NEW: return 'N';
82
case MU_FLAG_SIGNED: return 's';
83
case MU_FLAG_ENCRYPTED: return 'x';
84
case MU_FLAG_HAS_ATTACH: return 'a';
86
case MU_FLAG_UNREAD: return 'u';
96
mu_flag_from_char (char kar)
100
case 'D': return MU_FLAG_DRAFT;
101
case 'F': return MU_FLAG_FLAGGED;
102
case 'P': return MU_FLAG_PASSED;
103
case 'R': return MU_FLAG_REPLIED;
104
case 'S': return MU_FLAG_SEEN;
105
case 'T': return MU_FLAG_TRASHED;
107
case 'N': return MU_FLAG_NEW;
109
case 's': return MU_FLAG_SIGNED;
110
case 'x': return MU_FLAG_ENCRYPTED;
111
case 'a': return MU_FLAG_HAS_ATTACH;
113
case 'u': return MU_FLAG_UNREAD;
116
return MU_FLAG_INVALID;
121
/* does not use FLAG_INFO, optimized */
123
mu_flag_name (MuFlags flag)
126
case MU_FLAG_DRAFT: return "draft";
127
case MU_FLAG_FLAGGED: return "flagged";
128
case MU_FLAG_PASSED: return "passed";
129
case MU_FLAG_REPLIED: return "replied";
130
case MU_FLAG_SEEN: return "seen";
131
case MU_FLAG_TRASHED: return "trashed";
133
case MU_FLAG_NEW: return "new";
135
case MU_FLAG_SIGNED: return "signed";
136
case MU_FLAG_ENCRYPTED: return "encrypted";
137
case MU_FLAG_HAS_ATTACH: return "attach";
139
case MU_FLAG_UNREAD: return "unread";
148
mu_flags_to_str_s (MuFlags flags, MuFlagType types)
151
static char str[sizeof(FLAG_INFO) + 1];
153
for (u = 0, v = 0; u != G_N_ELEMENTS(FLAG_INFO); ++u)
154
if (flags & FLAG_INFO[u].flag &&
155
types & FLAG_INFO[u].flag_type)
156
str[v++] = FLAG_INFO[u].kar;
165
mu_flags_from_str (const char *str, MuFlagType types)
170
g_return_val_if_fail (str, MU_FLAG_INVALID);
172
for (cur = str, flag = MU_FLAG_NONE; *cur; ++cur) {
176
f = mu_flag_from_char (*cur);
177
if (mu_flag_type (f) & types)
187
mu_flags_foreach (MuFlagsForeachFunc func, gpointer user_data)
191
g_return_if_fail (func);
193
for (u = 0; u != G_N_ELEMENTS(FLAG_INFO); ++u)
194
func (FLAG_INFO[u].flag, user_data);
199
mu_flags_from_str_delta (const char *str, MuFlags oldflags,
205
g_return_val_if_fail (str, MU_FLAG_INVALID);
207
for (cur = str, newflags = oldflags; *cur; ++cur) {
210
if (*cur == '+' || *cur == '-') {
211
f = mu_flag_from_char (cur[1]);
227
g_warning ("invalid flag string");
228
return MU_FLAG_INVALID;