1/* Copyright 2010, The Android Open Source Project
2 **
3 ** Licensed under the Apache License, Version 2.0 (the "License");
4 ** you may not use this file except in compliance with the License.
5 ** You may obtain a copy of the License at
6 **
7 **     http://www.apache.org/licenses/LICENSE-2.0
8 **
9 ** Unless required by applicable law or agreed to in writing, software
10 ** distributed under the License is distributed on an "AS IS" BASIS,
11 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 ** See the License for the specific language governing permissions and
13 ** limitations under the License.
14 */
15
16package com.android.exchange.utility;
17
18import java.text.ParseException;
19import java.util.Calendar;
20
21/**
22 * Note: This class was simply copied from the class in CalendarProvider, since we don't have access
23 * to it from the Email app.  I reformated some lines, but otherwise haven't altered the code.
24 */
25public class Duration {
26    public int sign; // 1 or -1
27    public int weeks;
28    public int days;
29    public int hours;
30    public int minutes;
31    public int seconds;
32
33    public Duration() {
34        sign = 1;
35    }
36
37    /**
38     * Parse according to RFC2445 ss4.3.6.  (It's actually a little loose with
39     * its parsing, for better or for worse)
40     */
41    public void parse(String str) throws ParseException {
42        sign = 1;
43        weeks = 0;
44        days = 0;
45        hours = 0;
46        minutes = 0;
47        seconds = 0;
48
49        int len = str.length();
50        int index = 0;
51        char c;
52
53        if (len < 1) {
54            return;
55        }
56
57        c = str.charAt(0);
58        if (c == '-') {
59            sign = -1;
60            index++;
61        } else if (c == '+') {
62            index++;
63        }
64
65        if (len < index) {
66            return;
67        }
68
69        c = str.charAt(index);
70        if (c != 'P') {
71            throw new ParseException (
72                    "Duration.parse(str='" + str + "') expected 'P' at index="
73                    + index, index);
74        }
75        index++;
76
77        int n = 0;
78        for (; index < len; index++) {
79            c = str.charAt(index);
80            if (c >= '0' && c <= '9') {
81                n *= 10;
82                n += (c - '0');
83            } else if (c == 'W') {
84                weeks = n;
85                n = 0;
86            } else if (c == 'H') {
87                hours = n;
88                n = 0;
89            } else if (c == 'M') {
90                minutes = n;
91                n = 0;
92            } else if (c == 'S') {
93                seconds = n;
94                n = 0;
95            } else if (c == 'D') {
96                days = n;
97                n = 0;
98            } else if (c == 'T') {
99            } else {
100                throw new ParseException (
101                        "Duration.parse(str='" + str + "') unexpected char '"
102                        + c + "' at index=" + index, index);
103            }
104        }
105    }
106
107    /**
108     * Add this to the calendar provided, in place, in the calendar.
109     */
110    public void addTo(Calendar cal) {
111        cal.add(Calendar.DAY_OF_MONTH, sign*weeks*7);
112        cal.add(Calendar.DAY_OF_MONTH, sign*days);
113        cal.add(Calendar.HOUR, sign*hours);
114        cal.add(Calendar.MINUTE, sign*minutes);
115        cal.add(Calendar.SECOND, sign*seconds);
116    }
117
118    public long addTo(long dt) {
119        return dt + getMillis();
120    }
121
122    public long getMillis() {
123        long factor = 1000 * sign;
124        return factor * ((7*24*60*60*weeks) + (24*60*60*days) + (60*60*hours) + (60*minutes) +
125                seconds);
126    }
127}
128