1 /*****************************************************************************
2 * entry.c : Callbacks for module entry point
3 *****************************************************************************
4 * Copyright (C) 2001-2007 the VideoLAN team
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
19 *****************************************************************************/
29 #include "modules/modules.h"
30 #include "config/configuration.h"
33 static const char default_name[] = "unnamed";
35 module_t *vlc_module_create (vlc_object_t *obj)
38 (module_t *)vlc_custom_create (obj, sizeof (module_t),
39 VLC_OBJECT_MODULE, "module");
43 module->b_reentrant = module->b_unloadable = VLC_TRUE;
44 module->psz_object_name = module->psz_longname = default_name;
45 module->psz_capability = "";
47 module->i_config_items = module->i_bool_items = 0;
53 module_t *vlc_submodule_create (module_t *module)
55 assert (module != NULL);
56 assert (!module->b_submodule); // subsubmodules are not supported
59 (module_t *)vlc_custom_create (VLC_OBJECT (module), sizeof (module_t),
60 VLC_OBJECT_MODULE, "submodule");
61 if (submodule == NULL)
64 vlc_object_attach (submodule, module);
65 submodule->b_submodule = VLC_TRUE;
67 /* Muahahaha! Heritage! Polymorphism! Ugliness!! */
68 memcpy (submodule->pp_shortcuts, module->pp_shortcuts,
69 sizeof (submodule->pp_shortcuts));
71 submodule->psz_object_name = module->psz_object_name;
72 submodule->psz_shortname = module->psz_shortname;
73 submodule->psz_longname = module->psz_longname;
74 submodule->psz_capability = module->psz_capability;
75 submodule->i_score = module->i_score;
76 submodule->i_cpu = module->i_cpu;
81 int vlc_module_set (module_t *module, int propid, void *value)
85 case VLC_MODULE_CPU_REQUIREMENT:
86 assert (!module->b_submodule);
87 module->i_cpu |= (intptr_t)value;
90 case VLC_MODULE_SHORTCUT:
93 for (i = 0; module->pp_shortcuts[i] != NULL; i++);
94 if (i >= (MODULE_SHORTCUT_MAX - 1))
97 module->pp_shortcuts[i] = (char *)value;
101 case VLC_MODULE_SHORTNAME:
102 module->psz_shortname = (char *)value;
105 case VLC_MODULE_DESCRIPTION:
106 module->psz_longname = (char *)value;
109 case VLC_MODULE_HELP:
110 module->psz_help = (char *)value;
113 case VLC_MODULE_CAPABILITY:
114 module->psz_capability = (char *)value;
117 case VLC_MODULE_SCORE:
118 module->i_score = (intptr_t)value;
121 case VLC_MODULE_CB_OPEN:
122 module->pf_activate = (int (*) (vlc_object_t *))value;
125 case VLC_MODULE_CB_CLOSE:
126 module->pf_deactivate = (void (*) (vlc_object_t *))value;
129 case VLC_MODULE_UNLOADABLE:
130 module->b_unloadable = (value != NULL);
133 case VLC_MODULE_NAME:
134 module->pp_shortcuts[0] = module->psz_object_name = (char *)value;
135 if (module->psz_longname == default_name)
136 module->psz_longname = (char *)value;
139 case VLC_MODULE_PROGRAM:
140 msg_Warn (module, "deprecated module property %d", propid);
144 msg_Err (module, "unknown module property %d", propid);
145 msg_Err (module, "LibVLC might be too old to use this module.");
151 module_config_t *vlc_config_create (module_t *module, int type)
153 unsigned confsize = module->confsize;
154 module_config_t *tab = module->p_config;
156 if ((confsize & 0xf) == 0)
158 tab = realloc (tab, (confsize + 17) * sizeof (*tab));
162 module->p_config = tab;
165 memset (tab + confsize, 0, sizeof (tab[confsize]));
166 tab[confsize].i_type = type;
167 tab[confsize].p_lock = &module->object_lock;
169 if (type & CONFIG_ITEM)
171 module->i_config_items++;
172 if (type == CONFIG_ITEM_BOOL)
173 module->i_bool_items++;
177 return tab + confsize;
180 int vlc_config_set (module_config_t *restrict item, int id, ...)
185 assert (item != NULL);
190 case VLC_CONFIG_NAME:
192 const char *name = va_arg (ap, const char *);
193 vlc_callback_t cb = va_arg (ap, vlc_callback_t);
195 assert (name != NULL);
196 item->psz_name = strdup (name);
197 item->pf_callback = cb;
202 case VLC_CONFIG_DESC:
204 const char *text = va_arg (ap, const char *);
205 const char *longtext = va_arg (ap, const char *);
207 item->psz_text = text ? strdup ( _(text)) : NULL;
208 item->psz_longtext = longtext ? strdup ( _(longtext)) : NULL;
213 case VLC_CONFIG_VALUE:
215 if (IsConfigIntegerType (item->i_type))
217 item->orig.i = item->saved.i =
218 item->value.i = va_arg (ap, int);
222 if (IsConfigFloatType (item->i_type))
224 item->orig.f = item->saved.f =
225 item->value.f = va_arg (ap, double);
229 if (IsConfigStringType (item->i_type))
231 const char *value = va_arg (ap, const char *);
232 item->value.psz = value ? strdup (value) : NULL;
233 item->orig.psz = value ? strdup (value) : NULL;
234 item->saved.psz = value ? strdup (value) : NULL;
240 case VLC_CONFIG_RANGE:
242 if (IsConfigIntegerType (item->i_type))
244 item->min.i = va_arg (ap, int);
245 item->max.i = va_arg (ap, int);
249 if (IsConfigFloatType (item->i_type))
251 item->min.f = va_arg (ap, double);
252 item->max.f = va_arg (ap, double);
258 case VLC_CONFIG_ADVANCED:
259 item->b_advanced = VLC_TRUE;
263 case VLC_CONFIG_VOLATILE:
264 item->b_unsaveable = VLC_TRUE;
268 case VLC_CONFIG_PERSISTENT:
269 item->b_autosave = VLC_TRUE;
273 case VLC_CONFIG_RESTART:
274 item->b_restart = VLC_TRUE;
278 case VLC_CONFIG_PRIVATE:
279 item->b_internal = VLC_TRUE;
283 case VLC_CONFIG_REMOVED:
284 item->b_removed = VLC_TRUE;
288 case VLC_CONFIG_CAPABILITY:
290 const char *cap = va_arg (ap, const char *);
291 item->psz_type = cap ? strdup (cap) : NULL;
296 case VLC_CONFIG_SHORTCUT:
297 item->i_short = va_arg (ap, int);
301 case VLC_CONFIG_LIST:
303 size_t len = va_arg (ap, size_t);
304 char **dtext = malloc (sizeof (char *) * (len + 1));
310 if (IsConfigIntegerType (item->i_type))
312 const int *src = va_arg (ap, const int *);
313 int *dst = malloc (sizeof (int) * (len + 1));
317 memcpy (dst, src, sizeof (int) * len);
324 if (IsConfigFloatType (item->i_type))
326 const float *src = va_arg (ap, const float *);
327 float *dst = malloc (sizeof (float) * (len + 1));
331 memcpy (dst, src, sizeof (float) * len);
338 if (IsConfigStringType (item->i_type))
340 const char *const *src = va_arg (ap, const char *const *);
341 char **dst = malloc (sizeof (char *) * (len + 1));
345 for (size_t i = 0; i < len; i++)
346 dst[i] = src[i] ? strdup (src[i]) : NULL;
349 item->ppsz_list = dst;
354 /* Copy textual descriptions */
355 const char *const *text = va_arg (ap, const char *const *);
358 for (size_t i = 0; i < len; i++)
359 dtext[i] = text[i] ? strdup ( _(text[i])) : NULL;
362 item->ppsz_list_text = dtext;
367 item->ppsz_list_text = NULL;
375 case VLC_CONFIG_ADD_ACTION:
377 vlc_callback_t cb = va_arg (ap, vlc_callback_t), *tabcb;
378 const char *name = va_arg (ap, const char *);
381 tabcb = realloc (item->ppf_action,
382 (item->i_action + 2) * sizeof (cb));
385 item->ppf_action = tabcb;
386 tabcb[item->i_action] = cb;
387 tabcb[item->i_action + 1] = NULL;
389 tabtext = realloc (item->ppsz_action_text,
390 (item->i_action + 2) * sizeof (name));
393 item->ppsz_action_text = tabtext;
396 tabtext[item->i_action] = strdup ( _(name));
398 tabtext[item->i_action] = NULL;
399 tabtext[item->i_action + 1] = NULL;
406 case VLC_CONFIG_OLDNAME:
408 const char *oldname = va_arg (ap, const char *);
409 item->psz_oldname = oldname ? strdup (oldname) : NULL;
414 case VLC_CONFIG_SAFE:
415 item->b_unsafe = VLC_TRUE;