linux-packaging-mono/mcs/class/System.Core/System/TimeZoneInfo.TransitionTime.cs
Jo Shields 181b81b4a4 Imported Upstream version 3.12.0
Former-commit-id: cf92446697332992ec36726e78eb8703e1f259d7
2015-01-13 10:44:36 +00:00

305 lines
9.0 KiB
C#

/*
* System.TimeZoneInfo.TransitionTime
*
* Author(s)
* Stephane Delcroix <stephane@delcroix.org>
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#if INSIDE_CORLIB || (NET_3_5 && !NET_4_0 && !MOBILE)
using System.Runtime.CompilerServices;
using System.Runtime.Serialization;
namespace System
{
#if NET_4_0 || !INSIDE_CORLIB
public
#endif
sealed partial class TimeZoneInfo
{
[SerializableAttribute]
#if MOBILE
[TypeForwardedFrom (Consts.AssemblySystem_Core)]
#elif NET_4_0
[TypeForwardedFrom (Consts.AssemblySystemCore_3_5)]
#endif
public struct TransitionTime : IEquatable<TimeZoneInfo.TransitionTime>, ISerializable, IDeserializationCallback
{
DateTime timeOfDay;
public DateTime TimeOfDay {
get { return timeOfDay; }
}
int month;
public int Month {
get { return month; }
}
int day;
public int Day {
get {
#if STRICT
if (!isFixedDateRule)
throw new Exception ("Day property is not valid for floating date rules");
#endif
return day;
}
}
int week;
public int Week {
get {
#if STRICT
if (isFixedDateRule)
throw new Exception ("Week property is not valid for fixed date rules");
#endif
return week;
}
}
DayOfWeek dayOfWeek;
public DayOfWeek DayOfWeek {
get {
#if STRICT
if (isFixedDateRule)
throw new Exception ("DayOfWeek property is not valid for fixed date rules");
#endif
return dayOfWeek;
}
}
bool isFixedDateRule;
public bool IsFixedDateRule {
get { return isFixedDateRule; }
}
public static TransitionTime CreateFixedDateRule (
DateTime timeOfDay,
int month,
int day)
{
return new TransitionTime (timeOfDay, month, day);
}
public static TransitionTime CreateFloatingDateRule (
DateTime timeOfDay,
int month,
int week,
DayOfWeek dayOfWeek)
{
return new TransitionTime (timeOfDay, month, week, dayOfWeek);
}
private TransitionTime (SerializationInfo info, StreamingContext context)
{
if (info == null)
throw new ArgumentNullException ("info");
timeOfDay = (DateTime) info.GetValue ("TimeOfDay", typeof (DateTime));
month = (byte) info.GetValue ("Month", typeof (byte));
week = (byte) info.GetValue ("Week", typeof (byte));
day = (byte) info.GetValue ("Day", typeof (byte));
dayOfWeek = (DayOfWeek) info.GetValue ("DayOfWeek", typeof (DayOfWeek));
isFixedDateRule = (bool) info.GetValue ("IsFixedDateRule", typeof (bool));
if (isFixedDateRule)
{
week = -1;
dayOfWeek = (DayOfWeek) (-1);
}
if (!isFixedDateRule)
day = -1;
}
private TransitionTime (
DateTime timeOfDay,
int month,
int day) : this (timeOfDay, month)
{
if (day < 1 || day > 31)
throw new ArgumentOutOfRangeException ("day parameter is less than 1 or greater than 31");
this.day = day;
this.isFixedDateRule = true;
}
private TransitionTime (
DateTime timeOfDay,
int month,
int week,
DayOfWeek dayOfWeek) : this (timeOfDay, month)
{
if (week < 1 || week > 5)
throw new ArgumentOutOfRangeException ("week parameter is less than 1 or greater than 5");
if (dayOfWeek != DayOfWeek.Sunday &&
dayOfWeek != DayOfWeek.Monday &&
dayOfWeek != DayOfWeek.Tuesday &&
dayOfWeek != DayOfWeek.Wednesday &&
dayOfWeek != DayOfWeek.Thursday &&
dayOfWeek != DayOfWeek.Friday &&
dayOfWeek != DayOfWeek.Saturday)
throw new ArgumentOutOfRangeException ("dayOfWeek parameter is not a member od DayOfWeek enumeration");
this.week = week;
this.dayOfWeek = dayOfWeek;
this.isFixedDateRule = false;
}
private TransitionTime (
DateTime timeOfDay,
int month)
{
if (timeOfDay.Year != 1 || timeOfDay.Month != 1 || timeOfDay.Day != 1)
throw new ArgumentException ("timeOfDay parameter has a non-default date component");
if (timeOfDay.Kind != DateTimeKind.Unspecified)
throw new ArgumentException ("timeOfDay parameter Kind's property is not DateTimeKind.Unspecified");
if (timeOfDay.Ticks % TimeSpan.TicksPerMillisecond != 0)
throw new ArgumentException ("timeOfDay parameter does not represent a whole number of milliseconds");
if (month < 1 || month > 12)
throw new ArgumentOutOfRangeException ("month parameter is less than 1 or greater than 12");
this.timeOfDay = timeOfDay;
this.month = month;
this.week = -1;
this.dayOfWeek = (System.DayOfWeek)(-1);
this.day = -1;
this.isFixedDateRule = false;
}
public static bool operator == (TransitionTime t1, TransitionTime t2)
{
return ( t1.day == t2.day &&
t1.dayOfWeek == t2.dayOfWeek &&
t1.isFixedDateRule == t2.isFixedDateRule &&
t1.month == t2.month &&
t1.timeOfDay == t2.timeOfDay &&
t1.week == t2.week);
}
public static bool operator != (TransitionTime t1, TransitionTime t2)
{
return !(t1 == t2);
}
#if NET_4_0
void ISerializable.GetObjectData (SerializationInfo info, StreamingContext context)
#else
public void GetObjectData (SerializationInfo info, StreamingContext context)
#endif
{
if (info == null)
throw new ArgumentNullException ("info");
info.AddValue ("TimeOfDay", TimeOfDay);
info.AddValue ("Month", System.Convert.ToByte(Month));
if (week > -1)
info.AddValue ("Week", System.Convert.ToByte(week));
else
info.AddValue ("Week", (byte) 1);
if (day > -1)
info.AddValue ("Day", System.Convert.ToByte(day));
else
info.AddValue ("Day", (byte) 1);
if (dayOfWeek != ((System.DayOfWeek) (-1)))
info.AddValue ("DayOfWeek", dayOfWeek);
else
info.AddValue ("DayOfWeek", DayOfWeek.Sunday);
info.AddValue ("IsFixedDateRule", IsFixedDateRule);
}
public override bool Equals (object obj)
{
if (obj is TransitionTime)
return this == (TransitionTime) obj;
return false;
}
public bool Equals (TimeZoneInfo.TransitionTime other)
{
return this == other;
}
public override int GetHashCode ()
{
return (day ^ (int)dayOfWeek ^ month ^ (int)timeOfDay.Ticks ^ week);
}
#if NET_4_0
void IDeserializationCallback.OnDeserialization (object sender)
#else
public void OnDeserialization (object sender)
#endif
{
try {
TimeZoneInfo.TransitionTime.Validate (timeOfDay, month, week, day, dayOfWeek, isFixedDateRule);
} catch (ArgumentException ex) {
throw new SerializationException ("invalid serialization data", ex);
}
}
private static void Validate (DateTime timeOfDay, int month,int week, int day, DayOfWeek dayOfWeek, bool isFixedDateRule)
{
if (timeOfDay.Year != 1 || timeOfDay.Month != 1 || timeOfDay.Day != 1)
throw new ArgumentException ("timeOfDay parameter has a non-default date component");
if (timeOfDay.Kind != DateTimeKind.Unspecified)
throw new ArgumentException ("timeOfDay parameter Kind's property is not DateTimeKind.Unspecified");
if (timeOfDay.Ticks % TimeSpan.TicksPerMillisecond != 0)
throw new ArgumentException ("timeOfDay parameter does not represent a whole number of milliseconds");
if (day < 1 || day > 31) {
if (!(!isFixedDateRule && day == -1))
throw new ArgumentOutOfRangeException ("day parameter is less than 1 or greater than 31");
}
if (week < 1 || week > 5) {
if (!(isFixedDateRule && week == -1))
throw new ArgumentOutOfRangeException ("week parameter is less than 1 or greater than 5");
}
if (month < 1 || month > 12)
throw new ArgumentOutOfRangeException ("month parameter is less than 1 or greater than 12");
if (dayOfWeek != DayOfWeek.Sunday &&
dayOfWeek != DayOfWeek.Monday &&
dayOfWeek != DayOfWeek.Tuesday &&
dayOfWeek != DayOfWeek.Wednesday &&
dayOfWeek != DayOfWeek.Thursday &&
dayOfWeek != DayOfWeek.Friday &&
dayOfWeek != DayOfWeek.Saturday) {
if (!(isFixedDateRule && dayOfWeek == (DayOfWeek) (-1)))
throw new ArgumentOutOfRangeException ("dayOfWeek parameter is not a member od DayOfWeek enumeration");
}
}
}
}
}
#endif