tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

vtzone.h (21172B)


      1 // © 2016 and later: Unicode, Inc. and others.
      2 // License & terms of use: http://www.unicode.org/copyright.html
      3 /*
      4 *******************************************************************************
      5 * Copyright (C) 2007-2013, International Business Machines Corporation and
      6 * others. All Rights Reserved.
      7 *******************************************************************************
      8 */
      9 #ifndef VTZONE_H
     10 #define VTZONE_H
     11 
     12 #include "unicode/utypes.h"
     13 
     14 #if U_SHOW_CPLUSPLUS_API
     15 
     16 /**
     17 * \file 
     18 * \brief C++ API: RFC2445 VTIMEZONE support
     19 */
     20 
     21 #if !UCONFIG_NO_FORMATTING
     22 
     23 #include "unicode/basictz.h"
     24 
     25 U_NAMESPACE_BEGIN
     26 
     27 class VTZWriter;
     28 class VTZReader;
     29 class UVector;
     30 
     31 /**
     32 * <code>VTimeZone</code> is a class implementing RFC2445 VTIMEZONE.  You can create a
     33 * <code>VTimeZone</code> instance from a time zone ID supported by <code>TimeZone</code>.
     34 * With the <code>VTimeZone</code> instance created from the ID, you can write out the rule
     35 * in RFC2445 VTIMEZONE format.  Also, you can create a <code>VTimeZone</code> instance
     36 * from RFC2445 VTIMEZONE data stream, which allows you to calculate time
     37 * zone offset by the rules defined by the data. Or, you can create a
     38 * <code>VTimeZone</code> from any other ICU <code>BasicTimeZone</code>.
     39 * <br><br>
     40 * Note: The consumer of this class reading or writing VTIMEZONE data is responsible to
     41 * decode or encode Non-ASCII text.  Methods reading/writing VTIMEZONE data in this class
     42 * do nothing with MIME encoding.
     43 * @stable ICU 3.8
     44 */
     45 class U_I18N_API VTimeZone : public BasicTimeZone {
     46 public:
     47    /**
     48     * Copy constructor.
     49     * @param source    The <code>VTimeZone</code> object to be copied.
     50     * @stable ICU 3.8
     51     */
     52    VTimeZone(const VTimeZone& source);
     53 
     54    /**
     55     * Destructor.
     56     * @stable ICU 3.8
     57     */
     58    virtual ~VTimeZone();
     59 
     60    /**
     61     * Assignment operator.
     62     * @param right The object to be copied.
     63     * @stable ICU 3.8
     64     */
     65    VTimeZone& operator=(const VTimeZone& right);
     66 
     67    /**
     68     * Return true if the given <code>TimeZone</code> objects are
     69     * semantically equal. Objects of different subclasses are considered unequal.
     70     * @param that  The object to be compared with.
     71     * @return  true if the given <code>TimeZone</code> objects are
     72      *semantically equal.
     73     * @stable ICU 3.8
     74     */
     75    virtual bool operator==(const TimeZone& that) const override;
     76 
     77    /**
     78     * Return true if the given <code>TimeZone</code> objects are
     79     * semantically unequal. Objects of different subclasses are considered unequal.
     80     * @param that  The object to be compared with.
     81     * @return  true if the given <code>TimeZone</code> objects are
     82     * semantically unequal.
     83     * @stable ICU 3.8
     84     */
     85    virtual bool operator!=(const TimeZone& that) const;
     86 
     87    /**
     88     * Create a <code>VTimeZone</code> instance by the time zone ID.
     89     * @param ID The time zone ID, such as America/New_York
     90     * @return A <code>VTimeZone</code> object initialized by the time zone ID,
     91     * or nullptr when the ID is unknown.
     92     * @stable ICU 3.8
     93     */
     94    static VTimeZone* createVTimeZoneByID(const UnicodeString& ID);
     95 
     96    /**
     97     * Create a <code>VTimeZone</code> instance using a basic time zone.
     98     * @param basicTZ The basic time zone instance
     99     * @param status Output param to filled in with a success or an error.
    100     * @return A <code>VTimeZone</code> object initialized by the basic time zone.
    101     * @stable ICU 4.6
    102     */
    103    static VTimeZone* createVTimeZoneFromBasicTimeZone(const BasicTimeZone& basicTZ,
    104                                                       UErrorCode &status);
    105 
    106    /**
    107     * Create a <code>VTimeZone</code> instance by RFC2445 VTIMEZONE data
    108     * 
    109     * @param vtzdata The string including VTIMEZONE data block
    110     * @param status Output param to filled in with a success or an error.
    111     * @return A <code>VTimeZone</code> initialized by the VTIMEZONE data or
    112     * nullptr if failed to load the rule from the VTIMEZONE data.
    113     * @stable ICU 3.8
    114     */
    115    static VTimeZone* createVTimeZone(const UnicodeString& vtzdata, UErrorCode& status);
    116 
    117    /**
    118     * Gets the RFC2445 TZURL property value.  When a <code>VTimeZone</code> instance was
    119     * created from VTIMEZONE data, the initial value is set by the TZURL property value
    120     * in the data.  Otherwise, the initial value is not set.
    121     * @param url Receives the RFC2445 TZURL property value.
    122     * @return true if TZURL attribute is available and value is set.
    123     * @stable ICU 3.8
    124     */
    125    UBool getTZURL(UnicodeString& url) const;
    126 
    127    /**
    128     * Sets the RFC2445 TZURL property value.
    129     * @param url The TZURL property value.
    130     * @stable ICU 3.8
    131     */
    132    void setTZURL(const UnicodeString& url);
    133 
    134    /**
    135     * Gets the RFC2445 LAST-MODIFIED property value.  When a <code>VTimeZone</code> instance
    136     * was created from VTIMEZONE data, the initial value is set by the LAST-MODIFIED property
    137     * value in the data.  Otherwise, the initial value is not set.
    138     * @param lastModified Receives the last modified date.
    139     * @return true if lastModified attribute is available and value is set.
    140     * @stable ICU 3.8
    141     */
    142    UBool getLastModified(UDate& lastModified) const;
    143 
    144    /**
    145     * Sets the RFC2445 LAST-MODIFIED property value.
    146     * @param lastModified The LAST-MODIFIED date.
    147     * @stable ICU 3.8
    148     */
    149    void setLastModified(UDate lastModified);
    150 
    151    /**
    152     * Writes RFC2445 VTIMEZONE data for this time zone
    153     * @param result Output param to filled in with the VTIMEZONE data.
    154     * @param status Output param to filled in with a success or an error.
    155     * @stable ICU 3.8
    156     */
    157    void write(UnicodeString& result, UErrorCode& status) const;
    158 
    159    /**
    160     * Writes RFC2445 VTIMEZONE data for this time zone applicable
    161     * for dates after the specified start time.
    162     * @param start The start date.
    163     * @param result Output param to filled in with the VTIMEZONE data.
    164     * @param status Output param to filled in with a success or an error.
    165     * @stable ICU 3.8
    166     */
    167    void write(UDate start, UnicodeString& result, UErrorCode& status) const;
    168 
    169    /**
    170     * Writes RFC2445 VTIMEZONE data applicable for the specified date.
    171     * Some common iCalendar implementations can only handle a single time
    172     * zone property or a pair of standard and daylight time properties using
    173     * BYDAY rule with day of week (such as BYDAY=1SUN).  This method produce
    174     * the VTIMEZONE data which can be handled these implementations.  The rules
    175     * produced by this method can be used only for calculating time zone offset
    176     * around the specified date.
    177     * @param time The date used for rule extraction.
    178     * @param result Output param to filled in with the VTIMEZONE data.
    179     * @param status Output param to filled in with a success or an error.
    180     * @stable ICU 3.8
    181     */
    182    void writeSimple(UDate time, UnicodeString& result, UErrorCode& status) const;
    183 
    184    /**
    185     * Clones TimeZone objects polymorphically. Clients are responsible for deleting
    186     * the TimeZone object cloned.
    187     * @return   A new copy of this TimeZone object.
    188     * @stable ICU 3.8
    189     */
    190    virtual VTimeZone* clone() const override;
    191 
    192    /**
    193     * Returns the TimeZone's adjusted GMT offset (i.e., the number of milliseconds to add
    194     * to GMT to get local time in this time zone, taking daylight savings time into
    195     * account) as of a particular reference date.  The reference date is used to determine
    196     * whether daylight savings time is in effect and needs to be figured into the offset
    197     * that is returned (in other words, what is the adjusted GMT offset in this time zone
    198     * at this particular date and time?).  For the time zones produced by createTimeZone(),
    199     * the reference data is specified according to the Gregorian calendar, and the date
    200     * and time fields are local standard time.
    201     *
    202     * <p>Note: Don't call this method. Instead, call the getOffset(UDate...) overload,
    203     * which returns both the raw and the DST offset for a given time. This method
    204     * is retained only for backward compatibility.
    205     *
    206     * @param era        The reference date's era
    207     * @param year       The reference date's year
    208     * @param month      The reference date's month (0-based; 0 is January)
    209     * @param day        The reference date's day-in-month (1-based)
    210     * @param dayOfWeek  The reference date's day-of-week (1-based; 1 is Sunday)
    211     * @param millis     The reference date's milliseconds in day, local standard time
    212     * @param status     Output param to filled in with a success or an error.
    213     * @return           The offset in milliseconds to add to GMT to get local time.
    214     * @stable ICU 3.8
    215     */
    216    virtual int32_t getOffset(uint8_t era, int32_t year, int32_t month, int32_t day,
    217                              uint8_t dayOfWeek, int32_t millis, UErrorCode& status) const override;
    218 
    219    /**
    220     * Gets the time zone offset, for current date, modified in case of
    221     * daylight savings. This is the offset to add *to* UTC to get local time.
    222     *
    223     * <p>Note: Don't call this method. Instead, call the getOffset(UDate...) overload,
    224     * which returns both the raw and the DST offset for a given time. This method
    225     * is retained only for backward compatibility.
    226     *
    227     * @param era        The reference date's era
    228     * @param year       The reference date's year
    229     * @param month      The reference date's month (0-based; 0 is January)
    230     * @param day        The reference date's day-in-month (1-based)
    231     * @param dayOfWeek  The reference date's day-of-week (1-based; 1 is Sunday)
    232     * @param millis     The reference date's milliseconds in day, local standard time
    233     * @param monthLength The length of the given month in days.
    234     * @param status     Output param to filled in with a success or an error.
    235     * @return           The offset in milliseconds to add to GMT to get local time.
    236     * @stable ICU 3.8
    237     */
    238    virtual int32_t getOffset(uint8_t era, int32_t year, int32_t month, int32_t day,
    239                           uint8_t dayOfWeek, int32_t millis,
    240                           int32_t monthLength, UErrorCode& status) const override;
    241 
    242    /**
    243     * Returns the time zone raw and GMT offset for the given moment
    244     * in time.  Upon return, local-millis = GMT-millis + rawOffset +
    245     * dstOffset.  All computations are performed in the proleptic
    246     * Gregorian calendar.  The default implementation in the TimeZone
    247     * class delegates to the 8-argument getOffset().
    248     *
    249     * @param date moment in time for which to return offsets, in
    250     * units of milliseconds from January 1, 1970 0:00 GMT, either GMT
    251     * time or local wall time, depending on `local'.
    252     * @param local if true, `date' is local wall time; otherwise it
    253     * is in GMT time.
    254     * @param rawOffset output parameter to receive the raw offset, that
    255     * is, the offset not including DST adjustments
    256     * @param dstOffset output parameter to receive the DST offset,
    257     * that is, the offset to be added to `rawOffset' to obtain the
    258     * total offset between local and GMT time. If DST is not in
    259     * effect, this value is zero; otherwise it is a positive value,
    260     * typically one hour.
    261     * @param ec input-output error code
    262     * @stable ICU 3.8
    263     */
    264    virtual void getOffset(UDate date, UBool local, int32_t& rawOffset,
    265                           int32_t& dstOffset, UErrorCode& ec) const override;
    266 
    267    /**
    268     * Get time zone offsets from local wall time.
    269     * @stable ICU 69
    270     */
    271    virtual void getOffsetFromLocal(
    272        UDate date, UTimeZoneLocalOption nonExistingTimeOpt,
    273        UTimeZoneLocalOption duplicatedTimeOpt,
    274        int32_t& rawOffset, int32_t& dstOffset, UErrorCode& status) const override;
    275 
    276    /**
    277     * Sets the TimeZone's raw GMT offset (i.e., the number of milliseconds to add
    278     * to GMT to get local time, before taking daylight savings time into account).
    279     *
    280     * @param offsetMillis  The new raw GMT offset for this time zone.
    281     * @stable ICU 3.8
    282     */
    283    virtual void setRawOffset(int32_t offsetMillis) override;
    284 
    285    /**
    286     * Returns the TimeZone's raw GMT offset (i.e., the number of milliseconds to add
    287     * to GMT to get local time, before taking daylight savings time into account).
    288     *
    289     * @return   The TimeZone's raw GMT offset.
    290     * @stable ICU 3.8
    291     */
    292    virtual int32_t getRawOffset() const override;
    293 
    294    /**
    295     * Queries if this time zone uses daylight savings time.
    296     * @return true if this time zone uses daylight savings time,
    297     * false, otherwise.
    298     * @stable ICU 3.8
    299     */
    300    virtual UBool useDaylightTime() const override;
    301 
    302 #ifndef U_FORCE_HIDE_DEPRECATED_API
    303    /**
    304     * Queries if the given date is in daylight savings time in
    305     * this time zone.
    306     * This method is wasteful since it creates a new GregorianCalendar and
    307     * deletes it each time it is called. This is a deprecated method
    308     * and provided only for Java compatibility.
    309     *
    310     * @param date the given UDate.
    311     * @param status Output param filled in with success/error code.
    312     * @return true if the given date is in daylight savings time,
    313     * false, otherwise.
    314     * @deprecated ICU 2.4. Use Calendar::inDaylightTime() instead.
    315     */
    316    virtual UBool inDaylightTime(UDate date, UErrorCode& status) const override;
    317 #endif  // U_FORCE_HIDE_DEPRECATED_API
    318 
    319    /**
    320     * Returns true if this zone has the same rule and offset as another zone.
    321     * That is, if this zone differs only in ID, if at all.
    322     * @param other the <code>TimeZone</code> object to be compared with
    323     * @return true if the given zone is the same as this one,
    324     * with the possible exception of the ID
    325     * @stable ICU 3.8
    326     */
    327    virtual UBool hasSameRules(const TimeZone& other) const override;
    328 
    329    /**
    330     * Gets the first time zone transition after the base time.
    331     * @param base      The base time.
    332     * @param inclusive Whether the base time is inclusive or not.
    333     * @param result    Receives the first transition after the base time.
    334     * @return  true if the transition is found.
    335     * @stable ICU 3.8
    336     */
    337    virtual UBool getNextTransition(UDate base, UBool inclusive, TimeZoneTransition& result) const override;
    338 
    339    /**
    340     * Gets the most recent time zone transition before the base time.
    341     * @param base      The base time.
    342     * @param inclusive Whether the base time is inclusive or not.
    343     * @param result    Receives the most recent transition before the base time.
    344     * @return  true if the transition is found.
    345     * @stable ICU 3.8
    346     */
    347    virtual UBool getPreviousTransition(UDate base, UBool inclusive, TimeZoneTransition& result) const override;
    348 
    349    /**
    350     * Returns the number of <code>TimeZoneRule</code>s which represents time transitions,
    351     * for this time zone, that is, all <code>TimeZoneRule</code>s for this time zone except
    352     * <code>InitialTimeZoneRule</code>.  The return value range is 0 or any positive value.
    353     * @param status    Receives error status code.
    354     * @return The number of <code>TimeZoneRule</code>s representing time transitions.
    355     * @stable ICU 3.8
    356     */
    357    virtual int32_t countTransitionRules(UErrorCode& status) const override;
    358 
    359    /**
    360     * Gets the <code>InitialTimeZoneRule</code> and the set of <code>TimeZoneRule</code>
    361     * which represent time transitions for this time zone.  On successful return,
    362     * the argument initial points to non-nullptr <code>InitialTimeZoneRule</code> and
    363     * the array trsrules is filled with 0 or multiple <code>TimeZoneRule</code>
    364     * instances up to the size specified by trscount.  The results are referencing the
    365     * rule instance held by this time zone instance.  Therefore, after this time zone
    366     * is destructed, they are no longer available.
    367     * @param initial       Receives the initial timezone rule
    368     * @param trsrules      Receives the timezone transition rules
    369     * @param trscount      On input, specify the size of the array 'transitions' receiving
    370     *                      the timezone transition rules.  On output, actual number of
    371     *                      rules filled in the array will be set.
    372     * @param status        Receives error status code.
    373     * @stable ICU 3.8
    374     */
    375    virtual void getTimeZoneRules(const InitialTimeZoneRule*& initial,
    376        const TimeZoneRule* trsrules[], int32_t& trscount, UErrorCode& status) const override;
    377 
    378 private:
    379    enum { DEFAULT_VTIMEZONE_LINES = 100 };
    380 
    381    /**
    382     * Default constructor.
    383     */
    384    VTimeZone();
    385    void write(VTZWriter& writer, UErrorCode& status) const;
    386    void write(UDate start, VTZWriter& writer, UErrorCode& status) const;
    387    void writeSimple(UDate time, VTZWriter& writer, UErrorCode& status) const;
    388    void load(VTZReader& reader, UErrorCode& status);
    389    void parse(UErrorCode& status);
    390 
    391    void writeZone(VTZWriter& w, BasicTimeZone& basictz, UVector* customProps,
    392        UErrorCode& status) const;
    393 
    394    void writeHeaders(VTZWriter& w, UErrorCode& status) const;
    395    void writeFooter(VTZWriter& writer, UErrorCode& status) const;
    396 
    397    void writeZonePropsByTime(VTZWriter& writer, UBool isDst, const UnicodeString& zonename,
    398                              int32_t fromOffset, int32_t toOffset, UDate time, UBool withRDATE,
    399                              UErrorCode& status) const;
    400    void writeZonePropsByDOM(VTZWriter& writer, UBool isDst, const UnicodeString& zonename,
    401                             int32_t fromOffset, int32_t toOffset,
    402                             int32_t month, int32_t dayOfMonth, UDate startTime, UDate untilTime,
    403                             UErrorCode& status) const;
    404    void writeZonePropsByDOW(VTZWriter& writer, UBool isDst, const UnicodeString& zonename,
    405                             int32_t fromOffset, int32_t toOffset,
    406                             int32_t month, int32_t weekInMonth, int32_t dayOfWeek,
    407                             UDate startTime, UDate untilTime, UErrorCode& status) const;
    408    void writeZonePropsByDOW_GEQ_DOM(VTZWriter& writer, UBool isDst, const UnicodeString& zonename,
    409                                     int32_t fromOffset, int32_t toOffset,
    410                                     int32_t month, int32_t dayOfMonth, int32_t dayOfWeek,
    411                                     UDate startTime, UDate untilTime, UErrorCode& status) const;
    412    void writeZonePropsByDOW_GEQ_DOM_sub(VTZWriter& writer, int32_t month, int32_t dayOfMonth,
    413                                         int32_t dayOfWeek, int32_t numDays,
    414                                         UDate untilTime, int32_t fromOffset, UErrorCode& status) const;
    415    void writeZonePropsByDOW_LEQ_DOM(VTZWriter& writer, UBool isDst, const UnicodeString& zonename,
    416                                     int32_t fromOffset, int32_t toOffset,
    417                                     int32_t month, int32_t dayOfMonth, int32_t dayOfWeek,
    418                                     UDate startTime, UDate untilTime, UErrorCode& status) const;
    419    void writeFinalRule(VTZWriter& writer, UBool isDst, const AnnualTimeZoneRule* rule,
    420                        int32_t fromRawOffset, int32_t fromDSTSavings,
    421                        UDate startTime, UErrorCode& status) const;
    422 
    423    void beginZoneProps(VTZWriter& writer, UBool isDst, const UnicodeString& zonename,
    424                        int32_t fromOffset, int32_t toOffset, UDate startTime, UErrorCode& status) const;
    425    void endZoneProps(VTZWriter& writer, UBool isDst, UErrorCode& status) const;
    426    void beginRRULE(VTZWriter& writer, int32_t month, UErrorCode& status) const;
    427    void appendUNTIL(VTZWriter& writer, const UnicodeString& until, UErrorCode& status) const;
    428 
    429    BasicTimeZone   *tz;
    430    UVector         *vtzlines;
    431    UnicodeString   tzurl;
    432    UDate           lastmod;
    433    UnicodeString   olsonzid;
    434    UnicodeString   icutzver;
    435 
    436 public:
    437    /**
    438     * Return the class ID for this class. This is useful only for comparing to
    439     * a return value from getDynamicClassID(). For example:
    440     * <pre>
    441     * .   Base* polymorphic_pointer = createPolymorphicObject();
    442     * .   if (polymorphic_pointer->getDynamicClassID() ==
    443     * .       erived::getStaticClassID()) ...
    444     * </pre>
    445     * @return          The class ID for all objects of this class.
    446     * @stable ICU 3.8
    447     */
    448    static UClassID U_EXPORT2 getStaticClassID();
    449 
    450    /**
    451     * Returns a unique class ID POLYMORPHICALLY. Pure virtual override. This
    452     * method is to implement a simple version of RTTI, since not all C++
    453     * compilers support genuine RTTI. Polymorphic operator==() and clone()
    454     * methods call this method.
    455     *
    456     * @return          The class ID for this object. All objects of a
    457     *                  given class have the same class ID.  Objects of
    458     *                  other classes have different class IDs.
    459     * @stable ICU 3.8
    460     */
    461    virtual UClassID getDynamicClassID() const override;
    462 };
    463 
    464 U_NAMESPACE_END
    465 
    466 #endif /* #if !UCONFIG_NO_FORMATTING */
    467 
    468 #endif /* U_SHOW_CPLUSPLUS_API */
    469 
    470 #endif // VTZONE_H
    471 //eof