Updated Spanish translation
[anjuta-git-plugin.git] / plugins / language-manager / plugin.c
blob1345f2c4384c50224521dc62cf37f162773c5cfe
1 /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
2 /*
3 * plugin.c
4 * Copyright (C) Johannes Schmid 2007 <jhs@gnome.org>
5 *
6 * plugin.c is free software.
7 *
8 * You may redistribute it and/or modify it under the terms of the
9 * GNU General Public License, as published by the Free Software
10 * Foundation; either version 2 of the License, or (at your option)
11 * any later version.
13 * plugin.c is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
16 * See the GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with plugin.c. If not, write to:
20 * The Free Software Foundation, Inc.,
21 * 51 Franklin Street, Fifth Floor
22 * Boston, MA 02110-1301, USA.
25 #include <config.h>
26 #include <libanjuta/anjuta-shell.h>
27 #include <libanjuta/anjuta-debug.h>
28 #include <libanjuta/interfaces/ianjuta-language.h>
30 #include <libxml/parser.h>
31 #include <libxml/tree.h>
33 #include "plugin.h"
34 #define LANG_FILE PACKAGE_DATA_DIR"/languages.xml"
36 #define LANGUAGE_MANAGER(o) (LanguageManager*) (o)
38 typedef struct _Language Language;
40 struct _Language
42 IAnjutaLanguageId id;
43 gchar* name;
44 GList* strings;
45 GList* mime_types;
49 static gpointer parent_class;
52 static void
53 language_destroy (gpointer data)
55 Language* lang = (Language*) data;
57 g_free(lang->name);
58 g_list_foreach(lang->strings, (GFunc) g_free, NULL);
59 g_list_foreach(lang->mime_types, (GFunc) g_free, NULL);
61 g_free(lang);
64 static void
65 load_languages (LanguageManager* language_manager)
67 xmlDocPtr doc;
68 xmlNodePtr root;
69 xmlNodePtr cur_node;
71 LIBXML_TEST_VERSION
73 doc = xmlReadFile (LANG_FILE, NULL, 0);
74 if (!doc)
76 DEBUG_PRINT("Could not read language xml file %s!", LANG_FILE);
77 return;
79 root = xmlDocGetRootElement (doc);
81 if (!g_str_equal (root->name, "languages"))
83 DEBUG_PRINT ("Invalid languages.xml file");
86 for (cur_node = root->children; cur_node != NULL; cur_node = cur_node->next)
88 Language* lang = g_new0(Language, 1);
89 gchar* id;
90 gchar* mime_types;
91 gchar* strings;
93 if (!g_str_equal (cur_node->name, (const xmlChar*) "language"))
94 continue;
96 id = (gchar*) xmlGetProp (cur_node, (const xmlChar*) "id");
97 lang->id = atoi(id);
98 lang->name = (gchar*) xmlGetProp(cur_node, (const xmlChar*) "name");
99 mime_types = (gchar*) xmlGetProp (cur_node, (const xmlChar*) "mime-types");
100 strings = (gchar*) xmlGetProp (cur_node, (const xmlChar*) "strings");
101 if (lang->id != 0 && lang->name && mime_types && strings)
103 GStrv mime_typesv = g_strsplit(mime_types, ",", -1);
104 GStrv stringsv = g_strsplit (strings, ",", -1);
105 GStrv type;
106 GStrv string;
108 for (type = mime_typesv; *type != NULL; type++)
110 lang->mime_types = g_list_append (lang->mime_types, g_strdup(*type));
112 g_strfreev(mime_typesv);
114 for (string = stringsv; *string != NULL; string++)
116 lang->strings = g_list_append (lang->strings, g_strdup(*string));
118 g_strfreev(stringsv);
120 g_hash_table_insert (language_manager->languages, GINT_TO_POINTER(lang->id), lang);
122 else
124 g_free(lang);
126 g_free (id);
127 g_free (mime_types);
128 g_free (strings);
130 xmlFreeDoc(doc);
133 static gboolean
134 language_manager_activate (AnjutaPlugin *plugin)
136 LanguageManager *language_manager;
138 DEBUG_PRINT ("LanguageManager: Activating LanguageManager plugin ...");
139 language_manager = (LanguageManager*) plugin;
141 load_languages(language_manager);
143 return TRUE;
146 static gboolean
147 language_manager_deactivate (AnjutaPlugin *plugin)
149 DEBUG_PRINT ("LanguageManager: Dectivating LanguageManager plugin ...");
151 return TRUE;
154 static void
155 language_manager_finalize (GObject *obj)
157 /* Finalization codes here */
158 GNOME_CALL_PARENT (G_OBJECT_CLASS, finalize, (obj));
161 static void
162 language_manager_dispose (GObject *obj)
164 /* Disposition codes */
165 LanguageManager* lang = LANGUAGE_MANAGER (obj);
167 g_hash_table_unref (lang->languages);
168 GNOME_CALL_PARENT (G_OBJECT_CLASS, dispose, (obj));
171 static void
172 language_manager_instance_init (GObject *obj)
174 LanguageManager *plugin = (LanguageManager*)obj;
175 plugin->languages = g_hash_table_new_full (NULL, NULL,
176 NULL, language_destroy);
180 static void
181 language_manager_class_init (GObjectClass *klass)
183 AnjutaPluginClass *plugin_class = ANJUTA_PLUGIN_CLASS (klass);
185 parent_class = g_type_class_peek_parent (klass);
187 plugin_class->activate = language_manager_activate;
188 plugin_class->deactivate = language_manager_deactivate;
189 klass->finalize = language_manager_finalize;
190 klass->dispose = language_manager_dispose;
193 typedef struct
195 LanguageManager* lang;
196 const gchar* target;
197 IAnjutaLanguageId result_id;
198 gboolean found;
199 } LangData;
201 static void
202 language_manager_find_mime_type (gpointer key, Language* language, LangData* data)
204 if (data->found)
205 return;
206 if (g_list_find_custom (language->mime_types, data->target, (GCompareFunc) strcmp))
208 data->result_id = language->id;
209 data->found = TRUE;
213 static void
214 language_manager_find_string (gpointer key, Language* language, LangData* data)
216 if (data->found)
217 return;
218 if (g_list_find_custom (language->strings, data->target, (GCompareFunc) g_ascii_strcasecmp))
220 DEBUG_PRINT ("Found language %i: %s", language->id, language->name);
221 data->result_id = language->id;
222 data->found = TRUE;
226 static IAnjutaLanguageId
227 ilanguage_get_from_mime_type (IAnjutaLanguage* ilang, const gchar* mime_type, GError** e)
229 if (!mime_type)
230 return 0;
231 LanguageManager* lang = LANGUAGE_MANAGER(ilang);
232 LangData* data = g_new0(LangData, 1);
233 IAnjutaLanguageId ret_id;
234 data->target = mime_type;
235 g_hash_table_foreach (lang->languages, (GHFunc)language_manager_find_mime_type, data);
236 if (data->found)
238 ret_id = data->result_id;
240 else
242 DEBUG_PRINT ("Unknown mime-type = %s", mime_type);
243 ret_id = 0;
245 g_free(data);
246 return ret_id;
249 static IAnjutaLanguageId
250 ilanguage_get_from_string (IAnjutaLanguage* ilang, const gchar* string, GError** e)
252 if (!string)
253 return 0;
254 LanguageManager* lang = LANGUAGE_MANAGER(ilang);
255 LangData* data = g_new0(LangData, 1);
256 IAnjutaLanguageId ret_id;
257 data->target = string;
258 g_hash_table_foreach (lang->languages, (GHFunc)language_manager_find_string, data);
259 if (data->found)
261 ret_id = data->result_id;
263 else
265 DEBUG_PRINT ("Unknown language string = %s", string);
266 ret_id = 0;
268 g_free(data);
269 return ret_id;
272 static const gchar*
273 ilanguage_get_name (IAnjutaLanguage* ilang, IAnjutaLanguageId id, GError** e)
275 LanguageManager* lang = LANGUAGE_MANAGER(ilang);
276 Language* language = g_hash_table_lookup (lang->languages,
277 GINT_TO_POINTER(id));
279 if (language)
281 return language->name;
282 DEBUG_PRINT ("Found language: %s", language->name);
284 else
285 return NULL;
288 static GList*
289 ilanguage_get_strings (IAnjutaLanguage* ilang, IAnjutaLanguageId id, GError** e)
291 LanguageManager* lang = LANGUAGE_MANAGER(ilang);
292 Language* language = g_hash_table_lookup (lang->languages,
293 GINT_TO_POINTER(id));
294 if (language)
295 return language->strings;
296 else
297 return NULL;
300 static IAnjutaLanguageId
301 ilanguage_get_from_editor (IAnjutaLanguage* ilang, IAnjutaEditorLanguage* editor, GError** e)
303 const gchar* language =
304 ianjuta_editor_language_get_language (editor, e);
306 IAnjutaLanguageId id =
307 ilanguage_get_from_string (ilang, language, e);
309 return id;
312 static const gchar*
313 ilanguage_get_name_from_editor (IAnjutaLanguage* ilang, IAnjutaEditorLanguage* editor, GError** e)
315 return ilanguage_get_name (ilang,
316 ilanguage_get_from_editor (ilang, editor, e), e);
319 static void
320 ilanguage_iface_init (IAnjutaLanguageIface* iface)
322 iface->get_from_mime_type = ilanguage_get_from_mime_type;
323 iface->get_from_string = ilanguage_get_from_string;
324 iface->get_name = ilanguage_get_name;
325 iface->get_strings = ilanguage_get_strings;
326 iface->get_from_editor = ilanguage_get_from_editor;
327 iface->get_name_from_editor = ilanguage_get_name_from_editor;
330 ANJUTA_PLUGIN_BEGIN (LanguageManager, language_manager);
331 ANJUTA_PLUGIN_ADD_INTERFACE (ilanguage, IANJUTA_TYPE_LANGUAGE);
332 ANJUTA_PLUGIN_END
334 ANJUTA_SIMPLE_PLUGIN (LanguageManager, language_manager);