blob: f6e65258ad39fbe94c6377d489c9003f8d073264 [file] [log] [blame]
/* Copyright 2010, 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.exchange.utility;
import java.text.ParseException;
import java.util.Calendar;
/**
* Note: This class was simply copied from the class in CalendarProvider, since we don't have access
* to it from the Email app. I reformated some lines, but otherwise haven't altered the code.
*/
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 ParseException {
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 ParseException (
"Duration.parse(str='" + str + "') expected 'P' at index="
+ index, index);
}
index++;
int n = 0;
for (; index < len; index++) {
c = str.charAt(index);
if (c >= '0' && c <= '9') {
n *= 10;
n += (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 ParseException (
"Duration.parse(str='" + str + "') unexpected char '"
+ c + "' at index=" + 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);
}
}