| /* //device/content/providers/pim/Duration.java
|
| **
|
| ** 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.providers.calendar;
|
|
|
| import android.pim.DateException;
|
|
|
| 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++;
|
|
|
| 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);
|
| }
|
| }
|