a221483d29a22e4381bc11f7de9b2b99c76195b7
[vlc.git] / src / modules / entry.c
1 /*****************************************************************************
2  * entry.c : Callbacks for module entry point
3  *****************************************************************************
4  * Copyright (C) 2001-2007 the VideoLAN team
5  *
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.
10  *
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.
15  *
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  *****************************************************************************/
20
21 #include <vlc/vlc.h>
22 #include <assert.h>
23 #include <stdarg.h>
24
25 #include "modules/modules.h"
26 #include "config/config.h"
27 #include "libvlc.h"
28
29 static const char default_name[] = "unnamed";
30
31 module_t *vlc_module_create (vlc_object_t *obj)
32 {
33     module_t *module =
34         (module_t *)vlc_custom_create (obj, sizeof (module_t),
35                                        VLC_OBJECT_MODULE, "module");
36     if (module == NULL)
37         return NULL;
38
39     module->b_reentrant = module->b_unloadable = VLC_TRUE;
40     module->psz_object_name = module->psz_longname = default_name;
41     module->psz_capability = "";
42     module->i_score = 1;
43     return module;
44 }
45
46
47 module_t *vlc_submodule_create (module_t *module)
48 {
49     assert (module != NULL);
50     assert (!module->b_submodule); // subsubmodules are not supported
51
52     module_t *submodule =
53         (module_t *)vlc_custom_create (VLC_OBJECT (module), sizeof (module_t),
54                                        VLC_OBJECT_MODULE, "submodule");
55     if (submodule == NULL)
56         return NULL;
57
58     vlc_object_attach (submodule, module);
59     submodule->b_submodule = VLC_TRUE;
60
61     /* Muahahaha! Heritage! Polymorphism! Ugliness!! */
62     memcpy (submodule->pp_shortcuts, module->pp_shortcuts,
63             sizeof (submodule->pp_shortcuts));
64
65     submodule->psz_object_name = module->psz_object_name;
66     submodule->psz_shortname = module->psz_shortname;
67     submodule->psz_longname = module->psz_longname;
68     submodule->psz_capability = module->psz_capability;
69     submodule->i_score = module->i_score;
70     submodule->i_cpu = module->i_cpu;
71     return submodule;
72 }
73
74
75 int vlc_module_set (module_t *module, int propid, void *value)
76 {
77     switch (propid)
78     {
79         case VLC_MODULE_CPU_REQUIREMENT:
80             assert (!module->b_submodule);
81             module->i_cpu |= (intptr_t)value;
82             break;
83
84         case VLC_MODULE_SHORTCUT:
85         {
86             unsigned i;
87             for (i = 0; module->pp_shortcuts[i] != NULL; i++);
88             if (i >= (MODULE_SHORTCUT_MAX - 1))
89                 return VLC_ENOMEM;
90
91             module->pp_shortcuts[i] = (char *)value;
92             break;
93         }
94
95         case VLC_MODULE_SHORTNAME:
96             module->psz_shortname = (char *)value;
97             break;
98
99         case VLC_MODULE_DESCRIPTION:
100             module->psz_longname = (char *)value;
101             break;
102
103         case VLC_MODULE_HELP:
104             module->psz_help = (char *)value;
105             break;
106
107         case VLC_MODULE_CAPABILITY:
108             module->psz_capability = (char *)value;
109             break;
110
111         case VLC_MODULE_SCORE:
112             module->i_score = (intptr_t)value;
113             break;
114
115         case VLC_MODULE_CB_OPEN:
116             module->pf_activate = (int (*) (vlc_object_t *))value;
117             break;
118
119         case VLC_MODULE_CB_CLOSE:
120             module->pf_deactivate = (void (*) (vlc_object_t *))value;
121             break;
122
123         case VLC_MODULE_UNLOADABLE:
124             module->b_unloadable = (value != NULL);
125             break;
126
127         case VLC_MODULE_NAME:
128             module->pp_shortcuts[0] = module->psz_object_name = (char *)value;
129             if (module->psz_longname == default_name)
130                 module->psz_longname = (char *)value;
131             break;
132
133         case VLC_MODULE_PROGRAM:
134             msg_Warn (module, "deprecated module property %d", propid);
135             return 0;
136
137         default:
138             msg_Err (module, "unknown module property %d", propid);
139             msg_Err (module, "LibVLC might be too old to use this module.");
140             return VLC_EGENERIC;
141     }
142     return 0;
143 }
144
145 module_config_t *vlc_config_create (module_t *module, int type)
146 {
147     unsigned confsize = module->confsize;
148     module_config_t *tab = module->p_config;
149
150     if ((confsize & 0xf) == 0)
151     {
152         tab = realloc (tab, (confsize + 17) * sizeof (*tab));
153         if (tab == NULL)
154             return NULL;
155
156         module->p_config = tab;
157     }
158     module->confsize++;
159
160     memset (tab + confsize, 0, sizeof (tab[confsize]));
161     return tab + confsize;
162 }
163
164 int vlc_config_set (module_config_t *restrict item, vlc_config_t id, ...)
165 {
166     int ret = -1;
167     va_list ap;
168
169     assert (item != NULL);
170     va_start (ap, id);
171
172     switch (id)
173     {
174         case VLC_CONFIG_NAME:
175         {
176             const char *name = va_arg (ap, const char *);
177             vlc_callback_t cb = va_arg (ap, vlc_callback_t);
178
179             assert (name != NULL);
180             item->psz_name = strdup (name);
181             item->pf_callback = cb;
182             ret = 0;
183             break;
184         }
185
186         case VLC_CONFIG_DESC:
187         {
188             const char *text = va_arg (ap, const char *);
189             const char *longtext = va_arg (ap, const char *);
190
191             item->psz_text = text ? strdup (gettext (text)) : NULL;
192             item->psz_longtext = longtext ? strdup (gettext (text)) : NULL;
193             ret = 0;
194             break;
195         }
196
197         case VLC_CONFIG_VALUE:
198         {
199             if (IsConfigIntegerType (item->i_type))
200             {
201                 item->value.i = va_arg (ap, int);
202                 ret = 0;
203             }
204             else
205             if (IsConfigFloatType (item->i_type))
206             {
207                 item->value.f = va_arg (ap, double);
208                 ret = 0;
209             }
210             else
211             if (IsConfigStringType (item->i_type))
212             {
213                 const char *value = va_arg (ap, const char *);
214                 item->value.psz = value ? strdup (value) : NULL;
215                 ret = 0;
216             }
217             break;
218         }
219
220         case VLC_CONFIG_RANGE:
221         {
222             if (IsConfigIntegerType (item->i_type))
223             {
224                 item->min.i = va_arg (ap, int);
225                 item->max.i = va_arg (ap, int);
226                 ret = 0;
227             }
228             else
229             if (IsConfigFloatType (item->i_type))
230             {
231                 item->min.f = va_arg (ap, double);
232                 item->max.f = va_arg (ap, double);
233                 ret = 0;
234             }
235             break;
236         }
237
238         case VLC_CONFIG_ADVANCED:
239             item->b_advanced = VLC_TRUE;
240             ret = 0;
241             break;
242
243         case VLC_CONFIG_VOLATILE:
244             item->b_unsaveable = VLC_TRUE;
245             ret = 0;
246             break;
247
248         case VLC_CONFIG_PERSISTENT:
249             item->b_autosave = VLC_TRUE;
250             ret = 0;
251             break;
252
253         case VLC_CONFIG_RESTART:
254             item->b_restart = VLC_TRUE;
255             ret = 0;
256             break;
257
258         case VLC_CONFIG_PRIVATE:
259             item->b_internal = VLC_TRUE;
260             ret = 0;
261             break;
262     }
263
264     va_end (ap);
265     return ret;
266 }