예제 #1
0
        protected override bool TryParseArguments(ImmutableList <IMessageData> arguments)
        {
            if (arguments.Count != 3)
            {
                return(false);
            }

            string storeType = MessageData.GetString(arguments[0], Encoding.ASCII);

            _messageRange = arguments[1] as NumberRangeMessageData;
            _valueList    = arguments[2] as ListMessageData;

            if (string.IsNullOrEmpty(storeType) ||
                _messageRange == null ||
                _valueList == null)
            {
                return(false);
            }

            Match argumentMatch = ArgumentPattern.Match(storeType);

            if (!argumentMatch.Success)
            {
                return(false);
            }

            switch (argumentMatch.Groups[1].Value)
            {
            case "":
                _operation = StoreOperation.Set;
                break;

            case "+":
                _operation = StoreOperation.Add;
                break;

            case "-":
                _operation = StoreOperation.Remove;
                break;

            default:
                return(false);
            }

            _command = argumentMatch.Groups[2].Value;

            if (!KnownCommands.Contains(_command, StringComparer.OrdinalIgnoreCase))
            {
                return(false);
            }

            _silent = string.Equals(argumentMatch.Groups[3].Value, ".SILENT", StringComparison.OrdinalIgnoreCase);

            return(true);
        }
예제 #2
0
        protected override bool TryParseArguments(ImmutableList <IMessageData> arguments)
        {
            switch (arguments.Count)
            {
            case 4:
            {
                IMessageData second = arguments[1];
                if (!(second is ListMessageData secondList))
                {
                    return(false);
                }

                _flags = secondList;
                if (!MessageData.TryGetDateTime(arguments[2], Encoding.ASCII, out DateTime localDate))
                {
                    return(false);
                }

                _date = localDate;
                goto case 2;
            }

            case 3:
            {
                IMessageData second = arguments[1];
                if (second is ListMessageData secondList)
                {
                    _flags = secondList;
                }
                else
                {
                    if (!MessageData.TryGetDateTime(second, Encoding.ASCII, out DateTime localDate))
                    {
                        return(false);
                    }

                    _date = localDate;
                }

                goto case 2;
            }

            case 2:
                _mailbox     = MessageData.GetString(arguments[0], Encoding.UTF8);
                _messageBody = arguments[arguments.Count - 1] as LiteralMessageData;
                return(true);

            default:
                return(false);
            }
        }
예제 #3
0
        public override async Task ExecuteAsync(CancellationToken cancellationToken)
        {
            if (string.IsNullOrEmpty(_reference) && string.IsNullOrEmpty(_pattern))
            {
                await _channel.SendMessageAsync(
                    new ImapMessage(
                        UntaggedTag,
                        CommandName,
                        new ListMessageData(new AtomMessageData(Tags.NoSelect)),
                        new QuotedMessageData(Constants.HeirarchySeparator),
                        new QuotedMessageData("")),
                    cancellationToken);

                await EndOkAsync(_channel, cancellationToken);

                return;
            }

            IEnumerable <Mailbox> mailboxes =
                await _mailstore.ListMailboxesAsync(_channel.AuthenticatedUser, _reference + _pattern, cancellationToken);

            foreach (Mailbox mailbox in mailboxes)
            {
                ListMessageData list;
                if (mailbox.IsSelectable)
                {
                    list = new ListMessageData();
                }
                else
                {
                    list = new ListMessageData(new AtomMessageData(Tags.NoSelect));
                }

#warning Presumably we should use the list...

                await _channel.SendMessageAsync(
                    new ImapMessage(
                        UntaggedTag,
                        CommandName,
                        new ListMessageData(new AtomMessageData(Tags.NoSelect)),
                        new QuotedMessageData(Constants.HeirarchySeparator),
                        MessageData.CreateData(mailbox.FullName)),
                    cancellationToken);
            }

            await EndOkAsync(_channel, cancellationToken);
        }