maildir supports a 'P' flag which denotes the fact that a message has
been 'passed' on (forwarded, bounced). notmuch syncs this to the
'passed' tag.

Per https://tools.ietf.org/html/rfc5788, IMAP has a user-defined flag
(keyword) '$Forwarded' that is supported by many servers and clients
these days. (Technically, one should check for '$Forwarded' in the
server response.)

Restructure mbsync's flag parser to accept keywords (flags starting with
'$') but still bail out on unknown system flags (flags starting with '\').
Support '$Forwarded' as a first keyword since it maps to maildir's 'P'
and needs to be sorted in between the system flags.

Signed-off-by: Michael J Gruber <git...@grubix.eu>
---
And sure enough, there was yet another flag bit definition in
src/driver.h... Found out the hard way. (This is the the only change in
v2 compared to v1.)

 src/driver.h      |  9 +++++----
 src/drv_imap.c    | 22 ++++++++++++----------
 src/drv_maildir.c |  2 +-
 src/drv_proxy.c   |  2 +-
 src/sync.c        |  2 +-
 5 files changed, 20 insertions(+), 17 deletions(-)

diff --git a/src/driver.h b/src/driver.h
index 7dc047a..af56069 100644
--- a/src/driver.h
+++ b/src/driver.h
@@ -48,10 +48,11 @@ typedef struct store_conf {
 /* The order is according to alphabetical maildir flag sort */
 #define F_DRAFT             (1<<0) /* Draft */
 #define F_FLAGGED    (1<<1) /* Flagged */
-#define F_ANSWERED   (1<<2) /* Replied */
-#define F_SEEN       (1<<3) /* Seen */
-#define F_DELETED    (1<<4) /* Trashed */
-#define NUM_FLAGS 5
+#define F_PASSED     (1<<2) /* Passed */
+#define F_ANSWERED   (1<<3) /* Replied */
+#define F_SEEN       (1<<4) /* Seen */
+#define F_DELETED    (1<<5) /* Trashed */
+#define NUM_FLAGS 6
 
 /* For message->status */
 #define M_RECENT       (1<<0) /* unsyncable flag; maildir_* depend on this 
being 1<<0 */
diff --git a/src/drv_imap.c b/src/drv_imap.c
index 56d71cb..6b724e0 100644
--- a/src/drv_imap.c
+++ b/src/drv_imap.c
@@ -244,11 +244,12 @@ static int imap_deref( imap_store_t *ctx );
 static void imap_invoke_bad_callback( imap_store_t *ctx );
 
 static const char *Flags[] = {
-       "Draft",
-       "Flagged",
-       "Answered",
-       "Seen",
-       "Deleted",
+       "\\Draft",      /* 'D' */
+       "\\Flagged",    /* 'F' */
+       "$Forwarded",   /* 'P' */
+       "\\Answered",   /* 'R' */
+       "\\Seen",       /* 'S' */
+       "\\Deleted",    /* 'T' */
 };
 
 static imap_cmd_t *
@@ -986,18 +987,20 @@ parse_fetch_rsp( imap_store_t *ctx, list_t *list, char *s 
ATTR_UNUSED )
                                if (is_list( tmp )) {
                                        for (flags = tmp->child; flags; flags = 
flags->next) {
                                                if (is_atom( flags )) {
-                                                       if (flags->val[0] == 
'\\') { /* ignore user-defined flags for now */
-                                                               if (!strcmp( 
"Recent", flags->val + 1)) {
+                                                       if (flags->val[0] == 
'\\' || flags->val[0] == '$') {
+                                                               if (!strcmp( 
"\\Recent", flags->val)) {
                                                                        status 
|= M_RECENT;
                                                                        goto 
flagok;
                                                                }
                                                                for (i = 0; i < 
as(Flags); i++)
-                                                                       if 
(!strcmp( Flags[i], flags->val + 1 )) {
+                                                                       if 
(!strcmp( Flags[i], flags->val)) {
                                                                                
mask |= 1 << i;
                                                                                
goto flagok;
                                                                        }
-                                                               if 
(flags->val[1] == 'X' && flags->val[2] == '-')
+                                                               if 
(flags->val[0] == '\\' && flags->val[1] == 'X' && flags->val[2] == '-')
                                                                        goto 
flagok; /* ignore system flag extensions */
+                                                               if 
(flags->val[0] == '$')
+                                                                       goto 
flagok; /* ignore unknown user-defined flags (keywords) */
                                                                error( "IMAP 
warning: unknown system flag %s\n", flags->val );
                                                        }
                                                  flagok: ;
@@ -2661,7 +2664,6 @@ imap_make_flags( int flags, char *buf )
        for (i = d = 0; i < as(Flags); i++)
                if (flags & (1 << i)) {
                        buf[d++] = ' ';
-                       buf[d++] = '\\';
                        for (s = Flags[i]; *s; s++)
                                buf[d++] = *s;
                }
diff --git a/src/drv_maildir.c b/src/drv_maildir.c
index c4dd6c7..c4bd165 100644
--- a/src/drv_maildir.c
+++ b/src/drv_maildir.c
@@ -108,7 +108,7 @@ debug( const char *msg, ... )
        va_end( va );
 }
 
-static const char Flags[] = { 'D', 'F', 'R', 'S', 'T' };
+static const char Flags[] = { 'D', 'F', 'P', 'R', 'S', 'T' };
 
 static uchar
 maildir_parse_flags( const char *info_prefix, const char *base )
diff --git a/src/drv_proxy.c b/src/drv_proxy.c
index 5010f60..c295e07 100644
--- a/src/drv_proxy.c
+++ b/src/drv_proxy.c
@@ -55,7 +55,7 @@ debugn( const char *msg, ... )
        va_end( va );
 }
 
-static const char Flags[] = { 'D', 'F', 'R', 'S', 'T' };
+static const char Flags[] = { 'D', 'F', 'P', 'R', 'S', 'T' };
 
 static char *
 proxy_make_flags( int flags, char *buf )
diff --git a/src/sync.c b/src/sync.c
index 8f2b4a2..1cf51bc 100644
--- a/src/sync.c
+++ b/src/sync.c
@@ -97,7 +97,7 @@ Fprintf( FILE *f, const char *msg, ... )
 }
 
 
-static const char Flags[] = { 'D', 'F', 'R', 'S', 'T' };
+static const char Flags[] = { 'D', 'F', 'P', 'R', 'S', 'T' };
 
 static int
 parse_flags( const char *buf )
-- 
2.16.2.418.gd47d907d45


------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
isync-devel mailing list
isync-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/isync-devel

Reply via email to