File geoclue-auto-detect-timezone-when-network-change.patch of Package geoclue2.7583
diff -Nura geoclue-2.4.3/src/gclue-web-source.c geoclue-2.4.3_new/src/gclue-web-source.c
--- geoclue-2.4.3/src/gclue-web-source.c 2015-09-07 20:17:11.000000000 +0800
+++ geoclue-2.4.3_new/src/gclue-web-source.c 2018-05-23 14:23:47.100209659 +0800
@@ -48,7 +48,7 @@
guint64 last_submitted;
- gboolean network_available;
+ gboolean internet_available;
};
G_DEFINE_ABSTRACT_TYPE (GClueWebSource, gclue_web_source, GCLUE_TYPE_LOCATION_SOURCE)
@@ -99,12 +99,37 @@
g_object_unref (location);
}
+static gboolean
+get_internet_available (void)
+{
+ GNetworkMonitor *monitor = g_network_monitor_get_default ();
+ gboolean available;
+
+#if GLIB_CHECK_VERSION(2, 44, 0)
+ available = (g_network_monitor_get_connectivity (monitor) ==
+ G_NETWORK_CONNECTIVITY_FULL);
+#else
+ GSocketConnectable *connectable;
+
+ connectable = g_network_address_new ("location.services.mozilla.com",
+ 80);
+ available = g_network_monitor_can_reach (monitor,
+ connectable,
+ NULL,
+ NULL);
+ g_object_unref (connectable);
+#endif
+
+ return available;
+}
+
static void
-refresh_accuracy_level (GClueWebSource *web,
- gboolean available)
+refresh_accuracy_level (GClueWebSource *web)
{
GClueAccuracyLevel new, existing;
+ gboolean available;
+ available = get_internet_available ();
existing = gclue_location_source_get_available_accuracy_level
(GCLUE_LOCATION_SOURCE (web));
new = GCLUE_WEB_SOURCE_GET_CLASS (web)->get_available_accuracy_level
@@ -119,23 +144,23 @@
}
static void
-on_network_changed (GNetworkMonitor *monitor,
- gboolean available,
+on_network_changed (GNetworkMonitor *monitor G_GNUC_UNUSED,
+ gboolean available G_GNUC_UNUSED,
gpointer user_data)
{
GClueWebSource *web = GCLUE_WEB_SOURCE (user_data);
GError *error = NULL;
- gboolean last_available = web->priv->network_available;
+ gboolean last_available = web->priv->internet_available;
- refresh_accuracy_level (web, available);
+ refresh_accuracy_level (web);
if (!gclue_location_source_get_active (GCLUE_LOCATION_SOURCE (user_data)))
return;
- web->priv->network_available = available;
- if (last_available == available)
- return; /* We already reacted to netork change */
- if (!available) {
+ web->priv->internet_available = get_internet_available ();
+ if (last_available == web->priv->internet_available)
+ return; /* We already reacted to network change */
+ if (!web->priv->internet_available) {
g_debug ("Network unavailable");
return;
}
@@ -203,8 +228,8 @@
"network-changed",
G_CALLBACK (on_network_changed),
object);
- on_network_changed (monitor,
- g_network_monitor_get_network_available (monitor),
+ on_network_changed (NULL,
+ TRUE,
object);
}
@@ -239,14 +264,11 @@
void
gclue_web_source_refresh (GClueWebSource *source)
{
- GNetworkMonitor *monitor;
-
g_return_if_fail (GCLUE_IS_WEB_SOURCE (source));
- monitor = g_network_monitor_get_default ();
- if (g_network_monitor_get_network_available (monitor)) {
- source->priv->network_available = FALSE;
- on_network_changed (monitor, TRUE, source);
+ if (get_internet_available ()) {
+ source->priv->internet_available = FALSE;
+ on_network_changed (NULL, TRUE, source);
}
}
@@ -292,7 +314,6 @@
{
GClueLocationSource *source = GCLUE_LOCATION_SOURCE (source_object);
GClueWebSource *web = GCLUE_WEB_SOURCE (user_data);
- GNetworkMonitor *monitor;
GClueLocation *location;
SoupMessage *query;
GError *error = NULL;
@@ -308,8 +329,7 @@
web->priv->last_submitted = geocode_location_get_timestamp
(GEOCODE_LOCATION (location));
- monitor = g_network_monitor_get_default ();
- if (!g_network_monitor_get_network_available (monitor))
+ if (!get_internet_available ())
return;
query = GCLUE_WEB_SOURCE_GET_CLASS (web)->create_submit_query