unit ELPlugin_AddTimeZoneInfo;
interface
implementation

uses
  Windows,  // for GetTimeZoneInformation and TTimeZoneInformation
  SysUtils, // for IntToStr
  Classes,  // for TStrings
  EEvents;  // RegisterEventCustomDataRequest

procedure AddTimeZoneInfo(const ACustom: Pointer; AExceptionInfo: TEurekaExceptionInfo; ALogBuilder: TObject; ADataFields: TStrings; var ACallNextHandler: Boolean);
var
  TimeZoneInfo: TTimeZoneInformation;
begin
  FillChar(TimeZoneInfo, SizeOf(TimeZoneInfo), 0);
  case GetTimeZoneInformation(TimeZoneInfo) of
    TIME_ZONE_ID_STANDARD:
    begin
      ADataFields.Values['TimeZone'] := 'non-DST (TIME_ZONE_ID_STANDARD)';
      ADataFields.Values['TimeZone UTC Offset'] := IntToStr(-Round((TimeZoneInfo.Bias + TimeZoneInfo.StandardBias) / 60));
    end;
    TIME_ZONE_ID_DAYLIGHT:
    begin
      ADataFields.Values['TimeZone'] := 'DST (TIME_ZONE_ID_DAYLIGHT)';
      ADataFields.Values['TimeZone UTC Offset'] := IntToStr(-Round((TimeZoneInfo.Bias + TimeZoneInfo.DaylightBias) / 60));
    end
  else
    begin
      ADataFields.Values['TimeZone'] := 'DST disabled (TIME_ZONE_ID_UNKNOWN)';
      ADataFields.Values['TimeZone UTC Offset'] := IntToStr(-Round((TimeZoneInfo.Bias + TimeZoneInfo.StandardBias) / 60));
    end;
  end;
  if ADataFields.Values['TimeZone UTC Offset'][1] <> '-' then
    ADataFields.Values['TimeZone UTC Offset'] := '+' + ADataFields.Values['TimeZone UTC Offset'];
  ADataFields.Values['TimeZone Bias'] := IntToStr(TimeZoneInfo.Bias);
  ADataFields.Values['TimeZone Standard Name'] := PWideChar(@TimeZoneInfo.StandardName);
  ADataFields.Values['TimeZone Standard Bias'] := IntToStr(TimeZoneInfo.StandardBias);
  ADataFields.Values['TimeZone Daylight Name'] := PWideChar(@TimeZoneInfo.DaylightName);
  ADataFields.Values['TimeZone Daylight Bias'] := IntToStr(TimeZoneInfo.DaylightBias);
end;

initialization
  RegisterEventCustomDataRequest(nil, AddTimeZoneInfo);
end.