Blame scripts/TimeZones.csx

Packit 1fb8d4
/**
Packit 1fb8d4
 * FreeRDP: A Remote Desktop Protocol Implementation
Packit 1fb8d4
 * Time Zone Redirection Table Generator
Packit 1fb8d4
 *
Packit 1fb8d4
 * Copyright 2012 Marc-Andre Moreau <marcandre.moreau@gmail.com>
Packit 1fb8d4
 *
Packit 1fb8d4
 * Licensed under the Apache License, Version 2.0 (the "License");
Packit 1fb8d4
 * you may not use this file except in compliance with the License.
Packit 1fb8d4
 * You may obtain a copy of the License at
Packit 1fb8d4
 *
Packit 1fb8d4
 *	 http://www.apache.org/licenses/LICENSE-2.0
Packit 1fb8d4
 *
Packit 1fb8d4
 * Unless required by applicable law or agreed to in writing, software
Packit 1fb8d4
 * distributed under the License is distributed on an "AS IS" BASIS,
Packit 1fb8d4
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Packit 1fb8d4
 * See the License for the specific language governing permissions and
Packit 1fb8d4
 * limitations under the License.
Packit 1fb8d4
 */
Packit 1fb8d4
/* Run with ' csi scripts/TimeZones.csx' from freerdp checkout root */
Packit 1fb8d4
Packit 1fb8d4
using System;
Packit 1fb8d4
using System.IO;
Packit 1fb8d4
using System.Globalization;
Packit 1fb8d4
using System.Collections.ObjectModel;
Packit 1fb8d4
Packit 1fb8d4
struct SYSTEM_TIME_ENTRY
Packit 1fb8d4
{
Packit 1fb8d4
    public UInt16 wYear;
Packit 1fb8d4
    public UInt16 wMonth;
Packit 1fb8d4
    public UInt16 wDayOfWeek;
Packit 1fb8d4
    public UInt16 wDay;
Packit 1fb8d4
    public UInt16 wHour;
Packit 1fb8d4
    public UInt16 wMinute;
Packit 1fb8d4
    public UInt16 wSecond;
Packit 1fb8d4
    public UInt16 wMilliseconds;
Packit 1fb8d4
};
Packit 1fb8d4
Packit 1fb8d4
struct TIME_ZONE_RULE_ENTRY
Packit 1fb8d4
{
Packit 1fb8d4
    public long TicksStart;
Packit 1fb8d4
    public long TicksEnd;
Packit 1fb8d4
    public Int32 DaylightDelta;
Packit 1fb8d4
    public SYSTEM_TIME_ENTRY StandardDate;
Packit 1fb8d4
    public SYSTEM_TIME_ENTRY DaylightDate;
Packit 1fb8d4
};
Packit 1fb8d4
Packit 1fb8d4
struct TIME_ZONE_ENTRY
Packit 1fb8d4
{
Packit 1fb8d4
    public string Id;
Packit 1fb8d4
    public Int32 Bias;
Packit 1fb8d4
    public bool SupportsDST;
Packit 1fb8d4
    public string DisplayName;
Packit 1fb8d4
    public string StandardName;
Packit 1fb8d4
    public string DaylightName;
Packit 1fb8d4
    public string RuleTable;
Packit 1fb8d4
    public UInt32 RuleTableCount;
Packit 1fb8d4
};
Packit 1fb8d4
Packit 1fb8d4
int i;
Packit 1fb8d4
UInt32 index;
Packit 1fb8d4
const string file = @"winpr/libwinpr/timezone/TimeZones.c";
Packit 1fb8d4
TimeZoneInfo.AdjustmentRule[] rules;
Packit 1fb8d4
StreamWriter stream = new StreamWriter(file, false);
Packit 1fb8d4
ReadOnlyCollection<TimeZoneInfo> timeZones = TimeZoneInfo.GetSystemTimeZones();
Packit 1fb8d4
Packit 1fb8d4
Console.WriteLine("Updating " + file);
Packit 1fb8d4
stream.WriteLine("/* ");
Packit 1fb8d4
stream.WriteLine(" * Automatically generated with scripts/TimeZones.csx");
Packit 1fb8d4
stream.WriteLine(" */ ");
Packit 1fb8d4
stream.WriteLine();
Packit 1fb8d4
Packit 1fb8d4
stream.WriteLine("#pragma pack(push, 1)");
Packit 1fb8d4
stream.WriteLine("struct _TIME_ZONE_RULE_ENTRY");
Packit 1fb8d4
stream.WriteLine("{");
Packit 1fb8d4
stream.WriteLine("\tUINT64 TicksStart;");
Packit 1fb8d4
stream.WriteLine("\tUINT64 TicksEnd;");
Packit 1fb8d4
stream.WriteLine("\tINT32 DaylightDelta;");
Packit 1fb8d4
stream.WriteLine("\tSYSTEMTIME StandardDate;");
Packit 1fb8d4
stream.WriteLine("\tSYSTEMTIME DaylightDate;");
Packit 1fb8d4
stream.WriteLine("};");
Packit 1fb8d4
stream.WriteLine("typedef struct _TIME_ZONE_RULE_ENTRY TIME_ZONE_RULE_ENTRY;");
Packit 1fb8d4
stream.WriteLine();
Packit 1fb8d4
Packit 1fb8d4
stream.WriteLine("struct _TIME_ZONE_ENTRY");
Packit 1fb8d4
stream.WriteLine("{");
Packit 1fb8d4
stream.WriteLine("\tconst char* Id;");
Packit 1fb8d4
stream.WriteLine("\tINT32 Bias;");
Packit 1fb8d4
stream.WriteLine("\tBOOL SupportsDST;");
Packit 1fb8d4
stream.WriteLine("\tconst char* DisplayName;");
Packit 1fb8d4
stream.WriteLine("\tconst char* StandardName;");
Packit 1fb8d4
stream.WriteLine("\tconst char* DaylightName;");
Packit 1fb8d4
stream.WriteLine("\tconst TIME_ZONE_RULE_ENTRY* RuleTable;");
Packit 1fb8d4
stream.WriteLine("\tUINT32 RuleTableCount;");
Packit 1fb8d4
stream.WriteLine("};");
Packit 1fb8d4
stream.WriteLine("typedef struct _TIME_ZONE_ENTRY TIME_ZONE_ENTRY;");
Packit 1fb8d4
stream.WriteLine("#pragma pack(pop)");
Packit 1fb8d4
stream.WriteLine();
Packit 1fb8d4
Packit 1fb8d4
index = 0;
Packit 1fb8d4
Packit 1fb8d4
foreach (TimeZoneInfo timeZone in timeZones)
Packit 1fb8d4
{
Packit 1fb8d4
    rules = timeZone.GetAdjustmentRules();
Packit 1fb8d4
Packit 1fb8d4
    if ((!timeZone.SupportsDaylightSavingTime) || (rules.Length < 1))
Packit 1fb8d4
    {
Packit 1fb8d4
        index++;
Packit 1fb8d4
        continue;
Packit 1fb8d4
    }
Packit 1fb8d4
Packit 1fb8d4
    stream.WriteLine("static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_{0}[] =", index);
Packit 1fb8d4
    stream.WriteLine("{");
Packit 1fb8d4
Packit 1fb8d4
    i = 0;
Packit 1fb8d4
    foreach (TimeZoneInfo.AdjustmentRule rule in rules)
Packit 1fb8d4
    {
Packit 1fb8d4
        DateTime time;
Packit 1fb8d4
        TIME_ZONE_RULE_ENTRY tzr;
Packit 1fb8d4
        TimeZoneInfo.TransitionTime transition;
Packit 1fb8d4
Packit 1fb8d4
        tzr.TicksStart = rule.DateEnd.ToUniversalTime().Ticks;
Packit 1fb8d4
        tzr.TicksEnd = rule.DateStart.ToUniversalTime().Ticks;
Packit 1fb8d4
        tzr.DaylightDelta = (Int32)rule.DaylightDelta.TotalMinutes;
Packit 1fb8d4
Packit 1fb8d4
        transition = rule.DaylightTransitionEnd;
Packit 1fb8d4
        time = transition.TimeOfDay;
Packit 1fb8d4
Packit 1fb8d4
        tzr.StandardDate.wYear = (UInt16)0;
Packit 1fb8d4
        tzr.StandardDate.wMonth = (UInt16)transition.Month;
Packit 1fb8d4
        tzr.StandardDate.wDayOfWeek = (UInt16)transition.DayOfWeek;
Packit 1fb8d4
        tzr.StandardDate.wDay = (UInt16)transition.Week;
Packit 1fb8d4
        tzr.StandardDate.wHour = (UInt16)time.Hour;
Packit 1fb8d4
        tzr.StandardDate.wMinute = (UInt16)time.Minute;
Packit 1fb8d4
        tzr.StandardDate.wSecond = (UInt16)time.Second;
Packit 1fb8d4
        tzr.StandardDate.wMilliseconds = (UInt16)time.Millisecond;
Packit 1fb8d4
Packit 1fb8d4
        transition = rule.DaylightTransitionStart;
Packit 1fb8d4
        time = transition.TimeOfDay;
Packit 1fb8d4
Packit 1fb8d4
        tzr.DaylightDate.wYear = (UInt16)0;
Packit 1fb8d4
        tzr.DaylightDate.wMonth = (UInt16)transition.Month;
Packit 1fb8d4
        tzr.DaylightDate.wDayOfWeek = (UInt16)transition.DayOfWeek;
Packit 1fb8d4
        tzr.DaylightDate.wDay = (UInt16)transition.Week;
Packit 1fb8d4
        tzr.DaylightDate.wHour = (UInt16)time.Hour;
Packit 1fb8d4
        tzr.DaylightDate.wMinute = (UInt16)time.Minute;
Packit 1fb8d4
        tzr.DaylightDate.wSecond = (UInt16)time.Second;
Packit 1fb8d4
        tzr.DaylightDate.wMilliseconds = (UInt16)time.Millisecond;
Packit 1fb8d4
Packit 1fb8d4
        stream.Write("\t{");
Packit 1fb8d4
        stream.Write(" {0}ULL, {1}ULL, {2},", tzr.TicksStart, tzr.TicksEnd, tzr.DaylightDelta);
Packit 1fb8d4
Packit 1fb8d4
        stream.Write(" { ");
Packit 1fb8d4
        stream.Write("{0}, {1}, {2}, {3}, {4}, {5}, {6}, {7}",
Packit 1fb8d4
            tzr.StandardDate.wYear, tzr.StandardDate.wMonth, tzr.StandardDate.wDayOfWeek,
Packit 1fb8d4
            tzr.StandardDate.wDay, tzr.StandardDate.wHour, tzr.StandardDate.wMinute,
Packit 1fb8d4
            tzr.StandardDate.wSecond, tzr.StandardDate.wMilliseconds);
Packit 1fb8d4
        stream.Write(" }, ");
Packit 1fb8d4
Packit 1fb8d4
        stream.Write("{ ");
Packit 1fb8d4
        stream.Write("{0}, {1}, {2}, {3}, {4}, {5}, {6}, {7}",
Packit 1fb8d4
            tzr.DaylightDate.wYear, tzr.DaylightDate.wMonth, tzr.DaylightDate.wDayOfWeek,
Packit 1fb8d4
            tzr.DaylightDate.wDay, tzr.DaylightDate.wHour, tzr.DaylightDate.wMinute,
Packit 1fb8d4
            tzr.DaylightDate.wSecond, tzr.DaylightDate.wMilliseconds);
Packit 1fb8d4
        stream.Write(" },");
Packit 1fb8d4
Packit 1fb8d4
        if (++i < rules.Length)
Packit 1fb8d4
            stream.WriteLine(" },");
Packit 1fb8d4
        else
Packit 1fb8d4
            stream.WriteLine(" }");
Packit 1fb8d4
    }
Packit 1fb8d4
Packit 1fb8d4
    stream.WriteLine("};");
Packit 1fb8d4
    stream.WriteLine();
Packit 1fb8d4
    index++;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
index = 0;
Packit 1fb8d4
stream.WriteLine("static const TIME_ZONE_ENTRY TimeZoneTable[] =");
Packit 1fb8d4
stream.WriteLine("{");
Packit 1fb8d4
Packit 1fb8d4
foreach (TimeZoneInfo timeZone in timeZones)
Packit 1fb8d4
{
Packit 1fb8d4
    TIME_ZONE_ENTRY tz;
Packit 1fb8d4
    TimeSpan offset = timeZone.BaseUtcOffset;
Packit 1fb8d4
Packit 1fb8d4
    rules = timeZone.GetAdjustmentRules();
Packit 1fb8d4
Packit 1fb8d4
    tz.Id = timeZone.Id;
Packit 1fb8d4
    tz.Bias = -(Int32)offset.TotalMinutes;
Packit 1fb8d4
Packit 1fb8d4
    tz.SupportsDST = timeZone.SupportsDaylightSavingTime;
Packit 1fb8d4
Packit 1fb8d4
    tz.DisplayName = timeZone.DisplayName;
Packit 1fb8d4
    tz.StandardName = timeZone.StandardName;
Packit 1fb8d4
    tz.DaylightName = timeZone.DaylightName;
Packit 1fb8d4
Packit 1fb8d4
    if ((!tz.SupportsDST) || (rules.Length < 1))
Packit 1fb8d4
    {
Packit 1fb8d4
        tz.RuleTableCount = 0;
Packit 1fb8d4
        tz.RuleTable = "NULL";
Packit 1fb8d4
    }
Packit 1fb8d4
    else
Packit 1fb8d4
    {
Packit 1fb8d4
        tz.RuleTableCount = (UInt32)rules.Length;
Packit 1fb8d4
        tz.RuleTable = "TimeZoneRuleTable_" + index;
Packit 1fb8d4
    }
Packit 1fb8d4
Packit 1fb8d4
    stream.WriteLine("\t{");
Packit 1fb8d4
Packit 1fb8d4
    stream.WriteLine("\t\t\"{0}\", {1}, {2}, \"{3}\",",
Packit 1fb8d4
        tz.Id, tz.Bias, tz.SupportsDST ? "TRUE" : "FALSE", tz.DisplayName);
Packit 1fb8d4
Packit 1fb8d4
    stream.WriteLine("\t\t\"{0}\", \"{1}\",", tz.StandardName, tz.DaylightName);
Packit 1fb8d4
    stream.WriteLine("\t\t{0}, {1}", tz.RuleTable, tz.RuleTableCount);
Packit 1fb8d4
Packit 1fb8d4
    index++;
Packit 1fb8d4
Packit 1fb8d4
    if ((int)index < timeZones.Count)
Packit 1fb8d4
        stream.WriteLine("\t},");
Packit 1fb8d4
    else
Packit 1fb8d4
        stream.WriteLine("\t}");
Packit 1fb8d4
}
Packit 1fb8d4
stream.WriteLine("};");
Packit 1fb8d4
stream.WriteLine();
Packit 1fb8d4
Packit 1fb8d4
stream.Close();
Packit 1fb8d4