| /* |
| ** 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.calendarcommon; |
| |
| 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); |
| } |
| } |