#include <gtk/gtk.h>
#include <gdk-pixbuf/gdk-pixdata.h>
+#include <glib.h>
+#include <glib/gstdio.h>
#include <glib/gi18n.h>
-#include <stdio.h>
#include <string.h>
#include <math.h>
#include "globals.h"
#include "vikviewport.h"
#include "viklayer.h"
#include "vikmapslayer.h"
-#include "vikmapslayer_pixmap.h"
+#ifdef HAVE_UNISTD_H
#include <unistd.h>
-#include <sys/stat.h>
-#include <sys/types.h>
+#endif
#include "mapcache.h"
/* only for dialog.h -- ugh */
static VikToolInterface maps_tools[] = {
{ N_("Maps Download"), (VikToolConstructorFunc) maps_layer_download_create, NULL, NULL, NULL,
(VikToolMouseFunc) maps_layer_download_click, NULL, (VikToolMouseFunc) maps_layer_download_release,
- (VikToolKeyFunc) NULL, &cursor_mapdl },
+ (VikToolKeyFunc) NULL, GDK_CURSOR_IS_PIXMAP, &cursor_mapdl_pixbuf },
};
VikLayerInterface vik_maps_layer_interface = {
N_("Map"),
- &mapslayer_pixbuf,
+ &vikmapslayer_pixbuf,
maps_tools,
sizeof(maps_tools) / sizeof(maps_tools[0]),
/******** MAPS LAYER TYPES **************/
/****************************************/
-void maps_layer_register_type ( const char *label, guint id, VikMapsLayer_MapType *map_type )
+void maps_layer_register_map_source ( const char *label, VikMapSource *map )
{
g_assert(label != NULL);
- g_assert(map_type != NULL);
- g_assert(id == map_type->uniq_id);
+ g_assert(map != NULL);
+
+ guint id = vik_map_source_get_uniq_id(map);
/* Add the label */
params_maptypes = g_list_append(params_maptypes, g_strdup(label));
/* Add the id */
- params_maptypes_ids = g_list_append(params_maptypes_ids, (gpointer)id);
+ params_maptypes_ids = g_list_append(params_maptypes_ids, GUINT_TO_POINTER (id));
/* We have to clone */
- VikMapsLayer_MapType *clone = g_memdup(map_type, sizeof(VikMapsLayer_MapType));
+ VikMapSource *clone = VIK_MAP_SOURCE(g_object_ref(map));
/* Register the clone in the list */
__map_types = g_list_append(__map_types, clone);
#define MAPS_LAYER_NTH_LABEL(n) ((gchar*)g_list_nth_data(params_maptypes, (n)))
#define MAPS_LAYER_NTH_ID(n) ((guint)g_list_nth_data(params_maptypes_ids, (n)))
-#define MAPS_LAYER_NTH_TYPE(n) ((VikMapsLayer_MapType*)g_list_nth_data(__map_types, (n)))
+#define MAPS_LAYER_NTH_TYPE(n) (VIK_MAP_SOURCE(g_list_nth_data(__map_types, (n))))
gint vik_maps_layer_get_map_type(VikMapsLayer *vml)
{
/****************************************/
#define DIRSTRUCTURE "%st%ds%dz%d" G_DIR_SEPARATOR_S "%d" G_DIR_SEPARATOR_S "%d"
+#define MAPS_CACHE_DIR maps_layer_default_dir()
+
#ifdef WINDOWS
-#define MAPS_CACHE_DIR "C:\\VIKING-MAPS\\"
+#include <io.h>
+#define GLOBAL_MAPS_DIR "C:\\VIKING-MAPS\\"
+#define LOCAL_MAPS_DIR "VIKING-MAPS"
#else /* POSIX */
-
#include <stdlib.h>
-
-#define MAPS_CACHE_DIR maps_layer_default_dir()
#define GLOBAL_MAPS_DIR "/var/cache/maps/"
+#define LOCAL_MAPS_DIR ".viking-maps"
+#endif
gchar *maps_layer_default_dir ()
{
const gchar *mapdir = g_getenv("VIKING_MAPS");
if ( mapdir ) {
defaultdir = g_strdup ( mapdir );
- } else if ( access ( GLOBAL_MAPS_DIR, W_OK ) == 0 ) {
+ } else if ( g_access ( GLOBAL_MAPS_DIR, W_OK ) == 0 ) {
defaultdir = g_strdup ( GLOBAL_MAPS_DIR );
} else {
- const gchar *home = g_getenv("HOME");
- if (!home || access(home, W_OK))
+ const gchar *home = g_get_home_dir();
+ if (!home || g_access(home, W_OK))
home = g_get_home_dir ();
if ( home )
- defaultdir = g_build_filename ( home, ".viking-maps", NULL );
+ defaultdir = g_build_filename ( home, LOCAL_MAPS_DIR, NULL );
else
- defaultdir = g_strdup ( ".viking-maps" );
+ defaultdir = g_strdup ( LOCAL_MAPS_DIR );
}
if (defaultdir && (defaultdir[strlen(defaultdir)-1] != G_DIR_SEPARATOR))
{
return defaultdir;
}
-#endif
-
static void maps_layer_mkdir_if_default_dir ( VikMapsLayer *vml )
{
- if ( vml->cache_dir && strcmp ( vml->cache_dir, MAPS_CACHE_DIR ) == 0 && access ( vml->cache_dir, F_OK ) != 0 )
+ if ( vml->cache_dir && strcmp ( vml->cache_dir, MAPS_CACHE_DIR ) == 0 && g_file_test ( vml->cache_dir, G_FILE_TEST_EXISTS ) == FALSE )
{
-#ifdef WINDOWS
- mkdir ( vml->cache_dir );
-#else
- mkdir ( vml->cache_dir, 0777 );
-#endif
+ g_mkdir ( vml->cache_dir, 0777 );
}
}
static guint map_index_to_uniq_id (guint8 index)
{
g_assert ( index < NUM_MAP_TYPES );
- return MAPS_LAYER_NTH_TYPE(index)->uniq_id;
+ return vik_map_source_get_uniq_id(MAPS_LAYER_NTH_TYPE(index));
}
static guint map_uniq_id_to_index ( guint uniq_id )
{
gint i;
for ( i = 0; i < NUM_MAP_TYPES; i++ )
- if ( MAPS_LAYER_NTH_TYPE(i)->uniq_id == uniq_id )
+ if ( vik_map_source_get_uniq_id(MAPS_LAYER_NTH_TYPE(i)) == uniq_id )
return i;
return NUM_MAP_TYPES; /* no such thing */
}
* So, we can check if we have to inform the user about inconsistency */
VikViewportDrawMode vp_drawmode;
VikMapsLayer *vml = VIK_MAPS_LAYER(vl);
- VikMapsLayer_MapType *map_type = NULL;
+ VikMapSource *map = NULL;
vp_drawmode = vik_viewport_get_drawmode ( VIK_VIEWPORT(vp) );
- map_type = MAPS_LAYER_NTH_TYPE(vml->maptype);
- if (map_type->drawmode != vp_drawmode) {
- const gchar *drawmode_name = vik_viewport_get_drawmode_name (VIK_VIEWPORT(vp), map_type->drawmode);
+ map = MAPS_LAYER_NTH_TYPE(vml->maptype);
+ if (vik_map_source_get_drawmode(map) != vp_drawmode) {
+ const gchar *drawmode_name = vik_viewport_get_drawmode_name (VIK_VIEWPORT(vp), vik_map_source_get_drawmode(map));
gchar *msg = g_strdup_printf(_("New map cannot be displayed in the current drawmode.\nSelect \"%s\" from View menu to view it."), drawmode_name);
a_dialog_warning_msg ( VIK_GTK_WINDOW_FROM_LAYER(vml), msg );
g_free(msg);
g_snprintf ( filename_buf, buf_len, DIRSTRUCTURE,
vml->cache_dir, mode,
mapcoord->scale, mapcoord->z, mapcoord->x, mapcoord->y );
- if ( access ( filename_buf, R_OK ) == 0) {
+ if ( g_file_test ( filename_buf, G_FILE_TEST_EXISTS ) == TRUE) {
{
GError *gx = NULL;
pixbuf = gdk_pixbuf_new_from_file ( filename_buf, &gx );
pixbuf = pixbuf_shrink ( pixbuf, xshrinkfactor, yshrinkfactor );
a_mapcache_add ( pixbuf, mapcoord->x, mapcoord->y,
- mapcoord->z, MAPS_LAYER_NTH_TYPE(vml->maptype)->uniq_id,
+ mapcoord->z, vik_map_source_get_uniq_id(MAPS_LAYER_NTH_TYPE(vml->maptype)),
mapcoord->scale, vml->alpha, xshrinkfactor, yshrinkfactor );
}
}
}
/* coord -> ID */
- VikMapsLayer_MapType *map_type = MAPS_LAYER_NTH_TYPE(vml->maptype);
- if ( map_type->coord_to_mapcoord ( ul, xzoom, yzoom, &ulm ) &&
- map_type->coord_to_mapcoord ( br, xzoom, yzoom, &brm ) ) {
+ VikMapSource *map = MAPS_LAYER_NTH_TYPE(vml->maptype);
+ if ( vik_map_source_coord_to_mapcoord ( map, ul, xzoom, yzoom, &ulm ) &&
+ vik_map_source_coord_to_mapcoord ( map, br, xzoom, yzoom, &brm ) ) {
/* loop & draw */
gint x, y;
gint xmin = MIN(ulm.x, brm.x), xmax = MAX(ulm.x, brm.x);
gint ymin = MIN(ulm.y, brm.y), ymax = MAX(ulm.y, brm.y);
- gint mode = map_type->uniq_id;
+ gint mode = vik_map_source_get_uniq_id(map);
VikCoord coord;
gint xx, yy, width, height;
start_download_thread ( vml, vvp, ul, br, REDOWNLOAD_NONE );
}
- if ( map_type->tilesize_x == 0 && !existence_only ) {
+ if ( vik_map_source_get_tilesize_x(map) == 0 && !existence_only ) {
for ( x = xmin; x <= xmax; x++ ) {
for ( y = ymin; y <= ymax; y++ ) {
ulm.x = x;
width = gdk_pixbuf_get_width ( pixbuf );
height = gdk_pixbuf_get_height ( pixbuf );
- map_type->mapcoord_to_center_coord ( &ulm, &coord );
+ vik_map_source_mapcoord_to_center_coord ( map, &ulm, &coord );
vik_viewport_coord_to_screen ( vvp, &coord, &xx, &yy );
xx -= (width/2);
yy -= (height/2);
}
}
} else { /* tilesize is known, don't have to keep converting coords */
- gdouble tilesize_x = map_type->tilesize_x * xshrinkfactor;
- gdouble tilesize_y = map_type->tilesize_y * yshrinkfactor;
+ gdouble tilesize_x = vik_map_source_get_tilesize_x(map) * xshrinkfactor;
+ gdouble tilesize_y = vik_map_source_get_tilesize_y(map) * yshrinkfactor;
/* ceiled so tiles will be maximum size in the case of funky shrinkfactor */
gint tilesize_x_ceil = ceil ( tilesize_x );
gint tilesize_y_ceil = ceil ( tilesize_y );
xend = (xinc == 1) ? (xmax+1) : (xmin-1);
yend = (yinc == 1) ? (ymax+1) : (ymin-1);
- map_type->mapcoord_to_center_coord ( &ulm, &coord );
+ vik_map_source_mapcoord_to_center_coord ( map, &ulm, &coord );
vik_viewport_coord_to_screen ( vvp, &coord, &xx_tmp, &yy_tmp );
xx = xx_tmp; yy = yy_tmp;
/* above trick so xx,yy doubles. this is so shrinkfactors aren't rounded off
g_snprintf ( path_buf, max_path_len, DIRSTRUCTURE,
vml->cache_dir, mode,
ulm.scale, ulm.z, ulm.x, ulm.y );
- if ( access ( path_buf, F_OK ) == 0 ) {
+ if ( g_file_test ( path_buf, G_FILE_TEST_EXISTS ) == TRUE ) {
vik_viewport_draw_line ( vvp, black_gc, xx+tilesize_x_ceil, yy, xx, yy+tilesize_y_ceil );
}
} else {
static void maps_layer_draw ( VikMapsLayer *vml, VikViewport *vvp )
{
- if ( MAPS_LAYER_NTH_TYPE(vml->maptype)->drawmode == vik_viewport_get_drawmode ( vvp ) )
+ if ( vik_map_source_get_drawmode(MAPS_LAYER_NTH_TYPE(vml->maptype)) == vik_viewport_get_drawmode ( vvp ) )
{
VikCoord ul, br;
gboolean remove_mem_cache = FALSE;
gboolean need_download = FALSE;
g_snprintf ( mdi->filename_buf, mdi->maxlen, DIRSTRUCTURE,
- mdi->cache_dir, MAPS_LAYER_NTH_TYPE(mdi->maptype)->uniq_id,
+ mdi->cache_dir, vik_map_source_get_uniq_id(MAPS_LAYER_NTH_TYPE(mdi->maptype)),
mdi->mapcoord.scale, mdi->mapcoord.z, x, y );
donemaps++;
a_background_thread_progress ( threaddata, ((gdouble)donemaps) / mdi->mapstoget ); /* this also calls testcancel */
if ( mdi->redownload == REDOWNLOAD_ALL)
- remove ( mdi->filename_buf );
+ g_remove ( mdi->filename_buf );
- else if ( (mdi->redownload == REDOWNLOAD_BAD) && (access ( mdi->filename_buf, F_OK ) == 0) )
+ else if ( (mdi->redownload == REDOWNLOAD_BAD) && (g_file_test ( mdi->filename_buf, G_FILE_TEST_EXISTS ) == TRUE) )
{
/* see if this one is bad or what */
GError *gx = NULL;
GdkPixbuf *pixbuf = gdk_pixbuf_new_from_file ( mdi->filename_buf, &gx );
if (gx || (!pixbuf))
- remove ( mdi->filename_buf );
+ g_remove ( mdi->filename_buf );
if ( pixbuf )
g_object_unref ( pixbuf );
if ( gx )
g_error_free ( gx );
}
- if ( access ( mdi->filename_buf, F_OK ) != 0 )
+ if ( g_file_test ( mdi->filename_buf, G_FILE_TEST_EXISTS ) == FALSE )
{
need_download = TRUE;
if (( mdi->redownload != REDOWNLOAD_NONE ) &&
mdi->mapcoord.x = x; mdi->mapcoord.y = y;
if (need_download) {
- if ( MAPS_LAYER_NTH_TYPE(mdi->maptype)->download ( &(mdi->mapcoord), mdi->filename_buf ))
+ if ( vik_map_source_download( MAPS_LAYER_NTH_TYPE(mdi->maptype), &(mdi->mapcoord), mdi->filename_buf ))
continue;
}
gdk_threads_enter();
g_mutex_lock(mdi->mutex);
if (remove_mem_cache)
- a_mapcache_remove_all_shrinkfactors ( x, y, mdi->mapcoord.z, MAPS_LAYER_NTH_TYPE(mdi->maptype)->uniq_id, mdi->mapcoord.scale );
+ a_mapcache_remove_all_shrinkfactors ( x, y, mdi->mapcoord.z, vik_map_source_get_uniq_id(MAPS_LAYER_NTH_TYPE(mdi->maptype)), mdi->mapcoord.scale );
if (mdi->refresh_display && mdi->map_layer_alive) {
/* TODO: check if it's on visible area */
vik_layer_emit_update ( VIK_LAYER(mdi->vml) );
if ( mdi->mapcoord.x || mdi->mapcoord.y )
{
g_snprintf ( mdi->filename_buf, mdi->maxlen, DIRSTRUCTURE,
- mdi->cache_dir, MAPS_LAYER_NTH_TYPE(mdi->maptype)->uniq_id,
+ mdi->cache_dir, vik_map_source_get_uniq_id(MAPS_LAYER_NTH_TYPE(mdi->maptype)),
mdi->mapcoord.scale, mdi->mapcoord.z, mdi->mapcoord.x, mdi->mapcoord.y );
- if ( access ( mdi->filename_buf, F_OK ) == 0)
+ if ( g_file_test ( mdi->filename_buf, G_FILE_TEST_EXISTS ) == TRUE)
{
- remove ( mdi->filename_buf );
+ g_remove ( mdi->filename_buf );
}
}
}
gdouble xzoom = vml->xmapzoom ? vml->xmapzoom : vik_viewport_get_xmpp ( vvp );
gdouble yzoom = vml->ymapzoom ? vml->ymapzoom : vik_viewport_get_ympp ( vvp );
MapCoord ulm, brm;
- VikMapsLayer_MapType *map_type = MAPS_LAYER_NTH_TYPE(vml->maptype);
- if ( map_type->coord_to_mapcoord ( ul, xzoom, yzoom, &ulm )
- && map_type->coord_to_mapcoord ( br, xzoom, yzoom, &brm ) )
+ VikMapSource *map = MAPS_LAYER_NTH_TYPE(vml->maptype);
+ if ( vik_map_source_coord_to_mapcoord ( map, ul, xzoom, yzoom, &ulm )
+ && vik_map_source_coord_to_mapcoord ( map, br, xzoom, yzoom, &brm ) )
{
MapDownloadInfo *mdi = g_malloc ( sizeof(MapDownloadInfo) );
gint a, b;
for ( b = mdi->y0; b <= mdi->yf; b++ )
{
g_snprintf ( mdi->filename_buf, mdi->maxlen, DIRSTRUCTURE,
- vml->cache_dir, map_type->uniq_id, ulm.scale,
+ vml->cache_dir, vik_map_source_get_uniq_id(map), ulm.scale,
ulm.z, a, b );
- if ( access ( mdi->filename_buf, F_OK ) != 0)
+ if ( g_file_test ( mdi->filename_buf, G_FILE_TEST_EXISTS ) == FALSE )
mdi->mapstoget++;
}
}
if ( mdi->mapstoget )
{
- gchar *tmp = g_strdup_printf ( "%s %s%d %s %s...", redownload ? _("Redownloading") : _("Downloading"), redownload == REDOWNLOAD_BAD ? _("up to ") : "", mdi->mapstoget, MAPS_LAYER_NTH_LABEL(vml->maptype), ngettext("map", "maps", mdi->mapstoget) );
+ const gchar *tmp_str;
+ gchar *tmp;
+ if (redownload)
+ {
+ if (redownload == REDOWNLOAD_BAD)
+ tmp_str = ngettext("Redownloading up to %d %s map...", "Redownloading up to %d %s maps...", mdi->mapstoget);
+ else
+ tmp_str = ngettext("Redownloading %d %s map...", "Redownloading %d %s maps...", mdi->mapstoget);
+ }
+ else
+ {
+ tmp_str = ngettext("Downloading %d %s map...", "Downloading %d %s maps...", mdi->mapstoget);
+ }
+ tmp = g_strdup_printf ( tmp_str, mdi->mapstoget, MAPS_LAYER_NTH_LABEL(vml->maptype));
+
g_object_weak_ref(G_OBJECT(mdi->vml), weak_ref_cb, mdi);
/* launch the thread */
a_background_thread ( VIK_GTK_WINDOW_FROM_LAYER(vml), /* parent window */
void maps_layer_download_section_without_redraw( VikMapsLayer *vml, VikViewport *vvp, VikCoord *ul, VikCoord *br, gdouble zoom)
{
MapCoord ulm, brm;
- VikMapsLayer_MapType *map_type = MAPS_LAYER_NTH_TYPE(vml->maptype);
+ VikMapSource *map = MAPS_LAYER_NTH_TYPE(vml->maptype);
- if (!map_type->coord_to_mapcoord(ul, zoom, zoom, &ulm)
- || !map_type->coord_to_mapcoord(br, zoom, zoom, &brm)) {
- g_warning("%s() coord_to_mapcoord() failed\n", __PRETTY_FUNCTION__);
+ if (!vik_map_source_coord_to_mapcoord(map, ul, zoom, zoom, &ulm)
+ || !vik_map_source_coord_to_mapcoord(map, br, zoom, zoom, &brm)) {
+ g_warning("%s() coord_to_mapcoord() failed", __PRETTY_FUNCTION__);
return;
}
for (i = mdi->x0; i <= mdi->xf; i++) {
for (j = mdi->y0; j <= mdi->yf; j++) {
g_snprintf ( mdi->filename_buf, mdi->maxlen, DIRSTRUCTURE,
- vml->cache_dir, map_type->uniq_id, ulm.scale,
+ vml->cache_dir, vik_map_source_get_uniq_id(map), ulm.scale,
ulm.z, i, j );
- if ( access ( mdi->filename_buf, F_OK ) != 0)
+ if ( g_file_test ( mdi->filename_buf, G_FILE_TEST_EXISTS ) == FALSE )
mdi->mapstoget++;
}
}
MapCoord tmp;
if (!vml || vml->vl.type != VIK_LAYER_MAPS)
return FALSE;
- VikMapsLayer_MapType *map_type = MAPS_LAYER_NTH_TYPE(vml->maptype);
- if ( map_type->drawmode == vik_viewport_get_drawmode ( vvp ) &&
- map_type->coord_to_mapcoord ( vik_viewport_get_center ( vvp ),
+ VikMapSource *map = MAPS_LAYER_NTH_TYPE(vml->maptype);
+ if ( vik_map_source_get_drawmode(map) == vik_viewport_get_drawmode ( vvp ) &&
+ vik_map_source_coord_to_mapcoord ( map, vik_viewport_get_center ( vvp ),
vml->xmapzoom ? vml->xmapzoom : vik_viewport_get_xmpp ( vvp ),
vml->ymapzoom ? vml->ymapzoom : vik_viewport_get_ympp ( vvp ),
&tmp ) ) {
vik_viewport_screen_to_coord ( vvp, 0, 0, &ul );
vik_viewport_screen_to_coord ( vvp, vik_viewport_get_width(vvp), vik_viewport_get_height(vvp), &br );
- VikMapsLayer_MapType *map_type = MAPS_LAYER_NTH_TYPE(vml->maptype);
- if ( map_type->drawmode == vp_drawmode &&
- map_type->coord_to_mapcoord ( &ul, xzoom, yzoom, &ulm ) &&
- map_type->coord_to_mapcoord ( &br, xzoom, yzoom, &brm ) )
+ VikMapSource *map = MAPS_LAYER_NTH_TYPE(vml->maptype);
+ if ( vik_map_source_get_drawmode(map) == vp_drawmode &&
+ vik_map_source_coord_to_mapcoord ( map, &ul, xzoom, yzoom, &ulm ) &&
+ vik_map_source_coord_to_mapcoord ( map, &br, xzoom, yzoom, &brm ) )
start_download_thread ( vml, vvp, &ul, &br, redownload );
- else if (map_type->drawmode != vp_drawmode) {
- const gchar *drawmode_name = vik_viewport_get_drawmode_name (vvp, map_type->drawmode);
+ else if (vik_map_source_get_drawmode(map) != vp_drawmode) {
+ const gchar *drawmode_name = vik_viewport_get_drawmode_name (vvp, vik_map_source_get_drawmode(map));
gchar *err = g_strdup_printf(_("Wrong drawmode for this map.\nSelect \"%s\" from View menu and try again."), _(drawmode_name));
a_dialog_error_msg ( VIK_GTK_WINDOW_FROM_LAYER(vml), err );
g_free(err);