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); }
/// <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); }
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)); }
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); }
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); }
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 }
// (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); } }
public cResponseTextProcessor(cCallbackSynchroniser pSynchroniser) { mSynchroniser = pSynchroniser ?? throw new ArgumentNullException(nameof(pSynchroniser)); }
public cSendBuffer(cCallbackSynchroniser pSynchroniser, cConnection pConnection, CancellationToken pCancellationToken) { mSynchroniser = pSynchroniser ?? throw new ArgumentNullException(nameof(pSynchroniser)); mConnection = pConnection ?? throw new ArgumentNullException(nameof(pConnection)); mCancellationToken = pCancellationToken; }
public cNamespaceDataProcessor(cCallbackSynchroniser pSynchroniser, bool pUTF8Enabled) { mSynchroniser = pSynchroniser ?? throw new ArgumentNullException(nameof(pSynchroniser)); mUTF8Enabled = pUTF8Enabled; }
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}'"); } } }
public cProgress(cCallbackSynchroniser pSynchroniser, Action <int> pIncrement) { mSynchroniser = pSynchroniser ?? throw new ArgumentNullException(nameof(pSynchroniser)); mIncrement = pIncrement; }
public cProgress() { mSynchroniser = null; mIncrement = null; }
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)); }