]> git.street.me.uk Git - andy/viking.git/blobdiff - src/bingmapsource.c
Merge pull request #20 from huobos/zh_CN
[andy/viking.git] / src / bingmapsource.c
index dc4ffb330d35ac4d01260a4b8296562eb65a486f..c999ac754aa6f6215246c1bcae432dc72a41bbf9 100644 (file)
@@ -79,6 +79,7 @@ struct _BingMapSourcePrivate
        GList *attributions;
        /* Current attribution, when parsing */
        gchar *attribution;
+       gboolean loading_attributions;
 };
 
 /* The pixbuf to store the logo */
@@ -109,6 +110,7 @@ bing_map_source_init (BingMapSource *self)
        priv->api_key = NULL;
        priv->attributions = NULL;
        priv->attribution = NULL;
+       priv->loading_attributions = FALSE;
 }
 
 static void
@@ -297,7 +299,11 @@ _get_copyright(VikMapSource * self, LatLonBBox bbox, gdouble zoom, void (*fct)(V
        /* Loop over all known attributions */
        GList *attribution = priv->attributions;
        if (attribution == NULL && g_strcmp0 ("<no-set>", priv->api_key)) {
-               _async_load_attributions (BING_MAP_SOURCE (self));
+               if ( ! priv->loading_attributions )
+                       _async_load_attributions (BING_MAP_SOURCE (self));
+               else
+                       // Wait until attributions loaded before processing them
+                       return;
        }
        while (attribution != NULL) {
                struct _Attribution *current = (struct _Attribution*)attribution->data;
@@ -326,7 +332,7 @@ bstart_element (GMarkupParseContext *context,
        const gchar *element = g_markup_parse_context_get_element (context);
        if (strcmp (element, "CoverageArea") == 0) {
                /* New Attribution */
-               struct _Attribution *attribution = g_malloc (sizeof(struct _Attribution));
+               struct _Attribution *attribution = g_malloc0 (sizeof(struct _Attribution));
                priv->attributions = g_list_append (priv->attributions, attribution);
                attribution->attribution = g_strdup (priv->attribution);
        }
@@ -351,33 +357,31 @@ btext (GMarkupParseContext *context,
        int len = g_slist_length ((GSList *)stack);
 
        const gchar *parent = len > 1 ? g_slist_nth_data ((GSList *)stack, 1) : NULL;
-       
        if (strcmp (element, "Attribution") == 0) {
                g_free (priv->attribution);
                priv->attribution = g_strdup (textl);
-       } else if (parent != NULL && strcmp (parent, "CoverageArea") == 0) {
-               if (strcmp (element, "ZoomMin") == 0) {
-                       attribution->minZoom = atoi (textl);
-               } else if (strcmp (element, "ZoomMax") == 0) {
-                       attribution->maxZoom = atoi (textl);
-               }
-       } else if (parent != NULL && strcmp (parent, "BoundingBox") == 0) {
-               if (strcmp (element, "SouthLatitude") == 0) {
-                       attribution->bounds.south = g_ascii_strtod (textl, NULL);
-               } else if (strcmp (element, "WestLongitude") == 0) {
-                       attribution->bounds.west = g_ascii_strtod (textl, NULL);
-               } else if (strcmp (element, "NorthLatitude") == 0) {
-                       attribution->bounds.north = g_ascii_strtod (textl, NULL);
-               } else if (strcmp (element, "EastLongitude") == 0) {
-                       attribution->bounds.east = g_ascii_strtod (textl, NULL);
+       }
+       else {
+               if ( attribution ) {
+                       if (parent != NULL && strcmp (parent, "CoverageArea") == 0) {
+                               if (strcmp (element, "ZoomMin") == 0) {
+                                       attribution->minZoom = atoi (textl);
+                               } else if (strcmp (element, "ZoomMax") == 0) {
+                                       attribution->maxZoom = atoi (textl);
+                               }
+                       } else if (parent != NULL && strcmp (parent, "BoundingBox") == 0) {
+                               if (strcmp (element, "SouthLatitude") == 0) {
+                                       attribution->bounds.south = g_ascii_strtod (textl, NULL);
+                               } else if (strcmp (element, "WestLongitude") == 0) {
+                                       attribution->bounds.west = g_ascii_strtod (textl, NULL);
+                               } else if (strcmp (element, "NorthLatitude") == 0) {
+                                       attribution->bounds.north = g_ascii_strtod (textl, NULL);
+                               } else if (strcmp (element, "EastLongitude") == 0) {
+                                       attribution->bounds.east = g_ascii_strtod (textl, NULL);
+                               }
+                       }
                }
        }
-       if (attribution)
-               g_debug("Current attribution %s from %d to %d %g %g %g %g",
-                       attribution->attribution,
-                       attribution->minZoom, attribution->maxZoom,
-                       attribution->bounds.south, attribution->bounds.north, attribution->bounds.west, attribution->bounds.east);
-
        g_free(textl);
 }
 
@@ -438,6 +442,15 @@ _parse_file_for_attributions(BingMapSource *self, gchar *filename)
        xml_context = NULL;
        fclose (file);
 
+       if (vik_debug) {
+               GList *attribution = priv->attributions;
+               while (attribution != NULL) {
+                       struct _Attribution *aa = (struct _Attribution*)attribution->data;
+                       g_debug ("Bing Attribution: %s from %d to %d %g %g %g %g", aa->attribution, aa->minZoom, aa->maxZoom, aa->bounds.south, aa->bounds.north, aa->bounds.east, aa->bounds.west);
+                       attribution = attribution->next;
+               }
+       }
+
        return TRUE;
 }
 
@@ -447,20 +460,25 @@ _load_attributions ( BingMapSource *self )
        int ret = 0;  /* OK */
 
        BingMapSourcePrivate *priv = BING_MAP_SOURCE_GET_PRIVATE (self);
+       priv->loading_attributions = TRUE;
        gchar *uri = g_strdup_printf(URL_ATTR_FMT, priv->api_key);
 
        gchar *tmpname = a_download_uri_to_tmp_file ( uri, vik_map_source_default_get_download_options(VIK_MAP_SOURCE_DEFAULT(self)) );
+       if ( !tmpname ) {
+               ret = -1;
+               goto done;
+       }
 
        g_debug("%s: %s", __FUNCTION__, tmpname);
        if (!_parse_file_for_attributions(self, tmpname)) {
                ret = -1;
-               goto done;
        }
 
+       (void)g_remove(tmpname);
+       g_free(tmpname);
 done:
+       priv->loading_attributions = FALSE;
        g_free(uri);
-       g_remove(tmpname);
-       g_free(tmpname);
        return ret;
 }