16f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*
26f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ******************************************************************************
36f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Copyright (C) 2003-2013, International Business Machines Corporation
46f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * and others. All Rights Reserved.
56f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ******************************************************************************
66f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
76f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * File PERSNCAL.H
86f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
96f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Modification History:
106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *   Date        Name        Description
126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *   9/23/2003 mehran        posted to icu-design
136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *****************************************************************************
146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifndef PERSNCAL_H
176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define PERSNCAL_H
186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/utypes.h"
206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if !UCONFIG_NO_FORMATTING
226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/calendar.h"
246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_NAMESPACE_BEGIN
266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <code>PersianCalendar</code> is a subclass of <code>Calendar</code>
296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * that implements the Persian calendar.  It is used as the official
306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * calendar in Iran.  This calendar is also known as the "Hijri Shamsi"
316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * calendar, since it starts at the time of Mohammed's emigration (or
326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * "hijra") to Medinah on Thursday, July 15, 622 AD (Julian) and is a
336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * solar calendar system (or "shamsi").
346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>
356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * The Persian calendar is strictly solar, and thus a Persian year has twelve
366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * solar months. A Persian year is about 365 days long, except in leap years
376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * which is 366 days long.
386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>
396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * The six first months of Persian Calendar are 31 days long. The next five
406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * months are 30 days long. The last month is 29 days long in normal years,
416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * and 30 days long in leap years.
426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @see GregorianCalendar
446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @author Mehran Mehr
466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @internal
476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass PersianCalendar : public Calendar {
496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org public:
506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  //-------------------------------------------------------------------------
516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  // Constants...
526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  //-------------------------------------------------------------------------
536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Constants for the months
556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @internal
566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  enum EMonths {
586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Constant for Farvardin, the 1st month of the Persian year.
606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @internal
616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    FARVARDIN = 0,
636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Constant for Ordibehesht, the 2nd month of the Persian year.
666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @internal
676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ORDIBEHESHT = 1,
696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Constant for Khordad, the 3rd month of the Persian year.
726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @internal
736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    KHORDAD = 2,
756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Constant for Tir, the 4th month of the Persian year.
786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @internal
796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    TIR = 3,
816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Constant for Mordad, the 5th month of the Persian year.
846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @internal
856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    MORDAD = 4,
876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Constant for Shahrivar, the 6th month of the Persian year.
906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @internal
916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    SHAHRIVAR = 5,
936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Constant for Mehr, the 7th month of the Persian year.
966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @internal
976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    MEHR = 6,
996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
1016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Constant for Aban, the 8th month of the Persian year.
1026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @internal
1036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
1046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ABAN = 7,
1056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
1076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Constant for Azar, the 9th month of the Persian year.
1086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @internal
1096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
1106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    AZAR = 8,
1116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
1136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Constant for Dei, the 10th month of the Persian year.
1146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @internal
1156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
1166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    DEI = 9,
1176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
1196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Constant for Bahman, the 11th month of the Persian year.
1206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @internal
1216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
1226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    BAHMAN = 10,
1236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
1256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Constant for Esfand, the 12th month of the Persian year.
1266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @internal
1276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
1286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ESFAND = 11,
1296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    PERSIAN_MONTH_MAX
1316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  };
1326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  //-------------------------------------------------------------------------
1366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  // Constructors...
1376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  //-------------------------------------------------------------------------
1386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
1406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Constructs a PersianCalendar based on the current time in the default time zone
1416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * with the given locale.
1426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
1436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param aLocale  The given locale.
1446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param success  Indicates the status of PersianCalendar object construction.
1456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *                 Returns U_ZERO_ERROR if constructed successfully.
1466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @internal
1476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
1486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  PersianCalendar(const Locale& aLocale, UErrorCode &success);
1496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
1516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Copy Constructor
1526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @internal
1536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
1546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  PersianCalendar(const PersianCalendar& other);
1556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
1576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Destructor.
1586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @internal
1596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
1606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  virtual ~PersianCalendar();
1616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  // TODO: copy c'tor, etc
1636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  // clone
1656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  virtual Calendar* clone() const;
1666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org private:
1686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
1696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Determine whether a year is a leap year in the Persian calendar
1706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
1716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  static UBool isLeapYear(int32_t year);
1726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
1746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Return the day # on which the given year starts.  Days are counted
1756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * from the Hijri epoch, origin 0.
1766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
1776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  int32_t yearStart(int32_t year);
1786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
1806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Return the day # on which the given month starts.  Days are counted
1816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * from the Hijri epoch, origin 0.
1826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
1836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param year  The hijri shamsi year
1846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param year  The hijri shamsi month, 0-based
1856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
1866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  int32_t monthStart(int32_t year, int32_t month) const;
1876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  //----------------------------------------------------------------------
1896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  // Calendar framework
1906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  //----------------------------------------------------------------------
1916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org protected:
1926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
1936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @internal
1946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
1956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  virtual int32_t handleGetLimit(UCalendarDateFields field, ELimitType limitType) const;
1966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
1986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Return the length (in days) of the given month.
1996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
2006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param year  The hijri shamsi year
2016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param year  The hijri shamsi month, 0-based
2026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @internal
2036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
2046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  virtual int32_t handleGetMonthLength(int32_t extendedYear, int32_t month) const;
2056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
2076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Return the number of days in the given Persian year
2086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @internal
2096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
2106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  virtual int32_t handleGetYearLength(int32_t extendedYear) const;
2116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  //-------------------------------------------------------------------------
2136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  // Functions for converting from field values to milliseconds....
2146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  //-------------------------------------------------------------------------
2156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  // Return JD of start of given month/year
2176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
2186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @internal
2196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
2206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  virtual int32_t handleComputeMonthStart(int32_t eyear, int32_t month, UBool useMonth) const;
2216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  //-------------------------------------------------------------------------
2236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  // Functions for converting from milliseconds to field values
2246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  //-------------------------------------------------------------------------
2256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
2276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @internal
2286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
2296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  virtual int32_t handleGetExtendedYear();
2306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
2326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Override Calendar to compute several fields specific to the Persian
2336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * calendar system.  These are:
2346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
2356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * <ul><li>ERA
2366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * <li>YEAR
2376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * <li>MONTH
2386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * <li>DAY_OF_MONTH
2396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * <li>DAY_OF_YEAR
2406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * <li>EXTENDED_YEAR</ul>
2416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
2426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * The DAY_OF_WEEK and DOW_LOCAL fields are already set when this
2436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * method is called. The getGregorianXxx() methods return Gregorian
2446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * calendar equivalents for the given Julian day.
2456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @internal
2466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
2476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  virtual void handleComputeFields(int32_t julianDay, UErrorCode &status);
2486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  // UObject stuff
2506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org public:
2516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
2526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return   The class ID for this object. All objects of a given class have the
2536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *           same class ID. Objects of other classes have different class IDs.
2546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @internal
2556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
2566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  virtual UClassID getDynamicClassID(void) const;
2576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
2596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Return the class ID for this class. This is useful only for comparing to a return
2606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * value from getDynamicClassID(). For example:
2616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
2626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *      Base* polymorphic_pointer = createPolymorphicObject();
2636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *      if (polymorphic_pointer->getDynamicClassID() ==
2646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *          Derived::getStaticClassID()) ...
2656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
2666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return   The class ID for all objects of this class.
2676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @internal
2686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
2696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  U_I18N_API static UClassID U_EXPORT2 getStaticClassID(void);
2706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
2726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * return the calendar type, "persian".
2736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
2746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return calendar type
2756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @internal
2766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
2776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  virtual const char * getType() const;
2786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org private:
2806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  PersianCalendar(); // default constructor not implemented
2816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org protected:
2836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
2856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * (Overrides Calendar) Return true if the current date for this Calendar is in
2866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Daylight Savings Time. Recognizes DST_OFFSET, if it is set.
2876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
2886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param status Fill-in parameter which receives the status of this operation.
2896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return   True if the current date for this Calendar is in Daylight Savings Time,
2906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *           false, otherwise.
2916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @internal
2926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
2936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  virtual UBool inDaylightTime(UErrorCode& status) const;
2946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
2966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Returns TRUE because the Persian Calendar does have a default century
2976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @internal
2986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
2996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  virtual UBool haveDefaultCentury() const;
3006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
3026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Returns the date of the start of the default century
3036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return start of century - in milliseconds since epoch, 1970
3046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @internal
3056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
3066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  virtual UDate defaultCenturyStart() const;
3076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
3096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Returns the year in which the default century begins
3106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @internal
3116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
3126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  virtual int32_t defaultCenturyStartYear() const;
3136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org};
3146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_NAMESPACE_END
3166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
3186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
3196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
322