Fix:Core:Split out main_ functions from main.c, updated dtd
authormartin-s <martin-s@ffa7fe5e-494d-0410-b361-a75ebd5db220>
Mon, 2 Nov 2009 11:10:26 +0000 (11:10 +0000)
committermartin-s <martin-s@ffa7fe5e-494d-0410-b361-a75ebd5db220>
Mon, 2 Nov 2009 11:10:26 +0000 (11:10 +0000)
git-svn-id: https://navit.svn.sourceforge.net/svnroot/navit/trunk/navit@2715 ffa7fe5e-494d-0410-b361-a75ebd5db220

navit/Makefile.am
navit/attr_def.h
navit/config_.c [new file with mode: 0644]
navit/config_.h [new file with mode: 0644]
navit/main.c
navit/navit.c
navit/navit.dtd
navit/start_real.c
navit/xmlconfig.c

index 36d2257..01968c4 100644 (file)
@@ -29,11 +29,11 @@ pkgdata_DATA = navit.xml
 
 EXTRA_DIST = navit_shipped.xml navit.dtd
 
-libnavit_la_SOURCES = announcement.c atom.c attr.c cache.c callback.c command.c compass.c coord.c country.c data_window.c debug.c \
+libnavit_la_SOURCES = announcement.c atom.c attr.c cache.c callback.c command.c compass.c config_.c coord.c country.c data_window.c debug.c \
        event.c event_glib.h file.c graphics.c gui.c item.c layout.c log.c main.c map.c \
        linguistics.c mapset.c maptype.c menu.c messages.c navit.c navigation.c osd.c param.c phrase.c plugin.c popup.c \
        profile.c projection.c roadprofile.c route.c search.c speech.c start_real.c transform.c track.c \
-       util.c vehicle.c vehicleprofile.c xmlconfig.c announcement.h atom.h attr.h attr_def.h cache.h callback.h color.h command.h compass.h coord.h country.h \
+       util.c vehicle.c vehicleprofile.c xmlconfig.c announcement.h atom.h attr.h attr_def.h cache.h callback.h color.h command.h compass.h config_.h coord.h country.h \
        data.h data_window.h data_window_int.h debug.h destination.h draw_info.h endianess.h event.h \
        file.h graphics.h gtkext.h gui.h item.h item_def.h keys.h log.h layer.h layout.h linguistics.h main.h map-share.h map.h\
        map_data.h mapset.h maptype.h menu.h messages.h navigation.h navit.h osd.h \
index 4b1245b..cad04f5 100644 (file)
@@ -324,6 +324,7 @@ ATTR(vehicleprofile)
 ATTR(roadprofile)
 ATTR(announcement)
 ATTR(cursor)
+ATTR(config)
 ATTR2(0x0008ffff,type_object_end)
 ATTR2(0x00090000,type_coord_begin)
 ATTR2(0x0009ffff,type_coord_end)
diff --git a/navit/config_.c b/navit/config_.c
new file mode 100644 (file)
index 0000000..4eecfe1
--- /dev/null
@@ -0,0 +1,137 @@
+/**
+ * Navit, a modular navigation system.
+ * Copyright (C) 2005-2008 Navit Team
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * version 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA  02110-1301, USA.
+ */
+
+#include <stdlib.h>
+#include <glib.h>
+#include "debug.h"
+#include "item.h"
+#include "callback.h"
+#include "config_.h"
+
+struct config {
+       struct attr **attrs;
+       struct callback_list *cbl;
+} *config;
+
+struct attr_iter {
+       void *iter;
+};
+
+void
+config_destroy(struct config *this_)
+{
+       attr_list_free(this_->attrs);
+       callback_list_destroy(this_->cbl);
+       g_free(config);
+       dbg(0,"exit");
+       exit(0);
+}
+
+int
+config_get_attr(struct config *this_, enum attr_type type, struct attr *attr, struct attr_iter *iter)
+{
+       dbg(0,"enter\n");
+       return attr_generic_get_attr(this_->attrs, NULL, type, attr, iter);
+}
+
+static int
+config_set_attr_int(struct config *this_, struct attr *attr)
+{
+       switch (attr->type) {
+       case attr_language:
+               setenv("LANG",attr->u.str,1);
+               return 1;
+       default:
+               return 0;
+       }
+}
+
+int
+config_set_attr(struct config *this_, struct attr *attr)
+{
+       return config_set_attr_int(this_, attr);
+}
+
+int
+config_add_attr(struct config *this_, struct attr *attr)
+{
+       switch (attr->type) {
+       case attr_callback:
+               callback_list_add(this_->cbl, attr->u.callback);
+       default:        
+               this_->attrs=attr_generic_add_attr(this_->attrs, attr);
+       }
+       callback_list_call_attr_2(this_->cbl, attr->type, attr->u.data, 1);
+       return 1;
+}
+
+int
+config_remove_attr(struct config *this_, struct attr *attr)
+{
+       switch (attr->type) {
+       case attr_callback:
+               callback_list_remove(this_->cbl, attr->u.callback);
+       default:        
+               this_->attrs=attr_generic_remove_attr(this_->attrs, attr);
+       }
+       callback_list_call_attr_2(this_->cbl, attr->type, attr->u.data, -1);
+       return 1;
+}
+
+struct attr_iter *
+config_attr_iter_new()
+{
+       dbg(0,"enter\n");
+       return g_new0(struct attr_iter, 1);
+}
+
+void
+config_attr_iter_destroy(struct attr_iter *iter)
+{
+       dbg(0,"enter\n");
+       g_free(iter);
+}
+
+
+struct config *
+config_new(struct attr *parent, struct attr **attrs)
+{
+       dbg(0,"enter\n");
+       if (config) {
+               dbg(0,"only one config allowed\n");
+               return NULL;
+       }
+       if (parent) {
+               dbg(0,"no parent in config allowed\n");
+               return NULL;
+       }
+       config=g_new0(struct config, 1);
+       config->attrs=attr_list_dup(attrs);
+       config->cbl=callback_list_new();
+       while (*attrs) {
+               if (!config_set_attr_int(config,*attrs)) {
+                       dbg(0,"failed to set attribute '%s'\n",attr_to_name((*attrs)->type));
+                       config_destroy(config);
+                       config=NULL;
+                       break;
+               }
+               attrs++;
+       }
+       return config;
+}
diff --git a/navit/config_.h b/navit/config_.h
new file mode 100644 (file)
index 0000000..9f47e99
--- /dev/null
@@ -0,0 +1,15 @@
+extern struct config *config;
+/* prototypes */
+enum attr_type;
+struct attr;
+struct attr_iter;
+struct config;
+void config_destroy(struct config *this_);
+int config_get_attr(struct config *this_, enum attr_type type, struct attr *attr, struct attr_iter *iter);
+int config_set_attr(struct config *this_, struct attr *attr);
+int config_add_attr(struct config *this_, struct attr *attr);
+int config_remove_attr(struct config *this_, struct attr *attr);
+struct attr_iter *config_attr_iter_new(void);
+void config_attr_iter_destroy(struct attr_iter *iter);
+struct config *config_new(struct attr *parent, struct attr **attrs);
+/* end of prototypes */
index 2910196..8be0117 100644 (file)
@@ -65,86 +65,6 @@ static void sigchld(int sig)
 #endif
 }
 
-static GList *navit;
-
-struct iter {
-       GList *list;
-};
-
-struct iter *
-main_iter_new(void)
-{
-       struct iter *ret=g_new0(struct iter, 1);
-       ret->list=navit;
-       return ret;
-}
-
-void
-main_iter_destroy(struct iter *iter)
-{
-       g_free(iter);
-}
-
-struct navit *
-main_get_navit(struct iter *iter)
-{
-       GList *list;
-       struct navit *ret=NULL;
-       if (iter)
-               list=iter->list;
-       else
-               list=navit;
-       if (list) {
-               ret=(struct navit *)(list->data);
-               if (iter)
-                       iter->list=g_list_next(iter->list);
-       }
-       return ret;
-
-}
-void
-main_add_navit(struct navit *nav)
-{
-       navit=g_list_prepend(navit, nav);
-       callback_list_call_2(cbl, nav, 1);
-}
-
-void
-main_remove_navit(struct navit *nav)
-{
-       navit=g_list_remove(navit, nav);
-       callback_list_call_2(cbl, nav, 0);
-       if (! navit)
-               event_main_loop_quit();
-}
-
-int
-main_add_attr(struct attr *attr)
-{
-       switch (attr->type)
-       {
-       case attr_callback:
-               callback_list_add(cbl, attr->u.callback);
-               return 1;
-       default:
-               return 0;
-       }
-}
-
-int
-main_remove_attr(struct attr *attr)
-{
-       switch (attr->type)
-       {
-       case attr_callback:
-               callback_list_remove(cbl, attr->u.callback);
-               return 1;
-       default:
-               return 0;
-       }
-}
-
-
 #ifdef HAVE_API_WIN32
 void
 setenv(char *var, char *val, int overwrite)
index d5eaaf1..72c2934 100644 (file)
@@ -638,7 +638,6 @@ navit_new(struct attr *parent, struct attr **attrs)
        this_->self.type=attr_navit;
        this_->self.u.navit=this_;
        this_->attr_cbl=callback_list_new();
-       main_add_navit(this_);
 
        this_->bookmarks_hash=g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL);
 
@@ -2272,7 +2271,6 @@ navit_destroy(struct navit *this_)
        /* TODO: destroy objects contained in this_ */
        if (this_->vehicle)
                vehicle_destroy(this_->vehicle->vehicle);
-       main_remove_navit(this_);
        char *center_file = navit_get_center_file(TRUE);
        navit_write_center_to_file(this_, center_file);
        g_free(center_file);
index 4abbabc..8c3fbc2 100644 (file)
@@ -1,19 +1,27 @@
 <!ELEMENT config (plugins,debug*,navit)>
 <!ATTLIST config xmlns:xi CDATA #REQUIRED>
+<!ATTLIST config language CDATA #IMPLIED>
 <!ELEMENT plugins (plugin*)>
 <!ELEMENT plugin EMPTY>
 <!ATTLIST plugin path CDATA #REQUIRED>
 <!ATTLIST plugin active CDATA #IMPLIED>
+<!ATTLIST plugin ondemand CDATA #IMPLIED>
 <!ELEMENT debug EMPTY>
 <!ATTLIST debug name CDATA #REQUIRED>
 <!ATTLIST debug level CDATA "0">
-<!ELEMENT navit (gui,graphics,vehicle*,tracking,route,navigation,speech,mapset+,layout+)>
+<!ELEMENT log EMPTY>
+<!ATTLIST log enabled CDATA #IMPLIED>
+<!ATTLIST log type CDATA #REQUIRED>
+<!ATTLIST log data CDATA #REQUIRED>
+<!ATTLIST log flush_size CDATA #IMPLIED>
+<!ATTLIST log flush_time CDATA #IMPLIED>
+<!ELEMENT navit (gui,graphics,vehicle*,vehicleprofile*,tracking,route,navigation,speech,osd*,mapset+,layout+,log*)>
 <!ATTLIST navit center CDATA #REQUIRED>
 <!ATTLIST navit zoom CDATA #REQUIRED>
 <!ATTLIST navit tracking CDATA #REQUIRED>
-<!ATTLIST navit cursor CDATA #REQUIRED>
 <!ATTLIST navit orientation CDATA #REQUIRED>
 <!ATTLIST navit recent_dest CDATA #IMPLIED>
+<!ATTLIST navit drag_bitmap CDATA #IMPLIED>
 <!ELEMENT gui EMPTY>
 <!ATTLIST gui type CDATA #REQUIRED>
 <!ATTLIST gui menubar CDATA #IMPLIED>
 <!ATTLIST gui fullscreen CDATA #IMPLIED>
 <!ELEMENT graphics EMPTY>
 <!ATTLIST graphics type CDATA #REQUIRED>
-<!ELEMENT vehicle (cursor)>
+<!ELEMENT vehicle (cursor*)>
 <!ATTLIST vehicle name CDATA #REQUIRED>
 <!ATTLIST vehicle source CDATA #REQUIRED>
-<!ATTLIST vehicle color CDATA #REQUIRED>
 <!ATTLIST vehicle enabled CDATA #IMPLIED>
 <!ATTLIST vehicle active CDATA #IMPLIED>
 <!ATTLIST vehicle follow CDATA #IMPLIED>
 <!ATTLIST vehicle update CDATA #IMPLIED>
 <!ATTLIST vehicle gpsd_query CDATA #IMPLIED>
-<!ELEMENT cursor EMPTY>
+<!ATTLIST vehicle profilename CDATA #IMPLIED>
+<!ELEMENT vehicleprofile (roadprofile+)>
+<!ATTLIST vehicleprofile name CDATA #REQUIRED>
+<!ATTLIST vehicleprofile flags CDATA #REQUIRED>
+<!ATTLIST vehicleprofile flags_forward_mask CDATA #REQUIRED>
+<!ATTLIST vehicleprofile flags_reverse_mask CDATA #REQUIRED>
+<!ATTLIST vehicleprofile maxspeed_handling CDATA #REQUIRED>
+<!ATTLIST vehicleprofile route_mode CDATA #REQUIRED>
+<!ELEMENT coord EMPTY>
+<!ATTLIST coord x CDATA #REQUIRED>
+<!ATTLIST coord y CDATA #REQUIRED>
+<!ELEMENT cursor (itemgra+)>
+<!ATTLIST cursor w CDATA #REQUIRED>
+<!ATTLIST cursor h CDATA #REQUIRED>
 <!ELEMENT tracking ANY>
-<!ELEMENT route (speed+)>
+<!ATTLIST tracking cdf_histsize CDATA #IMPLIED>
+<!ELEMENT route EMPTY>
+<!ATTLIST route destination_distance CDATA #IMPLIED>
+<!ELEMENT roadprofile (announcement*)>
+<!ATTLIST roadprofile item_types CDATA #REQUIRED>
+<!ATTLIST roadprofile speed CDATA #REQUIRED>
+<!ATTLIST roadprofile route_weight CDATA #REQUIRED>
 <!ELEMENT speed EMPTY>
 <!ATTLIST speed type CDATA #REQUIRED>
 <!ATTLIST speed value CDATA #REQUIRED>
 <!ATTLIST announce level1 CDATA #IMPLIED>
 <!ATTLIST announce level2 CDATA #IMPLIED>
 <!ATTLIST announce unit CDATA #REQUIRED>
+<!ELEMENT announcement EMPTY>
+<!ATTLIST announcement level CDATA #REQUIRED>
+<!ATTLIST announcement distance_metric CDATA #REQUIRED>
 <!ELEMENT speech EMPTY>
 <!ATTLIST speech type CDATA #REQUIRED>
 <!ATTLIST speech data CDATA #REQUIRED>
-<!ELEMENT mapset (map+)>
+<!ATTLIST speech cps CDATA #IMPLIED>
+<!ELEMENT mapset (map*,xi:include*)>
 <!ATTLIST mapset enabled CDATA #IMPLIED>
 <!ELEMENT map EMPTY>
 <!ATTLIST map type CDATA #REQUIRED>
 <!ATTLIST map active CDATA #IMPLIED>
 <!ATTLIST map data CDATA #REQUIRED>
 <!ATTLIST map debug CDATA #IMPLIED>
-<!ELEMENT layout (layer*)>
+<!ELEMENT layout (cursor*,layer*,xi:include*)>
 <!ATTLIST layout name CDATA #REQUIRED>
 <!ATTLIST layout color CDATA #IMPLIED>
 <!ATTLIST layout font CDATA #IMPLIED>
-<!ELEMENT layer (itemgra+)>
+<!ELEMENT layer (itemgra*)>
+<!ATTLIST layer enabled CDATA #IMPLIED>
 <!ATTLIST layer name CDATA #IMPLIED>
 <!ATTLIST layer details CDATA #IMPLIED>
+<!ELEMENT osd EMPTY>
+<!ATTLIST osd enabled CDATA #IMPLIED>
+<!ATTLIST osd type CDATA #REQUIRED>
+<!ATTLIST osd x CDATA #IMPLIED>
+<!ATTLIST osd y CDATA #IMPLIED>
+<!ATTLIST osd src CDATA #IMPLIED>
+<!ATTLIST osd command CDATA #IMPLIED>
 <!ELEMENT itemgra (polygon|polyline|text|circle|icon|image|arrows)*>
 <!ATTLIST itemgra item_types CDATA #IMPLIED>
 <!ATTLIST itemgra order CDATA #IMPLIED>
 <!ATTLIST itemgra speed_range CDATA #IMPLIED>
-<!ELEMENT polygon EMPTY>
+<!ELEMENT polygon (coord*)>
 <!ATTLIST polygon color CDATA #REQUIRED>
-<!ELEMENT polyline EMPTY>
+<!ELEMENT polyline (coord*)>
 <!ATTLIST polyline color CDATA #REQUIRED>
 <!ATTLIST polyline width CDATA #IMPLIED>
 <!ATTLIST polyline dash CDATA #IMPLIED>
 <!ELEMENT text EMPTY>
 <!ATTLIST text text_size CDATA #REQUIRED>
 <!ATTLIST text color CDATA #IMPLIED>
-<!ELEMENT circle EMPTY>
+<!ELEMENT circle (coord*)>
 <!ATTLIST circle color CDATA #REQUIRED>
 <!ATTLIST circle radius CDATA #REQUIRED>
 <!ATTLIST circle width CDATA #IMPLIED>
 <!ATTLIST arrows color CDATA #REQUIRED>
 <!ATTLIST arrows width CDATA #IMPLIED>
 <!ELEMENT image EMPTY>
-
+<!ELEMENT xi:include EMPTY>
+<!ATTLIST xi:include href CDATA #IMPLIED>
+<!ATTLIST xi:include xpointer CDATA #IMPLIED>
index c647850..44f8279 100644 (file)
@@ -22,6 +22,7 @@
 #include <glib.h>
 #include <getopt.h>
 #include "config.h"
+#include "config_.h"
 #include "version.h"
 #include "item.h"
 #include "coord.h"
@@ -59,6 +60,7 @@ int main_real(int argc, char **argv)
        char *config_file = NULL;
        int opt;
        char *cp;
+       struct attr navit;
 
        GList *list = NULL, *li;
 
@@ -165,7 +167,7 @@ int main_real(int argc, char **argv)
                li = g_list_next(li);
        }
        g_list_free(list);
-       if (! main_get_navit(NULL)) {
+       if (! config_get_attr(config, attr_navit, &navit, NULL)) {
                dbg(0, _("No instance has been created, exiting\n"));
                exit(1);
        }
index cbf8a8c..442efc2 100644 (file)
@@ -47,6 +47,7 @@
 #include "announcement.h"
 #include "vehicleprofile.h"
 #include "roadprofile.h"
+#include "config_.h"
 #include "xmlconfig.h"
 
 #ifdef HAVE_GLIB
@@ -186,13 +187,6 @@ convert_number(const char *val)
 }
 
 static int
-xmlconfig_config(struct xmlstate *state)
-{
-       state->element_attr.u.data = (void *)1;
-       return 1;
-}
-
-static int
 xmlconfig_announce(struct xmlstate *state)
 {
        const char *type,*value;
@@ -242,6 +236,7 @@ static struct object_func object_funcs[] = {
        { attr_announcement,NEW(announcement_new),  GET(announcement_get_attr), NULL, NULL, SET(announcement_set_attr), ADD(announcement_add_attr) },
        { attr_arrows,     NEW(arrows_new)},
        { attr_circle,     NEW(circle_new),   NULL, NULL, NULL, NULL, ADD(element_add_attr)},
+       { attr_config,     NEW(config_new), GET(config_get_attr), ITERN(config_attr_iter_new), ITERD(config_attr_iter_destroy), SET(config_set_attr), ADD(config_add_attr), REMOVE(config_remove_attr), NULL, DESTROY(config_destroy)},
        { attr_coord,      NEW(coord_new_from_attrs)},
        { attr_cursor,     NEW(cursor_new),   NULL, NULL, NULL, NULL, ADD(cursor_add_attr)},
        { attr_debug,      NEW(debug_new)},
@@ -288,7 +283,7 @@ struct element_func {
        int (*func)(struct xmlstate *state);
        enum attr_type type;
 } elements[] = {
-       { "config", NULL, xmlconfig_config},
+       { "config", NULL, NULL, attr_config},
        { "announce", "navigation", xmlconfig_announce},
        { "speech", "navit", NULL, attr_speech},
        { "tracking", "navit", NULL, attr_tracking},
@@ -388,6 +383,7 @@ start_element(GMarkupParseContext *context,
        static int fixme_count;
        const char *parent_name=NULL;
        char *s,*sep="",*possible_parents;
+       struct attr *parent_attr;
        dbg(2,"name='%s' parent='%s'\n", element_name, *parent ? (*parent)->element:NULL);
 
        /* determine if we have to fix any attributes */
@@ -467,13 +463,17 @@ start_element(GMarkupParseContext *context,
                        return;
                attrs=convert_to_attrs(new,attr_fixme);
                new->element_attr.type=attr_none;
-               new->element_attr.u.data = new->object_func->new(&new->parent->element_attr, attrs);
+               if (!new->parent || new->parent->element_attr.type == attr_none)
+                       parent_attr=NULL;
+               else
+                       parent_attr=&new->parent->element_attr;
+               new->element_attr.u.data = new->object_func->new(parent_attr, attrs);
                if (! new->element_attr.u.data)
                        return;
                new->element_attr.type=attr_from_name(element_name);
                if (new->element_attr.type == attr_none) 
                        dbg(0,"failed to create object of type '%s'\n", element_name);
-               if (new->parent->object_func && new->parent->object_func->add_attr) 
+               if (new->parent && new->parent->object_func && new->parent->object_func->add_attr) 
                        new->parent->object_func->add_attr(new->parent->element_attr.u.data, &new->element_attr);
        }
        return;