/// <summary>sends extended LIST command</summary>
        /// <remarks>valid in authenticated state</remarks>
        public ImapCommandResult ListExtended(string referenceName,
                                          string[] mailboxNamePatterns,
                                          ImapListSelectionOptions selectionOptions,
                                          ImapListReturnOptions returnOptions,
                                          out ImapMailbox[] mailboxes)
        {
            if (referenceName == null)
            throw new ArgumentNullException("referenceName");
              if (mailboxNamePatterns == null)
            throw new ArgumentNullException("mailboxNamePatterns");
              else if (mailboxNamePatterns.Length == 0)
            throw new ArgumentException("must be non-empty array", "mailboxNamePatterns");
              if (selectionOptions == null)
            throw new ArgumentNullException("selectionOptions");
              if (returnOptions == null)
            throw new ArgumentNullException("returnOptions");

              return ListExtendedInternal(referenceName, mailboxNamePatterns, selectionOptions, returnOptions, out mailboxes);
        }
        private ImapCommandResult ListExtendedInternalNoRefName(string mailboxNamePattern,
                                                            string[] mailboxNamePatterns,
                                                            ImapListSelectionOptions selectionOptions,
                                                            ImapListReturnOptions returnOptions,
                                                            out ImapMailbox[] mailboxes)
        {
            if (mailboxNamePattern == null)
            throw new ArgumentNullException("mailboxNamePattern");

              if (mailboxNamePatterns == null || mailboxNamePatterns.Length == 0)
            return ListExtendedInternal(string.Empty, new[] {mailboxNamePattern}, selectionOptions, returnOptions, out mailboxes);
              else
            return ListExtendedInternal(string.Empty, mailboxNamePatterns.Prepend(mailboxNamePattern), selectionOptions, returnOptions, out mailboxes);
        }
        /// <summary>sends extended LIST command</summary>
        /// <remarks>valid in authenticated state</remarks>
        public ImapCommandResult ListExtended(string mailboxNamePattern,
                                          ImapListSelectionOptions selectionOptions,
                                          ImapListReturnOptions returnOptions,
                                          out ImapMailbox[] mailboxes)
        {
            if (selectionOptions == null)
            throw new ArgumentNullException("selectionOptions");
              if (returnOptions == null)
            throw new ArgumentNullException("returnOptions");

              return ListExtendedInternalNoRefName(mailboxNamePattern, null, selectionOptions, returnOptions, out mailboxes);
        }
        private ImapCommandResult ListExtendedInternal(string referenceName,
                                                   string[] mailboxNamePatterns,
                                                   ImapListSelectionOptions selectionOptions,
                                                   ImapListReturnOptions returnOptions,
                                                   out ImapMailbox[] mailboxes)
        {
            using (var t = new ListExtendedTransaction(connection)) {
            if (selectionOptions != null)
            t.RequestArguments["selection options"] = selectionOptions;

            if (returnOptions != null)
              t.RequestArguments["return options"] = returnOptions;

            var quotedMailboxNamePatterns = Array.ConvertAll(mailboxNamePatterns, delegate(string pattern) {
              return new ImapMailboxNameString(pattern);
            });

            if (quotedMailboxNamePatterns.Length == 1)
              ListLsubInternal(t, referenceName, quotedMailboxNamePatterns[0], out mailboxes);
            else
              ListLsubInternal(t, referenceName, new ImapParenthesizedString(quotedMailboxNamePatterns), out mailboxes);

            /*
             * IMAP4 Extension for Returning STATUS Information in Extended LIST
             * http://tools.ietf.org/html/rfc5819
             */
            if (returnOptions != null && returnOptions.RequiredCapabilities.Contains(ImapCapability.ListStatus)) {
              // XXX: converting STATUS response
              foreach (var response in t.Result.ReceivedResponses) {
            var data = response as ImapDataResponse;

            if (data == null || data.Type != ImapDataResponseType.Status)
              continue;

            string mailboxName;
            var statusAttr = ImapDataResponseConverter.FromStatus(data, out mailboxName);

            var statusMailbox = Array.Find(mailboxes, delegate(ImapMailbox mailbox) {
              return mailbox.Name == mailboxName;
            });

            if (statusMailbox != null)
              statusMailbox.UpdateStatus(statusAttr);
              }
            }

            return t.Result;
              }
        }