Esempio n. 1
0
        public static TimeSpan ParseUtcOffset(string s, ComplianceTracker tracker)
        {
            int num    = 0;
            int num2   = 0;
            int num3   = 0;
            int length = s.Length;

            if (length != 5 && length != 7)
            {
                tracker.SetComplianceStatus(ComplianceStatus.InvalidValueFormat, CalendarStrings.InvalidUtcOffsetLength);
                return(TimeSpan.Zero);
            }
            char c = s[0];
            bool flag;

            if (c == '+')
            {
                flag = false;
            }
            else
            {
                if (c != '-')
                {
                    tracker.SetComplianceStatus(ComplianceStatus.InvalidValueFormat, CalendarStrings.ExpectedPlusMinus);
                    return(TimeSpan.Zero);
                }
                flag = true;
            }
            for (int i = 1; i < length; i++)
            {
                c = s[i];
                if ((int)c >= ContentLineParser.Dictionary.Length)
                {
                    tracker.SetComplianceStatus(ComplianceStatus.InvalidValueFormat, CalendarStrings.InvalidCharacter);
                    return(TimeSpan.Zero);
                }
                if ((byte)(ContentLineParser.Tokens.Digit & ContentLineParser.Dictionary[(int)c]) == 0)
                {
                    tracker.SetComplianceStatus(ComplianceStatus.InvalidValueFormat, CalendarStrings.InvalidToken);
                    return(TimeSpan.Zero);
                }
            }
            if (!int.TryParse(s.Substring(1, 2), out num) || num < 0 || num > 23)
            {
                tracker.SetComplianceStatus(ComplianceStatus.InvalidValueFormat, CalendarStrings.InvalidValueFormat);
            }
            if (!int.TryParse(s.Substring(3, 2), out num2) || num2 < 0 || num2 > 59)
            {
                tracker.SetComplianceStatus(ComplianceStatus.InvalidValueFormat, CalendarStrings.InvalidValueFormat);
            }
            if (length == 7 && (!int.TryParse(s.Substring(5, 2), out num3) || num3 < 0 || num3 > 59))
            {
                tracker.SetComplianceStatus(ComplianceStatus.InvalidValueFormat, CalendarStrings.InvalidValueFormat);
            }
            if (num == 0 && num2 == 0 && num3 == 0 && flag)
            {
                tracker.SetComplianceStatus(ComplianceStatus.InvalidValueFormat, CalendarStrings.InvalidValueFormat);
            }
            return(CalendarCommon.CreateTimeSpan(tracker, 0, num, num2, num3, flag));
        }
Esempio n. 2
0
        public static TimeSpan ParseDuration(string s, ComplianceTracker tracker)
        {
            int num    = 0;
            int length = s.Length;

            CalendarCommon.DurationParseStates durationParseStates = CalendarCommon.DurationParseStates.Start;
            StringBuilder stringBuilder = null;
            int           num2          = 0;
            int           num3          = 0;
            int           hours         = 0;
            int           minutes       = 0;
            int           seconds       = 0;
            bool          negative      = false;

            while (num < length && durationParseStates != CalendarCommon.DurationParseStates.End)
            {
                char c = s[num];
                if ((int)c >= ContentLineParser.Dictionary.Length)
                {
                    tracker.SetComplianceStatus(ComplianceStatus.InvalidValueFormat, CalendarStrings.InvalidCharacter);
                    return(TimeSpan.Zero);
                }
                switch (durationParseStates)
                {
                case CalendarCommon.DurationParseStates.Start:
                    if (c == 'P')
                    {
                        durationParseStates = CalendarCommon.DurationParseStates.S1;
                    }
                    else if (c == '+')
                    {
                        durationParseStates = CalendarCommon.DurationParseStates.Sign;
                    }
                    else
                    {
                        if (c != '-')
                        {
                            tracker.SetComplianceStatus(ComplianceStatus.InvalidValueFormat, CalendarStrings.InvalidCharacter);
                            return(TimeSpan.Zero);
                        }
                        negative            = true;
                        durationParseStates = CalendarCommon.DurationParseStates.Sign;
                    }
                    break;

                case CalendarCommon.DurationParseStates.Sign:
                    if (c != 'P')
                    {
                        tracker.SetComplianceStatus(ComplianceStatus.InvalidValueFormat, CalendarStrings.ExpectedP);
                        return(TimeSpan.Zero);
                    }
                    durationParseStates = CalendarCommon.DurationParseStates.S1;
                    break;

                case CalendarCommon.DurationParseStates.S1:
                    if ((byte)(ContentLineParser.Tokens.Digit & ContentLineParser.Dictionary[(int)c]) != 0)
                    {
                        stringBuilder = new StringBuilder();
                        stringBuilder.Append(c);
                        durationParseStates = CalendarCommon.DurationParseStates.S2;
                    }
                    else
                    {
                        if (c != 'T')
                        {
                            tracker.SetComplianceStatus(ComplianceStatus.InvalidValueFormat, CalendarStrings.InvalidCharacter);
                            return(TimeSpan.Zero);
                        }
                        durationParseStates = CalendarCommon.DurationParseStates.T1;
                    }
                    break;

                case CalendarCommon.DurationParseStates.S2:
                    while ((byte)(ContentLineParser.Tokens.Digit & ContentLineParser.Dictionary[(int)c]) != 0)
                    {
                        stringBuilder.Append(c);
                        if (++num == length)
                        {
                            tracker.SetComplianceStatus(ComplianceStatus.InvalidValueFormat, CalendarStrings.ExpectedWOrD);
                            return(TimeSpan.Zero);
                        }
                        c = s[num];
                        if ((int)c >= ContentLineParser.Dictionary.Length)
                        {
                            tracker.SetComplianceStatus(ComplianceStatus.InvalidValueFormat, CalendarStrings.InvalidCharacter);
                            return(TimeSpan.Zero);
                        }
                    }
                    if (c == 'W')
                    {
                        if (!int.TryParse(stringBuilder.ToString(), out num3))
                        {
                            tracker.SetComplianceStatus(ComplianceStatus.InvalidValueFormat, CalendarStrings.InvalidValueFormat);
                        }
                        durationParseStates = CalendarCommon.DurationParseStates.End;
                    }
                    else
                    {
                        if (c != 'D')
                        {
                            tracker.SetComplianceStatus(ComplianceStatus.InvalidValueFormat, CalendarStrings.InvalidCharacter);
                            return(TimeSpan.Zero);
                        }
                        if (!int.TryParse(stringBuilder.ToString(), out num2))
                        {
                            tracker.SetComplianceStatus(ComplianceStatus.InvalidValueFormat, CalendarStrings.InvalidValueFormat);
                        }
                        durationParseStates = CalendarCommon.DurationParseStates.D1;
                    }
                    break;

                case CalendarCommon.DurationParseStates.D1:
                    if (c != 'T')
                    {
                        tracker.SetComplianceStatus(ComplianceStatus.InvalidValueFormat, CalendarStrings.ExpectedT);
                        return(TimeSpan.Zero);
                    }
                    durationParseStates = CalendarCommon.DurationParseStates.T1;
                    break;

                case CalendarCommon.DurationParseStates.T1:
                    if ((byte)(ContentLineParser.Tokens.Digit & ContentLineParser.Dictionary[(int)c]) == 0)
                    {
                        tracker.SetComplianceStatus(ComplianceStatus.InvalidValueFormat, CalendarStrings.InvalidCharacter);
                        return(TimeSpan.Zero);
                    }
                    stringBuilder = new StringBuilder();
                    stringBuilder.Append(c);
                    durationParseStates = CalendarCommon.DurationParseStates.T2;
                    break;

                case CalendarCommon.DurationParseStates.T2:
                    while ((byte)(ContentLineParser.Tokens.Digit & ContentLineParser.Dictionary[(int)c]) != 0)
                    {
                        stringBuilder.Append(c);
                        if (++num == length)
                        {
                            tracker.SetComplianceStatus(ComplianceStatus.InvalidValueFormat, CalendarStrings.ExpectedHMS);
                            return(TimeSpan.Zero);
                        }
                        c = s[num];
                        if ((int)c >= ContentLineParser.Dictionary.Length)
                        {
                            tracker.SetComplianceStatus(ComplianceStatus.InvalidValueFormat, CalendarStrings.InvalidCharacter);
                            return(TimeSpan.Zero);
                        }
                    }
                    if (c == 'H')
                    {
                        if (!int.TryParse(stringBuilder.ToString(), out hours))
                        {
                            tracker.SetComplianceStatus(ComplianceStatus.InvalidValueFormat, CalendarStrings.InvalidValueFormat);
                        }
                        durationParseStates = CalendarCommon.DurationParseStates.H1;
                    }
                    else if (c == 'M')
                    {
                        if (!int.TryParse(stringBuilder.ToString(), out minutes))
                        {
                            tracker.SetComplianceStatus(ComplianceStatus.InvalidValueFormat, CalendarStrings.InvalidValueFormat);
                        }
                        durationParseStates = CalendarCommon.DurationParseStates.M1;
                    }
                    else
                    {
                        if (c != 'S')
                        {
                            tracker.SetComplianceStatus(ComplianceStatus.InvalidValueFormat, CalendarStrings.InvalidCharacter);
                            return(TimeSpan.Zero);
                        }
                        if (!int.TryParse(stringBuilder.ToString(), out seconds))
                        {
                            tracker.SetComplianceStatus(ComplianceStatus.InvalidValueFormat, CalendarStrings.InvalidValueFormat);
                        }
                        durationParseStates = CalendarCommon.DurationParseStates.End;
                    }
                    break;

                case CalendarCommon.DurationParseStates.H1:
                    if ((byte)(ContentLineParser.Tokens.Digit & ContentLineParser.Dictionary[(int)c]) == 0)
                    {
                        tracker.SetComplianceStatus(ComplianceStatus.InvalidValueFormat, CalendarStrings.InvalidCharacter);
                        return(TimeSpan.Zero);
                    }
                    stringBuilder = new StringBuilder();
                    stringBuilder.Append(c);
                    durationParseStates = CalendarCommon.DurationParseStates.H2;
                    break;

                case CalendarCommon.DurationParseStates.H2:
                    while ((byte)(ContentLineParser.Tokens.Digit & ContentLineParser.Dictionary[(int)c]) != 0)
                    {
                        stringBuilder.Append(c);
                        if (++num == length)
                        {
                            tracker.SetComplianceStatus(ComplianceStatus.InvalidValueFormat, CalendarStrings.ExpectedM);
                            return(TimeSpan.Zero);
                        }
                        c = s[num];
                        if ((int)c >= ContentLineParser.Dictionary.Length)
                        {
                            tracker.SetComplianceStatus(ComplianceStatus.InvalidValueFormat, CalendarStrings.InvalidCharacter);
                            return(TimeSpan.Zero);
                        }
                    }
                    if (c != 'M')
                    {
                        tracker.SetComplianceStatus(ComplianceStatus.InvalidValueFormat, CalendarStrings.InvalidCharacter);
                        return(TimeSpan.Zero);
                    }
                    if (!int.TryParse(stringBuilder.ToString(), out minutes))
                    {
                        tracker.SetComplianceStatus(ComplianceStatus.InvalidValueFormat, CalendarStrings.InvalidValueFormat);
                    }
                    durationParseStates = CalendarCommon.DurationParseStates.M1;
                    break;

                case CalendarCommon.DurationParseStates.M1:
                    if ((byte)(ContentLineParser.Tokens.Digit & ContentLineParser.Dictionary[(int)c]) == 0)
                    {
                        tracker.SetComplianceStatus(ComplianceStatus.InvalidValueFormat, CalendarStrings.InvalidCharacter);
                        return(TimeSpan.Zero);
                    }
                    stringBuilder = new StringBuilder();
                    stringBuilder.Append(c);
                    durationParseStates = CalendarCommon.DurationParseStates.M2;
                    break;

                case CalendarCommon.DurationParseStates.M2:
                    while ((byte)(ContentLineParser.Tokens.Digit & ContentLineParser.Dictionary[(int)c]) != 0)
                    {
                        stringBuilder.Append(c);
                        if (++num == length)
                        {
                            tracker.SetComplianceStatus(ComplianceStatus.InvalidValueFormat, CalendarStrings.ExpectedS);
                            return(TimeSpan.Zero);
                        }
                        c = s[num];
                        if ((int)c >= ContentLineParser.Dictionary.Length)
                        {
                            tracker.SetComplianceStatus(ComplianceStatus.InvalidValueFormat, CalendarStrings.InvalidCharacter);
                            return(TimeSpan.Zero);
                        }
                    }
                    if (c != 'S')
                    {
                        tracker.SetComplianceStatus(ComplianceStatus.InvalidValueFormat, CalendarStrings.InvalidCharacter);
                        return(TimeSpan.Zero);
                    }
                    if (!int.TryParse(stringBuilder.ToString(), out seconds))
                    {
                        tracker.SetComplianceStatus(ComplianceStatus.InvalidValueFormat, CalendarStrings.InvalidValueFormat);
                    }
                    durationParseStates = CalendarCommon.DurationParseStates.End;
                    break;

                default:
                    tracker.SetComplianceStatus(ComplianceStatus.InvalidValueFormat, CalendarStrings.InvalidValueFormat);
                    return(TimeSpan.Zero);
                }
                num++;
            }
            if (num != length)
            {
                tracker.SetComplianceStatus(ComplianceStatus.InvalidValueFormat, CalendarStrings.DurationDataNotEndedProperly);
                return(TimeSpan.Zero);
            }
            if (num3 != 0)
            {
                num2 += num3 * 7;
            }
            return(CalendarCommon.CreateTimeSpan(tracker, num2, hours, minutes, seconds, negative));
        }