diff options
Diffstat (limited to 'src/com/android/calendarcommon2/Duration.java')
-rw-r--r-- | src/com/android/calendarcommon2/Duration.java | 150 |
1 files changed, 150 insertions, 0 deletions
diff --git a/src/com/android/calendarcommon2/Duration.java b/src/com/android/calendarcommon2/Duration.java new file mode 100644 index 0000000..dad7f74 --- /dev/null +++ b/src/com/android/calendarcommon2/Duration.java @@ -0,0 +1,150 @@ +/* +** Copyright 2006, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + +package com.android.calendarcommon2; + +import java.util.Calendar; + +/** + * According to RFC2445, durations are like this: + * WEEKS + * | DAYS [ HOURS [ MINUTES [ SECONDS ] ] ] + * | HOURS [ MINUTES [ SECONDS ] ] + * it doesn't specifically, say, but this sort of implies that you can't have + * 70 seconds. + */ +public class Duration +{ + public int sign; // 1 or -1 + public int weeks; + public int days; + public int hours; + public int minutes; + public int seconds; + + public Duration() + { + sign = 1; + } + + /** + * Parse according to RFC2445 ss4.3.6. (It's actually a little loose with + * its parsing, for better or for worse) + */ + public void parse(String str) throws DateException + { + sign = 1; + weeks = 0; + days = 0; + hours = 0; + minutes = 0; + seconds = 0; + + int len = str.length(); + int index = 0; + char c; + + if (len < 1) { + return ; + } + + c = str.charAt(0); + if (c == '-') { + sign = -1; + index++; + } + else if (c == '+') { + index++; + } + + if (len < index) { + return ; + } + + c = str.charAt(index); + if (c != 'P') { + throw new DateException ( + "Duration.parse(str='" + str + "') expected 'P' at index=" + + index); + } + index++; + c = str.charAt(index); + if (c == 'T') { + index++; + } + + int n = 0; + for (; index < len; index++) { + c = str.charAt(index); + if (c >= '0' && c <= '9') { + n *= 10; + n += ((int)(c-'0')); + } + else if (c == 'W') { + weeks = n; + n = 0; + } + else if (c == 'H') { + hours = n; + n = 0; + } + else if (c == 'M') { + minutes = n; + n = 0; + } + else if (c == 'S') { + seconds = n; + n = 0; + } + else if (c == 'D') { + days = n; + n = 0; + } + else if (c == 'T') { + } + else { + throw new DateException ( + "Duration.parse(str='" + str + "') unexpected char '" + + c + "' at index=" + index); + } + } + } + + /** + * Add this to the calendar provided, in place, in the calendar. + */ + public void addTo(Calendar cal) + { + cal.add(Calendar.DAY_OF_MONTH, sign*weeks*7); + cal.add(Calendar.DAY_OF_MONTH, sign*days); + cal.add(Calendar.HOUR, sign*hours); + cal.add(Calendar.MINUTE, sign*minutes); + cal.add(Calendar.SECOND, sign*seconds); + } + + public long addTo(long dt) { + return dt + getMillis(); + } + + public long getMillis() { + long factor = 1000 * sign; + return factor * ((7*24*60*60*weeks) + + (24*60*60*days) + + (60*60*hours) + + (60*minutes) + + seconds); + } +} |