示例#1
0
 public sCommandDetails(cCommandTag pTag, ReadOnlyCollection <cCommandPart> pParts, cCommandDisposables pDisposables, uint?pUIDValidity, cCommandHook pHook)
 {
     Tag         = pTag ?? throw new ArgumentNullException(nameof(pTag));
     Parts       = pParts ?? throw new ArgumentNullException(nameof(pParts));
     Disposables = pDisposables ?? throw new ArgumentNullException(nameof(pDisposables));
     UIDValidity = pUIDValidity;
     Hook        = pHook ?? throw new ArgumentNullException(nameof(pHook));
 }
示例#2
0
 public cCommand(sCommandDetails pCommandDetails)
 {
     Tag                 = pCommandDetails.Tag ?? throw new ArgumentOutOfRangeException(nameof(pCommandDetails));
     mParts              = pCommandDetails.Parts ?? throw new ArgumentOutOfRangeException(nameof(pCommandDetails));
     mDisposables        = pCommandDetails.Disposables ?? throw new ArgumentOutOfRangeException(nameof(pCommandDetails));
     mSASLAuthentication = mDisposables.SASLAuthentication;
     UIDValidity         = pCommandDetails.UIDValidity;
     Hook                = pCommandDetails.Hook ?? throw new ArgumentOutOfRangeException(nameof(pCommandDetails));
 }
示例#3
0
文件: idle.cs 项目: bacome/imapclient
                private async Task ZIdleIdleAsync(int pIdleRestartInterval, cTrace.cContext pParentContext)
                {
                    var lContext = pParentContext.NewMethod(nameof(cCommandPipeline), nameof(ZIdleIdleAsync), pIdleRestartInterval);

                    using (cCountdownTimer lCountdownTimer = new cCountdownTimer(pIdleRestartInterval, lContext))
                    {
                        while (true)
                        {
                            cCommandTag lTag = new cCommandTag();

                            mIdleBuffer.Clear();

                            mIdleBuffer.AddRange(lTag);
                            mIdleBuffer.Add(cASCII.SPACE);
                            mIdleBuffer.AddRange(kIdleIdle);
                            mIdleBuffer.Add(cASCII.CR);
                            mIdleBuffer.Add(cASCII.LF);

                            lContext.TraceVerbose("sending {0}", mIdleBuffer);
                            mSynchroniser.InvokeNetworkSend(mIdleBuffer, lContext);
                            await mConnection.WriteAsync(mIdleBuffer.ToArray(), mBackgroundCancellationTokenSource.Token, lContext).ConfigureAwait(false);

                            if (await ZIdleProcessResponsesAsync(false, null, lTag, true, lContext).ConfigureAwait(false) != eIdleProcessResponsesTerminatedBy.continuerequest)
                            {
                                throw new cUnexpectedServerActionException(fCapabilities.idle, "idle completed before done sent", lContext);
                            }

                            var lProcessResponsesTerminatedBy = await ZIdleProcessResponsesAsync(true, lCountdownTimer.GetAwaitCountdownTask(), lTag, false, lContext).ConfigureAwait(false);

                            if (lProcessResponsesTerminatedBy == eIdleProcessResponsesTerminatedBy.commandcompletion)
                            {
                                throw new cUnexpectedServerActionException(fCapabilities.idle, "idle completed before done sent", lContext);
                            }

                            mIdleBuffer.Clear();

                            mIdleBuffer.AddRange(kIdleDone);
                            mIdleBuffer.Add(cASCII.CR);
                            mIdleBuffer.Add(cASCII.LF);

                            lContext.TraceVerbose("sending {0}", mIdleBuffer);
                            mSynchroniser.InvokeNetworkSend(mIdleBuffer, lContext);
                            await mConnection.WriteAsync(mIdleBuffer.ToArray(), mBackgroundCancellationTokenSource.Token, lContext).ConfigureAwait(false);

                            await ZIdleProcessResponsesAsync(false, null, lTag, false, lContext).ConfigureAwait(false);

                            if (lProcessResponsesTerminatedBy == eIdleProcessResponsesTerminatedBy.backgroundreleaser)
                            {
                                return;
                            }

                            lCountdownTimer.Restart(lContext);
                        }
                    }
                }
示例#4
0
文件: idle.cs 项目: bacome/imapclient
                private async Task ZIdlePollCommandAsync(cBytes pCommand, cTrace.cContext pParentContext)
                {
                    var lContext = pParentContext.NewMethod(nameof(cCommandPipeline), nameof(ZIdlePollCommandAsync), pCommand);

                    cCommandTag lTag = new cCommandTag();

                    mIdleBuffer.Clear();

                    mIdleBuffer.AddRange(lTag);
                    mIdleBuffer.Add(cASCII.SPACE);
                    mIdleBuffer.AddRange(pCommand);
                    mIdleBuffer.Add(cASCII.CR);
                    mIdleBuffer.Add(cASCII.LF);

                    lContext.TraceVerbose("sending {0}", mIdleBuffer);
                    mSynchroniser.InvokeNetworkSend(mIdleBuffer, lContext);
                    await mConnection.WriteAsync(mIdleBuffer.ToArray(), mBackgroundCancellationTokenSource.Token, lContext).ConfigureAwait(false);

                    await ZIdleProcessResponsesAsync(false, null, lTag, false, lContext).ConfigureAwait(false);
                }
示例#5
0
                    public void AddTag(cCommandTag pTag)
                    {
                        if (pTag == null)
                        {
                            throw new ArgumentNullException(nameof(pTag));
                        }

                        if (mTracing)
                        {
                            if (mCurrentTraceBuffer != null)
                            {
                                mTraceBuffers.Add(new cBytes(mCurrentTraceBuffer));
                            }
                            mCurrentTraceBuffer = new List <byte>(pTag);
                            mCurrentTraceBuffer.Add(cASCII.SPACE);

                            mLastByteWasSecret = false;
                        }

                        mSendBuffer.AddRange(pTag);
                        mSendBuffer.Add(cASCII.SPACE);
                    }
示例#6
0
文件: idle.cs 项目: bacome/imapclient
                private async Task <eIdleProcessResponsesTerminatedBy> ZIdleProcessResponsesAsync(bool pMonitorBackgroundReleaser, Task pCountdownTask, cCommandTag pTag, bool pExpectContinueRequest, cTrace.cContext pParentContext)
                {
                    var lContext = pParentContext.NewMethod(nameof(cCommandPipeline), nameof(ZIdleProcessResponsesAsync), pMonitorBackgroundReleaser, pTag, pExpectContinueRequest);

                    Task lBackgroundReleaserTask;

                    if (pMonitorBackgroundReleaser)
                    {
                        lBackgroundReleaserTask = mBackgroundReleaser.GetAwaitReleaseTask(lContext);
                    }
                    else
                    {
                        lBackgroundReleaserTask = null;
                    }

                    while (true)
                    {
                        Task lBuildResponseTask = mConnection.GetBuildResponseTask(lContext);

                        Task lTask = await mBackgroundAwaiter.AwaitAny(lBuildResponseTask, lBackgroundReleaserTask, pCountdownTask).ConfigureAwait(false);

                        if (ReferenceEquals(lTask, lBackgroundReleaserTask))
                        {
                            return(eIdleProcessResponsesTerminatedBy.backgroundreleaser);
                        }
                        if (ReferenceEquals(lTask, pCountdownTask))
                        {
                            return(eIdleProcessResponsesTerminatedBy.countdowntask);
                        }

                        var lResponse = mConnection.GetResponse(lContext);
                        mSynchroniser.InvokeNetworkReceive(lResponse, lContext);
                        var lCursor = new cBytesCursor(lResponse);

                        if (lCursor.SkipBytes(kPlusSpace))
                        {
                            if (!pExpectContinueRequest)
                            {
                                throw new cUnexpectedServerActionException(fCapabilities.idle, "unexpected continuation request", lContext);
                            }
                            mResponseTextProcessor.Process(eResponseTextContext.continuerequest, lCursor, null, lContext);
                            return(eIdleProcessResponsesTerminatedBy.continuerequest);
                        }

                        if (ZProcessDataResponse(lCursor, lContext))
                        {
                            continue;
                        }

                        if (pTag != null && ZProcessCommandCompletionResponse(lCursor, pTag, false, null, lContext) != null)
                        {
                            return(eIdleProcessResponsesTerminatedBy.commandcompletion);
                        }

                        lContext.TraceError("unrecognised response: {0}", lResponse);
                    }
                }
                private readonly bool mSort; // if the results are coming sorted this should be set to true

                public cCommandHookSearchExtended(cCommandTag pCommandTag, cSelectedMailbox pSelectedMailbox, bool pSort) : base(pCommandTag, pSelectedMailbox)
                {
                    mSort = pSort;
                }
 public cCommandHookBaseSearchExtended(cCommandTag pCommandTag, cSelectedMailbox pSelectedMailbox)
 {
     mCommandTag      = pCommandTag ?? throw new ArgumentNullException(nameof(pCommandTag));
     mSelectedMailbox = pSelectedMailbox ?? throw new ArgumentNullException(nameof(pSelectedMailbox));
 }
 public cSetUnseenCountExtendedCommandHook(cCommandTag pCommandTag, cSelectedMailbox pSelectedMailbox) : base(pCommandTag, pSelectedMailbox)
 {
 }