示例#1
0
        public static RecurrenceValue Parse(CalendarReader reader)
        {
            RecurrenceFrequency?freq    = null;
            int?               interval = null;
            List <int>         byMinute = null;
            List <int>         byHour   = null;
            List <WeekDayNum>  byDay    = null;
            List <int>         bySetPos = null;
            List <MonthOfYear> byMonth  = null;

            do
            {
                var param = CalendarPropertyParameter.ReadFrom(reader);
                var name  = param.Name.ToUpperInvariant();
                switch (name)
                {
                case "FREQ":
                    if (freq.HasValue)
                    {
                        throw new Exception("Multiple FREQ rule parts occured");
                    }
                    freq = ParseFrequency(param.Value);
                    break;

                case "INTERVAL":
                    if (interval.HasValue)
                    {
                        throw new Exception("Multiple INTERVAL rule parts occured");
                    }
                    interval = int.Parse(param.Value);
                    break;

                case "BYMINUTE":
                    if (byMinute != null)
                    {
                        throw new Exception("Multiple BYMINUTE rule parts occured");
                    }
                    if (param.Values.Count == 0)
                    {
                        throw new Exception("BYMINUTE values expected");
                    }
                    byMinute = param.Values.Select(int.Parse).ToList();
                    break;

                case "BYHOUR":
                    if (byHour != null)
                    {
                        throw new Exception("Multiple BYHOUR rule parts occured");
                    }
                    if (param.Values.Count == 0)
                    {
                        throw new Exception("BYHOUR values expected");
                    }
                    byHour = param.Values.Select(int.Parse).ToList();
                    break;

                case "BYDAY":
                    if (byDay != null)
                    {
                        throw new Exception("Multiple BYDAY rule parts occured");
                    }
                    if (param.Values.Count == 0)
                    {
                        throw new Exception("BYDAY values expected");
                    }
                    byDay = param.Values.Select(WeekDayNum.Parse).ToList();
                    break;

                case "BYMONTH":
                    if (byMonth != null)
                    {
                        throw new Exception("Multiple BYMONTH rule parts occured");
                    }
                    if (param.Values.Count == 0)
                    {
                        throw new Exception("BYMONTH values expected");
                    }
                    byMonth = param.Values.Select(item => (MonthOfYear)int.Parse(item)).ToList();
                    break;

                case "BYSETPOS":
                    if (bySetPos != null)
                    {
                        throw new Exception("Multiple BYSETPOS rule parts occured");
                    }
                    if (param.Values.Count == 0)
                    {
                        throw new Exception("BYSETPOS values expected");
                    }
                    bySetPos = param.Values.Select(int.Parse).ToList();
                    break;

                default:
                    throw new Exception("Unknown rule part " + name);
                }
            } while (reader.PeekOrRead(';'));

            if (!freq.HasValue)
            {
                throw new Exception("FREQ rule part is required");
            }
            return(new RecurrenceValue {
                Frequency = freq.Value,
                Interval = interval,
                ByMinute = byMinute,
                ByHour = byHour,
                ByDay = byDay,
                ByMonth = byMonth,
                BySetPos = bySetPos
            });
        }