Example #1
0
                public void ProcessTextCode(eResponseTextContext pTextContext, cResponseData pData, cTrace.cContext pParentContext)
                {
                    var lContext = pParentContext.NewMethod(nameof(cSelectedMailbox), nameof(ProcessTextCode), pTextContext, pData);

                    switch (pData)
                    {
                    case cResponseDataPermanentFlags lPermanentFlags:

                        mMailboxCacheItem.SetPermanentFlags(mSelectedForUpdate, lPermanentFlags.Flags, lContext);
                        return;

                    case cResponseDataUIDValidity lUIDValidity:

                        mCache = new cSelectedMailboxCache(mCache, lUIDValidity.UIDValidity, lContext);
                        return;

                    case cResponseDataAccess lAccess:

                        if (lAccess.ReadOnly != mAccessReadOnly)
                        {
                            mAccessReadOnly = lAccess.ReadOnly;
                            mSynchroniser.InvokeMailboxPropertiesChanged(mMailboxCacheItem, fMailboxProperties.isaccessreadonly, lContext);
                        }

                        return;
                    }

                    mCache.ProcessTextCode(pTextContext, pData, lContext);
                }
Example #2
0
                public override eProcessDataResult ProcessData(cResponseData pData, cTrace.cContext pParentContext)
                {
                    var lContext = pParentContext.NewMethod(nameof(cCommandHookFetchBody), nameof(ProcessData));

                    if (!(pData is cResponseDataFetch lFetch))
                    {
                        return(eProcessDataResult.notprocessed);
                    }
                    if (lFetch.Flags == null)
                    {
                        return(eProcessDataResult.notprocessed);
                    }

                    uint lUInt;

                    if (mFeedbackCollector.KeyType == cStoreFeedbackCollector.eKeyType.uid)
                    {
                        if (lFetch.UID == null)
                        {
                            return(eProcessDataResult.notprocessed);
                        }
                        lUInt = lFetch.UID.Value;
                    }
                    else
                    {
                        lUInt = lFetch.MSN;
                    }

                    if (mFeedbackCollector.ReceivedFlagsUpdate(lUInt))
                    {
                        return(eProcessDataResult.observed);
                    }
                    return(eProcessDataResult.notprocessed);
                }
Example #3
0
                public override eProcessDataResult ProcessData(cResponseData pData, cTrace.cContext pParentContext)
                {
                    var lContext = pParentContext.NewMethod(nameof(cCommandHookSelect), nameof(ProcessData));

                    if (mMailboxCache.SelectedMailboxDetails != null)
                    {
                        return(eProcessDataResult.notprocessed);
                    }

                    switch (pData)
                    {
                    case cResponseDataFlags lFlags:

                        mFlags = lFlags.Flags;
                        return(eProcessDataResult.processed);

                    case cResponseDataExists lExists:

                        mExists = lExists.Exists;
                        return(eProcessDataResult.processed);

                    case cResponseDataRecent lRecent:

                        mRecent = lRecent.Recent;
                        return(eProcessDataResult.processed);
                    }

                    return(eProcessDataResult.notprocessed);
                }
Example #4
0
                public eProcessDataResult ProcessData(cResponseData pData, cTrace.cContext pParentContext)
                {
                    var lContext = pParentContext.NewMethod(nameof(cMailboxCache), nameof(ProcessData));

                    if (mSelectedMailbox != null)
                    {
                        var lResult = mSelectedMailbox.ProcessData(pData, lContext);
                        if (lResult != eProcessDataResult.notprocessed)
                        {
                            return(lResult);
                        }
                    }

                    switch (pData)
                    {
                    case cResponseDataListMailbox lListMailbox:

                        ZProcessListMailbox(lListMailbox, lContext);
                        return(eProcessDataResult.observed);

                    case cResponseDataLSub lLSub:

                        ZProcessLSub(lLSub, lContext);
                        return(eProcessDataResult.observed);

                    default:

                        return(eProcessDataResult.notprocessed);
                    }
                }
Example #5
0
                public bool Process(cBytesCursor pCursor, out cResponseData rResponseData, cTrace.cContext pParentContext)
                {
                    var lContext = pParentContext.NewMethod(nameof(cResponseDataParserLSub), nameof(Process));

                    if (!pCursor.SkipBytes(kLSubSpace))
                    {
                        rResponseData = null; return(false);
                    }

                    if (!pCursor.GetFlags(out var lFlags) ||
                        !pCursor.SkipByte(cASCII.SPACE) ||
                        !pCursor.GetMailboxDelimiter(out var lDelimiter) ||
                        !pCursor.SkipByte(cASCII.SPACE) ||
                        !pCursor.GetAString(out IList <byte> lEncodedMailboxPath) ||
                        !pCursor.Position.AtEnd ||
                        !cMailboxName.TryConstruct(lEncodedMailboxPath, lDelimiter, mUTF8Enabled, out var lMailboxName))
                    {
                        lContext.TraceWarning("likely malformed lsub response");
                        rResponseData = null;
                        return(true);
                    }

                    rResponseData = new cResponseDataLSub(lMailboxName, !lFlags.Contains(@"\Noselect", StringComparer.InvariantCultureIgnoreCase));
                    return(true);
                }
Example #6
0
                public void ProcessTextCode(eResponseTextContext pTextContext, cResponseData pData, cTrace.cContext pParentContext)
                {
                    var lContext = pParentContext.NewMethod(nameof(cMailboxCache), nameof(ProcessTextCode), pTextContext, pData);

                    if (mSelectedMailbox != null)
                    {
                        mSelectedMailbox.ProcessTextCode(pTextContext, pData, lContext);
                    }
                }
Example #7
0
                    public void ProcessTextCode(eResponseTextContext pTextContext, cResponseData pData, cTrace.cContext pParentContext)
                    {
                        var lContext = pParentContext.NewMethod(nameof(cActiveCommands), nameof(ProcessTextCode), pTextContext, pData);

                        foreach (var lCommand in this)
                        {
                            lCommand.Hook.ProcessTextCode(pTextContext, pData, lContext);
                        }
                    }
Example #8
0
                public override eProcessDataResult ProcessData(cResponseData pData, cTrace.cContext pParentContext)
                {
                    var lContext = pParentContext.NewMethod(nameof(cListDelimiterCommandHook), nameof(ProcessData));

                    if (!(pData is cResponseDataListDelimiter lListDelimiter))
                    {
                        return(eProcessDataResult.notprocessed);
                    }
                    Delimiter = lListDelimiter.Delimiter;
                    return(eProcessDataResult.observed);
                }
Example #9
0
                public eProcessDataResult ProcessData(cResponseData pData, cTrace.cContext pParentContext)
                {
                    var lContext = pParentContext.NewMethod(nameof(cSelectedMailbox), nameof(ProcessData));

                    if (pData is cResponseDataFlags lFlags)
                    {
                        mMailboxCacheItem.SetMessageFlags(lFlags.Flags, lContext);
                        return(eProcessDataResult.processed);
                    }

                    return(mCache.ProcessData(pData, lContext));
                }
Example #10
0
                public override eProcessDataResult ProcessData(cResponseData pData, cTrace.cContext pParentContext)
                {
                    var lContext = pParentContext.NewMethod(nameof(cLogoutCommandHook), nameof(ProcessData));

                    if (pData is cResponseDataBye lBye)
                    {
                        GotBye = true;
                        return(eProcessDataResult.processed);
                    }

                    return(eProcessDataResult.notprocessed);
                }
Example #11
0
                public void ProcessTextCode(eResponseTextContext pTextContext, cResponseData pData, cTrace.cContext pParentContext)
                {
                    var lContext = pParentContext.NewMethod(nameof(cSelectedMailboxCache), nameof(ProcessTextCode), pTextContext, pData);

                    if (pData is cResponseDataUIDNext lUIDNext)
                    {
                        ZUIDNext(lUIDNext.UIDNext, lContext);
                    }
                    else if (pTextContext == eResponseTextContext.success && pData is cResponseDataHighestModSeq lHighestModSeq)
                    {
                        ZHighestModSeq(lHighestModSeq.HighestModSeq, lContext);
                    }
                }
Example #12
0
                public override eProcessDataResult ProcessData(cResponseData pData, cTrace.cContext pParentContext)
                {
                    var lContext = pParentContext.NewMethod(nameof(cListExtendedCommandHook), nameof(ProcessData));

                    if (!(pData is cResponseDataListMailbox lListMailbox))
                    {
                        return(eProcessDataResult.notprocessed);
                    }
                    if (!mPattern.Matches(lListMailbox.MailboxName.Path))
                    {
                        return(eProcessDataResult.notprocessed);
                    }

                    switch (mSelect)
                    {
                    case eListExtendedSelect.exists:

                        // if it is non-existent it may be being reported because it has children
                        if ((lListMailbox.Flags & fListFlags.nonexistent) == 0 || (lListMailbox.Flags & fListFlags.subscribed) == 0 || (lListMailbox.Flags & fListFlags.haschildren) != 0)
                        {
                            mMailboxes.Add(lListMailbox.MailboxName);
                            return(eProcessDataResult.observed);
                        }

                        return(eProcessDataResult.notprocessed);

                    case eListExtendedSelect.subscribed:

                        if ((lListMailbox.Flags & fListFlags.subscribed) != 0)
                        {
                            mMailboxes.Add(lListMailbox.MailboxName);
                            return(eProcessDataResult.observed);
                        }

                        return(eProcessDataResult.notprocessed);

                    case eListExtendedSelect.subscribedrecursive:

                        if ((lListMailbox.Flags & fListFlags.subscribed) != 0 || lListMailbox.HasSubscribedChildren)
                        {
                            mMailboxes.Add(lListMailbox.MailboxName);
                            return(eProcessDataResult.observed);
                        }

                        return(eProcessDataResult.notprocessed);

                    default:

                        throw new cInternalErrorException(lContext);
                    }
                }
Example #13
0
                } = null;                                       // note that this body may start before the origin position requested and may be longer or shorter than requested

                public override eProcessDataResult ProcessData(cResponseData pData, cTrace.cContext pParentContext)
                {
                    var lContext = pParentContext.NewMethod(nameof(cCommandHookFetchBody), nameof(ProcessData));

                    if (!(pData is cResponseDataFetch lFetch))
                    {
                        return(eProcessDataResult.notprocessed);
                    }
                    if (!IsThisTheMessageThatIAmInterestedIn(lFetch))
                    {
                        return(eProcessDataResult.notprocessed);
                    }

                    eProcessDataResult lResult = eProcessDataResult.notprocessed;

                    foreach (var lBody in lFetch.Bodies)
                    {
                        uint lOrigin = (lBody.Origin ?? 0);

                        if (lBody.Binary == mBinary && lBody.Section == mSection && lOrigin <= mOrigin)
                        {
                            if (lBody.Bytes == null)
                            {
                                // this is the case where NIL is returned by the server (e.g. * 1 FETCH (BODY[] NIL))
                                //  most likely because the message has been expunged
                                if (lOrigin >= mOrigin)
                                {
                                    lResult = eProcessDataResult.observed;
                                }
                            }
                            else
                            {
                                uint lTo = lOrigin + (uint)lBody.Bytes.Count;

                                if (lTo >= mOrigin)
                                {
                                    lResult = eProcessDataResult.observed;

                                    if (Body == null || lTo > mTo)
                                    {
                                        Body = lBody;
                                        mTo  = lTo;
                                    }
                                }
                            }
                        }
                    }

                    return(lResult);
                }
Example #14
0
                public override eProcessDataResult ProcessData(cResponseData pData, cTrace.cContext pParentContext)
                {
                    var lContext = pParentContext.NewMethod(nameof(cCommandHookListMailboxes), nameof(ProcessData));

                    if (!(pData is cResponseDataListMailbox lListMailbox))
                    {
                        return(eProcessDataResult.notprocessed);
                    }
                    if (!mPattern.Matches(lListMailbox.MailboxName.Path))
                    {
                        return(eProcessDataResult.notprocessed);
                    }

                    mMailboxes.Add(lListMailbox.MailboxName);
                    return(eProcessDataResult.observed);
                }
Example #15
0
                public bool Process(cBytesCursor pCursor, out cResponseData rResponseData, cTrace.cContext pParentContext)
                {
                    var lContext = pParentContext.NewMethod(nameof(cResponseDataParserSelect), nameof(Process));

                    if (pCursor.SkipBytes(kFlagsSpace))
                    {
                        if (pCursor.GetFlags(out var lRawFlags) && pCursor.Position.AtEnd && cFetchableFlags.TryConstruct(lRawFlags, out var lFlags))
                        {
                            rResponseData = new cResponseDataFlags(lFlags);
                        }
                        else
                        {
                            lContext.TraceWarning("likely malformed flags response");
                            rResponseData = null;
                        }

                        return(true);
                    }
Example #16
0
                public override eProcessDataResult ProcessData(cResponseData pData, cTrace.cContext pParentContext)
                {
                    var lContext = pParentContext.NewMethod(nameof(cCommandHookLSub), nameof(ProcessData));

                    if (!(pData is cResponseDataLSub lLSub))
                    {
                        return(eProcessDataResult.notprocessed);
                    }
                    if (!mPattern.Matches(lLSub.MailboxName.Path))
                    {
                        return(eProcessDataResult.notprocessed);
                    }

                    if (lLSub.Subscribed)
                    {
                        mMailboxes.Add(lLSub.MailboxName);
                    }
                    else if (mHasSubscribedChildren)
                    {
                        mMailboxes.Add(lLSub.MailboxName);
                    }

                    return(eProcessDataResult.observed);
                }
Example #17
0
                public eProcessDataResult ProcessData(cResponseData pData, cTrace.cContext pParentContext)
                {
                    var lContext = pParentContext.NewMethod(nameof(cSelectedMailboxCache), nameof(ProcessData));

                    switch (pData)
                    {
                    case cResponseDataFetch lFetch:

                        ZFetch(lFetch, lContext);
                        return(eProcessDataResult.observed);

                    case cResponseDataExists lExists:

                        ZExists(lExists.Exists, lContext);
                        return(eProcessDataResult.processed);

                    case cResponseDataRecent lRecent:

                        ZRecent(lRecent.Recent, lContext);
                        return(eProcessDataResult.processed);
                    }

                    return(eProcessDataResult.notprocessed);
                }
                public override eProcessDataResult ProcessData(cResponseData pData, cTrace.cContext pParentContext)
                {
                    var lContext = pParentContext.NewMethod(nameof(cCommandHookBaseSearchExtended), nameof(ProcessData));

                    if (!(pData is cResponseDataESearch lESearch))
                    {
                        return(eProcessDataResult.notprocessed);
                    }
                    if (!cASCII.Compare(mCommandTag, lESearch.Tag, true))
                    {
                        return(eProcessDataResult.notprocessed);
                    }

                    if (mSequenceSets == null)
                    {
                        mSequenceSets = new cSequenceSets();
                    }
                    if (lESearch.SequenceSet != null)
                    {
                        mSequenceSets.Add(lESearch.SequenceSet);
                    }

                    return(eProcessDataResult.processed);
                }
Example #19
0
                public bool Process(cBytesCursor pCursor, out cResponseData rResponseData, cTrace.cContext pParentContext)
                {
                    var lContext = pParentContext.NewMethod(nameof(cResponseDataParserList), nameof(Process));

                    if (!pCursor.SkipBytes(kListSpace))
                    {
                        rResponseData = null; return(false);
                    }

                    if (!pCursor.GetFlags(out var lFlags) ||
                        !pCursor.SkipByte(cASCII.SPACE) ||
                        !pCursor.GetMailboxDelimiter(out var lDelimiter) ||
                        !pCursor.SkipByte(cASCII.SPACE) ||
                        !pCursor.GetAString(out IList <byte> lEncodedMailboxPath) ||
                        !ZProcessExtendedItems(pCursor, out var lExtendedItems) ||
                        !pCursor.Position.AtEnd)
                    {
                        lContext.TraceWarning("likely malformed list response");
                        rResponseData = null;
                        return(true);
                    }

                    if (lEncodedMailboxPath.Count == 0)
                    {
                        if (lFlags.Count == 0 && lExtendedItems.Count == 0)
                        {
                            if (lDelimiter == null)
                            {
                                rResponseData = new cResponseDataListDelimiter();
                            }
                            else
                            {
                                rResponseData = new cResponseDataListDelimiter((char)lDelimiter.Value);
                            }
                        }
                        else
                        {
                            lContext.TraceWarning("likely malformed list delimiter response");
                            rResponseData = null;
                        }
                    }
                    else
                    {
                        if (cMailboxName.TryConstruct(lEncodedMailboxPath, lDelimiter, mUTF8Enabled, out var lMailboxName))
                        {
                            fListFlags lListFlags = 0;

                            if (lFlags.Contains(@"\Noinferiors", StringComparer.InvariantCultureIgnoreCase))
                            {
                                lListFlags |= fListFlags.noinferiors | fListFlags.hasnochildren;
                            }
                            if (lFlags.Contains(@"\Noselect", StringComparer.InvariantCultureIgnoreCase))
                            {
                                lListFlags |= fListFlags.noselect;
                            }
                            if (lFlags.Contains(@"\Marked", StringComparer.InvariantCultureIgnoreCase))
                            {
                                lListFlags |= fListFlags.marked;
                            }
                            if (lFlags.Contains(@"\Unmarked", StringComparer.InvariantCultureIgnoreCase))
                            {
                                lListFlags |= fListFlags.unmarked;
                            }

                            if (lFlags.Contains(@"\NonExistent", StringComparer.InvariantCultureIgnoreCase))
                            {
                                lListFlags |= fListFlags.noselect | fListFlags.nonexistent;
                            }
                            if (lFlags.Contains(@"\Subscribed", StringComparer.InvariantCultureIgnoreCase))
                            {
                                lListFlags |= fListFlags.subscribed;
                            }
                            if (lFlags.Contains(@"\Remote", StringComparer.InvariantCultureIgnoreCase))
                            {
                                lListFlags |= fListFlags.remote;
                            }
                            if (lFlags.Contains(@"\HasChildren", StringComparer.InvariantCultureIgnoreCase))
                            {
                                lListFlags |= fListFlags.haschildren;
                            }
                            if (lFlags.Contains(@"\HasNoChildren", StringComparer.InvariantCultureIgnoreCase))
                            {
                                lListFlags |= fListFlags.hasnochildren;
                            }

                            if (lFlags.Contains(@"\All", StringComparer.InvariantCultureIgnoreCase))
                            {
                                lListFlags |= fListFlags.all;
                            }
                            if (lFlags.Contains(@"\Archive", StringComparer.InvariantCultureIgnoreCase))
                            {
                                lListFlags |= fListFlags.archive;
                            }
                            if (lFlags.Contains(@"\Drafts", StringComparer.InvariantCultureIgnoreCase))
                            {
                                lListFlags |= fListFlags.drafts;
                            }
                            if (lFlags.Contains(@"\Flagged", StringComparer.InvariantCultureIgnoreCase))
                            {
                                lListFlags |= fListFlags.flagged;
                            }
                            if (lFlags.Contains(@"\Junk", StringComparer.InvariantCultureIgnoreCase))
                            {
                                lListFlags |= fListFlags.junk;
                            }
                            if (lFlags.Contains(@"\Sent", StringComparer.InvariantCultureIgnoreCase))
                            {
                                lListFlags |= fListFlags.sent;
                            }
                            if (lFlags.Contains(@"\Trash", StringComparer.InvariantCultureIgnoreCase))
                            {
                                lListFlags |= fListFlags.trash;
                            }

                            bool lHasSubscribedChildren = false;

                            foreach (var lItem in lExtendedItems)
                            {
                                if (lItem.Tag.Equals("childinfo", StringComparison.InvariantCultureIgnoreCase) && lItem.Value.Contains("subscribed", StringComparison.InvariantCultureIgnoreCase))
                                {
                                    lHasSubscribedChildren = true;
                                    break;
                                }
                            }

                            rResponseData = new cResponseDataListMailbox(lMailboxName, lListFlags, lHasSubscribedChildren);
                        }
                        else
                        {
                            lContext.TraceWarning("likely malformed list mailbox response");
                            rResponseData = null;
                        }
                    }

                    return(true);
                }
Example #20
0
 public virtual void ProcessTextCode(eResponseTextContext pTextContext, cResponseData pData, cTrace.cContext pParentContext)
 {
 }
Example #21
0
                public bool Process(cByteList pCode, cByteList pArguments, out cResponseData rResponseData, cTrace.cContext pParentContext)
                {
                    var lContext = pParentContext.NewMethod(nameof(cResponseTextCodeParserSelect), nameof(Process));

                    if (pCode.Equals(kPermanentFlags))
                    {
                        if (pArguments != null)
                        {
                            cBytesCursor lCursor = new cBytesCursor(pArguments);

                            if (lCursor.GetFlags(out var lRawFlags) && lCursor.Position.AtEnd && cPermanentFlags.TryConstruct(lRawFlags, out var lFlags))
                            {
                                rResponseData = new cResponseDataPermanentFlags(lFlags);
                                return(true);
                            }
                        }

                        lContext.TraceWarning("likely malformed permanentflags");

                        rResponseData = null;
                        return(false);
                    }

                    if (pCode.Equals(kUIDNext))
                    {
                        if (pArguments != null)
                        {
                            cBytesCursor lCursor = new cBytesCursor(pArguments);

                            if (lCursor.GetNZNumber(out _, out var lNumber) && lCursor.Position.AtEnd)
                            {
                                rResponseData = new cResponseDataUIDNext(lNumber);
                                return(true);
                            }
                        }

                        lContext.TraceWarning("likely malformed uidnext");

                        rResponseData = null;
                        return(false);
                    }

                    if (pCode.Equals(kUIDValidity))
                    {
                        if (pArguments != null)
                        {
                            cBytesCursor lCursor = new cBytesCursor(pArguments);

                            if (lCursor.GetNZNumber(out _, out var lNumber) && lCursor.Position.AtEnd)
                            {
                                rResponseData = new cResponseDataUIDValidity(lNumber);
                                return(true);
                            }
                        }

                        lContext.TraceWarning("likely malformed uidvalidity");

                        rResponseData = null;
                        return(false);
                    }

                    if (mCapabilities.CondStore)
                    {
                        if (pCode.Equals(kHighestModSeq))
                        {
                            if (pArguments != null)
                            {
                                cBytesCursor lCursor = new cBytesCursor(pArguments);

                                if (lCursor.GetNZNumber(out _, out var lNumber) && lCursor.Position.AtEnd)
                                {
                                    rResponseData = new cResponseDataHighestModSeq(lNumber);
                                    return(true);
                                }
                            }

                            lContext.TraceWarning("likely malformed highestmodseq");

                            rResponseData = null;
                            return(false);
                        }
                    }

                    if (pCode.Equals(kReadWrite) && pArguments == null)
                    {
                        rResponseData = new cResponseDataAccess(false);
                        return(true);
                    }

                    if (pCode.Equals(kReadOnly) && pArguments == null)
                    {
                        rResponseData = new cResponseDataAccess(true);
                        return(true);
                    }

                    rResponseData = null;
                    return(false);
                }
Example #22
0
 public virtual eProcessDataResult ProcessData(cResponseData pData, cTrace.cContext pParentContext) => eProcessDataResult.notprocessed;
Example #23
0
                public override void ProcessTextCode(eResponseTextContext pTextContext, cResponseData pData, cTrace.cContext pParentContext)
                {
                    var lContext = pParentContext.NewMethod(nameof(cCommandHookSelect), nameof(ProcessTextCode), pTextContext, pData);

                    if (mMailboxCache.SelectedMailboxDetails != null)
                    {
                        return;
                    }

                    if (pTextContext == eResponseTextContext.information)
                    {
                        switch (pData)
                        {
                        case cResponseDataPermanentFlags lFlags:

                            mPermanentFlags = lFlags.Flags;
                            return;

                        case cResponseDataUIDNext lUIDNext:

                            mUIDNext = lUIDNext.UIDNext;
                            return;

                        case cResponseDataUIDValidity lUIDValidity:

                            mUIDValidity = lUIDValidity.UIDValidity;
                            return;

                        case cResponseDataHighestModSeq lHighestModSeq:

                            mHighestModSeq = lHighestModSeq.HighestModSeq;
                            return;
                        }
                    }
                    else if (pTextContext == eResponseTextContext.success && pData is cResponseDataAccess lAccess)
                    {
                        mAccessReadOnly = lAccess.ReadOnly;
                    }
                }
Example #24
0
                public bool Process(cBytesCursor pCursor, out cResponseData rResponseData, cTrace.cContext pParentContext)
                {
                    var lContext = pParentContext.NewMethod(nameof(cResponseDataParserESearch), nameof(Process));

                    if (!pCursor.SkipBytes(kESearch))
                    {
                        rResponseData = null; return(false);
                    }

                    if (pCursor.Position.AtEnd)
                    {
                        rResponseData = new cResponseDataESearch(null, false, null);
                        return(true);
                    }

                    bool lSetParsedAs = false; // just in case there is another response that starts with the string "ESEARCH"

                    IList <byte> lTag;

                    if (pCursor.SkipBytes(kSpaceLParenTAGSpace))
                    {
                        if (!pCursor.GetString(out lTag) || !pCursor.SkipByte(cASCII.RPAREN))
                        {
                            rResponseData = null;
                            return(true);
                        }

                        lSetParsedAs = true;
                    }
                    else
                    {
                        lTag = null;
                    }

                    bool lUID;

                    if (pCursor.SkipBytes(kSpaceUID))
                    {
                        lUID         = true;
                        lSetParsedAs = true;
                    }
                    else
                    {
                        lUID = false;
                    }

                    cSequenceSet lSequenceSet = null;

                    while (true)
                    {
                        if (!pCursor.SkipByte(cASCII.SPACE))
                        {
                            break;
                        }

                        lSetParsedAs = true;

                        if (!pCursor.GetToken(cCharset.Atom, null, null, out cByteList lName) ||
                            !pCursor.SkipByte(cASCII.SPACE) ||
                            !pCursor.ProcessExtendedValue(out var lValue)
                            )
                        {
                            rResponseData = null;
                            return(true);
                        }

                        if (cASCII.Compare(lName, kAll, false) && lValue is cExtendedValue.cSequenceSetEV lSequenceSetEV)
                        {
                            lSequenceSet = lSequenceSetEV.SequenceSet;
                        }
                    }

                    if (!pCursor.Position.AtEnd)
                    {
                        rResponseData = null;
                        return(lSetParsedAs);
                    }

                    rResponseData = new cResponseDataESearch(lTag, lUID, lSequenceSet);
                    return(true);
                }