コード例 #1
0
                public cSelectedMailboxCache(cSelectedMailboxCache pOldCache, uint pUIDValidity, cTrace.cContext pParentContext)
                {
                    var lContext = pParentContext.NewObject(nameof(cSelectedMailboxCache), pOldCache, pUIDValidity);

                    mSynchroniser     = pOldCache.mSynchroniser;
                    mMailboxCacheItem = pOldCache.mMailboxCacheItem;
                    mUIDValidity      = pUIDValidity;
                    mNoModSeq         = pOldCache.mNoModSeq;

                    int lMessageCount = pOldCache.mItems.Count;

                    mItems = new List <cItem>(lMessageCount);
                    for (int i = 0; i < lMessageCount; i++)
                    {
                        mItems.Add(new cItem(this, mCacheSequence++));
                    }

                    mRecentCount = pOldCache.mRecentCount;

                    mUIDNext             = 0;
                    mUIDNextMessageCount = 0;
                    mUIDNextUnknownCount = lMessageCount;

                    mUnseenCount        = 0;
                    mUnseenUnknownCount = lMessageCount;

                    mHighestModSeq = 0;

                    ZSetMailboxStatus(lContext);
                }
コード例 #2
0
 /// <summary>
 /// Initialises a new instance.
 /// </summary>
 /// <param name="pInstanceName">The instance name to use for the instance's <see cref="cTrace"/> root-context.</param>
 public cIMAPClient(string pInstanceName = TraceSourceName)
 {
     mInstanceName = pInstanceName;
     mRootContext  = mTrace.NewRoot(pInstanceName);
     mRootContext.TraceInformation("cIMAPClient by bacome version {0}, release date {1}", Version, ReleaseDate);
     mSynchroniser        = new cCallbackSynchroniser(this, mRootContext);
     mCancellationManager = new cCancellationManager(mSynchroniser.InvokeCancellableCountChanged);
 }
コード例 #3
0
 public cMailboxCache(cCallbackSynchroniser pSynchroniser, fMailboxCacheDataItems pMailboxCacheDataItems, cCommandPartFactory pCommandPartFactory, cCapabilities pCapabilities, Action <eConnectionState, cTrace.cContext> pSetState)
 {
     mSynchroniser          = pSynchroniser ?? throw new ArgumentNullException(nameof(pSynchroniser));
     mMailboxCacheDataItems = pMailboxCacheDataItems;
     mCommandPartFactory    = pCommandPartFactory ?? throw new ArgumentNullException(nameof(pCommandPartFactory));
     mCapabilities          = pCapabilities ?? throw new ArgumentNullException(nameof(pCapabilities));
     mSetState = pSetState ?? throw new ArgumentNullException(nameof(pSetState));
 }
コード例 #4
0
                public cSelectedMailbox(cCallbackSynchroniser pSynchroniser, cMailboxCacheItem pMailboxCacheItem, bool pSelectedForUpdate, bool pAccessReadOnly, int pExists, int pRecent, uint pUIDNext, uint pUIDValidity, uint pHighestModSeq, cTrace.cContext pParentContext)
                {
                    var lContext = pParentContext.NewObject(nameof(cSelectedMailbox), pMailboxCacheItem, pSelectedForUpdate, pAccessReadOnly, pExists, pRecent, pUIDNext, pUIDValidity, pHighestModSeq);

                    mSynchroniser      = pSynchroniser ?? throw new ArgumentNullException(nameof(pSynchroniser));
                    mMailboxCacheItem  = pMailboxCacheItem ?? throw new ArgumentNullException(nameof(pMailboxCacheItem));
                    mSelectedForUpdate = pSelectedForUpdate;
                    mAccessReadOnly    = pAccessReadOnly;
                    mCache             = new cSelectedMailboxCache(pSynchroniser, pMailboxCacheItem, pUIDValidity, pExists, pRecent, pUIDNext, pHighestModSeq, lContext);
                }
コード例 #5
0
                public cSelectedMailboxCache(cCallbackSynchroniser pSynchroniser, cMailboxCacheItem pMailboxCacheItem, uint pUIDValidity, int pMessageCount, int pRecentCount, uint pUIDNext, uint pHighestModSeq, cTrace.cContext pParentContext)
                {
                    var lContext = pParentContext.NewObject(nameof(cSelectedMailboxCache), pMailboxCacheItem, pUIDValidity, pMessageCount, pRecentCount, pUIDNext, pHighestModSeq);

                    mSynchroniser     = pSynchroniser ?? throw new ArgumentNullException(nameof(pSynchroniser));
                    mMailboxCacheItem = pMailboxCacheItem ?? throw new ArgumentNullException(nameof(pMailboxCacheItem));
                    mUIDValidity      = pUIDValidity;
                    mNoModSeq         = pHighestModSeq == 0;

                    mItems = new List <cItem>(pMessageCount);
                    for (int i = 0; i < pMessageCount; i++)
                    {
                        mItems.Add(new cItem(this, mCacheSequence++));
                    }

                    mRecentCount = pRecentCount;

                    mUIDNext = pUIDNext;

                    if (mUIDNext == 0)
                    {
                        mUIDNextMessageCount = 0;
                        mUIDNextUnknownCount = pMessageCount;
                    }
                    else
                    {
                        mUIDNextMessageCount = pMessageCount;
                        mUIDNextUnknownCount = 0;
                    }

                    mUnseenCount        = 0;
                    mUnseenUnknownCount = pMessageCount;

                    mHighestModSeq = pHighestModSeq;

                    ZSetMailboxStatus(lContext);
                }
コード例 #6
0
                public cCommandPipeline(cCallbackSynchroniser pSynchroniser, Action <cTrace.cContext> pDisconnected, cBatchSizerConfiguration pNetworkWriteConfiguration, cIdleConfiguration pIdleConfiguration, cTrace.cContext pParentContext)
                {
                    var lContext = pParentContext.NewObject(nameof(cCommandPipeline), pIdleConfiguration);

                    mSynchroniser = pSynchroniser ?? throw new ArgumentNullException(nameof(pSynchroniser));
                    mDisconnected = pDisconnected ?? throw new ArgumentNullException(nameof(pDisconnected));
                    if (pNetworkWriteConfiguration == null)
                    {
                        throw new ArgumentNullException(nameof(pNetworkWriteConfiguration));
                    }
                    mConnection        = new cConnection(pNetworkWriteConfiguration);
                    mIdleConfiguration = pIdleConfiguration;

                    mResponseTextProcessor = new cResponseTextProcessor(pSynchroniser);

                    // these depend on the cancellationtokensource being constructed
                    mBackgroundReleaser = new cReleaser("commandpipeline_background", mBackgroundCancellationTokenSource.Token);
                    mBackgroundAwaiter  = new cAwaiter(mBackgroundCancellationTokenSource.Token);

                    mBackgroundSendBuffer = new cSendBuffer(pSynchroniser, mConnection, mBackgroundCancellationTokenSource.Token);

                    // plumbing
                    mIdleBlock.Released += mBackgroundReleaser.Release; // when the idle block is removed, kick the background process
                }
コード例 #7
0
ファイル: base.cs プロジェクト: bacome/imapclient
            // (note for when adding more: they need to be disposed)

            public cSession(cCallbackSynchroniser pSynchroniser, fCapabilities pIgnoreCapabilities, fMailboxCacheDataItems pMailboxCacheDataItems, cBatchSizerConfiguration pNetworkWriteConfiguration, cIdleConfiguration pIdleConfiguration, cBatchSizerConfiguration pFetchCacheItemsConfiguration, cBatchSizerConfiguration pFetchBodyReadConfiguration, Encoding pEncoding, cTrace.cContext pParentContext)
            {
                var lContext = pParentContext.NewObject(nameof(cSession), pIgnoreCapabilities, pMailboxCacheDataItems, pNetworkWriteConfiguration, pIdleConfiguration, pFetchCacheItemsConfiguration, pFetchBodyReadConfiguration);

                mSynchroniser          = pSynchroniser ?? throw new ArgumentNullException(nameof(pSynchroniser));
                mIgnoreCapabilities    = pIgnoreCapabilities;
                mMailboxCacheDataItems = pMailboxCacheDataItems;

                mPipeline = new cCommandPipeline(pSynchroniser, ZDisconnected, pNetworkWriteConfiguration, pIdleConfiguration, lContext);

                mFetchCacheItemsSizer = new cBatchSizer(pFetchCacheItemsConfiguration);
                mFetchBodyReadSizer   = new cBatchSizer(pFetchBodyReadConfiguration);

                mCommandPartFactory = new cCommandPartFactory(false, null);

                if (pEncoding == null)
                {
                    mEncodingPartFactory = mCommandPartFactory;
                }
                else
                {
                    mEncodingPartFactory = new cCommandPartFactory(false, pEncoding);
                }
            }
コード例 #8
0
 public cResponseTextProcessor(cCallbackSynchroniser pSynchroniser)
 {
     mSynchroniser = pSynchroniser ?? throw new ArgumentNullException(nameof(pSynchroniser));
 }
コード例 #9
0
 public cSendBuffer(cCallbackSynchroniser pSynchroniser, cConnection pConnection, CancellationToken pCancellationToken)
 {
     mSynchroniser      = pSynchroniser ?? throw new ArgumentNullException(nameof(pSynchroniser));
     mConnection        = pConnection ?? throw new ArgumentNullException(nameof(pConnection));
     mCancellationToken = pCancellationToken;
 }
コード例 #10
0
 public cNamespaceDataProcessor(cCallbackSynchroniser pSynchroniser, bool pUTF8Enabled)
 {
     mSynchroniser = pSynchroniser ?? throw new ArgumentNullException(nameof(pSynchroniser));
     mUTF8Enabled  = pUTF8Enabled;
 }
コード例 #11
0
                public static void _Tests(cTrace.cContext pParentContext)
                {
                    var lContext = pParentContext.NewMethod(nameof(cNamespaceDataProcessor), nameof(_Tests));

                    using (cCallbackSynchroniser lES = new cCallbackSynchroniser(new object(), lContext))
                    {
                        cNamespaceDataProcessor lNRDPASCII = new cNamespaceDataProcessor(lES, false);
                        cNamespaceDataProcessor lNRDPUTF8  = new cNamespaceDataProcessor(lES, true);

                        LTest(lNRDPASCII, "NAMESPACE ((\"\" \"/\")) NIL NIL");
                        if (lNRDPASCII.NamespaceNames.Personal[0].Prefix.Length != 0 || lNRDPASCII.NamespaceNames.Personal[0].Delimiter.Value != '/')
                        {
                            throw new cTestsException("rfc 2342 5.1 failed");
                        }

                        LTest(lNRDPASCII, "NAMESPACE NIL NIL ((\"\" \".\"))");
                        if (lNRDPASCII.NamespaceNames.Shared[0].Prefix.Length != 0 || lNRDPASCII.NamespaceNames.Shared[0].Delimiter.Value != '.')
                        {
                            throw new cTestsException("rfc 2342 5.2 failed");
                        }

                        LTest(lNRDPASCII, "NAMESPACE ((\"\" \"/\")) NIL ((\"Public Folders/\" \"/\"))");
                        if (lNRDPASCII.NamespaceNames.Personal[0].Prefix.Length != 0 || lNRDPASCII.NamespaceNames.Personal[0].Delimiter.Value != '/')
                        {
                            throw new cTestsException("rfc 2342 5.3.1 failed");
                        }
                        if (lNRDPASCII.NamespaceNames.Shared[0].Prefix != "Public Folders/" || lNRDPASCII.NamespaceNames.Shared[0].Delimiter.Value != '/')
                        {
                            throw new cTestsException("rfc 2342 5.3.2 failed");
                        }

                        LTest(lNRDPASCII, "NAMESPACE ((\"\" \"/\")) ((\"~\" \"/\")) ((\"#shared/\" \"/\")(\"#public/\" \"/\")(\"#ftp/\" \"/\")(\"#news.\" \".\"))");
                        if (lNRDPASCII.NamespaceNames.Personal[0].Prefix.Length != 0 || lNRDPASCII.NamespaceNames.Personal[0].Delimiter.Value != '/')
                        {
                            throw new cTestsException("rfc 2342 5.4.1 failed");
                        }
                        if (lNRDPASCII.NamespaceNames.OtherUsers[0].Prefix != "~" || lNRDPASCII.NamespaceNames.OtherUsers[0].Delimiter.Value != '/')
                        {
                            throw new cTestsException("rfc 2342 5.4.2 failed");
                        }
                        if (lNRDPASCII.NamespaceNames.Shared[0].Prefix != "#shared/" || lNRDPASCII.NamespaceNames.Shared[0].Delimiter.Value != '/')
                        {
                            throw new cTestsException("rfc 2342 5.4.3 failed");
                        }
                        if (lNRDPASCII.NamespaceNames.Shared[1].Prefix != "#public/" || lNRDPASCII.NamespaceNames.Shared[1].Delimiter.Value != '/')
                        {
                            throw new cTestsException("rfc 2342 5.4.4 failed");
                        }
                        if (lNRDPASCII.NamespaceNames.Shared[2].Prefix != "#ftp/" || lNRDPASCII.NamespaceNames.Shared[2].Delimiter.Value != '/')
                        {
                            throw new cTestsException("rfc 2342 5.4.5 failed");
                        }
                        if (lNRDPASCII.NamespaceNames.Shared[3].Prefix != "#news." || lNRDPASCII.NamespaceNames.Shared[3].Delimiter.Value != '.')
                        {
                            throw new cTestsException("rfc 2342 5.4.6 failed");
                        }

                        LTest(lNRDPASCII, "NAMESPACE ((\"INBOX.\" \".\")) NIL NIL");
                        if (lNRDPASCII.NamespaceNames.Personal[0].Prefix != "INBOX." || lNRDPASCII.NamespaceNames.Personal[0].Delimiter.Value != '.')
                        {
                            throw new cTestsException("rfc 2342 5.5.1 failed");
                        }

                        LTest(lNRDPASCII, "NAMESPACE ((\"\" \"/\")(\"#mh/\" \"/\" \"X-PARAM\" (\"FLAG1\" \"FLAG2\"))) nil nil");
                        if (lNRDPASCII.NamespaceNames.Personal[0].Prefix.Length != 0 || lNRDPASCII.NamespaceNames.Personal[0].Delimiter.Value != '/')
                        {
                            throw new cTestsException("rfc 2342 5.6.1 failed");
                        }
                        if (lNRDPASCII.NamespaceNames.Personal[1].Prefix != "#mh/" || lNRDPASCII.NamespaceNames.Personal[1].Delimiter.Value != '/')
                        {
                            throw new cTestsException("rfc 2342 5.6.2 failed");
                        }

                        LTest(lNRDPASCII, "NAMESPACE ((\"\" \"/\")) ((\"Other Users/\" \"/\")) NIL");
                        if (lNRDPASCII.NamespaceNames.Personal[0].Prefix.Length != 0 || lNRDPASCII.NamespaceNames.Personal[0].Delimiter.Value != '/')
                        {
                            throw new cTestsException("rfc 2342 5.7.1 failed");
                        }
                        if (lNRDPASCII.NamespaceNames.OtherUsers[0].Prefix != "Other Users/" || lNRDPASCII.NamespaceNames.OtherUsers[0].Delimiter.Value != '/')
                        {
                            throw new cTestsException("rfc 2342 5.7.2 failed");
                        }

                        LTest(lNRDPASCII, "NAMESPACE ((\"\" \"/\")) ((\"~\" \"/\")) NIL");
                        if (lNRDPASCII.NamespaceNames.Personal[0].Prefix.Length != 0 || lNRDPASCII.NamespaceNames.Personal[0].Delimiter.Value != '/')
                        {
                            throw new cTestsException("rfc 2342 5.8.1 failed");
                        }
                        if (lNRDPASCII.NamespaceNames.OtherUsers[0].Prefix != "~" || lNRDPASCII.NamespaceNames.OtherUsers[0].Delimiter.Value != '/')
                        {
                            throw new cTestsException("rfc 2342 5.8.2 failed");
                        }

                        // utf8
                        //lNamespaces = ZTest(new cBytes(Array.AsReadOnly(new byte[] { cASCII.n, cASCII.a, cASCII.m, cASCII.e, cASCII.s, cASCII.p, cASCII.a, cASCII.c, cASCII.e, cASCII.SPACE, cASCII.n, cASCII.i, cASCII.l, cASCII.SPACE, cASCII.n, cASCII.i, cASCII.l, cASCII.SPACE, cASCII.LPAREN, cASCII.LPAREN, cASCII.DQUOTE, cASCII.f, cASCII.r, 226, 130, 172, cASCII.d, cASCII.DQUOTE, cASCII.SPACE, cASCII.n, cASCII.i, cASCII.l, cASCII.RPAREN, cASCII.RPAREN })), true, lContext);
                        LTest(lNRDPUTF8, "namespace nil nil ((\"fr€d\" nil))");
                        if (lNRDPUTF8.NamespaceNames.Personal != null)
                        {
                            throw new cTestsException("UTF8 1 failed");
                        }
                        if (lNRDPUTF8.NamespaceNames.OtherUsers != null)
                        {
                            throw new cTestsException("UTF8 2 failed");
                        }
                        if (lNRDPUTF8.NamespaceNames.Shared[0].Prefix != "fr€d" || lNRDPUTF8.NamespaceNames.Shared[0].Delimiter != null)
                        {
                            throw new cTestsException("UTF8 3 failed");
                        }

                        // utf7

                        //string lTest = cIMAPClient.cTools.BytesToString(cModifiedUTF7.Encode("fr€d", lContext));

                        LTest(lNRDPASCII, "namespace nil nil ((\"fr&IKw-d\" nil))");
                        if (lNRDPASCII.NamespaceNames.Personal != null)
                        {
                            throw new cTestsException("UTF7 1 failed");
                        }
                        if (lNRDPASCII.NamespaceNames.OtherUsers != null)
                        {
                            throw new cTestsException("UTF7 2 failed");
                        }
                        if (lNRDPASCII.NamespaceNames.Shared[0].Prefix != "fr€d" || lNRDPASCII.NamespaceNames.Shared[0].Delimiter != null)
                        {
                            throw new cTestsException("UTF7 3 failed");
                        }

                        // check that () is rejected
                        LTestFail(lNRDPASCII, "NAMESPACE ((\"\" \"/\")) ((\"~\" \"/\")) ()");
                    }

                    void LTestFail(cNamespaceDataProcessor pNDP, string pExample)
                    {
                        List <cResponseLine> lLines = new List <cResponseLine>();

                        lLines.Add(new cResponseLine(false, System.Text.Encoding.UTF8.GetBytes(pExample)));
                        cBytesCursor lCursor = new cBytesCursor(new cResponse(lLines));

                        if (pNDP.ProcessData(lCursor, lContext) == eProcessDataResult.processed)
                        {
                            throw new cTestsException($"namespace: processed '{pExample}'");
                        }
                    }

                    void LTest(cNamespaceDataProcessor pNDP, string pExample)
                    {
                        List <cResponseLine> lLines = new List <cResponseLine>();

                        lLines.Add(new cResponseLine(false, System.Text.Encoding.UTF8.GetBytes(pExample)));
                        cBytesCursor lCursor = new cBytesCursor(new cResponse(lLines));

                        if (pNDP.ProcessData(lCursor, lContext) != eProcessDataResult.processed)
                        {
                            throw new cTestsException($"namespace: didn't process '{pExample}'");
                        }
                    }
                }
コード例 #12
0
 public cProgress(cCallbackSynchroniser pSynchroniser, Action <int> pIncrement)
 {
     mSynchroniser = pSynchroniser ?? throw new ArgumentNullException(nameof(pSynchroniser));
     mIncrement    = pIncrement;
 }
コード例 #13
0
 public cProgress()
 {
     mSynchroniser = null;
     mIncrement    = null;
 }
コード例 #14
0
ファイル: mailboxcacheitem.cs プロジェクト: bacome/imapclient
 public cMailboxCacheItem(cCallbackSynchroniser pSynchroniser, cMailboxCache pMailboxCache, string pEncodedMailboxPath)
 {
     mSynchroniser       = pSynchroniser ?? throw new ArgumentNullException(nameof(pSynchroniser));
     mMailboxCache       = pMailboxCache ?? throw new ArgumentNullException(nameof(pMailboxCache));
     mEncodedMailboxPath = pEncodedMailboxPath ?? throw new ArgumentNullException(nameof(pEncodedMailboxPath));
 }