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