~ubuntu-branches/ubuntu/quantal/maildir-utils/quantal

« back to all changes in this revision

Viewing changes to src/mu-flags.c

  • Committer: Package Import Robot
  • Author(s): Norbert Preining
  • Date: 2012-03-15 08:45:56 UTC
  • mfrom: (1.2.5)
  • Revision ID: package-import@ubuntu.com-20120315084556-vqdvw8sgodo24aji
Tags: 0.9.8.2-1
* several new upstream versions
* b-d on libgmime-2.6-dev (Closes: #664001, #664006)
* bump standards version to 3.9.3, no changes necessary
* switch to source format 3.0 (quilt): debian/control, debian/rules
* maildir-utils depends on dpkg/install-info (lintian warning)
* fix man page lintian warnings

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
** Copyright (C) 2011  <djcb@djcbsoftware.nl>
 
3
**
 
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
 
7
** later version.
 
8
**
 
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.
 
13
**
 
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.
 
17
**
 
18
*/
 
19
#include "mu-flags.h"
 
20
 
 
21
struct _FlagInfo {
 
22
        MuFlags          flag;
 
23
        char             kar;
 
24
        const char      *name;
 
25
        MuFlagType       flag_type;
 
26
};
 
27
typedef struct _FlagInfo FlagInfo;
 
28
 
 
29
static const FlagInfo FLAG_INFO[] = {
 
30
 
 
31
        /* NOTE: order of this is significant, due to optimizations
 
32
         * below */
 
33
        
 
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 },
 
40
                                             
 
41
        { MU_FLAG_NEW,        'N', "new",       MU_FLAG_TYPE_MAILDIR  },        
 
42
 
 
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  },
 
46
 
 
47
        { MU_FLAG_UNREAD,     'u', "unread",    MU_FLAG_TYPE_PSEUDO  }
 
48
};
 
49
 
 
50
/* does not use FLAG_INFO, optimized */
 
51
MuFlagType
 
52
mu_flag_type (MuFlags flag)
 
53
{
 
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;
 
62
 
 
63
        return MU_FLAG_TYPE_INVALID;
 
64
}
 
65
 
 
66
 
 
67
/* does not use FLAG_INFO, optimized */
 
68
char
 
69
mu_flag_char (MuFlags flag)
 
70
{
 
71
        switch (flag) {
 
72
                
 
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';
 
79
                
 
80
        case MU_FLAG_NEW:               return  'N';
 
81
                
 
82
        case MU_FLAG_SIGNED:            return  's';
 
83
        case MU_FLAG_ENCRYPTED:         return  'x';
 
84
        case MU_FLAG_HAS_ATTACH:        return  'a';
 
85
 
 
86
        case MU_FLAG_UNREAD:            return  'u';
 
87
 
 
88
        default:
 
89
                return 0;
 
90
        }
 
91
}
 
92
 
 
93
 
 
94
 
 
95
static MuFlags
 
96
mu_flag_from_char (char kar)
 
97
{
 
98
        switch (kar) {
 
99
                
 
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;       
 
106
 
 
107
        case 'N': return MU_FLAG_NEW;           
 
108
                
 
109
        case 's': return MU_FLAG_SIGNED;        
 
110
        case 'x': return MU_FLAG_ENCRYPTED;     
 
111
        case 'a': return MU_FLAG_HAS_ATTACH;    
 
112
 
 
113
        case 'u': return MU_FLAG_UNREAD;        
 
114
                
 
115
        default:
 
116
                return MU_FLAG_INVALID;
 
117
        }
 
118
}
 
119
 
 
120
 
 
121
/* does not use FLAG_INFO, optimized */
 
122
const char*
 
123
mu_flag_name (MuFlags flag)
 
124
{
 
125
        switch (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";  
 
132
                                             
 
133
        case  MU_FLAG_NEW:              return  "new";      
 
134
        
 
135
        case  MU_FLAG_SIGNED:           return  "signed";   
 
136
        case  MU_FLAG_ENCRYPTED:        return  "encrypted";
 
137
        case  MU_FLAG_HAS_ATTACH:       return  "attach";
 
138
 
 
139
        case MU_FLAG_UNREAD:            return  "unread";       
 
140
                
 
141
        default:
 
142
                return NULL;
 
143
        }
 
144
}
 
145
 
 
146
 
 
147
const char*
 
148
mu_flags_to_str_s (MuFlags flags, MuFlagType types)
 
149
{
 
150
        unsigned u,v;
 
151
        static char str[sizeof(FLAG_INFO) + 1];
 
152
        
 
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;
 
157
        str[v] = '\0';
 
158
        
 
159
        return str;
 
160
}
 
161
 
 
162
 
 
163
 
 
164
MuFlags
 
165
mu_flags_from_str (const char *str, MuFlagType types)
 
166
{
 
167
        const char *cur;
 
168
        MuFlags flag;
 
169
 
 
170
        g_return_val_if_fail (str, MU_FLAG_INVALID);
 
171
 
 
172
        for (cur = str, flag = MU_FLAG_NONE; *cur; ++cur) {
 
173
 
 
174
                MuFlags f;
 
175
 
 
176
                f = mu_flag_from_char (*cur);
 
177
                if (mu_flag_type (f) & types)
 
178
                        flag |= f;
 
179
        }
 
180
                
 
181
        return flag;
 
182
}
 
183
 
 
184
 
 
185
 
 
186
void
 
187
mu_flags_foreach (MuFlagsForeachFunc func, gpointer user_data)
 
188
{
 
189
        unsigned u;
 
190
        
 
191
        g_return_if_fail (func);
 
192
        
 
193
        for (u = 0; u != G_N_ELEMENTS(FLAG_INFO); ++u)
 
194
                func (FLAG_INFO[u].flag, user_data);
 
195
}
 
196
 
 
197
 
 
198
MuFlags
 
199
mu_flags_from_str_delta (const char *str, MuFlags oldflags,
 
200
                         MuFlagType types)
 
201
{
 
202
        const char *cur;
 
203
        MuFlags newflags;
 
204
                
 
205
        g_return_val_if_fail (str, MU_FLAG_INVALID);
 
206
 
 
207
        for (cur = str, newflags = oldflags; *cur; ++cur) {
 
208
 
 
209
                MuFlags f;
 
210
                if (*cur == '+' || *cur == '-') {
 
211
                        f = mu_flag_from_char (cur[1]);
 
212
                        if (f == 0)
 
213
                                goto error;
 
214
                        if (*cur == '+')
 
215
                                newflags  |= f;
 
216
                        else
 
217
                                newflags  &= ~f;
 
218
                        ++cur;          
 
219
                        continue;
 
220
                }
 
221
 
 
222
                goto error;
 
223
        }
 
224
        
 
225
        return newflags;
 
226
error:
 
227
        g_warning ("invalid flag string");
 
228
        return MU_FLAG_INVALID;
 
229
        
 
230
}
 
231
 
 
232