+ g_free ( tools );
+
+ gchar *datasources = g_build_filename(dir, VIKING_DATASOURCES_FILE, NULL);
+ if (g_access (datasources, R_OK) == 0)
+ {
+ VikGobjectBuilder *builder = vik_gobject_builder_new ();
+ g_signal_connect (builder, "new-object", G_CALLBACK (modules_register_datasources), NULL);
+ vik_gobject_builder_parse (builder, datasources);
+ g_object_unref (builder);
+ }
+ g_free ( datasources );
+
+ /* Go-to search engines */
+ gchar *go_to = g_build_filename(dir, VIKING_GOTOTOOLS_FILE, NULL);
+ if (g_access (go_to, R_OK) == 0)
+ {
+ VikGobjectBuilder *builder = vik_gobject_builder_new ();
+ g_signal_connect (builder, "new-object", G_CALLBACK (modules_register_gototools), NULL);
+ vik_gobject_builder_parse (builder, go_to);
+ g_object_unref (builder);
+ }
+ g_free ( go_to );
+
+ /* Routing engines */
+ gchar *routing = g_build_filename(dir, VIKING_ROUTING_FILE, NULL);
+ if (g_access (routing, R_OK) == 0)
+ {
+ VikGobjectBuilder *builder = vik_gobject_builder_new ();
+ g_signal_connect (builder, "new-object", G_CALLBACK (modules_register_routing_engine), NULL);
+ vik_gobject_builder_parse (builder, routing);
+ g_object_unref (builder);
+ }
+ g_free ( routing );
+}
+
+static void
+modules_load_config(void)
+{
+ /* Look in the directories of data path */
+ gchar * * data_dirs = a_get_viking_data_path();
+ /* Priority is standard one:
+ left element is more important than right one.
+ But our logic is to load all existing files and overwrite
+ overlapping config with last recent one.
+ So, we have to process directories in reverse order. */
+ /* First: find the last element */
+ gchar * * ptr = data_dirs;
+ while (*ptr != NULL) ptr++;
+ /* Second: deduce the number of directories */
+ int nb_data_dirs = 0;
+ nb_data_dirs = ptr - data_dirs;
+ /* Last: parse them in reverse order */
+ for (; nb_data_dirs > 0 ; nb_data_dirs--)
+ {
+ modules_load_config_dir(data_dirs[nb_data_dirs-1]);
+ }
+ g_strfreev(data_dirs);
+
+ /* Check if system config is set */
+ modules_load_config_dir(VIKING_SYSCONFDIR);
+
+ const gchar *data_home = a_get_viking_data_home ();
+ if (data_home)
+ {
+ modules_load_config_dir(data_home);
+ }
+
+ /* Check user's home config */
+ modules_load_config_dir(a_get_viking_dir());
+}
+
+static void
+register_loadable_types(void)
+{
+ /* Force registering of loadable types */
+ volatile GType types[] = {
+ /* Maps */
+ VIK_TYPE_SLIPPY_MAP_SOURCE,
+ VIK_TYPE_TMS_MAP_SOURCE,
+ VIK_TYPE_WMSC_MAP_SOURCE,
+
+ /* Goto */
+ VIK_GOTO_XML_TOOL_TYPE,
+
+ /* Tools */
+ VIK_WEBTOOL_CENTER_TYPE,
+ VIK_WEBTOOL_BOUNDS_TYPE,
+
+ /* Datasource */
+ VIK_WEBTOOL_DATASOURCE_TYPE,
+
+ /* Routing */
+ VIK_ROUTING_WEB_ENGINE_TYPE
+ };
+
+ /* kill 'unused variable' warning */
+ g_debug("%ld types loaded", sizeof(types)/sizeof(GType));