[libchamplain] Fix various network-map-data-source related problems



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]