1 /*****************************************************************************
2 * entry.c : Callbacks for module entry point
3 *****************************************************************************
4 * Copyright (C) 2007 the VideoLAN team
5 * Copyright © 2007-2008 Rémi Denis-Courmont
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
20 *****************************************************************************/
26 #include <vlc_common.h>
27 #include <vlc_plugin.h>
31 #include "modules/modules.h"
32 #include "config/configuration.h"
35 static const char default_name[] = "unnamed";
37 module_t *vlc_module_create (vlc_object_t *obj)
40 (module_t *)vlc_custom_create (obj, sizeof (module_t),
41 VLC_OBJECT_MODULE, "module");
45 module->b_reentrant = module->b_unloadable = true;
46 module->psz_object_name = strdup( default_name );
47 module->psz_longname = default_name;
48 module->psz_capability = (char*)"";
50 module->i_config_items = module->i_bool_items = 0;
56 module_t *vlc_submodule_create (module_t *module)
58 assert (module != NULL);
59 assert (!module->b_submodule); // subsubmodules are not supported
62 (module_t *)vlc_custom_create (VLC_OBJECT (module), sizeof (module_t),
63 VLC_OBJECT_MODULE, "submodule");
64 if (submodule == NULL)
67 vlc_object_attach (submodule, module);
68 submodule->b_submodule = true;
70 /* Muahahaha! Heritage! Polymorphism! Ugliness!! */
71 memcpy (submodule->pp_shortcuts, module->pp_shortcuts,
72 sizeof (submodule->pp_shortcuts));
74 submodule->psz_object_name = strdup( module->psz_object_name );
75 submodule->psz_shortname = module->psz_shortname;
76 submodule->psz_longname = module->psz_longname;
77 submodule->psz_capability = module->psz_capability;
78 submodule->i_score = module->i_score;
79 submodule->i_cpu = module->i_cpu;
84 int vlc_module_set (module_t *module, int propid, ...)
87 int ret = VLC_SUCCESS;
89 va_start (ap, propid);
92 case VLC_MODULE_CPU_REQUIREMENT:
93 assert (!module->b_submodule);
94 module->i_cpu |= va_arg (ap, int);
97 case VLC_MODULE_SHORTCUT:
100 for (i = 0; module->pp_shortcuts[i] != NULL; i++);
101 if (i >= (MODULE_SHORTCUT_MAX - 1))
107 module->pp_shortcuts[i] = va_arg (ap, char *);
111 case VLC_MODULE_SHORTNAME_NODOMAIN:
113 const char *name = va_arg (ap, char *);
114 ret = vlc_module_set (module, VLC_MODULE_SHORTNAME, NULL, name);
118 case VLC_MODULE_DESCRIPTION_NODOMAIN:
120 const char *desc = va_arg (ap, char *);
121 ret = vlc_module_set (module, VLC_MODULE_DESCRIPTION, NULL, desc);
125 case VLC_MODULE_HELP_NODOMAIN:
127 const char *help = va_arg (ap, char *);
128 ret = vlc_module_set (module, VLC_MODULE_HELP, NULL, help);
132 case VLC_MODULE_CAPABILITY:
133 module->psz_capability = va_arg (ap, char *);
136 case VLC_MODULE_SCORE:
137 module->i_score = va_arg (ap, int);
140 case VLC_MODULE_PROGRAM:
141 msg_Warn (module, "deprecated module property %d", propid);
144 case VLC_MODULE_CB_OPEN:
145 module->pf_activate = va_arg (ap, int (*) (vlc_object_t *));
148 case VLC_MODULE_CB_CLOSE:
149 module->pf_deactivate = va_arg (ap, void (*) (vlc_object_t *));
152 case VLC_MODULE_NO_UNLOAD:
153 module->b_unloadable = false;
156 case VLC_MODULE_NAME:
158 const char *value = va_arg (ap, const char *);
159 free( module->psz_object_name );
160 module->psz_object_name = strdup( value );
161 module->pp_shortcuts[0] = value;
162 if (module->psz_longname == default_name)
163 module->psz_longname = value;
167 case VLC_MODULE_SHORTNAME:
169 const char *domain = va_arg (ap, const char *);
172 module->psz_shortname = dgettext (domain, va_arg (ap, char *));
176 case VLC_MODULE_DESCRIPTION:
178 const char *domain = va_arg (ap, const char *);
181 module->psz_longname = dgettext (domain, va_arg (ap, char *));
185 case VLC_MODULE_HELP:
187 const char *domain = va_arg (ap, const char *);
190 module->psz_help = dgettext (domain, va_arg (ap, char *));
195 msg_Err (module, "unknown module property %d", propid);
196 msg_Err (module, "LibVLC might be too old to use this module.");
204 module_config_t *vlc_config_create (module_t *module, int type)
206 unsigned confsize = module->confsize;
207 module_config_t *tab = module->p_config;
209 if ((confsize & 0xf) == 0)
211 tab = realloc (tab, (confsize + 17) * sizeof (*tab));
215 module->p_config = tab;
218 memset (tab + confsize, 0, sizeof (tab[confsize]));
219 tab[confsize].i_type = type;
220 tab[confsize].p_lock = &module->object_lock;
222 if (type & CONFIG_ITEM)
224 module->i_config_items++;
225 if (type == CONFIG_ITEM_BOOL)
226 module->i_bool_items++;
230 return tab + confsize;
233 int vlc_config_set (module_config_t *restrict item, int id, ...)
238 assert (item != NULL);
243 case VLC_CONFIG_NAME:
245 const char *name = va_arg (ap, const char *);
246 vlc_callback_t cb = va_arg (ap, vlc_callback_t);
248 assert (name != NULL);
249 item->psz_name = strdup (name);
250 item->pf_callback = cb;
255 case VLC_CONFIG_DESC:
257 const char *text = va_arg (ap, const char *);
258 const char *longtext = va_arg (ap, const char *);
260 item->psz_text = text ? strdup (dgettext (PACKAGE, text)) : NULL;
262 longtext ? strdup (dgettext (PACKAGE, longtext)) : NULL;
267 case VLC_CONFIG_VALUE:
269 if (IsConfigIntegerType (item->i_type))
271 item->orig.i = item->saved.i =
272 item->value.i = va_arg (ap, int);
276 if (IsConfigFloatType (item->i_type))
278 item->orig.f = item->saved.f =
279 item->value.f = va_arg (ap, double);
283 if (IsConfigStringType (item->i_type))
285 const char *value = va_arg (ap, const char *);
286 item->value.psz = value ? strdup (value) : NULL;
287 item->orig.psz = value ? strdup (value) : NULL;
288 item->saved.psz = value ? strdup (value) : NULL;
294 case VLC_CONFIG_RANGE:
296 if (IsConfigIntegerType (item->i_type))
298 item->min.i = va_arg (ap, int);
299 item->max.i = va_arg (ap, int);
303 if (IsConfigFloatType (item->i_type))
305 item->min.f = va_arg (ap, double);
306 item->max.f = va_arg (ap, double);
312 case VLC_CONFIG_ADVANCED:
313 item->b_advanced = true;
317 case VLC_CONFIG_VOLATILE:
318 item->b_unsaveable = true;
322 case VLC_CONFIG_PERSISTENT:
323 item->b_autosave = true;
327 case VLC_CONFIG_RESTART:
328 item->b_restart = true;
332 case VLC_CONFIG_PRIVATE:
333 item->b_internal = true;
337 case VLC_CONFIG_REMOVED:
338 item->b_removed = true;
342 case VLC_CONFIG_CAPABILITY:
344 const char *cap = va_arg (ap, const char *);
345 item->psz_type = cap ? strdup (cap) : NULL;
350 case VLC_CONFIG_SHORTCUT:
351 item->i_short = va_arg (ap, int);
355 case VLC_CONFIG_LIST:
357 size_t len = va_arg (ap, size_t);
358 char **dtext = malloc (sizeof (char *) * (len + 1));
364 if (IsConfigIntegerType (item->i_type))
366 const int *src = va_arg (ap, const int *);
367 int *dst = malloc (sizeof (int) * (len + 1));
371 memcpy (dst, src, sizeof (int) * len);
378 if (IsConfigFloatType (item->i_type))
380 const float *src = va_arg (ap, const float *);
381 float *dst = malloc (sizeof (float) * (len + 1));
385 memcpy (dst, src, sizeof (float) * len);
392 if (IsConfigStringType (item->i_type))
394 const char *const *src = va_arg (ap, const char *const *);
395 char **dst = malloc (sizeof (char *) * (len + 1));
399 for (size_t i = 0; i < len; i++)
400 dst[i] = src[i] ? strdup (src[i]) : NULL;
403 item->ppsz_list = dst;
408 /* Copy textual descriptions */
409 const char *const *text = va_arg (ap, const char *const *);
412 for (size_t i = 0; i < len; i++)
414 text[i] ? strdup (dgettext (PACKAGE, text[i])) : NULL;
417 item->ppsz_list_text = dtext;
422 item->ppsz_list_text = NULL;
426 item->pf_update_list = va_arg (ap, vlc_callback_t);
431 case VLC_CONFIG_ADD_ACTION:
433 vlc_callback_t cb = va_arg (ap, vlc_callback_t), *tabcb;
434 const char *name = va_arg (ap, const char *);
437 tabcb = realloc (item->ppf_action,
438 (item->i_action + 2) * sizeof (cb));
441 item->ppf_action = tabcb;
442 tabcb[item->i_action] = cb;
443 tabcb[item->i_action + 1] = NULL;
445 tabtext = realloc (item->ppsz_action_text,
446 (item->i_action + 2) * sizeof (name));
449 item->ppsz_action_text = tabtext;
452 tabtext[item->i_action] = strdup (dgettext (PACKAGE, name));
454 tabtext[item->i_action] = NULL;
455 tabtext[item->i_action + 1] = NULL;
462 case VLC_CONFIG_OLDNAME:
464 const char *oldname = va_arg (ap, const char *);
465 item->psz_oldname = oldname ? strdup (oldname) : NULL;
470 case VLC_CONFIG_SAFE: