From 93a378429b3774f56ea497228d9c0a85c822813d Mon Sep 17 00:00:00 2001 From: Tae-Hwan Kim Date: Mon, 3 Sep 2012 20:55:57 +0900 Subject: [PATCH] Merge upstream with r75974 Change-Id: If16dc19df3b6dbcd45c0052b40ff24cc541c3254 Subject: [E-devel] [patch] change plug-in loading behavior in elm_map... --- src/lib/elm_map.c | 471 +++++++++++++++++++++--------------------------------- 1 file changed, 182 insertions(+), 289 deletions(-) diff --git a/src/lib/elm_map.c b/src/lib/elm_map.c index 2e54d22..11406af 100644 --- a/src/lib/elm_map.c +++ b/src/lib/elm_map.c @@ -372,17 +372,15 @@ struct _Widget_Data Evas_Object *sep_maps_overlays; // Tiles are below this and overlays are on top Evas_Map *map; - Eina_Array *src_tile_mods; + Eina_Array *src_mods; Source_Tile *src_tile; Eina_List *src_tiles; const char **src_tile_names; - Eina_Array *src_route_mods; Source_Route *src_route; Eina_List *src_routes; const char **src_route_names; - Eina_Array *src_name_mods; Source_Name *src_name; Eina_List *src_names; const char **src_name_names; @@ -3077,253 +3075,95 @@ _pinch_rotate_end_cb(void *data, void *event_info __UNUSED__) return EVAS_EVENT_FLAG_NONE; } -static Eina_Bool -_source_tile_mod_cb(Eina_Module *m, void *data) -{ - EINA_SAFETY_ON_NULL_RETURN_VAL(data, EINA_FALSE); - - Widget_Data *wd = data; - Source_Tile *s; - Elm_Map_Module_Source_Name_Func name_cb; - Elm_Map_Module_Tile_Zoom_Min_Func zoom_min; - Elm_Map_Module_Tile_Zoom_Max_Func zoom_max; - Elm_Map_Module_Tile_Url_Func url_cb; - Elm_Map_Module_Tile_Geo_to_Coord_Func geo_to_coord; - Elm_Map_Module_Tile_Coord_to_Geo_Func coord_to_geo; - Elm_Map_Module_Tile_Scale_Func scale_cb; - const char *file; - - file = eina_module_file_get(m); - if (!eina_module_load(m)) - { - ERR("Could not load module \"%s\": %s", file, - eina_error_msg_get(eina_error_get())); - return EINA_FALSE; - } - - name_cb = eina_module_symbol_get(m, "map_module_source_name_get"); - zoom_min = eina_module_symbol_get(m, "map_module_tile_zoom_min_get"); - zoom_max = eina_module_symbol_get(m, "map_module_tile_zoom_max_get"); - url_cb = eina_module_symbol_get(m, "map_module_tile_url_get"); - geo_to_coord = eina_module_symbol_get(m, "map_module_tile_geo_to_coord"); - coord_to_geo = eina_module_symbol_get(m, "map_module_tile_coord_to_geo"); - scale_cb = eina_module_symbol_get(m, "map_module_tile_scale_get"); - if ((!name_cb) || (!zoom_min) || (!zoom_max) || (!url_cb) || - (!geo_to_coord) || (!coord_to_geo) || (!scale_cb)) - { - WRN("Could not find map module functions from module \"%s\": %s", - file, eina_error_msg_get(eina_error_get())); - eina_module_unload(m); - return EINA_FALSE; - } - s = ELM_NEW(Source_Tile); - s->name = name_cb(); - s->zoom_min = zoom_min(); - s->zoom_max = zoom_max(); - s->url_cb = url_cb; - s->geo_to_coord = geo_to_coord; - s->coord_to_geo = coord_to_geo; - s->scale_cb = scale_cb; - wd->src_tiles = eina_list_append(wd->src_tiles, s); - - return EINA_TRUE; -} - -static void -_source_tile_load(Widget_Data *wd) -{ - unsigned int idx; - Eina_List *l; - Source_Tile *s; - - // Load from hard coded data - for (idx = 0; idx < (sizeof(src_tiles) / sizeof(Source_Tile)); idx++) - { - s= ELM_NEW(Source_Tile); - s->name = src_tiles[idx].name; - s->zoom_min = src_tiles[idx].zoom_min; - s->zoom_max = src_tiles[idx].zoom_max; - s->url_cb = src_tiles[idx].url_cb; - s->geo_to_coord = src_tiles[idx].geo_to_coord; - s->coord_to_geo = src_tiles[idx].coord_to_geo; - s->scale_cb = src_tiles[idx].scale_cb; - wd->src_tiles = eina_list_append(wd->src_tiles, s); - } - - // Load from modules - wd->src_tile_mods = eina_module_list_get(wd->src_tile_mods, MODULES_PATH, 1, - &_source_tile_mod_cb, wd); - - // Set default source - wd->src_tile = eina_list_nth(wd->src_tiles, 0); - - // Make name strings - idx = 0; - wd->src_tile_names = calloc((eina_list_count(wd->src_tiles) + 1), - sizeof(char *)); - EINA_LIST_FOREACH(wd->src_tiles, l, s) - { - eina_stringshare_replace(&wd->src_tile_names[idx], s->name); - INF("source : %s", wd->src_tile_names[idx]); - idx++; - } -} - static void -_source_tile_unload(Widget_Data *wd) +_source_tile_set(Widget_Data *sd, + const char *source_name) { - int idx = 0; Source_Tile *s; + Eina_List *l; - for (idx = 0; wd->src_tile_names[idx]; idx++) - eina_stringshare_del(wd->src_tile_names[idx]); - EINA_LIST_FREE(wd->src_tiles, s) free(s); - eina_module_list_free(wd->src_tile_mods); -} - -static void -_source_tile_set(Widget_Data *wd, const char *source_name) -{ - EINA_SAFETY_ON_NULL_RETURN(wd); EINA_SAFETY_ON_NULL_RETURN(source_name); - Source_Tile *s; - Eina_List *l; - if (wd->src_tile && !strcmp(wd->src_tile->name, source_name)) return; + if (sd->src_tile && !strcmp(sd->src_tile->name, source_name)) + return; - EINA_LIST_FOREACH(wd->src_tiles, l, s) + EINA_LIST_FOREACH (sd->src_tiles, l, s) { if (!strcmp(s->name, source_name)) { - wd->src_tile = s; + sd->src_tile = s; break; } } - if (!wd->src_tile) + if (!sd->src_tile) { ERR("source name (%s) is not found", source_name); return; } - if (wd->src_tile->zoom_max < wd->zoom) - wd->zoom = wd->src_tile->zoom_max; - else if (wd->src_tile->zoom_min > wd->zoom) - wd->zoom = wd->src_tile->zoom_min; + if (sd->src_tile->zoom_max < sd->zoom) + sd->zoom = sd->src_tile->zoom_max; + else if (sd->src_tile->zoom_min > sd->zoom) + sd->zoom = sd->src_tile->zoom_min; - if (wd->src_tile->zoom_max < wd->zoom_max) - wd->zoom_max = wd->src_tile->zoom_max; - if (wd->src_tile->zoom_min > wd->zoom_min) - wd->zoom_min = wd->src_tile->zoom_min; + if (sd->src_tile->zoom_max < sd->zoom_max) + sd->zoom_max = sd->src_tile->zoom_max; + if (sd->src_tile->zoom_min > sd->zoom_min) + sd->zoom_min = sd->src_tile->zoom_min; - _grid_all_clear(wd); - _grid_all_create(wd); - zoom_do(wd, wd->zoom); + _grid_all_clear(sd); + _grid_all_create(sd); + zoom_do(sd, sd->zoom); } -static Eina_Bool -_source_route_mod_cb(Eina_Module *m, void *data) +static void +_source_route_set(Widget_Data *sd, + const char *source_name) { - EINA_SAFETY_ON_NULL_RETURN_VAL(data, EINA_FALSE); - - Widget_Data *wd = data; Source_Route *s; - Elm_Map_Module_Source_Name_Func name_cb; - Elm_Map_Module_Route_Url_Func url_cb; - const char *file; - - file = eina_module_file_get(m); - if (!eina_module_load(m)) - { - ERR("Could not load module \"%s\": %s", file, - eina_error_msg_get(eina_error_get())); - return EINA_FALSE; - } - - name_cb = eina_module_symbol_get(m, "map_module_source_name_get"); - url_cb = eina_module_symbol_get(m, "map_module_route_url_get"); - - if ((!name_cb) || (!url_cb)) - { - WRN("Could not find map module functions from module \"%s\": %s", - file, eina_error_msg_get(eina_error_get())); - eina_module_unload(m); - return EINA_FALSE; - } - s = ELM_NEW(Source_Tile); - s->name = name_cb(); - s->url_cb = url_cb; - wd->src_routes = eina_list_append(wd->src_routes, s); + Eina_List *l; - eina_module_unload(m); - return EINA_TRUE; -} + EINA_SAFETY_ON_NULL_RETURN(source_name); -static void -_source_route_load(Widget_Data *wd) -{ - unsigned int idx; - Eina_List *l; - Source_Route *s; + if (sd->src_route && !strcmp(sd->src_route->name, source_name)) + return; - // Load from hard coded data - for (idx = 0; idx < (sizeof(src_routes) / sizeof(Source_Route)); idx++) + EINA_LIST_FOREACH (sd->src_routes, l, s) { - s= ELM_NEW(Source_Route); - s->name = src_routes[idx].name; - s->url_cb = src_routes[idx].url_cb; - wd->src_routes = eina_list_append(wd->src_routes, s); + if (!strcmp(s->name, source_name)) + { + sd->src_route = s; + break; + } } - - // Load from modules - wd->src_route_mods = eina_module_list_get(wd->src_route_mods, MODULES_PATH, - 1, &_source_route_mod_cb, wd); - - // Set default source - wd->src_route = eina_list_nth(wd->src_routes, 0); - - // Make name strings - idx = 0; - wd->src_route_names = calloc((eina_list_count(wd->src_routes) + 1), - sizeof(char *)); - EINA_LIST_FOREACH(wd->src_routes, l, s) + if (!sd->src_route) { - eina_stringshare_replace(&wd->src_route_names[idx], s->name); - INF("source : %s", wd->src_route_names[idx]); - idx++; + ERR("source name (%s) is not found", source_name); + return; } } static void -_source_route_unload(Widget_Data *wd) +_source_name_set(Widget_Data *sd, + const char *source_name) { - int idx = 0; - Source_Route *s; - - for (idx = 0; wd->src_route_names[idx]; idx++) - eina_stringshare_del(wd->src_route_names[idx]); - EINA_LIST_FREE(wd->src_routes, s) free(s); - eina_module_list_free(wd->src_route_mods); -} + Source_Name *s; + Eina_List *l; -static void -_source_route_set(Widget_Data *wd, const char *source_name) -{ - EINA_SAFETY_ON_NULL_RETURN(wd); EINA_SAFETY_ON_NULL_RETURN(source_name); - Source_Route *s; - Eina_List *l; - if (wd->src_route && !strcmp(wd->src_route->name, source_name)) return; + if (sd->src_name && !strcmp(sd->src_name->name, source_name)) + return; - EINA_LIST_FOREACH(wd->src_routes, l, s) + EINA_LIST_FOREACH (sd->src_names, l, s) { if (!strcmp(s->name, source_name)) { - wd->src_route = s; + sd->src_name = s; break; } } - if (!wd->src_route) + if (!sd->src_name) { ERR("source name (%s) is not found", source_name); return; @@ -3331,15 +3171,23 @@ _source_route_set(Widget_Data *wd, const char *source_name) } static Eina_Bool -_source_name_mod_cb(Eina_Module *m, void *data) +_source_mod_cb(Eina_Module *m, + void *data) { - EINA_SAFETY_ON_NULL_RETURN_VAL(data, EINA_FALSE); + const char *file; + Widget_Data *sd = data; - Widget_Data *wd = data; - Source_Name *s; Elm_Map_Module_Source_Name_Func name_cb; - Elm_Map_Module_Name_Url_Func url_cb; - const char *file; + Elm_Map_Module_Tile_Url_Func tile_url_cb; + Elm_Map_Module_Tile_Scale_Func scale_cb; + Elm_Map_Module_Tile_Zoom_Min_Func zoom_min; + Elm_Map_Module_Tile_Zoom_Max_Func zoom_max; + Elm_Map_Module_Tile_Geo_to_Coord_Func geo_to_coord; + Elm_Map_Module_Tile_Coord_to_Geo_Func coord_to_geo; + Elm_Map_Module_Route_Url_Func route_url_cb; + Elm_Map_Module_Name_Url_Func name_url_cb; + + EINA_SAFETY_ON_NULL_RETURN_VAL(data, EINA_FALSE); file = eina_module_file_get(m); if (!eina_module_load(m)) @@ -3348,118 +3196,163 @@ _source_name_mod_cb(Eina_Module *m, void *data) eina_error_msg_get(eina_error_get())); return EINA_FALSE; } - name_cb = eina_module_symbol_get(m, "map_module_source_name_get"); - url_cb = eina_module_symbol_get(m, "map_module_name_url_get"); - - if ((!name_cb) || (!url_cb)) + if ((!name_cb)) { - WRN("Could not find map module functions from module \"%s\": %s", + WRN("Could not find map module name from module \"%s\": %s", file, eina_error_msg_get(eina_error_get())); eina_module_unload(m); return EINA_FALSE; } - s = ELM_NEW(Source_Tile); - s->name = name_cb(); - s->url_cb = url_cb; - wd->src_names = eina_list_append(wd->src_names, s); - eina_module_unload(m); + // Find TILE module + tile_url_cb = eina_module_symbol_get(m, "map_module_tile_url_get"); + zoom_min = eina_module_symbol_get(m, "map_module_tile_zoom_min_get"); + zoom_max = eina_module_symbol_get(m, "map_module_tile_zoom_max_get"); + geo_to_coord = eina_module_symbol_get(m, "map_module_tile_geo_to_coord"); + coord_to_geo = eina_module_symbol_get(m, "map_module_tile_coord_to_geo"); + scale_cb = eina_module_symbol_get(m, "map_module_tile_scale_get"); + if (tile_url_cb && zoom_min && zoom_max && geo_to_coord && coord_to_geo && + scale_cb) + { + INF("Map TILE module is loaded \"%s\"", file); + Source_Tile *s; + s = ELM_NEW(Source_Tile); + s->name = name_cb(); + s->url_cb = tile_url_cb; + s->zoom_min = zoom_min(); + s->zoom_max = zoom_max(); + s->geo_to_coord = geo_to_coord; + s->coord_to_geo = coord_to_geo; + s->scale_cb = scale_cb; + sd->src_tiles = eina_list_append(sd->src_tiles, s); + } + + // Find ROUTE module + route_url_cb = eina_module_symbol_get(m, "map_module_route_url_get"); + if (route_url_cb) + { + INF("Map ROUTE module is loaded \"%s\"", file); + Source_Route *s; + s = ELM_NEW(Source_Tile); + s->name = name_cb(); + s->url_cb = route_url_cb; + sd->src_routes = eina_list_append(sd->src_routes, s); + } + + // Find NAME module + name_url_cb = eina_module_symbol_get(m, "map_module_name_url_get"); + if (name_url_cb) + { + INF("Map NAME module is loaded \"%s\"", file); + Source_Name *s; + s = ELM_NEW(Source_Tile); + s->name = name_cb(); + s->url_cb = name_url_cb; + sd->src_names = eina_list_append(sd->src_names, s); + } return EINA_TRUE; } static void -_source_name_load(Widget_Data *wd) +_source_all_unload(Widget_Data *sd) +{ + int idx = 0; + Source_Tile *s; + + for (idx = 0; sd->src_tile_names[idx]; idx++) + eina_stringshare_del(sd->src_tile_names[idx]); + for (idx = 0; sd->src_route_names[idx]; idx++) + eina_stringshare_del(sd->src_route_names[idx]); + for (idx = 0; sd->src_name_names[idx]; idx++) + eina_stringshare_del(sd->src_name_names[idx]); + + EINA_LIST_FREE(sd->src_tiles, s) free(s); + EINA_LIST_FREE(sd->src_routes, s) free(s); + EINA_LIST_FREE(sd->src_names, s) free(s); + + eina_module_list_free(sd->src_mods); +} + +static void +_source_all_load(Widget_Data *sd) { + Source_Tile *src_tile; + Source_Route *src_route; + Source_Name *src_name; unsigned int idx; Eina_List *l; - Source_Name *s; - // Load from hard coded data + // Load hard coded TILE source + for (idx = 0; idx < (sizeof(src_tiles) / sizeof(Source_Tile)); idx++) + { + src_tile = ELM_NEW(Source_Tile); + src_tile->name = src_tiles[idx].name; + src_tile->zoom_min = src_tiles[idx].zoom_min; + src_tile->zoom_max = src_tiles[idx].zoom_max; + src_tile->url_cb = src_tiles[idx].url_cb; + src_tile->geo_to_coord = src_tiles[idx].geo_to_coord; + src_tile->coord_to_geo = src_tiles[idx].coord_to_geo; + src_tile->scale_cb = src_tiles[idx].scale_cb; + sd->src_tiles = eina_list_append(sd->src_tiles, src_tile); + } + // Load hard coded ROUTE source + for (idx = 0; idx < (sizeof(src_routes) / sizeof(Source_Route)); idx++) + { + src_route = ELM_NEW(Source_Route); + src_route->name = src_routes[idx].name; + src_route->url_cb = src_routes[idx].url_cb; + sd->src_routes = eina_list_append(sd->src_routes, src_route); + } + // Load from hard coded NAME source for (idx = 0; idx < (sizeof(src_names) / sizeof(Source_Name)); idx++) { - s= ELM_NEW(Source_Name); - s->name = src_names[idx].name; - s->url_cb = src_names[idx].url_cb; - wd->src_names = eina_list_append(wd->src_names, s); + src_name = ELM_NEW(Source_Name); + src_name->name = src_names[idx].name; + src_name->url_cb = src_names[idx].url_cb; + sd->src_names = eina_list_append(sd->src_names, src_name); } // Load from modules - wd->src_name_mods = eina_module_list_get(wd->src_name_mods, MODULES_PATH, 1, - &_source_name_mod_cb, wd); + sd->src_mods = eina_module_list_get(sd->src_mods, MODULES_PATH, 1, + &_source_mod_cb, sd); // Set default source - wd->src_name = eina_list_nth(wd->src_names, 0); + sd->src_tile = eina_list_nth(sd->src_tiles, 0); + sd->src_route = eina_list_nth(sd->src_routes, 0); + sd->src_name = eina_list_nth(sd->src_names, 0); - // Make name strings + // Make name string of sources idx = 0; - wd->src_name_names = calloc((eina_list_count(wd->src_names) + 1), - sizeof(char *)); - EINA_LIST_FOREACH(wd->src_names, l, s) + sd->src_tile_names = calloc((eina_list_count(sd->src_tiles) + 1), + sizeof(const char *)); + EINA_LIST_FOREACH (sd->src_tiles, l, src_tile) { - eina_stringshare_replace(&wd->src_name_names[idx], s->name); - INF("source : %s", wd->src_name_names[idx]); + eina_stringshare_replace(&sd->src_tile_names[idx], src_tile->name); + INF("source : %s", sd->src_tile_names[idx]); idx++; } -} - -static void -_source_name_unload(Widget_Data *wd) -{ - int idx = 0; - Source_Name *s; - - for (idx = 0; wd->src_name_names[idx]; idx++) - eina_stringshare_del(wd->src_name_names[idx]); - EINA_LIST_FREE(wd->src_names, s) free(s); - eina_module_list_free(wd->src_name_mods); -} - -static void -_source_name_set(Widget_Data *wd, const char *source_name) -{ - EINA_SAFETY_ON_NULL_RETURN(wd); - EINA_SAFETY_ON_NULL_RETURN(source_name); - - Source_Name *s; - Eina_List *l; - - if (wd->src_name && !strcmp(wd->src_name->name, source_name)) return; - - EINA_LIST_FOREACH(wd->src_names, l, s) + idx = 0; + sd->src_route_names = calloc((eina_list_count(sd->src_routes) + 1), + sizeof(const char *)); + EINA_LIST_FOREACH (sd->src_routes, l, src_route) { - if (!strcmp(s->name, source_name)) - { - wd->src_name = s; - break; - } + eina_stringshare_replace(&sd->src_route_names[idx], src_route->name); + INF("source : %s", sd->src_route_names[idx]); + idx++; } - if (!wd->src_name) + idx = 0; + sd->src_name_names = calloc((eina_list_count(sd->src_names) + 1), + sizeof(const char *)); + EINA_LIST_FOREACH (sd->src_names, l, src_name) { - ERR("source name (%s) is not found", source_name); - return; + eina_stringshare_replace(&sd->src_name_names[idx], src_name->name); + INF("source : %s", sd->src_name_names[idx]); + idx++; } } static void -_source_all_load(Widget_Data *wd) -{ - EINA_SAFETY_ON_NULL_RETURN(wd); - _source_tile_load(wd); - _source_route_load(wd); - _source_name_load(wd); -} - -static void -_source_all_unload(Widget_Data *wd) -{ - EINA_SAFETY_ON_NULL_RETURN(wd); - _source_tile_unload(wd); - _source_route_unload(wd); - _source_name_unload(wd); -} - -static void _zoom_mode_set(void *data) { EINA_SAFETY_ON_NULL_RETURN(data); -- 2.7.4