Skip to content

Commit

Permalink
Added AcceptedKeywords and PermanentKeywords to IMailFolder
Browse files Browse the repository at this point in the history
Also made IMessageSummary.Annotations and Keywords read-only as well
as making MessageFlagsChangedEventArgs.Keywords read-only.

Fixes issue #1256
  • Loading branch information
jstedfast committed Sep 10, 2021
1 parent 88220e1 commit 814a671
Show file tree
Hide file tree
Showing 13 changed files with 145 additions and 42 deletions.
28 changes: 28 additions & 0 deletions MailKit/IMailFolder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,12 @@
using MimeKit;
using MailKit.Search;

#if NET5_0_OR_GREATER
using IReadOnlySetOfStrings = System.Collections.Generic.IReadOnlySet<string>;
#else
using IReadOnlySetOfStrings = System.Collections.Generic.ISet<string>;
#endif

namespace MailKit {
/// <summary>
/// An interface for a mailbox folder as used by <see cref="IMailStore"/>.
Expand Down Expand Up @@ -107,6 +113,17 @@ public interface IMailFolder : IEnumerable<MimeMessage>
/// <value>The permanent flags.</value>
MessageFlags PermanentFlags { get; }

/// <summary>
/// Get the permanent keywords.
/// </summary>
/// <remarks>
/// <para>The permanent keywords are the keywords that will persist between sessions.</para>
/// <para>If the <see cref="MessageFlags.UserDefined"/> flag is set in <see cref="PermanentFlags"/>,
/// then the folder allows storing of user-defined keywords as well.</para>
/// </remarks>
/// <value>The permanent keywords.</value>
IReadOnlySetOfStrings PermanentKeywords { get; }

/// <summary>
/// Get the accepted flags.
/// </summary>
Expand All @@ -118,6 +135,17 @@ public interface IMailFolder : IEnumerable<MimeMessage>
/// <value>The accepted flags.</value>
MessageFlags AcceptedFlags { get; }

/// <summary>
/// Get the accepted keywords.
/// </summary>
/// <remarks>
/// The accepted keywords are the keywords that will be accepted and persist
/// for the current session. For the set of keywords that will persist between
/// sessions, see the <see cref="PermanentKeywords"/> property.
/// </remarks>
/// <value>The accepted keywords.</value>
IReadOnlySetOfStrings AcceptedKeywords { get; }

/// <summary>
/// Get the directory separator.
/// </summary>
Expand Down
10 changes: 8 additions & 2 deletions MailKit/IMessageSummary.cs
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,12 @@

using MimeKit;

#if NET5_0_OR_GREATER
using IReadOnlySetOfStrings = System.Collections.Generic.IReadOnlySet<string>;
#else
using IReadOnlySetOfStrings = System.Collections.Generic.ISet<string>;
#endif

namespace MailKit {
/// <summary>
/// A summary of a message.
Expand Down Expand Up @@ -234,7 +240,7 @@ public interface IMessageSummary
/// methods.</para>
/// </remarks>
/// <value>The user-defined message flags.</value>
HashSet<string> Keywords { get; }
IReadOnlySetOfStrings Keywords { get; }

/// <summary>
/// Gets the message annotations, if available.
Expand All @@ -248,7 +254,7 @@ public interface IMessageSummary
/// methods.</para>
/// </remarks>
/// <value>The message annotations.</value>
IList<Annotation> Annotations { get; }
IReadOnlyList<Annotation> Annotations { get; }

/// <summary>
/// Gets the list of headers, if available.
Expand Down
34 changes: 33 additions & 1 deletion MailKit/MailFolder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,12 @@

using MailKit.Search;

#if NET5_0_OR_GREATER
using IReadOnlySetOfStrings = System.Collections.Generic.IReadOnlySet<string>;
#else
using IReadOnlySetOfStrings = System.Collections.Generic.ISet<string>;
#endif

namespace MailKit {
/// <summary>
/// An abstract mail folder implementation.
Expand Down Expand Up @@ -149,13 +155,26 @@ protected MailFolder ()
/// <remarks>
/// <para>The permanent flags are the message flags that will persist between sessions.</para>
/// <para>If the <see cref="MessageFlags.UserDefined"/> flag is set, then the folder allows
/// storing of user-defined (custom) message flags.</para>
/// storing of user-defined keywords.</para>
/// </remarks>
/// <value>The permanent flags.</value>
public MessageFlags PermanentFlags {
get; protected set;
}

/// <summary>
/// Get the permanent keywords.
/// </summary>
/// <remarks>
/// <para>The permanent keywords are the keywords that will persist between sessions.</para>
/// <para>If the <see cref="MessageFlags.UserDefined"/> flag is set in <see cref="PermanentFlags"/>,
/// then the folder allows storing of user-defined keywords as well.</para>
/// </remarks>
/// <value>The permanent keywords.</value>
public IReadOnlySetOfStrings PermanentKeywords {
get; protected set;
}

/// <summary>
/// Get the accepted flags.
/// </summary>
Expand All @@ -169,6 +188,19 @@ protected MailFolder ()
get; protected set;
}

/// <summary>
/// Get the accepted keywords.
/// </summary>
/// <remarks>
/// The accepted keywords are the keywords that will be accepted and persist
/// for the current session. For the set of keywords that will persist between
/// sessions, see the <see cref="PermanentKeywords"/> property.
/// </remarks>
/// <value>The accepted keywords.</value>
public IReadOnlySetOfStrings AcceptedKeywords {
get; protected set;
}

/// <summary>
/// Get the directory separator.
/// </summary>
Expand Down
32 changes: 19 additions & 13 deletions MailKit/MessageFlagsChangedEventArgs.cs
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,12 @@
using System;
using System.Collections.Generic;

#if NET5_0_OR_GREATER
using IReadOnlySetOfStrings = System.Collections.Generic.IReadOnlySet<string>;
#else
using IReadOnlySetOfStrings = System.Collections.Generic.ISet<string>;
#endif

namespace MailKit {
/// <summary>
/// Event args for the <see cref="IMailFolder.MessageFlagsChanged"/> event.
Expand All @@ -45,7 +51,7 @@ public class MessageFlagsChangedEventArgs : MessageEventArgs
/// <param name="index">The message index.</param>
internal MessageFlagsChangedEventArgs (int index) : base (index)
{
Keywords = new HashSet<string> (StringComparer.OrdinalIgnoreCase);
Keywords = new HashSet<string> (StringComparer.Ordinal);
}

/// <summary>
Expand All @@ -58,7 +64,7 @@ internal MessageFlagsChangedEventArgs (int index) : base (index)
/// <param name="flags">The message flags.</param>
public MessageFlagsChangedEventArgs (int index, MessageFlags flags) : base (index)
{
Keywords = new HashSet<string> (StringComparer.OrdinalIgnoreCase);
Keywords = new HashSet<string> (StringComparer.Ordinal);
Flags = flags;
}

Expand All @@ -70,14 +76,14 @@ public MessageFlagsChangedEventArgs (int index, MessageFlags flags) : base (inde
/// </remarks>
/// <param name="index">The message index.</param>
/// <param name="flags">The message flags.</param>
/// <param name="keywords">The user-defined message flags.</param>
/// <param name="keywords">The user-defined keywords.</param>
/// <exception cref="System.ArgumentNullException">
/// <paramref name="keywords"/> is <c>null</c>.
/// </exception>
/// <exception cref="System.ArgumentOutOfRangeException">
/// <paramref name="index"/> is out of range.
/// </exception>
public MessageFlagsChangedEventArgs (int index, MessageFlags flags, HashSet<string> keywords) : base (index)
public MessageFlagsChangedEventArgs (int index, MessageFlags flags, IReadOnlySetOfStrings keywords) : base (index)
{
if (keywords == null)
throw new ArgumentNullException (nameof (keywords));
Expand All @@ -100,7 +106,7 @@ public MessageFlagsChangedEventArgs (int index, MessageFlags flags, HashSet<stri
/// </exception>
public MessageFlagsChangedEventArgs (int index, MessageFlags flags, ulong modseq) : base (index)
{
Keywords = new HashSet<string> (StringComparer.OrdinalIgnoreCase);
Keywords = new HashSet<string> (StringComparer.Ordinal);
ModSeq = modseq;
Flags = flags;
}
Expand All @@ -113,15 +119,15 @@ public MessageFlagsChangedEventArgs (int index, MessageFlags flags, ulong modseq
/// </remarks>
/// <param name="index">The message index.</param>
/// <param name="flags">The message flags.</param>
/// <param name="keywords">The user-defined message flags.</param>
/// <param name="keywords">The user-defined keywords.</param>
/// <param name="modseq">The modification sequence value.</param>
/// <exception cref="System.ArgumentNullException">
/// <paramref name="keywords"/> is <c>null</c>.
/// </exception>
/// <exception cref="System.ArgumentOutOfRangeException">
/// <paramref name="index"/> is out of range.
/// </exception>
public MessageFlagsChangedEventArgs (int index, MessageFlags flags, HashSet<string> keywords, ulong modseq) : base (index)
public MessageFlagsChangedEventArgs (int index, MessageFlags flags, IReadOnlySetOfStrings keywords, ulong modseq) : base (index)
{
if (keywords == null)
throw new ArgumentNullException (nameof (keywords));
Expand All @@ -145,7 +151,7 @@ public MessageFlagsChangedEventArgs (int index, MessageFlags flags, HashSet<stri
/// </exception>
public MessageFlagsChangedEventArgs (int index, UniqueId uid, MessageFlags flags) : base (index, uid)
{
Keywords = new HashSet<string> (StringComparer.OrdinalIgnoreCase);
Keywords = new HashSet<string> (StringComparer.Ordinal);
Flags = flags;
}

Expand All @@ -158,14 +164,14 @@ public MessageFlagsChangedEventArgs (int index, UniqueId uid, MessageFlags flags
/// <param name="index">The message index.</param>
/// <param name="uid">The unique id of the message.</param>
/// <param name="flags">The message flags.</param>
/// <param name="keywords">The user-defined message flags.</param>
/// <param name="keywords">The user-defined keywords.</param>
/// <exception cref="System.ArgumentNullException">
/// <paramref name="keywords"/> is <c>null</c>.
/// </exception>
/// <exception cref="System.ArgumentOutOfRangeException">
/// <paramref name="index"/> is out of range.
/// </exception>
public MessageFlagsChangedEventArgs (int index, UniqueId uid, MessageFlags flags, HashSet<string> keywords) : base (index, uid)
public MessageFlagsChangedEventArgs (int index, UniqueId uid, MessageFlags flags, IReadOnlySetOfStrings keywords) : base (index, uid)
{
if (keywords == null)
throw new ArgumentNullException (nameof (keywords));
Expand All @@ -189,7 +195,7 @@ public MessageFlagsChangedEventArgs (int index, UniqueId uid, MessageFlags flags
/// </exception>
public MessageFlagsChangedEventArgs (int index, UniqueId uid, MessageFlags flags, ulong modseq) : base (index, uid)
{
Keywords = new HashSet<string> (StringComparer.OrdinalIgnoreCase);
Keywords = new HashSet<string> (StringComparer.Ordinal);
ModSeq = modseq;
Flags = flags;
}
Expand All @@ -211,7 +217,7 @@ public MessageFlagsChangedEventArgs (int index, UniqueId uid, MessageFlags flags
/// <exception cref="System.ArgumentOutOfRangeException">
/// <paramref name="index"/> is out of range.
/// </exception>
public MessageFlagsChangedEventArgs (int index, UniqueId uid, MessageFlags flags, HashSet<string> keywords, ulong modseq) : base (index, uid)
public MessageFlagsChangedEventArgs (int index, UniqueId uid, MessageFlags flags, IReadOnlySetOfStrings keywords, ulong modseq) : base (index, uid)
{
if (keywords == null)
throw new ArgumentNullException (nameof (keywords));
Expand Down Expand Up @@ -239,7 +245,7 @@ public MessageFlagsChangedEventArgs (int index, UniqueId uid, MessageFlags flags
/// Gets the updated user-defined message flags.
/// </remarks>
/// <value>The updated user-defined message flags.</value>
public HashSet<string> Keywords {
public IReadOnlySetOfStrings Keywords {
get; private set;
}

Expand Down
12 changes: 9 additions & 3 deletions MailKit/MessageSummary.cs
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,12 @@
using MimeKit;
using MimeKit.Utils;

#if NET5_0_OR_GREATER
using IReadOnlySetOfStrings = System.Collections.Generic.IReadOnlySet<string>;
#else
using IReadOnlySetOfStrings = System.Collections.Generic.ISet<string>;
#endif

namespace MailKit {
/// <summary>
/// A summary of a message.
Expand Down Expand Up @@ -62,7 +68,7 @@ public MessageSummary (int index)
if (index < 0)
throw new ArgumentOutOfRangeException (nameof (index));

Keywords = new HashSet<string> (StringComparer.OrdinalIgnoreCase);
Keywords = new HashSet<string> (StringComparer.Ordinal);
Index = index;
}

Expand Down Expand Up @@ -499,7 +505,7 @@ static IEnumerable<BodyPartBasic> EnumerateBodyParts (BodyPart entity, bool atta
/// methods.</para>
/// </remarks>
/// <value>The user-defined message flags.</value>
public HashSet<string> Keywords {
public IReadOnlySetOfStrings Keywords {
get; set;
}

Expand All @@ -515,7 +521,7 @@ static IEnumerable<BodyPartBasic> EnumerateBodyParts (BodyPart entity, bool atta
/// methods.</para>
/// </remarks>
/// <value>The message annotations.</value>
public IList<Annotation> Annotations {
public IReadOnlyList<Annotation> Annotations {
get; set;
}

Expand Down
16 changes: 8 additions & 8 deletions MailKit/MessageThreader.cs
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,12 @@

using MailKit.Search;

#if NET5_0_OR_GREATER
using IReadOnlySetOfStrings = System.Collections.Generic.IReadOnlySet<string>;
#else
using IReadOnlySetOfStrings = System.Collections.Generic.ISet<string>;
#endif

namespace MailKit {
/// <summary>
/// Threads messages according to the algorithms defined in rfc5256.
Expand Down Expand Up @@ -97,12 +103,9 @@ public ThreadableNode (IMessageSummary message)

public MessageFlags? Flags => null;

public HashSet<string> Keywords => null;

[Obsolete]
public HashSet<string> UserFlags => null;
public IReadOnlySetOfStrings Keywords => null;

public IList<Annotation> Annotations {
public IReadOnlyList<Annotation> Annotations {
get { return Message != null ? Message.Annotations : Children[0].Annotations; }
}

Expand All @@ -126,9 +129,6 @@ public ThreadableNode (IMessageSummary message)

public string EmailId => null;

[Obsolete]
public string Id => null;

public string ThreadId => null;

public UniqueId UniqueId {
Expand Down
6 changes: 4 additions & 2 deletions MailKit/Net/Imap/ImapEngine.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1501,7 +1501,7 @@ public async Task<ImapResponseCode> ParseResponseCodeAsync (bool isTagged, bool
var perm = (PermanentFlagsResponseCode) code;

Stream.UngetToken (token);
perm.Flags = await ImapUtils.ParseFlagsListAsync (this, "PERMANENTFLAGS", null, doAsync, cancellationToken).ConfigureAwait (false);
perm.Flags = await ImapUtils.ParseFlagsListAsync (this, "PERMANENTFLAGS", perm.Keywords, doAsync, cancellationToken).ConfigureAwait (false);
token = await ReadTokenAsync (doAsync, cancellationToken).ConfigureAwait (false);
break;
case ImapResponseCodeType.UidNext:
Expand Down Expand Up @@ -1992,7 +1992,9 @@ internal async Task<ImapUntaggedResult> ProcessUntaggedResponseAsync (bool doAsy
} while (true);
break;
case "FLAGS":
folder.UpdateAcceptedFlags (await ImapUtils.ParseFlagsListAsync (this, atom, null, doAsync, cancellationToken).ConfigureAwait (false));
var keywords = new HashSet<string> (StringComparer.Ordinal);
var flags = await ImapUtils.ParseFlagsListAsync (this, atom, keywords, doAsync, cancellationToken).ConfigureAwait (false);
folder.UpdateAcceptedFlags (flags, keywords);
token = await ReadTokenAsync (doAsync, cancellationToken).ConfigureAwait (false);

AssertToken (token, ImapTokenType.Eoln, GenericUntaggedResponseSyntaxErrorFormat, atom, token);
Expand Down

0 comments on commit 814a671

Please sign in to comment.