2 * Navit, a modular navigation system.
3 * Copyright (C) 2005-2008 Navit Team
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License
7 * version 2 as published by the Free Software Foundation.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the
16 * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17 * Boston, MA 02110-1301, USA.
22 * @brief Contains code used for loading more than one map
24 * The code in this file introduces "mapsets", which are collections of several maps.
25 * This enables navit to operate on more than one map at once. See map.c / map.h to learn
26 * how maps are handled.
31 #include <glib/gprintf.h>
35 #include "projection.h"
41 * This structure holds a complete mapset
44 GList *maps; /**< Linked list of all the maps in the mapset */
52 * @brief Creates a new, empty mapset
54 * @return The new mapset
56 struct mapset *mapset_new(struct attr *parent, struct attr **attrs)
60 ms=g_new0(struct mapset, 1);
67 mapset_attr_iter_new(void)
69 return g_new0(struct attr_iter, 1);
73 mapset_attr_iter_destroy(struct attr_iter *iter)
79 * @brief Adds a map to a mapset
81 * @param ms The mapset to add the map to
82 * @param m The map to be added
85 mapset_add_attr(struct mapset *ms, struct attr *attr)
89 ms->maps=g_list_append(ms->maps, attr->u.map);
98 mapset_remove_attr(struct mapset *ms, struct attr *attr)
100 switch (attr->type) {
102 ms->maps=g_list_remove(ms->maps, attr->u.map);
110 mapset_get_attr(struct mapset *ms, enum attr_type type, struct attr *attr, struct attr_iter *iter)
118 if (!iter || iter->last == g_list_previous(map)) {
119 attr->u.map=map->data;
124 map=g_list_next(map);
135 static void mapset_maps_free(struct mapset *ms)
142 * @brief Destroys a mapset.
144 * This destroys a mapset. Please note that it does not touch the contained maps
147 * @param ms The mapset to be destroyed
149 void mapset_destroy(struct mapset *ms)
154 map_destroy(map->data);
155 map=g_list_next(map);
161 * @brief Handle for a mapset in use
163 * This struct is used for a mapset that is in use. With this it is possible to iterate
164 * all maps in a mapset.
166 struct mapset_handle {
167 GList *l; /**< Pointer to the current (next) map */
171 * @brief Returns a new handle for a mapset
173 * This returns a new handle for an existing mapset. The new handle points to the first
176 * @param ms The mapset to get a handle of
177 * @return The new mapset handle
179 struct mapset_handle *
180 mapset_open(struct mapset *ms)
182 struct mapset_handle *ret=NULL;
185 ret=g_new(struct mapset_handle, 1);
193 * @brief Gets the next map from a mapset handle
195 * If you set active to true, this function will not return any maps that
196 * have the attr_active attribute associated with them and set to false.
198 * @param msh The mapset handle to get the next map of
199 * @param active Set to true to only get active maps (See description)
200 * @return The next map
202 struct map * mapset_next(struct mapset_handle *msh, int active)
205 struct attr active_attr;
211 msh->l=g_list_next(msh->l);
214 if (active == 2 && map_get_attr(ret, attr_route_active, &active_attr, NULL)) {
215 if (active_attr.u.num)
220 if (active == 3 && map_get_attr(ret, attr_search_active, &active_attr, NULL)) {
221 if (active_attr.u.num)
226 if (!map_get_attr(ret, attr_active, &active_attr, NULL))
228 if (active_attr.u.num)
234 * @brief Gets a map from the mapset by name
237 * @param map_name the map name used by the search
238 * @return The next map
241 mapset_get_map_by_name(struct mapset *ms, char*map_name)
243 struct mapset_handle*msh;
245 struct attr map_attr;
246 if( !ms || !map_name ) {
250 while ((curr_map=mapset_next(msh, 1))) {
252 if(map_get_attr(curr_map,attr_name, &map_attr,NULL)) {
253 if( ! strcmp(map_attr.u.str, map_name)) {
262 * @brief Closes a mapset handle after it is no longer used
264 * @param msh Mapset handle to be closed
267 mapset_close(struct mapset_handle *msh)
273 * @brief Holds information about a search in a mapset
275 * This struct holds information about a search (e.g. for a street) in a mapset.
277 * @sa For a more detailed description see the documentation of mapset_search_new().
279 struct mapset_search {
280 GList *map; /**< The list of maps to be searched within */
281 struct map_search *ms; /**< A map search struct for the map currently active */
282 struct item *item; /**< "Superior" item. */
283 struct attr *search_attr; /**< Attribute to be searched for. */
284 int partial; /**< Indicates if one would like to have partial matches */
288 * @brief Starts a search on a mapset
290 * This function starts a search on a mapset. What attributes one can search for depends on the
291 * map plugin. See the description of map_search_new() in map.c for details.
293 * If you enable partial matches bear in mind that the search matches only the begin of the
294 * strings - a search for a street named "street" would match to "streetfoo", but not to
295 * "somestreet". Search is case insensitive.
297 * The item passed to this function specifies a "superior item" to "search within" - e.g. a town
298 * in which we want to search for a street, or a country in which to search for a town.
300 * @param ms The mapset that should be searched
301 * @param item Specifies a superior item to "search within" (see description)
302 * @param search_attr Attribute specifying what to search for. See description.
303 * @param partial Set this to true to also have partial matches. See description.
304 * @return A new mapset search struct for this search
306 struct mapset_search *
307 mapset_search_new(struct mapset *ms, struct item *item, struct attr *search_attr, int partial)
309 struct mapset_search *this;
310 dbg(1,"enter(%p,%p,%p,%d)\n", ms, item, search_attr, partial);
311 this=g_new0(struct mapset_search,1);
312 if(this != NULL && ms!=NULL )
316 this->search_attr=search_attr;
317 this->partial=partial;
318 this->ms=map_search_new(this->map->data, item, search_attr, partial);
328 * @brief Returns the next found item from a mapset search
330 * This function returns the next item from a mapset search or NULL if there are no more items found.
331 * It automatically iterates through all the maps in the mapset. Please note that maps which have the
332 * attr_active attribute associated with them and set to false are not searched.
334 * @param this The mapset search to return an item from
335 * @return The next found item or NULL if there are no more items found
338 mapset_search_get_item(struct mapset_search *this_)
340 struct item *ret=NULL;
341 struct attr active_attr;
343 while ((this_) && (!this_->ms || !(ret=map_search_get_item(this_->ms)))) { /* The current map has no more items to be returned */
344 if (this_->search_attr->type >= attr_country_all && this_->search_attr->type <= attr_country_name)
347 this_->map=g_list_next(this_->map);
350 if (map_get_attr(this_->map->data, attr_search_active, &active_attr, NULL)) {
351 if (!active_attr.u.num)
354 if (!map_get_attr(this_->map->data, attr_active, &active_attr, NULL))
356 if (active_attr.u.num)
361 map_search_destroy(this_->ms);
362 this_->ms=map_search_new(this_->map->data, this_->item, this_->search_attr, this_->partial);
368 * @brief Destroys a mapset search
370 * @param this The mapset search to be destroyed
373 mapset_search_destroy(struct mapset_search *this_)
376 map_search_destroy(this_->ms);