Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
                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);
                        }
                    }
                }
Ejemplo n.º 3
0
        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));
        }
Ejemplo n.º 4
0
            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);
            }
Ejemplo n.º 5
0
        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));
        }
Ejemplo n.º 6
0
        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);
        }
Ejemplo n.º 7
0
        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);
        }