1/*
2 * Copyright (C) 2011 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.calendar;
18
19import com.android.calendarcommon.DateException;
20import java.util.Calendar;
21
22/**
23 *
24 * Dup of packages/providers/CalendarProvider/src/com/android/providers/calendar/Duration.java
25 *
26 * According to RFC2445, durations are like this:
27 *       WEEKS
28 *     | DAYS [ HOURS [ MINUTES [ SECONDS ] ] ]
29 *     | HOURS [ MINUTES [ SECONDS ] ]
30 * it doesn't specifically, say, but this sort of implies that you can't have
31 * 70 seconds.
32 */
33public class Duration
34{
35    public int sign; // 1 or -1
36    public int weeks;
37    public int days;
38    public int hours;
39    public int minutes;
40    public int seconds;
41
42    public Duration()
43    {
44        sign = 1;
45    }
46
47    /**
48     * Parse according to RFC2445 ss4.3.6.  (It's actually a little loose with
49     * its parsing, for better or for worse)
50     */
51    public void parse(String str) throws DateException
52    {
53        sign = 1;
54        weeks = 0;
55        days = 0;
56        hours = 0;
57        minutes = 0;
58        seconds = 0;
59
60        int len = str.length();
61        int index = 0;
62        char c;
63
64        if (len < 1) {
65            return ;
66        }
67
68        c = str.charAt(0);
69        if (c == '-') {
70            sign = -1;
71            index++;
72        }
73        else if (c == '+') {
74            index++;
75        }
76
77        if (len < index) {
78            return ;
79        }
80
81        c = str.charAt(index);
82        if (c != 'P') {
83            throw new DateException (
84                    "Duration.parse(str='" + str + "') expected 'P' at index="
85                    + index);
86        }
87        index++;
88
89        int n = 0;
90        for (; index < len; index++) {
91            c = str.charAt(index);
92            if (c >= '0' && c <= '9') {
93                n *= 10;
94                n += ((c-'0'));
95            }
96            else if (c == 'W') {
97                weeks = n;
98                n = 0;
99            }
100            else if (c == 'H') {
101                hours = n;
102                n = 0;
103            }
104            else if (c == 'M') {
105                minutes = n;
106                n = 0;
107            }
108            else if (c == 'S') {
109                seconds = n;
110                n = 0;
111            }
112            else if (c == 'D') {
113                days = n;
114                n = 0;
115            }
116            else if (c == 'T') {
117            }
118            else {
119                throw new DateException (
120                        "Duration.parse(str='" + str + "') unexpected char '"
121                        + c + "' at index=" + index);
122            }
123        }
124    }
125
126    /**
127     * Add this to the calendar provided, in place, in the calendar.
128     */
129    public void addTo(Calendar cal)
130    {
131        cal.add(Calendar.DAY_OF_MONTH, sign*weeks*7);
132        cal.add(Calendar.DAY_OF_MONTH, sign*days);
133        cal.add(Calendar.HOUR, sign*hours);
134        cal.add(Calendar.MINUTE, sign*minutes);
135        cal.add(Calendar.SECOND, sign*seconds);
136    }
137
138    public long addTo(long dt) {
139        return dt + getMillis();
140    }
141
142    public long getMillis() {
143        long factor = 1000 * sign;
144        return factor * ((7*24*60*60*weeks)
145                + (24*60*60*days)
146                + (60*60*hours)
147                + (60*minutes)
148                + seconds);
149    }
150}
151