gnome-clocks/null-datetime-crash.patch
2020-04-14 14:51:34 -05:00

211 lines
8.6 KiB
Diff

From db85dd563e1adbbb697acffc25e2c22eac1bbb32 Mon Sep 17 00:00:00 2001
From: Zander Brown <zbrown@gnome.org>
Date: Fri, 10 Apr 2020 15:16:03 +0100
Subject: [PATCH] world: handle null datetime
Of course we need to figure out how we got garbage that generated a null
datetime but at least this way we don't crash (and get logs)
(Kinda) Fix https://gitlab.gnome.org/GNOME/gnome-clocks/-/issues/91
---
src/world.vala | 169 +++++++++++++++++++++++++++++--------------------
1 file changed, 99 insertions(+), 70 deletions(-)
diff --git a/src/world.vala b/src/world.vala
index 0da51bf..c212b02 100644
--- a/src/world.vala
+++ b/src/world.vala
@@ -251,90 +251,119 @@ public class Item : Object, ContentItem {
tick ();
}
- private void calculate_riseset () {
- double lat, lon;
- int y, m, d;
+ private void calculate_riseset_at_correction (double latitude,
+ double longitude,
+ int year,
+ int month,
+ int day,
+ double correction,
+ out DateTime sunrise,
+ out DateTime sunset) {
int rise_hour, rise_min;
int set_hour, set_min;
+ calculate_sunrise_sunset (latitude,
+ longitude,
+ year,
+ month,
+ day,
+ correction,
+ out rise_hour,
+ out rise_min,
+ out set_hour,
+ out set_min);
+
+ var utc_sunrise = new DateTime.utc (year, month, day, rise_hour, rise_min, 0);
+ if (utc_sunrise != null) {
+ sunrise = utc_sunrise.to_timezone (time_zone);
+ } else {
+ sunrise = null;
+ warning ("Sunrise for (%f,%f) resulted in %04i-%02i-%02i %02i:%02i",
+ latitude,
+ longitude,
+ year,
+ month,
+ day,
+ rise_hour,
+ rise_min);
+ }
+
+ var utc_sunset = new DateTime.utc (year, month, day, set_hour, set_min, 0);
+ if (utc_sunset != null) {
+ var local_sunset = utc_sunset.to_timezone (time_zone);
+ if (local_sunset.compare (sun_rise) < 0) {
+ sunset = local_sunset.add_days (1);
+ } else {
+ sunset = local_sunset;
+ }
+ } else {
+ sunset = null;
+ warning ("Sunset for (%f,%f) resulted in %04i-%02i-%02i %02i:%02i",
+ latitude,
+ longitude,
+ year,
+ month,
+ day,
+ rise_hour,
+ rise_min);
+ }
+ }
+
+ private void calculate_riseset () {
+ // Where we are calculating for
+ double latitude, longitude;
+ // The current UTC day
+ int year, month, day;
+
if (date_time.get_day_of_year () == last_calc_day) {
return;
}
- location.get_coords (out lat, out lon);
+ location.get_coords (out latitude, out longitude);
// Some locations, such as UTC, aren't actual locations and don't have
// proper coords
- if (!lat.is_finite () || !lon.is_finite ()) {
+ if (!latitude.is_finite () || !longitude.is_finite ()) {
return;
}
var utc = date_time.to_utc ();
- utc.get_ymd (out y, out m, out d);
-
- calculate_sunrise_sunset (lat,
- lon,
- y,
- m,
- d,
- RISESET_CORRECTION_NONE,
- out rise_hour,
- out rise_min,
- out set_hour,
- out set_min);
-
- sun_rise = new DateTime.utc (y, m, d, rise_hour, rise_min, 0).to_timezone (time_zone);
- sun_set = new DateTime.utc (y, m, d, set_hour, set_min, 0).to_timezone (time_zone);
- if (sun_set.compare (sun_rise) < 0)
- sun_set = sun_set.add_days (1);
-
- calculate_sunrise_sunset (lat,
- lon,
- y,
- m,
- d,
- RISESET_CORRECTION_CIVIL,
- out rise_hour,
- out rise_min,
- out set_hour,
- out set_min);
-
- civil_rise = new DateTime.utc (y, m, d, rise_hour, rise_min, 0).to_timezone (time_zone);
- civil_set = new DateTime.utc (y, m, d, set_hour, set_min, 0).to_timezone (time_zone);
- if (civil_set.compare (civil_rise) < 0)
- civil_set = civil_set.add_days (1);
-
- calculate_sunrise_sunset (lat,
- lon,
- y,
- m,
- d,
- RISESET_CORRECTION_NAUTICAL,
- out rise_hour,
- out rise_min,
- out set_hour,
- out set_min);
-
- naut_rise = new DateTime.utc (y, m, d, rise_hour, rise_min, 0).to_timezone (time_zone);
- naut_set = new DateTime.utc (y, m, d, set_hour, set_min, 0).to_timezone (time_zone);
- if (naut_set.compare (naut_rise) < 0)
- naut_set = naut_set.add_days (1);
-
- calculate_sunrise_sunset (lat,
- lon,
- y,
- m,
- d,
- RISESET_CORRECTION_ASTRONOMICAL,
- out rise_hour,
- out rise_min,
- out set_hour,
- out set_min);
-
- astro_rise = new DateTime.utc (y, m, d, rise_hour, rise_min, 0).to_timezone (time_zone);
- astro_set = new DateTime.utc (y, m, d, set_hour, set_min, 0).to_timezone (time_zone);
- if (astro_set.compare (astro_rise) < 0)
- astro_set = astro_set.add_days (1);
+ utc.get_ymd (out year, out month, out day);
+
+ calculate_riseset_at_correction (latitude,
+ longitude,
+ year,
+ month,
+ day,
+ RISESET_CORRECTION_NONE,
+ out sun_rise,
+ out sun_set);
+ calculate_riseset_at_correction (latitude,
+ longitude,
+ year,
+ month,
+ day,
+ RISESET_CORRECTION_CIVIL,
+ out civil_rise,
+ out civil_set);
+ calculate_riseset_at_correction (latitude,
+ longitude,
+ year,
+ month,
+ day,
+ RISESET_CORRECTION_NAUTICAL,
+ out naut_rise,
+ out naut_set);
+ calculate_riseset_at_correction (latitude,
+ longitude,
+ year,
+ month,
+ day,
+ RISESET_CORRECTION_ASTRONOMICAL,
+ out astro_rise,
+ out astro_set);
+
+ last_calc_day = date_time.get_day_of_year ();
}
[Signal (run = "first")]
--
2.24.1