public bool GetLanguageTag(out string rLanguageTag) { // rfc 5646, 4646, 3066, 1766 // this is a crude implementation ignoring the finer details cByteList lResult = new cByteList(); cByteList lPart; if (!GetToken(cCharset.Alpha, null, null, out lPart, 1, 8)) { rLanguageTag = null; return(false); } lResult.AddRange(lPart); while (true) { var lBookmark = Position; if (!SkipByte(cASCII.HYPEN)) { break; } if (!GetToken(cCharset.AlphaNumeric, null, null, out lPart, 1, 8)) { Position = lBookmark; break; } lResult.Add(cASCII.HYPEN); lResult.AddRange(lPart); } rLanguageTag = cTools.ASCIIBytesToString(lResult); return(true); }
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); } } }
public static cTextCommandPart AsDate(DateTime pDate) { var lBytes = new cByteList(11); lBytes.AddRange(ZIntToBytes(pDate.Day, 0)); lBytes.Add(cASCII.HYPEN); lBytes.AddRange(cASCIIMonth.Name[pDate.Month - 1]); lBytes.Add(cASCII.HYPEN); lBytes.AddRange(ZIntToBytes(pDate.Year, 4)); return(new cTextCommandPart(lBytes)); }
public override IList <byte> GetResponse(IList <byte> pChallenge) { if (mDone) { throw new InvalidOperationException(kInvalidOperationExceptionMessage.AlreadyChallenged); } mDone = true; if (pChallenge != null && pChallenge.Count != 0) { throw new ArgumentOutOfRangeException("non zero length challenge"); } var lBytes = new cByteList(); lBytes.Add(0); lBytes.AddRange(Encoding.UTF8.GetBytes(mAuthenticationId)); lBytes.Add(0); lBytes.AddRange(Encoding.UTF8.GetBytes(mPassword)); return(lBytes); }
public static cTextCommandPart AsDateTime(DateTime pDate) { var lBytes = new cByteList(26); lBytes.Add(cASCII.DQUOTE); lBytes.AddRange(ZIntToBytes(pDate.Day, 2)); lBytes.Add(cASCII.HYPEN); lBytes.AddRange(cASCIIMonth.Name[pDate.Month - 1]); lBytes.Add(cASCII.HYPEN); lBytes.AddRange(ZIntToBytes(pDate.Year, 4)); lBytes.Add(cASCII.SPACE); lBytes.AddRange(ZIntToBytes(pDate.Hour, 2)); lBytes.Add(cASCII.COLON); lBytes.AddRange(ZIntToBytes(pDate.Minute, 2)); lBytes.Add(cASCII.COLON); lBytes.AddRange(ZIntToBytes(pDate.Second, 2)); lBytes.Add(cASCII.SPACE); if (pDate.Kind == DateTimeKind.Utc) { lBytes.AddRange(UTC); } else { var lOffset = TimeZoneInfo.Local.GetUtcOffset(pDate); if (lOffset < TimeSpan.Zero) { lBytes.Add(cASCII.HYPEN); lOffset = -lOffset; } else { lBytes.Add(cASCII.PLUS); } var lOffsetChars = lOffset.ToString("hhmm"); foreach (var lChar in lOffsetChars) { lBytes.Add((byte)lChar); } } return(new cTextCommandPart(lBytes)); }
private bool ZTryAsMailbox(string pString, char?pDelimiter, cCharset pCharset, out cCommandPart rCommandPart, out string rEncodedMailboxPath) { if (pString.Equals(cMailboxName.InboxString, StringComparison.InvariantCultureIgnoreCase)) { rCommandPart = cCommandPart.Inbox; rEncodedMailboxPath = cMailboxName.InboxString; } cTextCommandPart lText; cLiteralCommandPart lLiteral; if (ZTryAsBytesInCharset(pString, pCharset, false, out lText)) { rCommandPart = lText; rEncodedMailboxPath = pString; return(true); } if (UTF8Enabled) { if (ZTryAsQuotedUTF8(pString, false, out lText)) { rCommandPart = lText; rEncodedMailboxPath = pString; return(true); } rCommandPart = null; rEncodedMailboxPath = null; return(false); } cByteList lBytes; if (pDelimiter == null) { lBytes = cModifiedUTF7.Encode(pString); } else { char lDelimiterChar = pDelimiter.Value; byte lDelimiterByte = (byte)lDelimiterChar; string[] lSegments = pString.Split(lDelimiterChar); lBytes = new cByteList(); bool lFirst = true; foreach (string lSegment in lSegments) { if (lFirst) { lFirst = false; } else { lBytes.Add(lDelimiterByte); } lBytes.AddRange(cModifiedUTF7.Encode(lSegment)); } } if (ZTryAsBytesInCharset(lBytes, pCharset, false, false, out lText) || ZTryAsQuotedASCII(lBytes, false, false, out lText)) { rCommandPart = lText; rEncodedMailboxPath = cTools.ASCIIBytesToString(lBytes); return(true); } if (ZTryAsASCIILiteral(lBytes, false, out lLiteral)) { rCommandPart = lLiteral; rEncodedMailboxPath = cTools.ASCIIBytesToString(lBytes); return(true); } rCommandPart = null; rEncodedMailboxPath = null; return(false); }
public cTextCommandPart(cSequenceSet pSequenceSet) : base(false, false) { cByteList lBytes = new cByteList(); cByteList lTemp = new cByteList(); bool lFirst = true; foreach (var lItem in pSequenceSet) { if (lFirst) { lFirst = false; } else { lBytes.Add(cASCII.COMMA); } if (lItem == cSequenceSetItem.Asterisk) { lBytes.Add(cASCII.ASTERISK); continue; } if (lItem is cSequenceSetNumber lNumber) { lTemp = cTools.UIntToBytesReverse(lNumber.Number); lTemp.Reverse(); lBytes.AddRange(lTemp); continue; } if (!(lItem is cSequenceSetRange lRange)) { throw new ArgumentException("invalid form 1", nameof(pSequenceSet)); } if (lRange.From == cSequenceSetItem.Asterisk) { lBytes.Add(cASCII.ASTERISK); continue; } if (!(lRange.From is cSequenceSetNumber lFrom)) { throw new ArgumentException("invalid form 2", nameof(pSequenceSet)); } lTemp = cTools.UIntToBytesReverse(lFrom.Number); lTemp.Reverse(); lBytes.AddRange(lTemp); lBytes.Add(cASCII.COLON); if (lRange.To == cSequenceSetItem.Asterisk) { lBytes.Add(cASCII.ASTERISK); continue; } if (!(lRange.To is cSequenceSetNumber lTo)) { throw new ArgumentException("invalid form 3", nameof(pSequenceSet)); } lTemp = cTools.UIntToBytesReverse(lTo.Number); lTemp.Reverse(); lBytes.AddRange(lTemp); } Bytes = new cBytes(lBytes); }