[libchamplain] Fix various network-map-data-source related problems
- From: Pierre-Luc Beaudoin <plbeaudoin src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [libchamplain] Fix various network-map-data-source related problems
- Date: Sun, 24 Jan 2010 20:10:30 +0000 (UTC)
commit 51e0a40f703f71838a93e8597f2e5c947b37cecb
Author: Simon Wenner <simon wenner ch>
Date: Wed Jul 15 18:37:13 2009 +0200
Fix various network-map-data-source related problems
- do not spawn threads if no map data is available.
- redraw all tiles that are not in the state loading or validating cache.
- code formatting
champlain/champlain-memphis-map-source.c | 37 +++++++++++++++++++++---
champlain/champlain-network-map-data-source.c | 24 +++++++++-------
champlain/champlain-view.c | 3 +-
3 files changed, 48 insertions(+), 16 deletions(-)
---
diff --git a/champlain/champlain-memphis-map-source.c b/champlain/champlain-memphis-map-source.c
index 28cf9cd..1d6ed1c 100644
--- a/champlain/champlain-memphis-map-source.c
+++ b/champlain/champlain-memphis-map-source.c
@@ -59,6 +59,7 @@ struct _ChamplainMemphisMapSourcePrivate {
MemphisRuleSet *rules;
MemphisRenderer *renderer;
GThreadPool *thpool;
+ gboolean no_map_data;
};
typedef struct _TileData TileData;
@@ -154,6 +155,15 @@ map_data_changed_cb (ChamplainMapDataSource *map_data_source,
ChamplainMemphisMapSourcePrivate *priv = GET_PRIVATE(map_source);
map = champlain_map_data_source_get_map_data (map_data_source);
+ if (map == NULL)
+ {
+ map = memphis_map_new ();
+ priv->no_map_data = TRUE;
+ }
+ else
+ {
+ priv->no_map_data = FALSE;
+ }
DEBUG ("DataSource has been changed!");
@@ -161,8 +171,7 @@ map_data_changed_cb (ChamplainMapDataSource *map_data_source,
memphis_renderer_set_map (priv->renderer, map);
g_static_rw_lock_writer_unlock (&MemphisLock);
- g_signal_emit_by_name (CHAMPLAIN_MAP_SOURCE (map_source),
- "reload-tiles", NULL);
+ champlain_memphis_map_source_delete_session_cache (map_source);
}
static void
@@ -192,6 +201,14 @@ fill_tile (ChamplainMapSource *map_source, ChamplainTile *tile)
champlain_tile_get_zoom_level (tile));
champlain_tile_set_state (tile, CHAMPLAIN_STATE_DONE);
}
+ else if (priv->no_map_data)
+ {
+ DEBUG ("No tile data (%u, %u, %u)",
+ champlain_tile_get_x (tile),
+ champlain_tile_get_y (tile),
+ champlain_tile_get_zoom_level (tile));
+ // TODO: draw an error tile
+ }
else
{
DEBUG ("Render tile (%u, %u, %u)", champlain_tile_get_x (tile),
@@ -382,6 +399,7 @@ champlain_memphis_map_source_init (ChamplainMemphisMapSource *self)
priv->renderer = NULL;
priv->thpool = NULL;
priv->session_id = g_strdup ("default");
+ priv->no_map_data = TRUE;
}
ChamplainMemphisMapSource *
@@ -409,8 +427,20 @@ champlain_memphis_map_source_new_full (ChamplainMapSourceDesc *desc,
priv = GET_PRIVATE(source);
priv->map_data_source = g_object_ref (map_data_source);
+ g_signal_connect (priv->map_data_source, "map-data-changed",
+ G_CALLBACK (map_data_changed_cb), source);
+
priv->rules = memphis_rule_set_new ();
map = champlain_map_data_source_get_map_data (priv->map_data_source);
+ if (map == NULL)
+ {
+ map = memphis_map_new ();
+ priv->no_map_data = TRUE;
+ }
+ else
+ {
+ priv->no_map_data = FALSE;
+ }
priv->renderer = memphis_renderer_new_full (priv->rules, map);
memphis_renderer_set_resolution (priv->renderer, DEFAULT_TILE_SIZE);
@@ -423,9 +453,6 @@ champlain_memphis_map_source_new_full (ChamplainMapSourceDesc *desc,
priv->thpool = g_thread_pool_new (memphis_worker_thread, source,
MAX_THREADS, FALSE, NULL);
- g_signal_connect (priv->map_data_source, "map-data-changed",
- G_CALLBACK (map_data_changed_cb), source);
-
return source;
}
diff --git a/champlain/champlain-network-map-data-source.c b/champlain/champlain-network-map-data-source.c
index 625a7d6..0f5ab7a 100644
--- a/champlain/champlain-network-map-data-source.c
+++ b/champlain/champlain-network-map-data-source.c
@@ -87,9 +87,10 @@ champlain_network_map_data_source_dispose (GObject *object)
{
ChamplainNetworkMapDataSource *self =
CHAMPLAIN_NETWORK_MAP_DATA_SOURCE (object);
- ChamplainNetworkMapDataSourcePrivate *priv = GET_PRIVATE(self);
+ ChamplainNetworkMapDataSourcePrivate *priv = GET_PRIVATE (self);
- memphis_map_free (priv->map);
+ if (priv->map)
+ memphis_map_free (priv->map);
G_OBJECT_CLASS (champlain_network_map_data_source_parent_class)->dispose (object);
}
@@ -99,7 +100,7 @@ champlain_network_map_data_source_finalize (GObject *object)
{
ChamplainNetworkMapDataSource *self =
CHAMPLAIN_NETWORK_MAP_DATA_SOURCE (object);
- ChamplainNetworkMapDataSourcePrivate *priv = GET_PRIVATE(self);
+ ChamplainNetworkMapDataSourcePrivate *priv = GET_PRIVATE (self);
g_free (priv->api_uri);
@@ -109,7 +110,7 @@ champlain_network_map_data_source_finalize (GObject *object)
static MemphisMap *
get_map_data (ChamplainMapDataSource *self)
{
- ChamplainNetworkMapDataSourcePrivate *priv = GET_PRIVATE(self);
+ ChamplainNetworkMapDataSourcePrivate *priv = GET_PRIVATE (self);
return priv->map;
}
@@ -148,9 +149,9 @@ champlain_network_map_data_source_class_init (ChamplainNetworkMapDataSourceClass
static void
champlain_network_map_data_source_init (ChamplainNetworkMapDataSource *self)
{
- ChamplainNetworkMapDataSourcePrivate *priv = GET_PRIVATE(self);
+ ChamplainNetworkMapDataSourcePrivate *priv = GET_PRIVATE (self);
- priv->map = memphis_map_new ();
+ priv->map = NULL;
priv->api_uri = g_strdup ("http://www.informationfreeway.org/api/0.6");
}
@@ -166,9 +167,9 @@ load_map_data_cb (SoupSession *session, SoupMessage *msg,
{
ChamplainNetworkMapDataSource *self =
CHAMPLAIN_NETWORK_MAP_DATA_SOURCE (user_data);
- ChamplainNetworkMapDataSourcePrivate *priv = GET_PRIVATE(self);
+ ChamplainNetworkMapDataSourcePrivate *priv = GET_PRIVATE (self);
- // TODO: error handling, error tile?
+ // TODO: network error handling
MemphisMap *map = memphis_map_new ();
memphis_map_set_debug_level (map, 0);
memphis_map_load_from_data (map,
@@ -177,6 +178,9 @@ load_map_data_cb (SoupSession *session, SoupMessage *msg,
DEBUG ("BBox data received");
+ if (priv->map)
+ memphis_map_free (priv->map);
+
priv->map = map;
g_signal_emit_by_name (CHAMPLAIN_MAP_DATA_SOURCE (self),
@@ -215,7 +219,7 @@ champlain_network_map_data_source_get_api_uri (
{
g_return_val_if_fail (CHAMPLAIN_IS_NETWORK_MAP_DATA_SOURCE (self), NULL);
- ChamplainNetworkMapDataSourcePrivate *priv = GET_PRIVATE(self);
+ ChamplainNetworkMapDataSourcePrivate *priv = GET_PRIVATE (self);
return priv->api_uri;
}
@@ -228,7 +232,7 @@ champlain_network_map_data_source_set_api_uri (
g_return_if_fail (CHAMPLAIN_IS_NETWORK_MAP_DATA_SOURCE (self)
&& api_uri != NULL);
- ChamplainNetworkMapDataSourcePrivate *priv = GET_PRIVATE(self);
+ ChamplainNetworkMapDataSourcePrivate *priv = GET_PRIVATE (self);
if (priv->api_uri != NULL)
g_free (priv->api_uri);
diff --git a/champlain/champlain-view.c b/champlain/champlain-view.c
index df59212..96a9745 100644
--- a/champlain/champlain-view.c
+++ b/champlain/champlain-view.c
@@ -2407,7 +2407,8 @@ view_reload_tiles_cb (ChamplainMapSource *map_source,
tile_y < y_first || tile_y > y_count)
continue;
- if (champlain_tile_get_state (tile) == CHAMPLAIN_STATE_DONE)
+ if (champlain_tile_get_state (tile) != CHAMPLAIN_STATE_LOADING &&
+ champlain_tile_get_state (tile) != CHAMPLAIN_STATE_VALIDATING_CACHE)
champlain_map_source_fill_tile (priv->map_source, tile);
}
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]