1 /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
4 * Copyright (C) Johannes Schmid 2007 <jhs@gnome.org>
6 * plugin.c is free software.
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)
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.
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>
34 #define LANG_FILE PACKAGE_DATA_DIR"/languages.xml"
36 #define LANGUAGE_MANAGER(o) (LanguageManager*) (o)
38 typedef struct _Language Language
;
49 static gpointer parent_class
;
53 language_destroy (gpointer data
)
55 Language
* lang
= (Language
*) data
;
58 g_list_foreach(lang
->strings
, (GFunc
) g_free
, NULL
);
59 g_list_foreach(lang
->mime_types
, (GFunc
) g_free
, NULL
);
65 load_languages (LanguageManager
* language_manager
)
73 doc
= xmlReadFile (LANG_FILE
, NULL
, 0);
76 DEBUG_PRINT("Could not read language xml file %s!", LANG_FILE
);
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);
93 if (!g_str_equal (cur_node
->name
, (const xmlChar
*) "language"))
96 id
= (gchar
*) xmlGetProp (cur_node
, (const xmlChar
*) "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);
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
);
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
);
147 language_manager_deactivate (AnjutaPlugin
*plugin
)
149 DEBUG_PRINT ("LanguageManager: Dectivating LanguageManager plugin ...");
155 language_manager_finalize (GObject
*obj
)
157 /* Finalization codes here */
158 GNOME_CALL_PARENT (G_OBJECT_CLASS
, finalize
, (obj
));
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
));
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
);
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
;
195 LanguageManager
* lang
;
197 IAnjutaLanguageId result_id
;
202 language_manager_find_mime_type (gpointer key
, Language
* language
, LangData
* data
)
206 if (g_list_find_custom (language
->mime_types
, data
->target
, (GCompareFunc
) strcmp
))
208 data
->result_id
= language
->id
;
214 language_manager_find_string (gpointer key
, Language
* language
, LangData
* data
)
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
;
226 static IAnjutaLanguageId
227 ilanguage_get_from_mime_type (IAnjutaLanguage
* ilang
, const gchar
* mime_type
, GError
** e
)
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
);
238 ret_id
= data
->result_id
;
242 DEBUG_PRINT ("Unknown mime-type = %s", mime_type
);
249 static IAnjutaLanguageId
250 ilanguage_get_from_string (IAnjutaLanguage
* ilang
, const gchar
* string
, GError
** e
)
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
);
261 ret_id
= data
->result_id
;
265 DEBUG_PRINT ("Unknown language string = %s", string
);
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
));
281 return language
->name
;
282 DEBUG_PRINT ("Found language: %s", language
->name
);
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
));
295 return language
->strings
;
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
);
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
);
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
);
334 ANJUTA_SIMPLE_PLUGIN (LanguageManager
, language_manager
);