2656 lines
		
	
	
		
			112 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			2656 lines
		
	
	
		
			112 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| #if FRAMEWORK20
 | |
| using System;
 | |
| using System.Collections.Generic;
 | |
| using System.Text;
 | |
| using System.Security.Permissions;
 | |
| using System.Runtime.Serialization;
 | |
| using System.Globalization;
 | |
| using System.Security;
 | |
| using Microsoft.Win32;
 | |
| using System.Runtime.InteropServices;
 | |
| using System.Security.AccessControl;
 | |
| using System.IO;
 | |
| using System.Runtime.ConstrainedExecution;
 | |
| 
 | |
| namespace DevComponents.Schedule
 | |
| {
 | |
|     [Serializable, HostProtection(SecurityAction.LinkDemand, MayLeakOnAbort = true)]
 | |
|     public sealed class TimeZoneInfo : IEquatable<TimeZoneInfo>, ISerializable, IDeserializationCallback
 | |
|     {
 | |
|         // Fields
 | |
|         private const string c_daylightValue = "Dlt";
 | |
|         private const string c_disableDST = "DisableAutoDaylightTimeSet";
 | |
|         private const string c_disableDynamicDST = "DynamicDaylightTimeDisabled";
 | |
|         private const string c_displayValue = "Display";
 | |
|         private const string c_firstEntryValue = "FirstEntry";
 | |
|         private const string c_lastEntryValue = "LastEntry";
 | |
|         private const string c_localId = "Local";
 | |
|         private const int c_maxKeyLength = 0xff;
 | |
|         private const string c_muiDaylightValue = "MUI_Dlt";
 | |
|         private const string c_muiDisplayValue = "MUI_Display";
 | |
|         private const string c_muiStandardValue = "MUI_Std";
 | |
|         private const string c_standardValue = "Std";
 | |
|         private const long c_ticksPerDay = 0xc92a69c000L;
 | |
|         private const long c_ticksPerDayRange = 0xc92a6998f0L;
 | |
|         private const long c_ticksPerHour = 0x861c46800L;
 | |
|         private const long c_ticksPerMillisecond = 0x2710L;
 | |
|         private const long c_ticksPerMinute = 0x23c34600L;
 | |
|         private const long c_ticksPerSecond = 0x989680L;
 | |
|         private const string c_timeZoneInfoRegistryHive = @"SYSTEM\CurrentControlSet\Control\TimeZoneInformation";
 | |
|         private const string c_timeZoneInfoRegistryHivePermissionList = @"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TimeZoneInformation";
 | |
|         private const string c_timeZoneInfoValue = "TZI";
 | |
|         private const string c_timeZonesRegistryHive = @"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones";
 | |
|         private const string c_timeZonesRegistryHivePermissionList = @"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones";
 | |
|         private const string c_utcId = "UTC";
 | |
|         private AdjustmentRule[] m_adjustmentRules;
 | |
|         private TimeSpan m_baseUtcOffset;
 | |
|         private string m_daylightDisplayName;
 | |
|         private string m_displayName;
 | |
|         private string m_id;
 | |
|         private string m_standardDisplayName;
 | |
|         private bool m_supportsDaylightSavingTime;
 | |
|         private static bool s_allSystemTimeZonesRead = false;
 | |
|         private static object s_hiddenInternalSyncObject;
 | |
|         private static Dictionary<string, TimeZoneInfo> s_hiddenSystemTimeZones;
 | |
|         private static TimeZoneInfo s_localTimeZone;
 | |
|         private static List<TimeZoneInfo> s_readOnlySystemTimeZones;
 | |
|         private static TimeZoneInfo s_utcTimeZone;
 | |
| 
 | |
|         // Methods
 | |
|         private TimeZoneInfo(NativeMethods.TimeZoneInformation zone, bool dstDisabled)
 | |
|         {
 | |
|             if (string.IsNullOrEmpty(zone.StandardName))
 | |
|             {
 | |
|                 this.m_id = "Local";
 | |
|             }
 | |
|             else
 | |
|             {
 | |
|                 this.m_id = zone.StandardName;
 | |
|             }
 | |
|             this.m_baseUtcOffset = new TimeSpan(0, -zone.Bias, 0);
 | |
|             if (!dstDisabled)
 | |
|             {
 | |
|                 NativeMethods.RegistryTimeZoneInformation timeZoneInformation = new NativeMethods.RegistryTimeZoneInformation(zone);
 | |
|                 AdjustmentRule rule = CreateAdjustmentRuleFromTimeZoneInformation(timeZoneInformation, DateTime.MinValue.Date, DateTime.MaxValue.Date);
 | |
|                 if (rule != null)
 | |
|                 {
 | |
|                     this.m_adjustmentRules = new AdjustmentRule[] { rule };
 | |
|                 }
 | |
|             }
 | |
|             ValidateTimeZoneInfo(this.m_id, this.m_baseUtcOffset, this.m_adjustmentRules, out this.m_supportsDaylightSavingTime);
 | |
|             this.m_displayName = zone.StandardName;
 | |
|             this.m_standardDisplayName = zone.StandardName;
 | |
|             this.m_daylightDisplayName = zone.DaylightName;
 | |
|         }
 | |
| 
 | |
|         private TimeZoneInfo(SerializationInfo info, StreamingContext context)
 | |
|         {
 | |
|             if (info == null)
 | |
|             {
 | |
|                 throw new ArgumentNullException("info");
 | |
|             }
 | |
|             this.m_id = (string)info.GetValue("Id", typeof(string));
 | |
|             this.m_displayName = (string)info.GetValue("DisplayName", typeof(string));
 | |
|             this.m_standardDisplayName = (string)info.GetValue("StandardName", typeof(string));
 | |
|             this.m_daylightDisplayName = (string)info.GetValue("DaylightName", typeof(string));
 | |
|             this.m_baseUtcOffset = (TimeSpan)info.GetValue("BaseUtcOffset", typeof(TimeSpan));
 | |
|             this.m_adjustmentRules = (AdjustmentRule[])info.GetValue("AdjustmentRules", typeof(AdjustmentRule[]));
 | |
|             this.m_supportsDaylightSavingTime = (bool)info.GetValue("SupportsDaylightSavingTime", typeof(bool));
 | |
|         }
 | |
| 
 | |
|         private TimeZoneInfo(string id, TimeSpan baseUtcOffset, string displayName, string standardDisplayName, string daylightDisplayName, AdjustmentRule[] adjustmentRules, bool disableDaylightSavingTime)
 | |
|         {
 | |
|             bool flag;
 | |
|             ValidateTimeZoneInfo(id, baseUtcOffset, adjustmentRules, out flag);
 | |
|             if ((!disableDaylightSavingTime && (adjustmentRules != null)) && (adjustmentRules.Length > 0))
 | |
|             {
 | |
|                 this.m_adjustmentRules = (AdjustmentRule[])adjustmentRules.Clone();
 | |
|             }
 | |
|             this.m_id = id;
 | |
|             this.m_baseUtcOffset = baseUtcOffset;
 | |
|             this.m_displayName = displayName;
 | |
|             this.m_standardDisplayName = standardDisplayName;
 | |
|             this.m_daylightDisplayName = disableDaylightSavingTime ? null : daylightDisplayName;
 | |
|             this.m_supportsDaylightSavingTime = flag && !disableDaylightSavingTime;
 | |
|         }
 | |
| 
 | |
|         [SecurityCritical, SecurityTreatAsSafe]
 | |
|         private static bool CheckDaylightSavingTimeDisabled()
 | |
|         {
 | |
|             try
 | |
|             {
 | |
|                 PermissionSet set = new PermissionSet(PermissionState.None);
 | |
|                 set.AddPermission(new RegistryPermission(RegistryPermissionAccess.Read, @"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TimeZoneInformation"));
 | |
|                 set.Assert();
 | |
|                 using (RegistryKey key = Registry.LocalMachine.OpenSubKey(@"SYSTEM\CurrentControlSet\Control\TimeZoneInformation", RegistryKeyPermissionCheck.Default, RegistryRights.ExecuteKey))
 | |
|                 {
 | |
|                     if (key == null)
 | |
|                     {
 | |
|                         return false;
 | |
|                     }
 | |
|                     int num = 0;
 | |
|                     try
 | |
|                     {
 | |
|                         num = (int)key.GetValue("DisableAutoDaylightTimeSet", 0, RegistryValueOptions.None);
 | |
|                     }
 | |
|                     catch (InvalidCastException)
 | |
|                     {
 | |
|                     }
 | |
|                     if (num != 1)
 | |
|                     {
 | |
|                         try
 | |
|                         {
 | |
|                             num = (int)key.GetValue("DynamicDaylightTimeDisabled", 0, RegistryValueOptions.None);
 | |
|                         }
 | |
|                         catch (InvalidCastException)
 | |
|                         {
 | |
|                         }
 | |
|                         if (num != 1)
 | |
|                         {
 | |
|                             goto Label_009C;
 | |
|                         }
 | |
|                     }
 | |
|                     return true;
 | |
|                 }
 | |
|             }
 | |
|             finally
 | |
|             {
 | |
|                 PermissionSet.RevertAssert();
 | |
|             }
 | |
|         Label_009C:
 | |
|             return false;
 | |
|         }
 | |
| 
 | |
|         private static bool CheckDaylightSavingTimeNotSupported(NativeMethods.TimeZoneInformation timeZone)
 | |
|         {
 | |
|             return (((((timeZone.DaylightDate.Year == timeZone.StandardDate.Year) && (timeZone.DaylightDate.Month == timeZone.StandardDate.Month)) && ((timeZone.DaylightDate.DayOfWeek == timeZone.StandardDate.DayOfWeek) && (timeZone.DaylightDate.Day == timeZone.StandardDate.Day))) && (((timeZone.DaylightDate.Hour == timeZone.StandardDate.Hour) && (timeZone.DaylightDate.Minute == timeZone.StandardDate.Minute)) && (timeZone.DaylightDate.Second == timeZone.StandardDate.Second))) && (timeZone.DaylightDate.Milliseconds == timeZone.StandardDate.Milliseconds));
 | |
|         }
 | |
| 
 | |
|         private static bool CheckIsDst(DateTime startTime, DateTime time, DateTime endTime)
 | |
|         {
 | |
|             if (startTime.Year != endTime.Year)
 | |
|             {
 | |
|                 endTime = endTime.AddYears(startTime.Year - endTime.Year);
 | |
|             }
 | |
|             if (startTime.Year != time.Year)
 | |
|             {
 | |
|                 time = time.AddYears(startTime.Year - time.Year);
 | |
|             }
 | |
|             if (startTime > endTime)
 | |
|             {
 | |
|                 return ((time < endTime) || (time >= startTime));
 | |
|             }
 | |
|             return ((time >= startTime) && (time < endTime));
 | |
|         }
 | |
| 
 | |
|         public static void ClearCachedData()
 | |
|         {
 | |
|             lock (s_internalSyncObject)
 | |
|             {
 | |
|                 s_localTimeZone = null;
 | |
|                 s_utcTimeZone = null;
 | |
|                 s_systemTimeZones = null;
 | |
|                 s_readOnlySystemTimeZones = null;
 | |
|                 s_allSystemTimeZonesRead = false;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         public static DateTime ConvertTime(DateTime dateTime, TimeZoneInfo destinationTimeZone)
 | |
|         {
 | |
|             if (destinationTimeZone == null)
 | |
|             {
 | |
|                 throw new ArgumentNullException("destinationTimeZone");
 | |
|             }
 | |
|             if (dateTime.Kind == DateTimeKind.Utc)
 | |
|             {
 | |
|                 lock (s_internalSyncObject)
 | |
|                 {
 | |
|                     return ConvertTime(dateTime, Utc, destinationTimeZone);
 | |
|                 }
 | |
|             }
 | |
|             lock (s_internalSyncObject)
 | |
|             {
 | |
|                 return ConvertTime(dateTime, Local, destinationTimeZone);
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         public static DateTimeOffset ConvertTime(DateTimeOffset dateTimeOffset, TimeZoneInfo destinationTimeZone)
 | |
|         {
 | |
|             if (destinationTimeZone == null)
 | |
|             {
 | |
|                 throw new ArgumentNullException("destinationTimeZone");
 | |
|             }
 | |
|             DateTime utcDateTime = dateTimeOffset.UtcDateTime;
 | |
|             TimeSpan utcOffsetFromUtc = GetUtcOffsetFromUtc(utcDateTime, destinationTimeZone);
 | |
|             long ticks = utcDateTime.Ticks + utcOffsetFromUtc.Ticks;
 | |
|             if (ticks > DateTimeOffset.MaxValue.Ticks)
 | |
|             {
 | |
|                 return DateTimeOffset.MaxValue;
 | |
|             }
 | |
|             if (ticks < DateTimeOffset.MinValue.Ticks)
 | |
|             {
 | |
|                 return DateTimeOffset.MinValue;
 | |
|             }
 | |
|             return new DateTimeOffset(ticks, utcOffsetFromUtc);
 | |
|         }
 | |
| 
 | |
|         public static DateTime ConvertTime(DateTime dateTime, TimeZoneInfo sourceTimeZone, TimeZoneInfo destinationTimeZone)
 | |
|         {
 | |
|             return ConvertTime(dateTime, sourceTimeZone, destinationTimeZone, TimeZoneInfoOptions.None);
 | |
|         }
 | |
| 
 | |
|         internal static DateTime ConvertTime(DateTime dateTime, TimeZoneInfo sourceTimeZone, TimeZoneInfo destinationTimeZone, TimeZoneInfoOptions flags)
 | |
|         {
 | |
|             if (sourceTimeZone == null)
 | |
|             {
 | |
|                 throw new ArgumentNullException("sourceTimeZone");
 | |
|             }
 | |
|             if (destinationTimeZone == null)
 | |
|             {
 | |
|                 throw new ArgumentNullException("destinationTimeZone");
 | |
|             }
 | |
|             DateTimeKind correspondingKind = sourceTimeZone.GetCorrespondingKind();
 | |
|             if ((((flags & TimeZoneInfoOptions.NoThrowOnInvalidTime) == 0) && (dateTime.Kind != DateTimeKind.Unspecified)) && (dateTime.Kind != correspondingKind))
 | |
|             {
 | |
|                 throw new ArgumentException("Argument_ConvertMismatch", "sourceTimeZone");
 | |
|             }
 | |
|             AdjustmentRule adjustmentRuleForTime = sourceTimeZone.GetAdjustmentRuleForTime(dateTime);
 | |
|             TimeSpan baseUtcOffset = sourceTimeZone.BaseUtcOffset;
 | |
|             if (adjustmentRuleForTime != null)
 | |
|             {
 | |
|                 bool flag = false;
 | |
|                 DaylightTime daylightTime = GetDaylightTime(dateTime.Year, adjustmentRuleForTime);
 | |
|                 if (((flags & TimeZoneInfoOptions.NoThrowOnInvalidTime) == 0) && GetIsInvalidTime(dateTime, adjustmentRuleForTime, daylightTime))
 | |
|                 {
 | |
|                     throw new ArgumentException("Argument_DateTimeIsInvalid", "dateTime");
 | |
|                 }
 | |
|                 flag = GetIsDaylightSavings(dateTime, adjustmentRuleForTime, daylightTime);
 | |
|                 baseUtcOffset += flag ? adjustmentRuleForTime.DaylightDelta : TimeSpan.Zero;
 | |
|             }
 | |
|             DateTimeKind kind = destinationTimeZone.GetCorrespondingKind();
 | |
|             if (((dateTime.Kind != DateTimeKind.Unspecified) && (correspondingKind != DateTimeKind.Unspecified)) && (correspondingKind == kind))
 | |
|             {
 | |
|                 return dateTime;
 | |
|             }
 | |
|             long ticks = dateTime.Ticks - baseUtcOffset.Ticks;
 | |
|             DateTime time2 = ConvertUtcToTimeZone(ticks, destinationTimeZone);
 | |
|             if (kind == DateTimeKind.Local)
 | |
|             {
 | |
|                 kind = DateTimeKind.Unspecified;
 | |
|             }
 | |
|             return new DateTime(time2.Ticks, kind);
 | |
|         }
 | |
| 
 | |
|         public static DateTime ConvertTimeBySystemTimeZoneId(DateTime dateTime, string destinationTimeZoneId)
 | |
|         {
 | |
|             return ConvertTime(dateTime, FindSystemTimeZoneById(destinationTimeZoneId));
 | |
|         }
 | |
| 
 | |
|         public static DateTimeOffset ConvertTimeBySystemTimeZoneId(DateTimeOffset dateTimeOffset, string destinationTimeZoneId)
 | |
|         {
 | |
|             return ConvertTime(dateTimeOffset, FindSystemTimeZoneById(destinationTimeZoneId));
 | |
|         }
 | |
| 
 | |
|         public static DateTime ConvertTimeBySystemTimeZoneId(DateTime dateTime, string sourceTimeZoneId, string destinationTimeZoneId)
 | |
|         {
 | |
|             if ((dateTime.Kind == DateTimeKind.Local) && (string.Compare(sourceTimeZoneId, Local.Id, StringComparison.OrdinalIgnoreCase) == 0))
 | |
|             {
 | |
|                 lock (s_internalSyncObject)
 | |
|                 {
 | |
|                     return ConvertTime(dateTime, Local, FindSystemTimeZoneById(destinationTimeZoneId));
 | |
|                 }
 | |
|             }
 | |
|             if ((dateTime.Kind == DateTimeKind.Utc) && (string.Compare(sourceTimeZoneId, Utc.Id, StringComparison.OrdinalIgnoreCase) == 0))
 | |
|             {
 | |
|                 lock (s_internalSyncObject)
 | |
|                 {
 | |
|                     return ConvertTime(dateTime, Utc, FindSystemTimeZoneById(destinationTimeZoneId));
 | |
|                 }
 | |
|             }
 | |
|             return ConvertTime(dateTime, FindSystemTimeZoneById(sourceTimeZoneId), FindSystemTimeZoneById(destinationTimeZoneId));
 | |
|         }
 | |
| 
 | |
|         public static DateTime ConvertTimeFromUtc(DateTime dateTime, TimeZoneInfo destinationTimeZone)
 | |
|         {
 | |
|             lock (s_internalSyncObject)
 | |
|             {
 | |
|                 return ConvertTime(dateTime, Utc, destinationTimeZone);
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         public static DateTime ConvertTimeToUtc(DateTime dateTime)
 | |
|         {
 | |
|             if (dateTime.Kind == DateTimeKind.Utc)
 | |
|             {
 | |
|                 return dateTime;
 | |
|             }
 | |
|             lock (s_internalSyncObject)
 | |
|             {
 | |
|                 return ConvertTime(dateTime, Local, Utc);
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         public static DateTime ConvertTimeToUtc(DateTime dateTime, TimeZoneInfo sourceTimeZone)
 | |
|         {
 | |
|             lock (s_internalSyncObject)
 | |
|             {
 | |
|                 return ConvertTime(dateTime, sourceTimeZone, Utc);
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         private static DateTime ConvertUtcToTimeZone(long ticks, TimeZoneInfo destinationTimeZone)
 | |
|         {
 | |
|             DateTime maxValue;
 | |
|             if (ticks > DateTime.MaxValue.Ticks)
 | |
|             {
 | |
|                 maxValue = DateTime.MaxValue;
 | |
|             }
 | |
|             else if (ticks < DateTime.MinValue.Ticks)
 | |
|             {
 | |
|                 maxValue = DateTime.MinValue;
 | |
|             }
 | |
|             else
 | |
|             {
 | |
|                 maxValue = new DateTime(ticks);
 | |
|             }
 | |
|             TimeSpan utcOffsetFromUtc = GetUtcOffsetFromUtc(maxValue, destinationTimeZone);
 | |
|             ticks += utcOffsetFromUtc.Ticks;
 | |
|             if (ticks > DateTime.MaxValue.Ticks)
 | |
|             {
 | |
|                 return DateTime.MaxValue;
 | |
|             }
 | |
|             if (ticks < DateTime.MinValue.Ticks)
 | |
|             {
 | |
|                 return DateTime.MinValue;
 | |
|             }
 | |
|             return new DateTime(ticks);
 | |
|         }
 | |
| 
 | |
|         private static AdjustmentRule CreateAdjustmentRuleFromTimeZoneInformation(NativeMethods.RegistryTimeZoneInformation timeZoneInformation, DateTime startDate, DateTime endDate)
 | |
|         {
 | |
|             if (timeZoneInformation.StandardDate.Month == 0)
 | |
|             {
 | |
|                 return null;
 | |
|             }
 | |
|             TransitionTime? nullable = TransitionTimeFromTimeZoneInformation(timeZoneInformation, true);
 | |
|             if (!nullable.HasValue)
 | |
|             {
 | |
|                 return null;
 | |
|             }
 | |
|             TransitionTime? nullable2 = TransitionTimeFromTimeZoneInformation(timeZoneInformation, false);
 | |
|             if (!nullable2.HasValue)
 | |
|             {
 | |
|                 return null;
 | |
|             }
 | |
|             if (nullable.Equals(nullable2))
 | |
|             {
 | |
|                 return null;
 | |
|             }
 | |
|             return AdjustmentRule.CreateAdjustmentRule(startDate, endDate, new TimeSpan(0, -timeZoneInformation.DaylightBias, 0), nullable.Value, nullable2.Value);
 | |
|         }
 | |
| 
 | |
|         public static TimeZoneInfo CreateCustomTimeZone(string id, TimeSpan baseUtcOffset, string displayName, string standardDisplayName)
 | |
|         {
 | |
|             return new TimeZoneInfo(id, baseUtcOffset, displayName, standardDisplayName, standardDisplayName, null, false);
 | |
|         }
 | |
| 
 | |
|         public static TimeZoneInfo CreateCustomTimeZone(string id, TimeSpan baseUtcOffset, string displayName, string standardDisplayName, string daylightDisplayName, AdjustmentRule[] adjustmentRules)
 | |
|         {
 | |
|             return new TimeZoneInfo(id, baseUtcOffset, displayName, standardDisplayName, daylightDisplayName, adjustmentRules, false);
 | |
|         }
 | |
| 
 | |
|         public static TimeZoneInfo CreateCustomTimeZone(string id, TimeSpan baseUtcOffset, string displayName, string standardDisplayName, string daylightDisplayName, AdjustmentRule[] adjustmentRules, bool disableDaylightSavingTime)
 | |
|         {
 | |
|             return new TimeZoneInfo(id, baseUtcOffset, displayName, standardDisplayName, daylightDisplayName, adjustmentRules, disableDaylightSavingTime);
 | |
|         }
 | |
| 
 | |
|         public bool Equals(TimeZoneInfo other)
 | |
|         {
 | |
|             return (((other != null) && (string.Compare(this.m_id, other.m_id, StringComparison.OrdinalIgnoreCase) == 0)) && this.HasSameRules(other));
 | |
|         }
 | |
| 
 | |
|         [SecurityCritical, SecurityTreatAsSafe]
 | |
|         private static string FindIdFromTimeZoneInformation(NativeMethods.TimeZoneInformation timeZone, out bool dstDisabled)
 | |
|         {
 | |
|             dstDisabled = false;
 | |
|             try
 | |
|             {
 | |
|                 PermissionSet set = new PermissionSet(PermissionState.None);
 | |
|                 set.AddPermission(new RegistryPermission(RegistryPermissionAccess.Read, @"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones"));
 | |
|                 set.Assert();
 | |
|                 using (RegistryKey key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones", RegistryKeyPermissionCheck.Default, RegistryRights.ExecuteKey))
 | |
|                 {
 | |
|                     if (key == null)
 | |
|                     {
 | |
|                         return null;
 | |
|                     }
 | |
|                     foreach (string str in key.GetSubKeyNames())
 | |
|                     {
 | |
|                         if (TryCompareTimeZoneInformationToRegistry(timeZone, str, out dstDisabled))
 | |
|                         {
 | |
|                             return str;
 | |
|                         }
 | |
|                     }
 | |
|                 }
 | |
|             }
 | |
|             finally
 | |
|             {
 | |
|                 PermissionSet.RevertAssert();
 | |
|             }
 | |
|             return null;
 | |
|         }
 | |
| 
 | |
|         public static TimeZoneInfo FindSystemTimeZoneById(string id)
 | |
|         {
 | |
|             if (string.Compare(id, "UTC", StringComparison.OrdinalIgnoreCase) == 0)
 | |
|             {
 | |
|                 return Utc;
 | |
|             }
 | |
|             lock (s_internalSyncObject)
 | |
|             {
 | |
|                 return GetTimeZone(id);
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         public static TimeZoneInfo FromSerializedString(string source)
 | |
|         {
 | |
|             if (source == null)
 | |
|             {
 | |
|                 throw new ArgumentNullException("source");
 | |
|             }
 | |
|             if (source.Length == 0)
 | |
|             {
 | |
|                 throw new ArgumentException("Argument_InvalidSerializedString source");
 | |
|             }
 | |
|             return StringSerializer.GetDeserializedTimeZoneInfo(source);
 | |
|         }
 | |
| 
 | |
|         private AdjustmentRule GetAdjustmentRuleForTime(DateTime dateTime)
 | |
|         {
 | |
|             if ((this.m_adjustmentRules != null) && (this.m_adjustmentRules.Length != 0))
 | |
|             {
 | |
|                 DateTime date = dateTime.Date;
 | |
|                 for (int i = 0; i < this.m_adjustmentRules.Length; i++)
 | |
|                 {
 | |
|                     if ((this.m_adjustmentRules[i].DateStart <= date) && (this.m_adjustmentRules[i].DateEnd >= date))
 | |
|                     {
 | |
|                         return this.m_adjustmentRules[i];
 | |
|                     }
 | |
|                 }
 | |
|             }
 | |
|             return null;
 | |
|         }
 | |
| 
 | |
|         public AdjustmentRule[] GetAdjustmentRules()
 | |
|         {
 | |
|             if (this.m_adjustmentRules == null)
 | |
|             {
 | |
|                 return new AdjustmentRule[0];
 | |
|             }
 | |
|             return (AdjustmentRule[])this.m_adjustmentRules.Clone();
 | |
|         }
 | |
| 
 | |
|         public TimeSpan[] GetAmbiguousTimeOffsets(DateTime dateTime)
 | |
|         {
 | |
|             DateTime time;
 | |
|             bool flag;
 | |
|             if (!this.m_supportsDaylightSavingTime)
 | |
|             {
 | |
|                 throw new ArgumentException("Argument_DateTimeIsNotAmbiguous", "dateTime");
 | |
|             }
 | |
|             if (dateTime.Kind == DateTimeKind.Local)
 | |
|             {
 | |
|                 lock (s_internalSyncObject)
 | |
|                 {
 | |
|                     time = ConvertTime(dateTime, Local, this, TimeZoneInfoOptions.NoThrowOnInvalidTime);
 | |
|                     goto Label_007D;
 | |
|                 }
 | |
|             }
 | |
|             if (dateTime.Kind == DateTimeKind.Utc)
 | |
|             {
 | |
|                 lock (s_internalSyncObject)
 | |
|                 {
 | |
|                     time = ConvertTime(dateTime, Utc, this, TimeZoneInfoOptions.NoThrowOnInvalidTime);
 | |
|                     goto Label_007D;
 | |
|                 }
 | |
|             }
 | |
|             time = dateTime;
 | |
|         Label_007D:
 | |
|             flag = false;
 | |
|             AdjustmentRule adjustmentRuleForTime = this.GetAdjustmentRuleForTime(time);
 | |
|             if (adjustmentRuleForTime != null)
 | |
|             {
 | |
|                 DaylightTime daylightTime = GetDaylightTime(time.Year, adjustmentRuleForTime);
 | |
|                 flag = GetIsAmbiguousTime(time, adjustmentRuleForTime, daylightTime);
 | |
|             }
 | |
|             if (!flag)
 | |
|             {
 | |
|                 throw new ArgumentException("Argument_DateTimeIsNotAmbiguous", "dateTime");
 | |
|             }
 | |
|             TimeSpan[] spanArray = new TimeSpan[2];
 | |
|             if (adjustmentRuleForTime.DaylightDelta > TimeSpan.Zero)
 | |
|             {
 | |
|                 spanArray[0] = this.m_baseUtcOffset;
 | |
|                 spanArray[1] = this.m_baseUtcOffset + adjustmentRuleForTime.DaylightDelta;
 | |
|                 return spanArray;
 | |
|             }
 | |
|             spanArray[0] = this.m_baseUtcOffset + adjustmentRuleForTime.DaylightDelta;
 | |
|             spanArray[1] = this.m_baseUtcOffset;
 | |
|             return spanArray;
 | |
|         }
 | |
| 
 | |
|         public TimeSpan[] GetAmbiguousTimeOffsets(DateTimeOffset dateTimeOffset)
 | |
|         {
 | |
|             if (!this.m_supportsDaylightSavingTime)
 | |
|             {
 | |
|                 throw new ArgumentException("Argument_DateTimeOffsetIsNotAmbiguous", "dateTimeOffset");
 | |
|             }
 | |
|             DateTime dateTime = ConvertTime(dateTimeOffset, this).DateTime;
 | |
|             bool flag = false;
 | |
|             AdjustmentRule adjustmentRuleForTime = this.GetAdjustmentRuleForTime(dateTime);
 | |
|             if (adjustmentRuleForTime != null)
 | |
|             {
 | |
|                 DaylightTime daylightTime = GetDaylightTime(dateTime.Year, adjustmentRuleForTime);
 | |
|                 flag = GetIsAmbiguousTime(dateTime, adjustmentRuleForTime, daylightTime);
 | |
|             }
 | |
|             if (!flag)
 | |
|             {
 | |
|                 throw new ArgumentException("Argument_DateTimeOffsetIsNotAmbiguous", "dateTimeOffset");
 | |
|             }
 | |
|             TimeSpan[] spanArray = new TimeSpan[2];
 | |
|             if (adjustmentRuleForTime.DaylightDelta > TimeSpan.Zero)
 | |
|             {
 | |
|                 spanArray[0] = this.m_baseUtcOffset;
 | |
|                 spanArray[1] = this.m_baseUtcOffset + adjustmentRuleForTime.DaylightDelta;
 | |
|                 return spanArray;
 | |
|             }
 | |
|             spanArray[0] = this.m_baseUtcOffset + adjustmentRuleForTime.DaylightDelta;
 | |
|             spanArray[1] = this.m_baseUtcOffset;
 | |
|             return spanArray;
 | |
|         }
 | |
| 
 | |
|         private DateTimeKind GetCorrespondingKind()
 | |
|         {
 | |
|             if (this == s_utcTimeZone)
 | |
|             {
 | |
|                 return DateTimeKind.Utc;
 | |
|             }
 | |
|             if (this == s_localTimeZone)
 | |
|             {
 | |
|                 return DateTimeKind.Local;
 | |
|             }
 | |
|             return DateTimeKind.Unspecified;
 | |
|         }
 | |
| 
 | |
|         private static DaylightTime GetDaylightTime(int year, AdjustmentRule rule)
 | |
|         {
 | |
|             TimeSpan daylightDelta = rule.DaylightDelta;
 | |
|             DateTime start = TransitionTimeToDateTime(year, rule.DaylightTransitionStart);
 | |
|             return new DaylightTime(start, TransitionTimeToDateTime(year, rule.DaylightTransitionEnd), daylightDelta);
 | |
|         }
 | |
| 
 | |
|         public override int GetHashCode()
 | |
|         {
 | |
|             return this.m_id.ToUpperInvariant().GetHashCode();
 | |
|         }
 | |
| 
 | |
|         private static bool GetIsAmbiguousTime(DateTime time, AdjustmentRule rule, DaylightTime daylightTime)
 | |
|         {
 | |
|             bool flag = false;
 | |
|             if ((rule != null) && (rule.DaylightDelta != TimeSpan.Zero))
 | |
|             {
 | |
|                 DateTime end;
 | |
|                 DateTime time3;
 | |
|                 DateTime time4;
 | |
|                 DateTime time5;
 | |
|                 if (rule.DaylightDelta > TimeSpan.Zero)
 | |
|                 {
 | |
|                     end = daylightTime.End;
 | |
|                     time3 = daylightTime.End - rule.DaylightDelta;
 | |
|                 }
 | |
|                 else
 | |
|                 {
 | |
|                     end = daylightTime.Start;
 | |
|                     time3 = daylightTime.Start + rule.DaylightDelta;
 | |
|                 }
 | |
|                 flag = (time >= time3) && (time < end);
 | |
|                 if (flag || (end.Year == time3.Year))
 | |
|                 {
 | |
|                     return flag;
 | |
|                 }
 | |
|                 try
 | |
|                 {
 | |
|                     time4 = end.AddYears(1);
 | |
|                     time5 = time3.AddYears(1);
 | |
|                     flag = (time >= time5) && (time < time4);
 | |
|                 }
 | |
|                 catch (ArgumentOutOfRangeException)
 | |
|                 {
 | |
|                 }
 | |
|                 if (flag)
 | |
|                 {
 | |
|                     return flag;
 | |
|                 }
 | |
|                 try
 | |
|                 {
 | |
|                     time4 = end.AddYears(-1);
 | |
|                     time5 = time3.AddYears(-1);
 | |
|                     flag = (time >= time5) && (time < time4);
 | |
|                 }
 | |
|                 catch (ArgumentOutOfRangeException)
 | |
|                 {
 | |
|                 }
 | |
|             }
 | |
|             return flag;
 | |
|         }
 | |
| 
 | |
|         private static bool GetIsDaylightSavings(DateTime time, AdjustmentRule rule, DaylightTime daylightTime)
 | |
|         {
 | |
|             if (rule == null)
 | |
|             {
 | |
|                 return false;
 | |
|             }
 | |
|             bool flag = rule.DaylightDelta > TimeSpan.Zero;
 | |
|             DateTime startTime = daylightTime.Start + (flag ? rule.DaylightDelta : TimeSpan.Zero);
 | |
|             DateTime endTime = daylightTime.End + (flag ? -(rule.DaylightDelta) : TimeSpan.Zero);
 | |
|             return CheckIsDst(startTime, time, endTime);
 | |
|         }
 | |
| 
 | |
|         private static bool GetIsDaylightSavingsFromUtc(DateTime time, int Year, TimeSpan utc, AdjustmentRule rule)
 | |
|         {
 | |
|             if (rule == null)
 | |
|             {
 | |
|                 return false;
 | |
|             }
 | |
|             TimeSpan span = utc;
 | |
|             DaylightTime daylightTime = GetDaylightTime(Year, rule);
 | |
|             DateTime startTime = daylightTime.Start - span;
 | |
|             DateTime endTime = (daylightTime.End - span) - rule.DaylightDelta;
 | |
|             return CheckIsDst(startTime, time, endTime);
 | |
|         }
 | |
| 
 | |
|         private static bool GetIsInvalidTime(DateTime time, AdjustmentRule rule, DaylightTime daylightTime)
 | |
|         {
 | |
|             bool flag = false;
 | |
|             if ((rule != null) && (rule.DaylightDelta != TimeSpan.Zero))
 | |
|             {
 | |
|                 DateTime end;
 | |
|                 DateTime time3;
 | |
|                 DateTime time4;
 | |
|                 DateTime time5;
 | |
|                 if (rule.DaylightDelta < TimeSpan.Zero)
 | |
|                 {
 | |
|                     end = daylightTime.End;
 | |
|                     time3 = daylightTime.End - rule.DaylightDelta;
 | |
|                 }
 | |
|                 else
 | |
|                 {
 | |
|                     end = daylightTime.Start;
 | |
|                     time3 = daylightTime.Start + rule.DaylightDelta;
 | |
|                 }
 | |
|                 flag = (time >= end) && (time < time3);
 | |
|                 if (flag || (end.Year == time3.Year))
 | |
|                 {
 | |
|                     return flag;
 | |
|                 }
 | |
|                 try
 | |
|                 {
 | |
|                     time4 = end.AddYears(1);
 | |
|                     time5 = time3.AddYears(1);
 | |
|                     flag = (time >= time4) && (time < time5);
 | |
|                 }
 | |
|                 catch (ArgumentOutOfRangeException)
 | |
|                 {
 | |
|                 }
 | |
|                 if (flag)
 | |
|                 {
 | |
|                     return flag;
 | |
|                 }
 | |
|                 try
 | |
|                 {
 | |
|                     time4 = end.AddYears(-1);
 | |
|                     time5 = time3.AddYears(-1);
 | |
|                     flag = (time >= time4) && (time < time5);
 | |
|                 }
 | |
|                 catch (ArgumentOutOfRangeException)
 | |
|                 {
 | |
|                 }
 | |
|             }
 | |
|             return flag;
 | |
|         }
 | |
| 
 | |
|         [SecurityCritical]
 | |
|         private static TimeZoneInfo GetLocalTimeZone()
 | |
|         {
 | |
|             string id = null;
 | |
|             try
 | |
|             {
 | |
|                 TimeZoneInfo info;
 | |
|                 Exception exception;
 | |
|                 TimeZoneInfo info2;
 | |
|                 Exception exception2;
 | |
|                 NativeMethods.DynamicTimeZoneInformation lpDynamicTimeZoneInformation = new NativeMethods.DynamicTimeZoneInformation();
 | |
|                 long dynamicTimeZoneInformation = UnsafeNativeMethods.GetDynamicTimeZoneInformation(out lpDynamicTimeZoneInformation);
 | |
|                 if (dynamicTimeZoneInformation == -1L)
 | |
|                 {
 | |
|                     return CreateCustomTimeZone("Local", TimeSpan.Zero, "Local", "Local");
 | |
|                 }
 | |
|                 NativeMethods.TimeZoneInformation timeZone = new NativeMethods.TimeZoneInformation(lpDynamicTimeZoneInformation);
 | |
|                 bool dstDisabled = CheckDaylightSavingTimeDisabled();
 | |
|                 if (!string.IsNullOrEmpty(lpDynamicTimeZoneInformation.TimeZoneKeyName) && (TryGetTimeZone(lpDynamicTimeZoneInformation.TimeZoneKeyName, dstDisabled, out info, out exception) == TimeZoneInfoResult.Success))
 | |
|                 {
 | |
|                     return info;
 | |
|                 }
 | |
|                 id = FindIdFromTimeZoneInformation(timeZone, out dstDisabled);
 | |
|                 if ((id != null) && (TryGetTimeZone(id, dstDisabled, out info2, out exception2) == TimeZoneInfoResult.Success))
 | |
|                 {
 | |
|                     return info2;
 | |
|                 }
 | |
|                 return GetLocalTimeZoneFromWin32Data(timeZone, dstDisabled);
 | |
|             }
 | |
|             catch (EntryPointNotFoundException)
 | |
|             {
 | |
|                 bool flag2;
 | |
|                 TimeZoneInfo info3;
 | |
|                 Exception exception3;
 | |
|                 NativeMethods.TimeZoneInformation lpTimeZoneInformation = new NativeMethods.TimeZoneInformation();
 | |
|                 long timeZoneInformation = UnsafeNativeMethods.GetTimeZoneInformation(out lpTimeZoneInformation);
 | |
|                 if (timeZoneInformation == -1L)
 | |
|                 {
 | |
|                     return CreateCustomTimeZone("Local", TimeSpan.Zero, "Local", "Local");
 | |
|                 }
 | |
|                 id = FindIdFromTimeZoneInformation(lpTimeZoneInformation, out flag2);
 | |
|                 if ((id != null) && (TryGetTimeZone(id, flag2, out info3, out exception3) == TimeZoneInfoResult.Success))
 | |
|                 {
 | |
|                     return info3;
 | |
|                 }
 | |
|                 return GetLocalTimeZoneFromWin32Data(lpTimeZoneInformation, flag2);
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         private static TimeZoneInfo GetLocalTimeZoneFromWin32Data(NativeMethods.TimeZoneInformation timeZoneInformation, bool dstDisabled)
 | |
|         {
 | |
|             TimeZoneInfo info = null;
 | |
|             try
 | |
|             {
 | |
|                 info = new TimeZoneInfo(timeZoneInformation, dstDisabled);
 | |
|             }
 | |
|             catch (ArgumentException)
 | |
|             {
 | |
|             }
 | |
|             catch (InvalidTimeZoneException)
 | |
|             {
 | |
|             }
 | |
|             return info;
 | |
|             try
 | |
|             {
 | |
|                 info = new TimeZoneInfo(timeZoneInformation, true);
 | |
|             }
 | |
|             catch (ArgumentException)
 | |
|             {
 | |
|             }
 | |
|             catch (InvalidTimeZoneException)
 | |
|             {
 | |
|             }
 | |
|             return info;
 | |
|         }
 | |
| 
 | |
|         [SecurityTreatAsSafe, SecurityCritical]
 | |
|         public static List<TimeZoneInfo> GetSystemTimeZones()
 | |
|         {
 | |
|             lock (s_internalSyncObject)
 | |
|             {
 | |
|                 if (!s_allSystemTimeZonesRead)
 | |
|                 {
 | |
|                     PermissionSet set = new PermissionSet(PermissionState.None);
 | |
|                     set.AddPermission(new RegistryPermission(RegistryPermissionAccess.Read, @"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones"));
 | |
|                     set.Assert();
 | |
|                     using (RegistryKey key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones", RegistryKeyPermissionCheck.Default, RegistryRights.ExecuteKey))
 | |
|                     {
 | |
|                         if (key == null)
 | |
|                         {
 | |
|                             List<TimeZoneInfo> list;
 | |
|                             if (s_systemTimeZones != null)
 | |
|                             {
 | |
|                                 list = new List<TimeZoneInfo>(s_systemTimeZones.Values);
 | |
|                             }
 | |
|                             else
 | |
|                             {
 | |
|                                 list = new List<TimeZoneInfo>();
 | |
|                             }
 | |
|                             s_readOnlySystemTimeZones = new List<TimeZoneInfo>(list);
 | |
|                             s_allSystemTimeZonesRead = true;
 | |
|                             return s_readOnlySystemTimeZones;
 | |
|                         }
 | |
|                         foreach (string str in key.GetSubKeyNames())
 | |
|                         {
 | |
|                             TimeZoneInfo info;
 | |
|                             Exception exception;
 | |
|                             TryGetTimeZone(str, false, out info, out exception);
 | |
|                         }
 | |
|                     }
 | |
|                     IComparer<TimeZoneInfo> comparer = new TimeZoneInfoComparer();
 | |
|                     List<TimeZoneInfo> list2 = new List<TimeZoneInfo>(s_systemTimeZones.Values);
 | |
|                     list2.Sort(comparer);
 | |
|                     s_readOnlySystemTimeZones = new List<TimeZoneInfo>(list2);
 | |
|                     s_allSystemTimeZonesRead = true;
 | |
|                 }
 | |
|                 return s_readOnlySystemTimeZones;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         private static TimeZoneInfo GetTimeZone(string id)
 | |
|         {
 | |
|             TimeZoneInfo info;
 | |
|             Exception exception;
 | |
|             if (id == null)
 | |
|             {
 | |
|                 throw new ArgumentNullException("id");
 | |
|             }
 | |
|             if (((id.Length == 0) || (id.Length > 0xff)) || id.Contains("\0"))
 | |
|             {
 | |
|                 throw new TimeZoneNotFoundException("TimeZoneNotFound_MissingRegistryData, id");
 | |
|             }
 | |
|             switch (TryGetTimeZone(id, false, out info, out exception))
 | |
|             {
 | |
|                 case TimeZoneInfoResult.Success:
 | |
|                     return info;
 | |
| 
 | |
|                 case TimeZoneInfoResult.InvalidTimeZoneException:
 | |
|                     throw new InvalidTimeZoneException("InvalidTimeZone_InvalidRegistryData, id", exception);
 | |
| 
 | |
|                 case TimeZoneInfoResult.SecurityException:
 | |
|                     throw new SecurityException("Security_CannotReadRegistryData, id", exception);
 | |
|             }
 | |
|             throw new TimeZoneNotFoundException("TimeZoneNotFound_MissingRegistryData, id", exception);
 | |
|         }
 | |
| 
 | |
|         public TimeSpan GetUtcOffset(DateTime dateTime)
 | |
|         {
 | |
|             if (dateTime.Kind == DateTimeKind.Local)
 | |
|             {
 | |
|                 DateTime time;
 | |
|                 lock (s_internalSyncObject)
 | |
|                 {
 | |
|                     if (this.GetCorrespondingKind() == DateTimeKind.Local)
 | |
|                     {
 | |
|                         return GetUtcOffset(dateTime, this);
 | |
|                     }
 | |
|                     time = ConvertTime(dateTime, Local, Utc, TimeZoneInfoOptions.NoThrowOnInvalidTime);
 | |
|                 }
 | |
|                 return GetUtcOffsetFromUtc(time, this);
 | |
|             }
 | |
|             if (dateTime.Kind != DateTimeKind.Utc)
 | |
|             {
 | |
|                 return GetUtcOffset(dateTime, this);
 | |
|             }
 | |
|             if (this.GetCorrespondingKind() == DateTimeKind.Utc)
 | |
|             {
 | |
|                 return this.m_baseUtcOffset;
 | |
|             }
 | |
|             return GetUtcOffsetFromUtc(dateTime, this);
 | |
|         }
 | |
| 
 | |
|         public TimeSpan GetUtcOffset(DateTimeOffset dateTimeOffset)
 | |
|         {
 | |
|             return GetUtcOffsetFromUtc(dateTimeOffset.UtcDateTime, this);
 | |
|         }
 | |
| 
 | |
|         private static TimeSpan GetUtcOffset(DateTime time, TimeZoneInfo zone)
 | |
|         {
 | |
|             TimeSpan baseUtcOffset = zone.BaseUtcOffset;
 | |
|             AdjustmentRule adjustmentRuleForTime = zone.GetAdjustmentRuleForTime(time);
 | |
|             if (adjustmentRuleForTime != null)
 | |
|             {
 | |
|                 DaylightTime daylightTime = GetDaylightTime(time.Year, adjustmentRuleForTime);
 | |
|                 bool flag = GetIsDaylightSavings(time, adjustmentRuleForTime, daylightTime);
 | |
|                 baseUtcOffset += flag ? adjustmentRuleForTime.DaylightDelta : TimeSpan.Zero;
 | |
|             }
 | |
|             return baseUtcOffset;
 | |
|         }
 | |
| 
 | |
|         private static TimeSpan GetUtcOffsetFromUtc(DateTime time, TimeZoneInfo zone)
 | |
|         {
 | |
|             bool flag;
 | |
|             return GetUtcOffsetFromUtc(time, zone, out flag);
 | |
|         }
 | |
| 
 | |
|         private static TimeSpan GetUtcOffsetFromUtc(DateTime time, TimeZoneInfo zone, out bool isDaylightSavings)
 | |
|         {
 | |
|             int year;
 | |
|             AdjustmentRule adjustmentRuleForTime;
 | |
|             isDaylightSavings = false;
 | |
|             TimeSpan baseUtcOffset = zone.BaseUtcOffset;
 | |
|             if (time > new DateTime(0x270f, 12, 0x1f))
 | |
|             {
 | |
|                 adjustmentRuleForTime = zone.GetAdjustmentRuleForTime(DateTime.MaxValue);
 | |
|                 year = 0x270f;
 | |
|             }
 | |
|             else if (time < new DateTime(1, 1, 2))
 | |
|             {
 | |
|                 adjustmentRuleForTime = zone.GetAdjustmentRuleForTime(DateTime.MinValue);
 | |
|                 year = 1;
 | |
|             }
 | |
|             else
 | |
|             {
 | |
|                 DateTime dateTime = time + baseUtcOffset;
 | |
|                 year = time.Year;
 | |
|                 adjustmentRuleForTime = zone.GetAdjustmentRuleForTime(dateTime);
 | |
|             }
 | |
|             if (adjustmentRuleForTime != null)
 | |
|             {
 | |
|                 isDaylightSavings = GetIsDaylightSavingsFromUtc(time, year, zone.m_baseUtcOffset, adjustmentRuleForTime);
 | |
|                 baseUtcOffset += isDaylightSavings ? adjustmentRuleForTime.DaylightDelta : TimeSpan.Zero;
 | |
|             }
 | |
|             return baseUtcOffset;
 | |
|         }
 | |
| 
 | |
|         public bool HasSameRules(TimeZoneInfo other)
 | |
|         {
 | |
|             if (other == null)
 | |
|             {
 | |
|                 throw new ArgumentNullException("other");
 | |
|             }
 | |
|             if ((this.m_baseUtcOffset != other.m_baseUtcOffset) || (this.m_supportsDaylightSavingTime != other.m_supportsDaylightSavingTime))
 | |
|             {
 | |
|                 return false;
 | |
|             }
 | |
|             AdjustmentRule[] adjustmentRules = this.m_adjustmentRules;
 | |
|             AdjustmentRule[] ruleArray2 = other.m_adjustmentRules;
 | |
|             bool flag = ((adjustmentRules == null) && (ruleArray2 == null)) || ((adjustmentRules != null) && (ruleArray2 != null));
 | |
|             if (!flag)
 | |
|             {
 | |
|                 return false;
 | |
|             }
 | |
|             if (adjustmentRules != null)
 | |
|             {
 | |
|                 if (adjustmentRules.Length != ruleArray2.Length)
 | |
|                 {
 | |
|                     return false;
 | |
|                 }
 | |
|                 for (int i = 0; i < adjustmentRules.Length; i++)
 | |
|                 {
 | |
|                     if (!adjustmentRules[i].Equals(ruleArray2[i]))
 | |
|                     {
 | |
|                         return false;
 | |
|                     }
 | |
|                 }
 | |
|             }
 | |
|             return flag;
 | |
|         }
 | |
| 
 | |
|         public bool IsAmbiguousTime(DateTime dateTime)
 | |
|         {
 | |
|             DateTime time;
 | |
|             AdjustmentRule rule;
 | |
|             if (!this.m_supportsDaylightSavingTime)
 | |
|             {
 | |
|                 return false;
 | |
|             }
 | |
|             if (dateTime.Kind == DateTimeKind.Local)
 | |
|             {
 | |
|                 lock (s_internalSyncObject)
 | |
|                 {
 | |
|                     time = ConvertTime(dateTime, Local, this, TimeZoneInfoOptions.NoThrowOnInvalidTime);
 | |
|                     goto Label_0068;
 | |
|                 }
 | |
|             }
 | |
|             if (dateTime.Kind == DateTimeKind.Utc)
 | |
|             {
 | |
|                 lock (s_internalSyncObject)
 | |
|                 {
 | |
|                     time = ConvertTime(dateTime, Utc, this, TimeZoneInfoOptions.NoThrowOnInvalidTime);
 | |
|                     goto Label_0068;
 | |
|                 }
 | |
|             }
 | |
|             time = dateTime;
 | |
|         Label_0068:
 | |
|             rule = this.GetAdjustmentRuleForTime(time);
 | |
|             if (rule != null)
 | |
|             {
 | |
|                 DaylightTime daylightTime = GetDaylightTime(time.Year, rule);
 | |
|                 return GetIsAmbiguousTime(time, rule, daylightTime);
 | |
|             }
 | |
|             return false;
 | |
|         }
 | |
| 
 | |
|         public bool IsAmbiguousTime(DateTimeOffset dateTimeOffset)
 | |
|         {
 | |
|             if (!this.m_supportsDaylightSavingTime)
 | |
|             {
 | |
|                 return false;
 | |
|             }
 | |
|             DateTimeOffset offset = ConvertTime(dateTimeOffset, this);
 | |
|             return this.IsAmbiguousTime(offset.DateTime);
 | |
|         }
 | |
| 
 | |
|         public bool IsDaylightSavingTime(DateTime dateTime)
 | |
|         {
 | |
|             DateTime time;
 | |
|             AdjustmentRule rule;
 | |
|             if (!this.m_supportsDaylightSavingTime || (this.m_adjustmentRules == null))
 | |
|             {
 | |
|                 return false;
 | |
|             }
 | |
|             if (dateTime.Kind == DateTimeKind.Local)
 | |
|             {
 | |
|                 lock (s_internalSyncObject)
 | |
|                 {
 | |
|                     time = ConvertTime(dateTime, Local, this, TimeZoneInfoOptions.NoThrowOnInvalidTime);
 | |
|                     goto Label_0064;
 | |
|                 }
 | |
|             }
 | |
|             if (dateTime.Kind == DateTimeKind.Utc)
 | |
|             {
 | |
|                 bool flag;
 | |
|                 if (this.GetCorrespondingKind() == DateTimeKind.Utc)
 | |
|                 {
 | |
|                     return false;
 | |
|                 }
 | |
|                 GetUtcOffsetFromUtc(dateTime, this, out flag);
 | |
|                 return flag;
 | |
|             }
 | |
|             time = dateTime;
 | |
|         Label_0064:
 | |
|             rule = this.GetAdjustmentRuleForTime(time);
 | |
|             if (rule != null)
 | |
|             {
 | |
|                 DaylightTime daylightTime = GetDaylightTime(time.Year, rule);
 | |
|                 return GetIsDaylightSavings(time, rule, daylightTime);
 | |
|             }
 | |
|             return false;
 | |
|         }
 | |
| 
 | |
|         public bool IsDaylightSavingTime(DateTimeOffset dateTimeOffset)
 | |
|         {
 | |
|             bool flag;
 | |
|             GetUtcOffsetFromUtc(dateTimeOffset.UtcDateTime, this, out flag);
 | |
|             return flag;
 | |
|         }
 | |
| 
 | |
|         public bool IsInvalidTime(DateTime dateTime)
 | |
|         {
 | |
|             bool flag = false;
 | |
|             if ((dateTime.Kind != DateTimeKind.Unspecified) && ((dateTime.Kind != DateTimeKind.Local) || (this.GetCorrespondingKind() != DateTimeKind.Local)))
 | |
|             {
 | |
|                 return flag;
 | |
|             }
 | |
|             AdjustmentRule adjustmentRuleForTime = this.GetAdjustmentRuleForTime(dateTime);
 | |
|             if (adjustmentRuleForTime != null)
 | |
|             {
 | |
|                 DaylightTime daylightTime = GetDaylightTime(dateTime.Year, adjustmentRuleForTime);
 | |
|                 return GetIsInvalidTime(dateTime, adjustmentRuleForTime, daylightTime);
 | |
|             }
 | |
|             return false;
 | |
|         }
 | |
| 
 | |
|         void IDeserializationCallback.OnDeserialization(object sender)
 | |
|         {
 | |
|             try
 | |
|             {
 | |
|                 bool flag;
 | |
|                 ValidateTimeZoneInfo(this.m_id, this.m_baseUtcOffset, this.m_adjustmentRules, out flag);
 | |
|                 if (flag != this.m_supportsDaylightSavingTime)
 | |
|                 {
 | |
|                    throw new SerializationException("Serialization_CorruptField, SupportsDaylightSavingTime" );
 | |
|                 }
 | |
|             }
 | |
|             catch (ArgumentException exception)
 | |
|             {
 | |
|                 throw new SerializationException("Serialization_InvalidData", exception);
 | |
|             }
 | |
|             catch (InvalidTimeZoneException exception2)
 | |
|             {
 | |
|                 throw new SerializationException("Serialization_InvalidData", exception2);
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         [SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.SerializationFormatter)]
 | |
|         void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)
 | |
|         {
 | |
|             if (info == null)
 | |
|             {
 | |
|                 throw new ArgumentNullException("info");
 | |
|             }
 | |
|             info.AddValue("Id", this.m_id);
 | |
|             info.AddValue("DisplayName", this.m_displayName);
 | |
|             info.AddValue("StandardName", this.m_standardDisplayName);
 | |
|             info.AddValue("DaylightName", this.m_daylightDisplayName);
 | |
|             info.AddValue("BaseUtcOffset", this.m_baseUtcOffset);
 | |
|             info.AddValue("AdjustmentRules", this.m_adjustmentRules);
 | |
|             info.AddValue("SupportsDaylightSavingTime", this.m_supportsDaylightSavingTime);
 | |
|         }
 | |
| 
 | |
|         public string ToSerializedString()
 | |
|         {
 | |
|             return StringSerializer.GetSerializedString(this);
 | |
|         }
 | |
| 
 | |
|         public override string ToString()
 | |
|         {
 | |
|             return this.DisplayName;
 | |
|         }
 | |
| 
 | |
|         private static TransitionTime? TransitionTimeFromTimeZoneInformation(NativeMethods.RegistryTimeZoneInformation timeZoneInformation, bool readStartDate)
 | |
|         {
 | |
|             TransitionTime time;
 | |
|             if (timeZoneInformation.StandardDate.Month == 0)
 | |
|             {
 | |
|                 return null;
 | |
|             }
 | |
|             if (readStartDate)
 | |
|             {
 | |
|                 if (timeZoneInformation.DaylightDate.Year == 0)
 | |
|                 {
 | |
|                     time = TransitionTime.CreateFloatingDateRule(new DateTime(1, 1, 1, timeZoneInformation.DaylightDate.Hour, timeZoneInformation.DaylightDate.Minute, timeZoneInformation.DaylightDate.Second, timeZoneInformation.DaylightDate.Milliseconds), timeZoneInformation.DaylightDate.Month, timeZoneInformation.DaylightDate.Day, (DayOfWeek)timeZoneInformation.DaylightDate.DayOfWeek);
 | |
|                 }
 | |
|                 else
 | |
|                 {
 | |
|                     time = TransitionTime.CreateFixedDateRule(new DateTime(1, 1, 1, timeZoneInformation.DaylightDate.Hour, timeZoneInformation.DaylightDate.Minute, timeZoneInformation.DaylightDate.Second, timeZoneInformation.DaylightDate.Milliseconds), timeZoneInformation.DaylightDate.Month, timeZoneInformation.DaylightDate.Day);
 | |
|                 }
 | |
|             }
 | |
|             else if (timeZoneInformation.StandardDate.Year == 0)
 | |
|             {
 | |
|                 time = TransitionTime.CreateFloatingDateRule(new DateTime(1, 1, 1, timeZoneInformation.StandardDate.Hour, timeZoneInformation.StandardDate.Minute, timeZoneInformation.StandardDate.Second, timeZoneInformation.StandardDate.Milliseconds), timeZoneInformation.StandardDate.Month, timeZoneInformation.StandardDate.Day, (DayOfWeek)timeZoneInformation.StandardDate.DayOfWeek);
 | |
|             }
 | |
|             else
 | |
|             {
 | |
|                 time = TransitionTime.CreateFixedDateRule(new DateTime(1, 1, 1, timeZoneInformation.StandardDate.Hour, timeZoneInformation.StandardDate.Minute, timeZoneInformation.StandardDate.Second, timeZoneInformation.StandardDate.Milliseconds), timeZoneInformation.StandardDate.Month, timeZoneInformation.StandardDate.Day);
 | |
|             }
 | |
|             return new TransitionTime?(time);
 | |
|         }
 | |
| 
 | |
|         private static DateTime TransitionTimeToDateTime(int year, TransitionTime transitionTime)
 | |
|         {
 | |
|             DateTime time;
 | |
|             DateTime timeOfDay = transitionTime.TimeOfDay;
 | |
|             if (transitionTime.IsFixedDateRule)
 | |
|             {
 | |
|                 int num = DateTime.DaysInMonth(year, transitionTime.Month);
 | |
|                 return new DateTime(year, transitionTime.Month, (num < transitionTime.Day) ? num : transitionTime.Day, timeOfDay.Hour, timeOfDay.Minute, timeOfDay.Second, timeOfDay.Millisecond);
 | |
|             }
 | |
|             if (transitionTime.Week <= 4)
 | |
|             {
 | |
|                 time = new DateTime(year, transitionTime.Month, 1, timeOfDay.Hour, timeOfDay.Minute, timeOfDay.Second, timeOfDay.Millisecond);
 | |
|                 int dayOfWeek = (int)time.DayOfWeek;
 | |
|                 int num3 = ((int)transitionTime.DayOfWeek) - dayOfWeek;
 | |
|                 if (num3 < 0)
 | |
|                 {
 | |
|                     num3 += 7;
 | |
|                 }
 | |
|                 num3 += 7 * (transitionTime.Week - 1);
 | |
|                 if (num3 > 0)
 | |
|                 {
 | |
|                     time = time.AddDays((double)num3);
 | |
|                 }
 | |
|                 return time;
 | |
|             }
 | |
|             int day = DateTime.DaysInMonth(year, transitionTime.Month);
 | |
|             time = new DateTime(year, transitionTime.Month, day, timeOfDay.Hour, timeOfDay.Minute, timeOfDay.Second, timeOfDay.Millisecond);
 | |
|             int num6 = (int)(time.DayOfWeek - transitionTime.DayOfWeek);
 | |
|             if (num6 < 0)
 | |
|             {
 | |
|                 num6 += 7;
 | |
|             }
 | |
|             if (num6 > 0)
 | |
|             {
 | |
|                 time = time.AddDays((double)-num6);
 | |
|             }
 | |
|             return time;
 | |
|         }
 | |
| 
 | |
|         private static bool TryCompareStandardDate(NativeMethods.TimeZoneInformation timeZone, NativeMethods.RegistryTimeZoneInformation registryTimeZoneInfo)
 | |
|         {
 | |
|             return ((((((timeZone.Bias == registryTimeZoneInfo.Bias) && (timeZone.StandardBias == registryTimeZoneInfo.StandardBias)) && ((timeZone.StandardDate.Year == registryTimeZoneInfo.StandardDate.Year) && (timeZone.StandardDate.Month == registryTimeZoneInfo.StandardDate.Month))) && (((timeZone.StandardDate.DayOfWeek == registryTimeZoneInfo.StandardDate.DayOfWeek) && (timeZone.StandardDate.Day == registryTimeZoneInfo.StandardDate.Day)) && ((timeZone.StandardDate.Hour == registryTimeZoneInfo.StandardDate.Hour) && (timeZone.StandardDate.Minute == registryTimeZoneInfo.StandardDate.Minute)))) && (timeZone.StandardDate.Second == registryTimeZoneInfo.StandardDate.Second)) && (timeZone.StandardDate.Milliseconds == registryTimeZoneInfo.StandardDate.Milliseconds));
 | |
|         }
 | |
| 
 | |
|         [SecurityTreatAsSafe, SecurityCritical]
 | |
|         private static bool TryCompareTimeZoneInformationToRegistry(NativeMethods.TimeZoneInformation timeZone, string id, out bool dstDisabled)
 | |
|         {
 | |
|             bool flag2;
 | |
|             dstDisabled = false;
 | |
|             try
 | |
|             {
 | |
|                 PermissionSet set = new PermissionSet(PermissionState.None);
 | |
|                 set.AddPermission(new RegistryPermission(RegistryPermissionAccess.Read, @"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones"));
 | |
|                 set.Assert();
 | |
|                 using (RegistryKey key = Registry.LocalMachine.OpenSubKey(string.Format(CultureInfo.InvariantCulture, @"{0}\{1}", new object[] { @"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones", id }), RegistryKeyPermissionCheck.Default, RegistryRights.ExecuteKey))
 | |
|                 {
 | |
|                     NativeMethods.RegistryTimeZoneInformation information;
 | |
|                     if (key == null)
 | |
|                     {
 | |
|                         return false;
 | |
|                     }
 | |
|                     try
 | |
|                     {
 | |
|                         information = new NativeMethods.RegistryTimeZoneInformation((byte[])key.GetValue("TZI", null, RegistryValueOptions.None));
 | |
|                     }
 | |
|                     catch (InvalidCastException)
 | |
|                     {
 | |
|                         return false;
 | |
|                     }
 | |
|                     catch (ArgumentException)
 | |
|                     {
 | |
|                         return false;
 | |
|                     }
 | |
|                     if (!TryCompareStandardDate(timeZone, information))
 | |
|                     {
 | |
|                         return false;
 | |
|                     }
 | |
|                     dstDisabled = CheckDaylightSavingTimeDisabled();
 | |
|                     bool flag = (dstDisabled || CheckDaylightSavingTimeNotSupported(timeZone)) || (((((timeZone.DaylightBias == information.DaylightBias) && (timeZone.DaylightDate.Year == information.DaylightDate.Year)) && ((timeZone.DaylightDate.Month == information.DaylightDate.Month) && (timeZone.DaylightDate.DayOfWeek == information.DaylightDate.DayOfWeek))) && (((timeZone.DaylightDate.Day == information.DaylightDate.Day) && (timeZone.DaylightDate.Hour == information.DaylightDate.Hour)) && ((timeZone.DaylightDate.Minute == information.DaylightDate.Minute) && (timeZone.DaylightDate.Second == information.DaylightDate.Second)))) && (timeZone.DaylightDate.Milliseconds == information.DaylightDate.Milliseconds));
 | |
|                     if (flag)
 | |
|                     {
 | |
|                         string strA = key.GetValue("Std", string.Empty, RegistryValueOptions.None) as string;
 | |
|                         flag = string.Compare(strA, timeZone.StandardName, StringComparison.Ordinal) == 0;
 | |
|                     }
 | |
|                     flag2 = flag;
 | |
|                 }
 | |
|             }
 | |
|             finally
 | |
|             {
 | |
|                 PermissionSet.RevertAssert();
 | |
|             }
 | |
|             return flag2;
 | |
|         }
 | |
| 
 | |
|         private static bool TryCreateAdjustmentRules(string id, NativeMethods.RegistryTimeZoneInformation defaultTimeZoneInformation, out AdjustmentRule[] rules, out Exception e)
 | |
|         {
 | |
|             e = null;
 | |
|             try
 | |
|             {
 | |
|                 using (RegistryKey key = Registry.LocalMachine.OpenSubKey(string.Format(CultureInfo.InvariantCulture, @"{0}\{1}\Dynamic DST", new object[] { @"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones", id }), RegistryKeyPermissionCheck.Default, RegistryRights.ExecuteKey))
 | |
|                 {
 | |
|                     if (key == null)
 | |
|                     {
 | |
|                         AdjustmentRule rule = CreateAdjustmentRuleFromTimeZoneInformation(defaultTimeZoneInformation, DateTime.MinValue.Date, DateTime.MaxValue.Date);
 | |
|                         if (rule == null)
 | |
|                         {
 | |
|                             rules = null;
 | |
|                         }
 | |
|                         else
 | |
|                         {
 | |
|                             rules = new AdjustmentRule[] { rule };
 | |
|                         }
 | |
|                         return true;
 | |
|                     }
 | |
|                     int year = (int)key.GetValue("FirstEntry", -1, RegistryValueOptions.None);
 | |
|                     int num2 = (int)key.GetValue("LastEntry", -1, RegistryValueOptions.None);
 | |
|                     if (((year == -1) || (num2 == -1)) || (year > num2))
 | |
|                     {
 | |
|                         rules = null;
 | |
|                         return false;
 | |
|                     }
 | |
|                     NativeMethods.RegistryTimeZoneInformation timeZoneInformation = new NativeMethods.RegistryTimeZoneInformation((byte[])key.GetValue(year.ToString(CultureInfo.InvariantCulture), null, RegistryValueOptions.None));
 | |
|                     if (year == num2)
 | |
|                     {
 | |
|                         AdjustmentRule rule2 = CreateAdjustmentRuleFromTimeZoneInformation(timeZoneInformation, DateTime.MinValue.Date, DateTime.MaxValue.Date);
 | |
|                         if (rule2 == null)
 | |
|                         {
 | |
|                             rules = null;
 | |
|                         }
 | |
|                         else
 | |
|                         {
 | |
|                             rules = new AdjustmentRule[] { rule2 };
 | |
|                         }
 | |
|                         return true;
 | |
|                     }
 | |
|                     List<AdjustmentRule> list = new List<AdjustmentRule>(1);
 | |
|                     AdjustmentRule item = CreateAdjustmentRuleFromTimeZoneInformation(timeZoneInformation, DateTime.MinValue.Date, new DateTime(year, 12, 0x1f));
 | |
|                     if (item != null)
 | |
|                     {
 | |
|                         list.Add(item);
 | |
|                     }
 | |
|                     for (int i = year + 1; i < num2; i++)
 | |
|                     {
 | |
|                         timeZoneInformation = new NativeMethods.RegistryTimeZoneInformation((byte[])key.GetValue(i.ToString(CultureInfo.InvariantCulture), null, RegistryValueOptions.None));
 | |
|                         AdjustmentRule rule4 = CreateAdjustmentRuleFromTimeZoneInformation(timeZoneInformation, new DateTime(i, 1, 1), new DateTime(i, 12, 0x1f));
 | |
|                         if (rule4 != null)
 | |
|                         {
 | |
|                             list.Add(rule4);
 | |
|                         }
 | |
|                     }
 | |
|                     timeZoneInformation = new NativeMethods.RegistryTimeZoneInformation((byte[])key.GetValue(num2.ToString(CultureInfo.InvariantCulture), null, RegistryValueOptions.None));
 | |
|                     AdjustmentRule rule5 = CreateAdjustmentRuleFromTimeZoneInformation(timeZoneInformation, new DateTime(num2, 1, 1), DateTime.MaxValue.Date);
 | |
|                     if (rule5 != null)
 | |
|                     {
 | |
|                         list.Add(rule5);
 | |
|                     }
 | |
|                     rules = list.ToArray();
 | |
|                     if ((rules != null) && (rules.Length == 0))
 | |
|                     {
 | |
|                         rules = null;
 | |
|                     }
 | |
|                 }
 | |
|             }
 | |
|             catch (InvalidCastException exception)
 | |
|             {
 | |
|                 rules = null;
 | |
|                 e = exception;
 | |
|                 return false;
 | |
|             }
 | |
|             catch (ArgumentOutOfRangeException exception2)
 | |
|             {
 | |
|                 rules = null;
 | |
|                 e = exception2;
 | |
|                 return false;
 | |
|             }
 | |
|             catch (ArgumentException exception3)
 | |
|             {
 | |
|                 rules = null;
 | |
|                 e = exception3;
 | |
|                 return false;
 | |
|             }
 | |
|             return true;
 | |
|         }
 | |
| 
 | |
|         [SecurityTreatAsSafe, SecurityCritical, FileIOPermission(SecurityAction.Assert, AllLocalFiles = FileIOPermissionAccess.PathDiscovery)]
 | |
|         private static string TryGetLocalizedNameByMuiNativeResource(string resource)
 | |
|         {
 | |
|             string str;
 | |
|             int num;
 | |
|             if (string.IsNullOrEmpty(resource))
 | |
|             {
 | |
|                 return string.Empty;
 | |
|             }
 | |
|             string[] strArray = resource.Split(new char[] { ',' }, StringSplitOptions.None);
 | |
|             if (strArray.Length != 2)
 | |
|             {
 | |
|                 return string.Empty;
 | |
|             }
 | |
|             string folderPath = Environment.GetFolderPath(Environment.SpecialFolder.System);
 | |
|             string str3 = strArray[0].TrimStart(new char[] { '@' });
 | |
|             try
 | |
|             {
 | |
|                 str = Path.Combine(folderPath, str3);
 | |
|             }
 | |
|             catch (ArgumentException)
 | |
|             {
 | |
|                 return string.Empty;
 | |
|             }
 | |
|             if (!int.TryParse(strArray[1], NumberStyles.Integer, CultureInfo.InvariantCulture, out num))
 | |
|             {
 | |
|                 return string.Empty;
 | |
|             }
 | |
|             num = -num;
 | |
|             try
 | |
|             {
 | |
|                 StringBuilder fileMuiPath = new StringBuilder(260);
 | |
|                 fileMuiPath.Length = 260;
 | |
|                 int fileMuiPathLength = 260;
 | |
|                 int languageLength = 0;
 | |
|                 long enumerator = 0L;
 | |
|                 if (!UnsafeNativeMethods.GetFileMUIPath(0x10, str, null, ref languageLength, fileMuiPath, ref fileMuiPathLength, ref enumerator))
 | |
|                 {
 | |
|                     return string.Empty;
 | |
|                 }
 | |
|                 return TryGetLocalizedNameByNativeResource(fileMuiPath.ToString(), num);
 | |
|             }
 | |
|             catch (EntryPointNotFoundException)
 | |
|             {
 | |
|                 return string.Empty;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         [SecurityCritical]
 | |
|         private static string TryGetLocalizedNameByNativeResource(string filePath, int resource)
 | |
|         {
 | |
|             if (File.Exists(filePath))
 | |
|             {
 | |
|                 using (SafeLibraryHandle handle = UnsafeNativeMethods.LoadLibraryEx(filePath, IntPtr.Zero, 2))
 | |
|                 {
 | |
|                     if (!handle.IsInvalid)
 | |
|                     {
 | |
|                         StringBuilder buffer = new StringBuilder(500);
 | |
|                         buffer.Length = 500;
 | |
|                         if (UnsafeNativeMethods.LoadString(handle, resource, buffer, buffer.Length) != 0)
 | |
|                         {
 | |
|                             return buffer.ToString();
 | |
|                         }
 | |
|                     }
 | |
|                 }
 | |
|             }
 | |
|             return string.Empty;
 | |
|         }
 | |
| 
 | |
|         private static bool TryGetLocalizedNamesByRegistryKey(RegistryKey key, out string displayName, out string standardName, out string daylightName)
 | |
|         {
 | |
|             displayName = string.Empty;
 | |
|             standardName = string.Empty;
 | |
|             daylightName = string.Empty;
 | |
|             string str = key.GetValue("MUI_Display", string.Empty, RegistryValueOptions.None) as string;
 | |
|             string str2 = key.GetValue("MUI_Std", string.Empty, RegistryValueOptions.None) as string;
 | |
|             string str3 = key.GetValue("MUI_Dlt", string.Empty, RegistryValueOptions.None) as string;
 | |
|             if (!string.IsNullOrEmpty(str))
 | |
|             {
 | |
|                 displayName = TryGetLocalizedNameByMuiNativeResource(str);
 | |
|             }
 | |
|             if (!string.IsNullOrEmpty(str2))
 | |
|             {
 | |
|                 standardName = TryGetLocalizedNameByMuiNativeResource(str2);
 | |
|             }
 | |
|             if (!string.IsNullOrEmpty(str3))
 | |
|             {
 | |
|                 daylightName = TryGetLocalizedNameByMuiNativeResource(str3);
 | |
|             }
 | |
|             if (string.IsNullOrEmpty(displayName))
 | |
|             {
 | |
|                 displayName = key.GetValue("Display", string.Empty, RegistryValueOptions.None) as string;
 | |
|             }
 | |
|             if (string.IsNullOrEmpty(standardName))
 | |
|             {
 | |
|                 standardName = key.GetValue("Std", string.Empty, RegistryValueOptions.None) as string;
 | |
|             }
 | |
|             if (string.IsNullOrEmpty(daylightName))
 | |
|             {
 | |
|                 daylightName = key.GetValue("Dlt", string.Empty, RegistryValueOptions.None) as string;
 | |
|             }
 | |
|             return true;
 | |
|         }
 | |
| 
 | |
|         private static TimeZoneInfoResult TryGetTimeZone(string id, bool dstDisabled, out TimeZoneInfo value, out Exception e)
 | |
|         {
 | |
|             TimeZoneInfoResult success = TimeZoneInfoResult.Success;
 | |
|             e = null;
 | |
|             TimeZoneInfo info = null;
 | |
|             if (s_systemTimeZones.TryGetValue(id, out info))
 | |
|             {
 | |
|                 if (dstDisabled && info.m_supportsDaylightSavingTime)
 | |
|                 {
 | |
|                     value = CreateCustomTimeZone(info.m_id, info.m_baseUtcOffset, info.m_displayName, info.m_standardDisplayName);
 | |
|                     return success;
 | |
|                 }
 | |
|                 value = new TimeZoneInfo(info.m_id, info.m_baseUtcOffset, info.m_displayName, info.m_standardDisplayName, info.m_daylightDisplayName, info.m_adjustmentRules, false);
 | |
|                 return success;
 | |
|             }
 | |
|             if (!s_allSystemTimeZonesRead)
 | |
|             {
 | |
|                 success = TryGetTimeZoneByRegistryKey(id, out info, out e);
 | |
|                 if (success == TimeZoneInfoResult.Success)
 | |
|                 {
 | |
|                     s_systemTimeZones.Add(id, info);
 | |
|                     if (dstDisabled && info.m_supportsDaylightSavingTime)
 | |
|                     {
 | |
|                         value = CreateCustomTimeZone(info.m_id, info.m_baseUtcOffset, info.m_displayName, info.m_standardDisplayName);
 | |
|                         return success;
 | |
|                     }
 | |
|                     value = new TimeZoneInfo(info.m_id, info.m_baseUtcOffset, info.m_displayName, info.m_standardDisplayName, info.m_daylightDisplayName, info.m_adjustmentRules, false);
 | |
|                     return success;
 | |
|                 }
 | |
|                 value = null;
 | |
|                 return success;
 | |
|             }
 | |
|             success = TimeZoneInfoResult.TimeZoneNotFoundException;
 | |
|             value = null;
 | |
|             return success;
 | |
|         }
 | |
| 
 | |
|         [SecurityCritical, SecurityTreatAsSafe]
 | |
|         private static TimeZoneInfoResult TryGetTimeZoneByRegistryKey(string id, out TimeZoneInfo value, out Exception e)
 | |
|         {
 | |
|             TimeZoneInfoResult invalidTimeZoneException;
 | |
|             e = null;
 | |
|             try
 | |
|             {
 | |
|                 PermissionSet set = new PermissionSet(PermissionState.None);
 | |
|                 set.AddPermission(new RegistryPermission(RegistryPermissionAccess.Read, @"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones"));
 | |
|                 set.Assert();
 | |
|                 using (RegistryKey key = Registry.LocalMachine.OpenSubKey(string.Format(CultureInfo.InvariantCulture, @"{0}\{1}", new object[] { @"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones", id }), RegistryKeyPermissionCheck.Default, RegistryRights.ExecuteKey))
 | |
|                 {
 | |
|                     NativeMethods.RegistryTimeZoneInformation information;
 | |
|                     AdjustmentRule[] ruleArray;
 | |
|                     string str;
 | |
|                     string str2;
 | |
|                     string str3;
 | |
|                     if (key == null)
 | |
|                     {
 | |
|                         value = null;
 | |
|                         return TimeZoneInfoResult.TimeZoneNotFoundException;
 | |
|                     }
 | |
|                     try
 | |
|                     {
 | |
|                         information = new NativeMethods.RegistryTimeZoneInformation((byte[])key.GetValue("TZI", null, RegistryValueOptions.None));
 | |
|                     }
 | |
|                     catch (InvalidCastException exception)
 | |
|                     {
 | |
|                         value = null;
 | |
|                         e = exception;
 | |
|                         return TimeZoneInfoResult.InvalidTimeZoneException;
 | |
|                     }
 | |
|                     catch (ArgumentException exception2)
 | |
|                     {
 | |
|                         value = null;
 | |
|                         e = exception2;
 | |
|                         return TimeZoneInfoResult.InvalidTimeZoneException;
 | |
|                     }
 | |
|                     if (!TryCreateAdjustmentRules(id, information, out ruleArray, out e))
 | |
|                     {
 | |
|                         value = null;
 | |
|                         return TimeZoneInfoResult.InvalidTimeZoneException;
 | |
|                     }
 | |
|                     if (!TryGetLocalizedNamesByRegistryKey(key, out str, out str2, out str3))
 | |
|                     {
 | |
|                         value = null;
 | |
|                         invalidTimeZoneException = TimeZoneInfoResult.InvalidTimeZoneException;
 | |
|                     }
 | |
|                     else
 | |
|                     {
 | |
|                         try
 | |
|                         {
 | |
|                             value = new TimeZoneInfo(id, new TimeSpan(0, -information.Bias, 0), str, str2, str3, ruleArray, false);
 | |
|                             invalidTimeZoneException = TimeZoneInfoResult.Success;
 | |
|                         }
 | |
|                         catch (ArgumentException exception3)
 | |
|                         {
 | |
|                             value = null;
 | |
|                             e = exception3;
 | |
|                             invalidTimeZoneException = TimeZoneInfoResult.InvalidTimeZoneException;
 | |
|                         }
 | |
|                         catch (InvalidTimeZoneException exception4)
 | |
|                         {
 | |
|                             value = null;
 | |
|                             e = exception4;
 | |
|                             invalidTimeZoneException = TimeZoneInfoResult.InvalidTimeZoneException;
 | |
|                         }
 | |
|                     }
 | |
|                 }
 | |
|             }
 | |
|             finally
 | |
|             {
 | |
|                 PermissionSet.RevertAssert();
 | |
|             }
 | |
|             return invalidTimeZoneException;
 | |
|         }
 | |
| 
 | |
|         internal static bool UtcOffsetOutOfRange(TimeSpan offset)
 | |
|         {
 | |
|             if (offset.TotalHours >= -14.0)
 | |
|             {
 | |
|                 return (offset.TotalHours > 14.0);
 | |
|             }
 | |
|             return true;
 | |
|         }
 | |
| 
 | |
|         private static void ValidateTimeZoneInfo(string id, TimeSpan baseUtcOffset, AdjustmentRule[] adjustmentRules, out bool adjustmentRulesSupportDst)
 | |
|         {
 | |
|             adjustmentRulesSupportDst = false;
 | |
|             if (id == null)
 | |
|             {
 | |
|                 throw new ArgumentNullException("id");
 | |
|             }
 | |
|             if (id.Length == 0)
 | |
|             {
 | |
|                 throw new ArgumentException("Argument_InvalidId , id");
 | |
|             }
 | |
|             if (UtcOffsetOutOfRange(baseUtcOffset))
 | |
|             {
 | |
|                 throw new ArgumentOutOfRangeException("baseUtcOffset", "ArgumentOutOfRange_UtcOffset");
 | |
|             }
 | |
|             if ((baseUtcOffset.Ticks % 0x23c34600L) != 0L)
 | |
|             {
 | |
|                 throw new ArgumentException("Argument_TimeSpanHasSeconds", "baseUtcOffset");
 | |
|             }
 | |
|             if ((adjustmentRules != null) && (adjustmentRules.Length != 0))
 | |
|             {
 | |
|                 adjustmentRulesSupportDst = true;
 | |
|                 AdjustmentRule rule = null;
 | |
|                 AdjustmentRule rule2 = null;
 | |
|                 for (int i = 0; i < adjustmentRules.Length; i++)
 | |
|                 {
 | |
|                     rule = rule2;
 | |
|                     rule2 = adjustmentRules[i];
 | |
|                     if (rule2 == null)
 | |
|                     {
 | |
|                         throw new InvalidTimeZoneException("Argument_AdjustmentRulesNoNulls");
 | |
|                     }
 | |
|                     if (UtcOffsetOutOfRange(baseUtcOffset + rule2.DaylightDelta))
 | |
|                     {
 | |
|                         throw new InvalidTimeZoneException("ArgumentOutOfRange_UtcOffsetAndDaylightDelta");
 | |
|                     }
 | |
|                     if ((rule != null) && (rule2.DateStart <= rule.DateEnd))
 | |
|                     {
 | |
|                         throw new InvalidTimeZoneException("Argument_AdjustmentRulesOutOfOrder");
 | |
|                     }
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         // Properties
 | |
|         public TimeSpan BaseUtcOffset
 | |
|         {
 | |
|             get
 | |
|             {
 | |
|                 return this.m_baseUtcOffset;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         public string DaylightName
 | |
|         {
 | |
|             get
 | |
|             {
 | |
|                 if (this.m_daylightDisplayName != null)
 | |
|                 {
 | |
|                     return this.m_daylightDisplayName;
 | |
|                 }
 | |
|                 return string.Empty;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         public string DisplayName
 | |
|         {
 | |
|             get
 | |
|             {
 | |
|                 if (this.m_displayName != null)
 | |
|                 {
 | |
|                     return this.m_displayName;
 | |
|                 }
 | |
|                 return string.Empty;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         public string Id
 | |
|         {
 | |
|             get
 | |
|             {
 | |
|                 return this.m_id;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         public static TimeZoneInfo Local
 | |
|         {
 | |
|             [SecurityCritical]
 | |
|             get
 | |
|             {
 | |
|                 TimeZoneInfo info = s_localTimeZone;
 | |
|                 if (info != null)
 | |
|                 {
 | |
|                     return info;
 | |
|                 }
 | |
|                 lock (s_internalSyncObject)
 | |
|                 {
 | |
|                     if (s_localTimeZone == null)
 | |
|                     {
 | |
|                         TimeZoneInfo localTimeZone = GetLocalTimeZone();
 | |
|                         s_localTimeZone = new TimeZoneInfo(localTimeZone.m_id, localTimeZone.m_baseUtcOffset, localTimeZone.m_displayName, localTimeZone.m_standardDisplayName, localTimeZone.m_daylightDisplayName, localTimeZone.m_adjustmentRules, false);
 | |
|                     }
 | |
|                     return s_localTimeZone;
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         private static object s_internalSyncObject
 | |
|         {
 | |
|             get
 | |
|             {
 | |
|                 if (s_hiddenInternalSyncObject == null)
 | |
|                 {
 | |
|                     object obj2 = new object();
 | |
|                     System.Threading.Interlocked.CompareExchange(ref s_hiddenInternalSyncObject, obj2, null);
 | |
|                 }
 | |
|                 return s_hiddenInternalSyncObject;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         private static Dictionary<string, TimeZoneInfo> s_systemTimeZones
 | |
|         {
 | |
|             get
 | |
|             {
 | |
|                 if (s_hiddenSystemTimeZones == null)
 | |
|                 {
 | |
|                     s_hiddenSystemTimeZones = new Dictionary<string, TimeZoneInfo>();
 | |
|                 }
 | |
|                 return s_hiddenSystemTimeZones;
 | |
|             }
 | |
|             set
 | |
|             {
 | |
|                 s_hiddenSystemTimeZones = value;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         public string StandardName
 | |
|         {
 | |
|             get
 | |
|             {
 | |
|                 if (this.m_standardDisplayName != null)
 | |
|                 {
 | |
|                     return this.m_standardDisplayName;
 | |
|                 }
 | |
|                 return string.Empty;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         public bool SupportsDaylightSavingTime
 | |
|         {
 | |
|             get
 | |
|             {
 | |
|                 return this.m_supportsDaylightSavingTime;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         public static TimeZoneInfo Utc
 | |
|         {
 | |
|             get
 | |
|             {
 | |
|                 TimeZoneInfo info = s_utcTimeZone;
 | |
|                 if (info != null)
 | |
|                 {
 | |
|                     return info;
 | |
|                 }
 | |
|                 lock (s_internalSyncObject)
 | |
|                 {
 | |
|                     if (s_utcTimeZone == null)
 | |
|                     {
 | |
|                         s_utcTimeZone = CreateCustomTimeZone("UTC", TimeSpan.Zero, "UTC", "UTC");
 | |
|                     }
 | |
|                     return s_utcTimeZone;
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         // Nested Types
 | |
|         [Serializable, HostProtection(SecurityAction.LinkDemand, MayLeakOnAbort = true), HostProtection(SecurityAction.LinkDemand, MayLeakOnAbort = true)]
 | |
|         public sealed class AdjustmentRule : IEquatable<TimeZoneInfo.AdjustmentRule>, ISerializable, IDeserializationCallback
 | |
|         {
 | |
|             // Fields
 | |
|             private DateTime m_dateEnd;
 | |
|             private DateTime m_dateStart;
 | |
|             private TimeSpan m_daylightDelta;
 | |
|             private TimeZoneInfo.TransitionTime m_daylightTransitionEnd;
 | |
|             private TimeZoneInfo.TransitionTime m_daylightTransitionStart;
 | |
| 
 | |
|             // Methods
 | |
|             private AdjustmentRule()
 | |
|             {
 | |
|             }
 | |
| 
 | |
|             private AdjustmentRule(SerializationInfo info, StreamingContext context)
 | |
|             {
 | |
|                 if (info == null)
 | |
|                 {
 | |
|                     throw new ArgumentNullException("info");
 | |
|                 }
 | |
|                 this.m_dateStart = (DateTime)info.GetValue("DateStart", typeof(DateTime));
 | |
|                 this.m_dateEnd = (DateTime)info.GetValue("DateEnd", typeof(DateTime));
 | |
|                 this.m_daylightDelta = (TimeSpan)info.GetValue("DaylightDelta", typeof(TimeSpan));
 | |
|                 this.m_daylightTransitionStart = (TimeZoneInfo.TransitionTime)info.GetValue("DaylightTransitionStart", typeof(TimeZoneInfo.TransitionTime));
 | |
|                 this.m_daylightTransitionEnd = (TimeZoneInfo.TransitionTime)info.GetValue("DaylightTransitionEnd", typeof(TimeZoneInfo.TransitionTime));
 | |
|             }
 | |
| 
 | |
|             public static TimeZoneInfo.AdjustmentRule CreateAdjustmentRule(DateTime dateStart, DateTime dateEnd, TimeSpan daylightDelta, TimeZoneInfo.TransitionTime daylightTransitionStart, TimeZoneInfo.TransitionTime daylightTransitionEnd)
 | |
|             {
 | |
|                 ValidateAdjustmentRule(dateStart, dateEnd, daylightDelta, daylightTransitionStart, daylightTransitionEnd);
 | |
|                 TimeZoneInfo.AdjustmentRule rule = new TimeZoneInfo.AdjustmentRule();
 | |
|                 rule.m_dateStart = dateStart;
 | |
|                 rule.m_dateEnd = dateEnd;
 | |
|                 rule.m_daylightDelta = daylightDelta;
 | |
|                 rule.m_daylightTransitionStart = daylightTransitionStart;
 | |
|                 rule.m_daylightTransitionEnd = daylightTransitionEnd;
 | |
|                 return rule;
 | |
|             }
 | |
| 
 | |
|             public bool Equals(TimeZoneInfo.AdjustmentRule other)
 | |
|             {
 | |
|                 return ((((((other != null) && (this.m_dateStart == other.m_dateStart)) && (this.m_dateEnd == other.m_dateEnd)) && (this.m_daylightDelta == other.m_daylightDelta)) && this.m_daylightTransitionEnd.Equals(other.m_daylightTransitionEnd)) && this.m_daylightTransitionStart.Equals(other.m_daylightTransitionStart));
 | |
|             }
 | |
| 
 | |
|             public override int GetHashCode()
 | |
|             {
 | |
|                 return this.m_dateStart.GetHashCode();
 | |
|             }
 | |
| 
 | |
|             void IDeserializationCallback.OnDeserialization(object sender)
 | |
|             {
 | |
|                 try
 | |
|                 {
 | |
|                     ValidateAdjustmentRule(this.m_dateStart, this.m_dateEnd, this.m_daylightDelta, this.m_daylightTransitionStart, this.m_daylightTransitionEnd);
 | |
|                 }
 | |
|                 catch (ArgumentException exception)
 | |
|                 {
 | |
|                     throw new SerializationException("Serialization_InvalidData", exception);
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             [SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.SerializationFormatter)]
 | |
|             void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)
 | |
|             {
 | |
|                 if (info == null)
 | |
|                 {
 | |
|                     throw new ArgumentNullException("info");
 | |
|                 }
 | |
|                 info.AddValue("DateStart", this.m_dateStart);
 | |
|                 info.AddValue("DateEnd", this.m_dateEnd);
 | |
|                 info.AddValue("DaylightDelta", this.m_daylightDelta);
 | |
|                 info.AddValue("DaylightTransitionStart", this.m_daylightTransitionStart);
 | |
|                 info.AddValue("DaylightTransitionEnd", this.m_daylightTransitionEnd);
 | |
|             }
 | |
| 
 | |
|             private static void ValidateAdjustmentRule(DateTime dateStart, DateTime dateEnd, TimeSpan daylightDelta, TimeZoneInfo.TransitionTime daylightTransitionStart, TimeZoneInfo.TransitionTime daylightTransitionEnd)
 | |
|             {
 | |
|                 if (dateStart.Kind != DateTimeKind.Unspecified)
 | |
|                 {
 | |
|                     throw new ArgumentException("Argument_DateTimeKindMustBeUnspecified", "dateStart");
 | |
|                 }
 | |
|                 if (dateEnd.Kind != DateTimeKind.Unspecified)
 | |
|                 {
 | |
|                     throw new ArgumentException("Argument_DateTimeKindMustBeUnspecified", "dateEnd");
 | |
|                 }
 | |
|                 if (daylightTransitionStart.Equals(daylightTransitionEnd))
 | |
|                 {
 | |
|                     throw new ArgumentException("Argument_TransitionTimesAreIdentical", "daylightTransitionEnd");
 | |
|                 }
 | |
|                 if (dateStart > dateEnd)
 | |
|                 {
 | |
|                     throw new ArgumentException("Argument_OutOfOrderDateTimes", "dateStart");
 | |
|                 }
 | |
|                 if (TimeZoneInfo.UtcOffsetOutOfRange(daylightDelta))
 | |
|                 {
 | |
|                     throw new ArgumentOutOfRangeException("daylightDelta", daylightDelta, "ArgumentOutOfRange_UtcOffset");
 | |
|                 }
 | |
|                 if ((daylightDelta.Ticks % 0x23c34600L) != 0L)
 | |
|                 {
 | |
|                     throw new ArgumentException("Argument_TimeSpanHasSeconds", "daylightDelta");
 | |
|                 }
 | |
|                 if (dateStart.TimeOfDay != TimeSpan.Zero)
 | |
|                 {
 | |
|                     throw new ArgumentException("Argument_DateTimeHasTimeOfDay", "dateStart");
 | |
|                 }
 | |
|                 if (dateEnd.TimeOfDay != TimeSpan.Zero)
 | |
|                 {
 | |
|                     throw new ArgumentException("Argument_DateTimeHasTimeOfDay", "dateEnd");
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             // Properties
 | |
|             public DateTime DateEnd
 | |
|             {
 | |
|                 get
 | |
|                 {
 | |
|                     return this.m_dateEnd;
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             public DateTime DateStart
 | |
|             {
 | |
|                 get
 | |
|                 {
 | |
|                     return this.m_dateStart;
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             public TimeSpan DaylightDelta
 | |
|             {
 | |
|                 get
 | |
|                 {
 | |
|                     return this.m_daylightDelta;
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             public TimeZoneInfo.TransitionTime DaylightTransitionEnd
 | |
|             {
 | |
|                 get
 | |
|                 {
 | |
|                     return this.m_daylightTransitionEnd;
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             public TimeZoneInfo.TransitionTime DaylightTransitionStart
 | |
|             {
 | |
|                 get
 | |
|                 {
 | |
|                     return this.m_daylightTransitionStart;
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         private sealed class StringSerializer
 | |
|         {
 | |
|             // Fields
 | |
|             private const string dateTimeFormat = "MM:dd:yyyy";
 | |
|             private const char esc = '\\';
 | |
|             private const string escapedEsc = @"\\";
 | |
|             private const string escapedLhs = @"\[";
 | |
|             private const string escapedRhs = @"\]";
 | |
|             private const string escapedSep = @"\;";
 | |
|             private const string escString = @"\";
 | |
|             private const int initialCapacityForString = 0x40;
 | |
|             private const char lhs = '[';
 | |
|             private const string lhsString = "[";
 | |
|             private int m_currentTokenStartIndex;
 | |
|             private string m_serializedText;
 | |
|             private State m_state;
 | |
|             private const char rhs = ']';
 | |
|             private const string rhsString = "]";
 | |
|             private const char sep = ';';
 | |
|             private const string sepString = ";";
 | |
|             private const string timeOfDayFormat = "HH:mm:ss.FFF";
 | |
| 
 | |
|             // Methods
 | |
|             private StringSerializer(string str)
 | |
|             {
 | |
|                 this.m_serializedText = str;
 | |
|                 this.m_state = State.StartOfToken;
 | |
|             }
 | |
| 
 | |
|             public static TimeZoneInfo GetDeserializedTimeZoneInfo(string source)
 | |
|             {
 | |
|                 TimeZoneInfo info;
 | |
|                 TimeZoneInfo.StringSerializer serializer = new TimeZoneInfo.StringSerializer(source);
 | |
|                 string nextStringValue = serializer.GetNextStringValue(false);
 | |
|                 TimeSpan nextTimeSpanValue = serializer.GetNextTimeSpanValue(false);
 | |
|                 string displayName = serializer.GetNextStringValue(false);
 | |
|                 string standardDisplayName = serializer.GetNextStringValue(false);
 | |
|                 string daylightDisplayName = serializer.GetNextStringValue(false);
 | |
|                 TimeZoneInfo.AdjustmentRule[] nextAdjustmentRuleArrayValue = serializer.GetNextAdjustmentRuleArrayValue(false);
 | |
|                 try
 | |
|                 {
 | |
|                     info = TimeZoneInfo.CreateCustomTimeZone(nextStringValue, nextTimeSpanValue, displayName, standardDisplayName, daylightDisplayName, nextAdjustmentRuleArrayValue);
 | |
|                 }
 | |
|                 catch (ArgumentException exception)
 | |
|                 {
 | |
|                     throw new SerializationException("Serialization_InvalidData", exception);
 | |
|                 }
 | |
|                 catch (InvalidTimeZoneException exception2)
 | |
|                 {
 | |
|                     throw new SerializationException("Serialization_InvalidData", exception2);
 | |
|                 }
 | |
|                 return info;
 | |
|             }
 | |
| 
 | |
|             private TimeZoneInfo.AdjustmentRule[] GetNextAdjustmentRuleArrayValue(bool canEndWithoutSeparator)
 | |
|             {
 | |
|                 List<TimeZoneInfo.AdjustmentRule> list = new List<TimeZoneInfo.AdjustmentRule>(1);
 | |
|                 int num = 0;
 | |
|                 for (TimeZoneInfo.AdjustmentRule rule = this.GetNextAdjustmentRuleValue(true); rule != null; rule = this.GetNextAdjustmentRuleValue(true))
 | |
|                 {
 | |
|                     list.Add(rule);
 | |
|                     num++;
 | |
|                 }
 | |
|                 if (!canEndWithoutSeparator)
 | |
|                 {
 | |
|                     if (this.m_state == State.EndOfLine)
 | |
|                     {
 | |
|                         throw new SerializationException("Serialization_InvalidData");
 | |
|                     }
 | |
|                     if ((this.m_currentTokenStartIndex < 0) || (this.m_currentTokenStartIndex >= this.m_serializedText.Length))
 | |
|                     {
 | |
|                         throw new SerializationException("Serialization_InvalidData");
 | |
|                     }
 | |
|                 }
 | |
|                 if (num == 0)
 | |
|                 {
 | |
|                     return null;
 | |
|                 }
 | |
|                 return list.ToArray();
 | |
|             }
 | |
| 
 | |
|             private TimeZoneInfo.AdjustmentRule GetNextAdjustmentRuleValue(bool canEndWithoutSeparator)
 | |
|             {
 | |
|                 TimeZoneInfo.AdjustmentRule rule;
 | |
|                 if (this.m_state == State.EndOfLine)
 | |
|                 {
 | |
|                     if (!canEndWithoutSeparator)
 | |
|                     {
 | |
|                         throw new SerializationException("Serialization_InvalidData");
 | |
|                     }
 | |
|                     return null;
 | |
|                 }
 | |
|                 if ((this.m_currentTokenStartIndex < 0) || (this.m_currentTokenStartIndex >= this.m_serializedText.Length))
 | |
|                 {
 | |
|                     throw new SerializationException("Serialization_InvalidData");
 | |
|                 }
 | |
|                 if (this.m_serializedText[this.m_currentTokenStartIndex] == ';')
 | |
|                 {
 | |
|                     return null;
 | |
|                 }
 | |
|                 if (this.m_serializedText[this.m_currentTokenStartIndex] != '[')
 | |
|                 {
 | |
|                     throw new SerializationException("Serialization_InvalidData");
 | |
|                 }
 | |
|                 this.m_currentTokenStartIndex++;
 | |
|                 DateTime nextDateTimeValue = this.GetNextDateTimeValue(false, "MM:dd:yyyy");
 | |
|                 DateTime dateEnd = this.GetNextDateTimeValue(false, "MM:dd:yyyy");
 | |
|                 TimeSpan nextTimeSpanValue = this.GetNextTimeSpanValue(false);
 | |
|                 TimeZoneInfo.TransitionTime nextTransitionTimeValue = this.GetNextTransitionTimeValue(false);
 | |
|                 TimeZoneInfo.TransitionTime daylightTransitionEnd = this.GetNextTransitionTimeValue(false);
 | |
|                 if ((this.m_state == State.EndOfLine) || (this.m_currentTokenStartIndex >= this.m_serializedText.Length))
 | |
|                 {
 | |
|                     throw new SerializationException("Serialization_InvalidData");
 | |
|                 }
 | |
|                 if (this.m_serializedText[this.m_currentTokenStartIndex] != ']')
 | |
|                 {
 | |
|                     this.SkipVersionNextDataFields(1);
 | |
|                 }
 | |
|                 else
 | |
|                 {
 | |
|                     this.m_currentTokenStartIndex++;
 | |
|                 }
 | |
|                 try
 | |
|                 {
 | |
|                     rule = TimeZoneInfo.AdjustmentRule.CreateAdjustmentRule(nextDateTimeValue, dateEnd, nextTimeSpanValue, nextTransitionTimeValue, daylightTransitionEnd);
 | |
|                 }
 | |
|                 catch (ArgumentException exception)
 | |
|                 {
 | |
|                     throw new SerializationException("Serialization_InvalidData", exception);
 | |
|                 }
 | |
|                 if (this.m_currentTokenStartIndex >= this.m_serializedText.Length)
 | |
|                 {
 | |
|                     this.m_state = State.EndOfLine;
 | |
|                     return rule;
 | |
|                 }
 | |
|                 this.m_state = State.StartOfToken;
 | |
|                 return rule;
 | |
|             }
 | |
| 
 | |
|             private DateTime GetNextDateTimeValue(bool canEndWithoutSeparator, string format)
 | |
|             {
 | |
|                 DateTime time;
 | |
|                 if (!DateTime.TryParseExact(this.GetNextStringValue(canEndWithoutSeparator), format, DateTimeFormatInfo.InvariantInfo, DateTimeStyles.None, out time))
 | |
|                 {
 | |
|                     throw new SerializationException("Serialization_InvalidData");
 | |
|                 }
 | |
|                 return time;
 | |
|             }
 | |
| 
 | |
|             private int GetNextInt32Value(bool canEndWithoutSeparator)
 | |
|             {
 | |
|                 int num;
 | |
|                 if (!int.TryParse(this.GetNextStringValue(canEndWithoutSeparator), NumberStyles.AllowLeadingSign, CultureInfo.InvariantCulture, out num))
 | |
|                 {
 | |
|                     throw new SerializationException("Serialization_InvalidData");
 | |
|                 }
 | |
|                 return num;
 | |
|             }
 | |
| 
 | |
|             private string GetNextStringValue(bool canEndWithoutSeparator)
 | |
|             {
 | |
|                 if (this.m_state == State.EndOfLine)
 | |
|                 {
 | |
|                     if (!canEndWithoutSeparator)
 | |
|                     {
 | |
|                         throw new SerializationException("Serialization_InvalidData");
 | |
|                     }
 | |
|                     return null;
 | |
|                 }
 | |
|                 if ((this.m_currentTokenStartIndex < 0) || (this.m_currentTokenStartIndex >= this.m_serializedText.Length))
 | |
|                 {
 | |
|                     throw new SerializationException("Serialization_InvalidData");
 | |
|                 }
 | |
|                 State notEscaped = State.NotEscaped;
 | |
|                 StringBuilder builder = new StringBuilder(0x40);
 | |
|                 for (int i = this.m_currentTokenStartIndex; i < this.m_serializedText.Length; i++)
 | |
|                 {
 | |
|                     if (notEscaped == State.Escaped)
 | |
|                     {
 | |
|                         VerifyIsEscapableCharacter(this.m_serializedText[i]);
 | |
|                         builder.Append(this.m_serializedText[i]);
 | |
|                         notEscaped = State.NotEscaped;
 | |
|                     }
 | |
|                     else if (notEscaped == State.NotEscaped)
 | |
|                     {
 | |
|                         switch (this.m_serializedText[i])
 | |
|                         {
 | |
|                             case '[':
 | |
|                                 throw new SerializationException("Serialization_InvalidData");
 | |
| 
 | |
|                             case '\\':
 | |
|                                 notEscaped = State.Escaped;
 | |
|                                 break;
 | |
| 
 | |
|                             case ']':
 | |
|                                 if (!canEndWithoutSeparator)
 | |
|                                 {
 | |
|                                     throw new SerializationException("Serialization_InvalidData");
 | |
|                                 }
 | |
|                                 this.m_currentTokenStartIndex = i;
 | |
|                                 this.m_state = State.StartOfToken;
 | |
|                                 return builder.ToString();
 | |
| 
 | |
|                             case ';':
 | |
|                                 this.m_currentTokenStartIndex = i + 1;
 | |
|                                 if (this.m_currentTokenStartIndex >= this.m_serializedText.Length)
 | |
|                                 {
 | |
|                                     this.m_state = State.EndOfLine;
 | |
|                                 }
 | |
|                                 else
 | |
|                                 {
 | |
|                                     this.m_state = State.StartOfToken;
 | |
|                                 }
 | |
|                                 return builder.ToString();
 | |
| 
 | |
|                             case '\0':
 | |
|                                 throw new SerializationException("Serialization_InvalidData");
 | |
| 
 | |
|                             default:
 | |
|                                 builder.Append(this.m_serializedText[i]);
 | |
|                                 break;
 | |
|                         }
 | |
|                     }
 | |
|                 }
 | |
|                 if (notEscaped == State.Escaped)
 | |
|                 {
 | |
|                     throw new SerializationException("Serialization_InvalidEscapeSequence");
 | |
|                 }
 | |
|                 if (!canEndWithoutSeparator)
 | |
|                 {
 | |
|                     throw new SerializationException("Serialization_InvalidData");
 | |
|                 }
 | |
|                 this.m_currentTokenStartIndex = this.m_serializedText.Length;
 | |
|                 this.m_state = State.EndOfLine;
 | |
|                 return builder.ToString();
 | |
|             }
 | |
| 
 | |
|             private TimeSpan GetNextTimeSpanValue(bool canEndWithoutSeparator)
 | |
|             {
 | |
|                 TimeSpan span;
 | |
|                 int minutes = this.GetNextInt32Value(canEndWithoutSeparator);
 | |
|                 try
 | |
|                 {
 | |
|                     span = new TimeSpan(0, minutes, 0);
 | |
|                 }
 | |
|                 catch (ArgumentOutOfRangeException exception)
 | |
|                 {
 | |
|                     throw new SerializationException("Serialization_InvalidData", exception);
 | |
|                 }
 | |
|                 return span;
 | |
|             }
 | |
| 
 | |
|             private TimeZoneInfo.TransitionTime GetNextTransitionTimeValue(bool canEndWithoutSeparator)
 | |
|             {
 | |
|                 TimeZoneInfo.TransitionTime time;
 | |
|                 if ((this.m_state == State.EndOfLine) || ((this.m_currentTokenStartIndex < this.m_serializedText.Length) && (this.m_serializedText[this.m_currentTokenStartIndex] == ']')))
 | |
|                 {
 | |
|                     throw new SerializationException("Serialization_InvalidData");
 | |
|                 }
 | |
|                 if ((this.m_currentTokenStartIndex < 0) || (this.m_currentTokenStartIndex >= this.m_serializedText.Length))
 | |
|                 {
 | |
|                     throw new SerializationException("Serialization_InvalidData");
 | |
|                 }
 | |
|                 if (this.m_serializedText[this.m_currentTokenStartIndex] != '[')
 | |
|                 {
 | |
|                     throw new SerializationException("Serialization_InvalidData");
 | |
|                 }
 | |
|                 this.m_currentTokenStartIndex++;
 | |
|                 int num = this.GetNextInt32Value(false);
 | |
|                 if ((num != 0) && (num != 1))
 | |
|                 {
 | |
|                     throw new SerializationException("Serialization_InvalidData");
 | |
|                 }
 | |
|                 DateTime nextDateTimeValue = this.GetNextDateTimeValue(false, "HH:mm:ss.FFF");
 | |
|                 nextDateTimeValue = new DateTime(1, 1, 1, nextDateTimeValue.Hour, nextDateTimeValue.Minute, nextDateTimeValue.Second, nextDateTimeValue.Millisecond);
 | |
|                 int month = this.GetNextInt32Value(false);
 | |
|                 if (num == 1)
 | |
|                 {
 | |
|                     int day = this.GetNextInt32Value(false);
 | |
|                     try
 | |
|                     {
 | |
|                         time = TimeZoneInfo.TransitionTime.CreateFixedDateRule(nextDateTimeValue, month, day);
 | |
|                         goto Label_015B;
 | |
|                     }
 | |
|                     catch (ArgumentException exception)
 | |
|                     {
 | |
|                         throw new SerializationException("Serialization_InvalidData", exception);
 | |
|                     }
 | |
|                 }
 | |
|                 int week = this.GetNextInt32Value(false);
 | |
|                 int num5 = this.GetNextInt32Value(false);
 | |
|                 try
 | |
|                 {
 | |
|                     time = TimeZoneInfo.TransitionTime.CreateFloatingDateRule(nextDateTimeValue, month, week, (DayOfWeek)num5);
 | |
|                 }
 | |
|                 catch (ArgumentException exception2)
 | |
|                 {
 | |
|                     throw new SerializationException("Serialization_InvalidData", exception2);
 | |
|                 }
 | |
|             Label_015B:
 | |
|                 if ((this.m_state == State.EndOfLine) || (this.m_currentTokenStartIndex >= this.m_serializedText.Length))
 | |
|                 {
 | |
|                     throw new SerializationException("Serialization_InvalidData");
 | |
|                 }
 | |
|                 if (this.m_serializedText[this.m_currentTokenStartIndex] != ']')
 | |
|                 {
 | |
|                     this.SkipVersionNextDataFields(1);
 | |
|                 }
 | |
|                 else
 | |
|                 {
 | |
|                     this.m_currentTokenStartIndex++;
 | |
|                 }
 | |
|                 bool flag = false;
 | |
|                 if ((this.m_currentTokenStartIndex < this.m_serializedText.Length) && (this.m_serializedText[this.m_currentTokenStartIndex] == ';'))
 | |
|                 {
 | |
|                     this.m_currentTokenStartIndex++;
 | |
|                     flag = true;
 | |
|                 }
 | |
|                 if (!flag && !canEndWithoutSeparator)
 | |
|                 {
 | |
|                     throw new SerializationException("Serialization_InvalidData");
 | |
|                 }
 | |
|                 if (this.m_currentTokenStartIndex >= this.m_serializedText.Length)
 | |
|                 {
 | |
|                     this.m_state = State.EndOfLine;
 | |
|                     return time;
 | |
|                 }
 | |
|                 this.m_state = State.StartOfToken;
 | |
|                 return time;
 | |
|             }
 | |
| 
 | |
|             public static string GetSerializedString(TimeZoneInfo zone)
 | |
|             {
 | |
|                 StringBuilder serializedText = new StringBuilder();
 | |
|                 serializedText.Append(SerializeSubstitute(zone.Id));
 | |
|                 serializedText.Append(';');
 | |
|                 serializedText.Append(SerializeSubstitute(zone.BaseUtcOffset.TotalMinutes.ToString(CultureInfo.InvariantCulture)));
 | |
|                 serializedText.Append(';');
 | |
|                 serializedText.Append(SerializeSubstitute(zone.DisplayName));
 | |
|                 serializedText.Append(';');
 | |
|                 serializedText.Append(SerializeSubstitute(zone.StandardName));
 | |
|                 serializedText.Append(';');
 | |
|                 serializedText.Append(SerializeSubstitute(zone.DaylightName));
 | |
|                 serializedText.Append(';');
 | |
|                 TimeZoneInfo.AdjustmentRule[] adjustmentRules = zone.GetAdjustmentRules();
 | |
|                 if ((adjustmentRules != null) && (adjustmentRules.Length > 0))
 | |
|                 {
 | |
|                     for (int i = 0; i < adjustmentRules.Length; i++)
 | |
|                     {
 | |
|                         TimeZoneInfo.AdjustmentRule rule = adjustmentRules[i];
 | |
|                         serializedText.Append('[');
 | |
|                         serializedText.Append(SerializeSubstitute(rule.DateStart.ToString("MM:dd:yyyy", DateTimeFormatInfo.InvariantInfo)));
 | |
|                         serializedText.Append(';');
 | |
|                         serializedText.Append(SerializeSubstitute(rule.DateEnd.ToString("MM:dd:yyyy", DateTimeFormatInfo.InvariantInfo)));
 | |
|                         serializedText.Append(';');
 | |
|                         serializedText.Append(SerializeSubstitute(rule.DaylightDelta.TotalMinutes.ToString(CultureInfo.InvariantCulture)));
 | |
|                         serializedText.Append(';');
 | |
|                         SerializeTransitionTime(rule.DaylightTransitionStart, serializedText);
 | |
|                         serializedText.Append(';');
 | |
|                         SerializeTransitionTime(rule.DaylightTransitionEnd, serializedText);
 | |
|                         serializedText.Append(';');
 | |
|                         serializedText.Append(']');
 | |
|                     }
 | |
|                 }
 | |
|                 serializedText.Append(';');
 | |
|                 return serializedText.ToString();
 | |
|             }
 | |
| 
 | |
|             private static string SerializeSubstitute(string text)
 | |
|             {
 | |
|                 text = text.Replace(@"\", @"\\");
 | |
|                 text = text.Replace("[", @"\[");
 | |
|                 text = text.Replace("]", @"\]");
 | |
|                 return text.Replace(";", @"\;");
 | |
|             }
 | |
| 
 | |
|             private static void SerializeTransitionTime(TimeZoneInfo.TransitionTime time, StringBuilder serializedText)
 | |
|             {
 | |
|                 serializedText.Append('[');
 | |
|                 serializedText.Append((time.IsFixedDateRule ? 1 : 0).ToString(CultureInfo.InvariantCulture));
 | |
|                 serializedText.Append(';');
 | |
|                 if (time.IsFixedDateRule)
 | |
|                 {
 | |
|                     serializedText.Append(SerializeSubstitute(time.TimeOfDay.ToString("HH:mm:ss.FFF", DateTimeFormatInfo.InvariantInfo)));
 | |
|                     serializedText.Append(';');
 | |
|                     serializedText.Append(SerializeSubstitute(time.Month.ToString(CultureInfo.InvariantCulture)));
 | |
|                     serializedText.Append(';');
 | |
|                     serializedText.Append(SerializeSubstitute(time.Day.ToString(CultureInfo.InvariantCulture)));
 | |
|                     serializedText.Append(';');
 | |
|                 }
 | |
|                 else
 | |
|                 {
 | |
|                     serializedText.Append(SerializeSubstitute(time.TimeOfDay.ToString("HH:mm:ss.FFF", DateTimeFormatInfo.InvariantInfo)));
 | |
|                     serializedText.Append(';');
 | |
|                     serializedText.Append(SerializeSubstitute(time.Month.ToString(CultureInfo.InvariantCulture)));
 | |
|                     serializedText.Append(';');
 | |
|                     serializedText.Append(SerializeSubstitute(time.Week.ToString(CultureInfo.InvariantCulture)));
 | |
|                     serializedText.Append(';');
 | |
|                     serializedText.Append(SerializeSubstitute(((int)time.DayOfWeek).ToString(CultureInfo.InvariantCulture)));
 | |
|                     serializedText.Append(';');
 | |
|                 }
 | |
|                 serializedText.Append(']');
 | |
|             }
 | |
| 
 | |
|             private void SkipVersionNextDataFields(int depth)
 | |
|             {
 | |
|                 if ((this.m_currentTokenStartIndex < 0) || (this.m_currentTokenStartIndex >= this.m_serializedText.Length))
 | |
|                 {
 | |
|                     throw new SerializationException("Serialization_InvalidData");
 | |
|                 }
 | |
|                 State notEscaped = State.NotEscaped;
 | |
|                 for (int i = this.m_currentTokenStartIndex; i < this.m_serializedText.Length; i++)
 | |
|                 {
 | |
|                     switch (notEscaped)
 | |
|                     {
 | |
|                         case State.Escaped:
 | |
|                             {
 | |
|                                 VerifyIsEscapableCharacter(this.m_serializedText[i]);
 | |
|                                 notEscaped = State.NotEscaped;
 | |
|                                 continue;
 | |
|                             }
 | |
|                         case State.NotEscaped:
 | |
|                             switch (this.m_serializedText[i])
 | |
|                             {
 | |
|                                 case '[':
 | |
|                                     {
 | |
|                                         depth++;
 | |
|                                         continue;
 | |
|                                     }
 | |
|                                 case '\\':
 | |
|                                     {
 | |
|                                         notEscaped = State.Escaped;
 | |
|                                         continue;
 | |
|                                     }
 | |
|                                 case ']':
 | |
|                                     depth--;
 | |
|                                     if (depth != 0)
 | |
|                                     {
 | |
|                                         continue;
 | |
|                                     }
 | |
|                                     this.m_currentTokenStartIndex = i + 1;
 | |
|                                     if (this.m_currentTokenStartIndex < this.m_serializedText.Length)
 | |
|                                     {
 | |
|                                         goto Label_00B5;
 | |
|                                     }
 | |
|                                     this.m_state = State.EndOfLine;
 | |
|                                     return;
 | |
| 
 | |
|                                 case '\0':
 | |
|                                     throw new SerializationException("Serialization_InvalidData");
 | |
|                             }
 | |
|                             break;
 | |
|                     }
 | |
|                     continue;
 | |
|                 Label_00B5:
 | |
|                     this.m_state = State.StartOfToken;
 | |
|                     return;
 | |
|                 }
 | |
|                 throw new SerializationException("Serialization_InvalidData");
 | |
|             }
 | |
| 
 | |
|             private static void VerifyIsEscapableCharacter(char c)
 | |
|             {
 | |
|                 if (((c != '\\') && (c != ';')) && ((c != '[') && (c != ']')))
 | |
|                 {
 | |
|                     throw new SerializationException("Serialization_InvalidEscapeSequence " + c.ToString());
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             // Nested Types
 | |
|             private enum State
 | |
|             {
 | |
|                 Escaped,
 | |
|                 NotEscaped,
 | |
|                 StartOfToken,
 | |
|                 EndOfLine
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         private class TimeZoneInfoComparer : IComparer<TimeZoneInfo>
 | |
|         {
 | |
|             // Methods
 | |
|             int IComparer<TimeZoneInfo>.Compare(TimeZoneInfo x, TimeZoneInfo y)
 | |
|             {
 | |
|                 return DevComponents.AdvTree.Utilities.CompareAlphaNumeric(x.Id, y.Id);
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         private enum TimeZoneInfoResult
 | |
|         {
 | |
|             Success,
 | |
|             TimeZoneNotFoundException,
 | |
|             InvalidTimeZoneException,
 | |
|             SecurityException
 | |
|         }
 | |
| 
 | |
|         [Serializable, StructLayout(LayoutKind.Sequential), HostProtection(SecurityAction.LinkDemand, MayLeakOnAbort = true), HostProtection(SecurityAction.LinkDemand, MayLeakOnAbort = true)]
 | |
|         public struct TransitionTime : IEquatable<TimeZoneInfo.TransitionTime>, ISerializable, IDeserializationCallback
 | |
|         {
 | |
|             private DateTime m_timeOfDay;
 | |
|             private byte m_month;
 | |
|             private byte m_week;
 | |
|             private byte m_day;
 | |
|             private DayOfWeek m_dayOfWeek;
 | |
|             private bool m_isFixedDateRule;
 | |
|             public DateTime TimeOfDay
 | |
|             {
 | |
|                 get
 | |
|                 {
 | |
|                     return this.m_timeOfDay;
 | |
|                 }
 | |
|             }
 | |
|             public int Month
 | |
|             {
 | |
|                 get
 | |
|                 {
 | |
|                     return this.m_month;
 | |
|                 }
 | |
|             }
 | |
|             public int Week
 | |
|             {
 | |
|                 get
 | |
|                 {
 | |
|                     return this.m_week;
 | |
|                 }
 | |
|             }
 | |
|             public int Day
 | |
|             {
 | |
|                 get
 | |
|                 {
 | |
|                     return this.m_day;
 | |
|                 }
 | |
|             }
 | |
|             public DayOfWeek DayOfWeek
 | |
|             {
 | |
|                 get
 | |
|                 {
 | |
|                     return this.m_dayOfWeek;
 | |
|                 }
 | |
|             }
 | |
|             public bool IsFixedDateRule
 | |
|             {
 | |
|                 get
 | |
|                 {
 | |
|                     return this.m_isFixedDateRule;
 | |
|                 }
 | |
|             }
 | |
|             public override bool Equals(object obj)
 | |
|             {
 | |
|                 return ((obj is TimeZoneInfo.TransitionTime) && this.Equals((TimeZoneInfo.TransitionTime)obj));
 | |
|             }
 | |
| 
 | |
|             public static bool operator ==(TimeZoneInfo.TransitionTime left, TimeZoneInfo.TransitionTime right)
 | |
|             {
 | |
|                 return left.Equals(right);
 | |
|             }
 | |
| 
 | |
|             public static bool operator !=(TimeZoneInfo.TransitionTime left, TimeZoneInfo.TransitionTime right)
 | |
|             {
 | |
|                 return !left.Equals(right);
 | |
|             }
 | |
| 
 | |
|             public bool Equals(TimeZoneInfo.TransitionTime other)
 | |
|             {
 | |
|                 bool flag = ((this.m_isFixedDateRule == other.m_isFixedDateRule) && (this.m_timeOfDay == other.m_timeOfDay)) && (this.m_month == other.m_month);
 | |
|                 if (!flag)
 | |
|                 {
 | |
|                     return flag;
 | |
|                 }
 | |
|                 if (other.m_isFixedDateRule)
 | |
|                 {
 | |
|                     return (this.m_day == other.m_day);
 | |
|                 }
 | |
|                 return ((this.m_week == other.m_week) && (this.m_dayOfWeek == other.m_dayOfWeek));
 | |
|             }
 | |
| 
 | |
|             public override int GetHashCode()
 | |
|             {
 | |
|                 return (this.m_month ^ (this.m_week << 8));
 | |
|             }
 | |
| 
 | |
|             public static TimeZoneInfo.TransitionTime CreateFixedDateRule(DateTime timeOfDay, int month, int day)
 | |
|             {
 | |
|                 return CreateTransitionTime(timeOfDay, month, 1, day, DayOfWeek.Sunday, true);
 | |
|             }
 | |
| 
 | |
|             public static TimeZoneInfo.TransitionTime CreateFloatingDateRule(DateTime timeOfDay, int month, int week, DayOfWeek dayOfWeek)
 | |
|             {
 | |
|                 return CreateTransitionTime(timeOfDay, month, week, 1, dayOfWeek, false);
 | |
|             }
 | |
| 
 | |
|             private static TimeZoneInfo.TransitionTime CreateTransitionTime(DateTime timeOfDay, int month, int week, int day, DayOfWeek dayOfWeek, bool isFixedDateRule)
 | |
|             {
 | |
|                 ValidateTransitionTime(timeOfDay, month, week, day, dayOfWeek);
 | |
|                 TimeZoneInfo.TransitionTime time = new TimeZoneInfo.TransitionTime();
 | |
|                 time.m_isFixedDateRule = isFixedDateRule;
 | |
|                 time.m_timeOfDay = timeOfDay;
 | |
|                 time.m_dayOfWeek = dayOfWeek;
 | |
|                 time.m_day = (byte)day;
 | |
|                 time.m_week = (byte)week;
 | |
|                 time.m_month = (byte)month;
 | |
|                 return time;
 | |
|             }
 | |
| 
 | |
|             private static void ValidateTransitionTime(DateTime timeOfDay, int month, int week, int day, DayOfWeek dayOfWeek)
 | |
|             {
 | |
|                 if (timeOfDay.Kind != DateTimeKind.Unspecified)
 | |
|                 {
 | |
|                     throw new ArgumentException("Argument_DateTimeKindMustBeUnspecified", "timeOfDay");
 | |
|                 }
 | |
|                 if ((month < 1) || (month > 12))
 | |
|                 {
 | |
|                     throw new ArgumentOutOfRangeException("month", "ArgumentOutOfRange_Month");
 | |
|                 }
 | |
|                 if ((day < 1) || (day > 0x1f))
 | |
|                 {
 | |
|                     throw new ArgumentOutOfRangeException("day", "ArgumentOutOfRange_Day");
 | |
|                 }
 | |
|                 if ((week < 1) || (week > 5))
 | |
|                 {
 | |
|                     throw new ArgumentOutOfRangeException("week", "ArgumentOutOfRange_Week");
 | |
|                 }
 | |
|                 if ((dayOfWeek < DayOfWeek.Sunday) || (dayOfWeek > DayOfWeek.Saturday))
 | |
|                 {
 | |
|                     throw new ArgumentOutOfRangeException("dayOfWeek", "ArgumentOutOfRange_DayOfWeek");
 | |
|                 }
 | |
|                 if (((timeOfDay.Year != 1) || (timeOfDay.Month != 1)) || ((timeOfDay.Day != 1) || ((timeOfDay.Ticks % 0x2710L) != 0L)))
 | |
|                 {
 | |
|                     throw new ArgumentException("Argument_DateTimeHasTicks", "timeOfDay");
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             void IDeserializationCallback.OnDeserialization(object sender)
 | |
|             {
 | |
|                 try
 | |
|                 {
 | |
|                     ValidateTransitionTime(this.m_timeOfDay, this.m_month, this.m_week, this.m_day, this.m_dayOfWeek);
 | |
|                 }
 | |
|                 catch (ArgumentException exception)
 | |
|                 {
 | |
|                     throw new SerializationException("Serialization_InvalidData", exception);
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             [SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.SerializationFormatter)]
 | |
|             void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)
 | |
|             {
 | |
|                 if (info == null)
 | |
|                 {
 | |
|                     throw new ArgumentNullException("info");
 | |
|                 }
 | |
|                 info.AddValue("TimeOfDay", this.m_timeOfDay);
 | |
|                 info.AddValue("Month", this.m_month);
 | |
|                 info.AddValue("Week", this.m_week);
 | |
|                 info.AddValue("Day", this.m_day);
 | |
|                 info.AddValue("RelativeDayOfWeek", this.m_dayOfWeek);
 | |
|                 info.AddValue("IsFixedDateRule", this.m_isFixedDateRule);
 | |
|             }
 | |
| 
 | |
|             private TransitionTime(SerializationInfo info, StreamingContext context)
 | |
|             {
 | |
|                 if (info == null)
 | |
|                 {
 | |
|                     throw new ArgumentNullException("info");
 | |
|                 }
 | |
|                 this.m_timeOfDay = (DateTime)info.GetValue("TimeOfDay", typeof(DateTime));
 | |
|                 this.m_month = (byte)info.GetValue("Month", typeof(byte));
 | |
|                 this.m_week = (byte)info.GetValue("Week", typeof(byte));
 | |
|                 this.m_day = (byte)info.GetValue("Day", typeof(byte));
 | |
|                 this.m_dayOfWeek = (DayOfWeek)info.GetValue("RelativeDayOfWeek", typeof(DayOfWeek));
 | |
|                 this.m_isFixedDateRule = (bool)info.GetValue("IsFixedDateRule", typeof(bool));
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     [Flags]
 | |
|     internal enum TimeZoneInfoOptions
 | |
|     {
 | |
|         None = 1,
 | |
|         NoThrowOnInvalidTime = 2
 | |
|     }
 | |
| 
 | |
|     [Serializable, HostProtection(SecurityAction.LinkDemand, MayLeakOnAbort = true)]
 | |
|     public class InvalidTimeZoneException : Exception
 | |
|     {
 | |
|         // Methods
 | |
|         public InvalidTimeZoneException()
 | |
|         {
 | |
|         }
 | |
| 
 | |
|         public InvalidTimeZoneException(string message)
 | |
|             : base(message)
 | |
|         {
 | |
|         }
 | |
| 
 | |
|         protected InvalidTimeZoneException(SerializationInfo info, StreamingContext context)
 | |
|             : base(info, context)
 | |
|         {
 | |
|         }
 | |
| 
 | |
|         public InvalidTimeZoneException(string message, Exception innerException)
 | |
|             : base(message, innerException)
 | |
|         {
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     [Serializable, HostProtection(SecurityAction.LinkDemand, MayLeakOnAbort = true)]
 | |
|     public class TimeZoneNotFoundException : Exception
 | |
|     {
 | |
|         // Methods
 | |
|         public TimeZoneNotFoundException()
 | |
|         {
 | |
|         }
 | |
| 
 | |
|         public TimeZoneNotFoundException(string message)
 | |
|             : base(message)
 | |
|         {
 | |
|         }
 | |
| 
 | |
|         protected TimeZoneNotFoundException(SerializationInfo info, StreamingContext context)
 | |
|             : base(info, context)
 | |
|         {
 | |
|         }
 | |
| 
 | |
|         public TimeZoneNotFoundException(string message, Exception innerException)
 | |
|             : base(message, innerException)
 | |
|         {
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     [SuppressUnmanagedCodeSecurity, HostProtection(SecurityAction.LinkDemand, MayLeakOnAbort = true)]
 | |
|     internal sealed class SafeLibraryHandle : Microsoft.Win32.SafeHandles.SafeHandleZeroOrMinusOneIsInvalid
 | |
|     {
 | |
|         // Methods
 | |
|         internal SafeLibraryHandle()
 | |
|             : base(true)
 | |
|         {
 | |
|         }
 | |
| 
 | |
|         [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success), DllImport("kernel32.dll", CharSet = CharSet.Unicode)]
 | |
|         private static extern bool FreeLibrary(IntPtr hModule);
 | |
|         [DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
 | |
|         internal static extern SafeLibraryHandle LoadLibraryEx(string libFilename, IntPtr reserved, int flags);
 | |
|         protected override bool ReleaseHandle()
 | |
|         {
 | |
|             return FreeLibrary(base.handle);
 | |
|         }
 | |
|     }
 | |
| }
 | |
| #endif
 | |
| 
 |