static void gdict_source_loader_update_sources (GdictSourceLoader *loader) { GSList *filenames, *f; g_assert (GDICT_IS_SOURCE_LOADER (loader)); g_slist_free_full (loader->priv->sources, g_object_unref); loader->priv->sources = NULL; filenames = build_source_filenames (loader); for (f = filenames; f != NULL; f = f->next) { GdictSource *source; GError *load_err; gchar *path = (gchar *) f->data; g_assert (path != NULL); source = gdict_source_new (); load_err = NULL; gdict_source_load_from_file (source, path, &load_err); if (load_err) { g_warning ("Unable to load dictionary source at '%s': %s\n", path, load_err->message); g_error_free (load_err); continue; } loader->priv->sources = g_slist_append (loader->priv->sources, source); g_hash_table_replace (loader->priv->sources_by_name, g_strdup (gdict_source_get_name (source)), source); g_signal_emit (loader, loader_signals[SOURCE_LOADED], 0, source); } g_slist_free_full (filenames, g_free); loader->priv->paths_dirty = FALSE; }
static void build_new_source (GdictSourceDialog *dialog) { GdictSource *source; gchar *name, *text; GdictSourceTransport transport; gchar *host, *port; gchar *data; gsize length; GError *error; gchar *filename; GdictDatabaseChooser *db_chooser; GdictStrategyChooser *strat_chooser; source = gdict_source_new (); /* use the timestamp and the pid to get a unique name */ name = g_strdup_printf ("source-%lu-%u", (gulong) time (NULL), (guint) getpid ()); gdict_source_set_name (source, name); g_free (name); text = get_text_from_entry (dialog, "description_entry"); gdict_source_set_description (source, text); g_free (text); db_chooser = GDICT_DATABASE_CHOOSER (dialog->db_chooser); text = gdict_database_chooser_get_current_database (db_chooser); gdict_source_set_database (source, text); g_free (text); strat_chooser = GDICT_STRATEGY_CHOOSER (dialog->strat_chooser); text = gdict_strategy_chooser_get_current_strategy (strat_chooser); gdict_source_set_strategy (source, text); g_free (text); /* get the selected transport id */ transport = dialog->transport; switch (transport) { case GDICT_SOURCE_TRANSPORT_DICTD: host = get_text_from_entry (dialog, "hostname_entry"); port = get_text_from_entry (dialog, "port_entry"); gdict_source_set_transport (source, GDICT_SOURCE_TRANSPORT_DICTD, "hostname", host, "port", atoi (port), NULL); g_free (host); g_free (port); break; case GDICT_SOURCE_TRANSPORT_INVALID: default: g_warning ("Invalid transport"); return; } error = NULL; data = gdict_source_to_data (source, &length, &error); if (error) { gdict_show_gerror_dialog (GTK_WINDOW (dialog), _("Unable to create a source file"), error); g_object_unref (source); return; } name = g_strdup_printf ("%s.desktop", gdict_source_get_name (source)); filename = g_build_filename (g_get_home_dir (), ".gnome2", "gnome-dictionary", name, NULL); g_free (name); g_file_set_contents (filename, data, length, &error); if (error) gdict_show_gerror_dialog (GTK_WINDOW (dialog), _("Unable to save source file"), error); g_free (filename); g_free (data); g_object_unref (source); }