/src/vlc/include/vlc_modules.h
Line | Count | Source (jump to first uncovered line) |
1 | | /***************************************************************************** |
2 | | * vlc_modules.h : Module descriptor and load functions |
3 | | ***************************************************************************** |
4 | | * Copyright (C) 2001-2011 VLC authors and VideoLAN |
5 | | * |
6 | | * Authors: Samuel Hocevar <sam@zoy.org> |
7 | | * |
8 | | * This program is free software; you can redistribute it and/or modify it |
9 | | * under the terms of the GNU Lesser General Public License as published by |
10 | | * the Free Software Foundation; either version 2.1 of the License, or |
11 | | * (at your option) any later version. |
12 | | * |
13 | | * This program 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. See the |
16 | | * GNU Lesser General Public License for more details. |
17 | | * |
18 | | * You should have received a copy of the GNU Lesser General Public License |
19 | | * along with this program; if not, write to the Free Software Foundation, |
20 | | * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. |
21 | | *****************************************************************************/ |
22 | | |
23 | | #ifndef VLC_MODULES_H |
24 | | #define VLC_MODULES_H 1 |
25 | | |
26 | | /** |
27 | | * \file |
28 | | * This file defines functions for modules in vlc |
29 | | */ |
30 | | |
31 | | typedef int (*vlc_activate_t)(void *func, bool forced, va_list args); |
32 | | struct vlc_logger; |
33 | | |
34 | | /***************************************************************************** |
35 | | * Exported functions. |
36 | | *****************************************************************************/ |
37 | | |
38 | | /** |
39 | | * Finds the candidate modules for given criteria. |
40 | | * |
41 | | * All candidates modules having the specified capability and name will be |
42 | | * sorted in decreasing order of priority and returned in a heap-allocated |
43 | | * table. |
44 | | * |
45 | | * \param capability capability, i.e. class of module |
46 | | * \param names string of comma-separated requested module shortcut names, |
47 | | * or NULL for defaults |
48 | | * \param strict whether to exclude modules with no unmatching shortcut names |
49 | | * \param modules storage location for the base address of a sorted table |
50 | | * of candidate modules (NULL on error) [OUT] |
51 | | * \param strict_matches storage location for the count of strictly matched |
52 | | * modules [OUT] |
53 | | * \return number of modules found or a strictly negative value on error |
54 | | */ |
55 | | VLC_API |
56 | | ssize_t vlc_module_match(const char *capability, const char *names, |
57 | | bool strict, module_t ***restrict modules, |
58 | | size_t *restrict strict_matches); |
59 | | |
60 | | /** |
61 | | * Maps a module in memory. |
62 | | * |
63 | | * This function attempts to map a given module in memory, if it is not |
64 | | * already mapped. If it is already mapped, this function does nothing. |
65 | | * |
66 | | * \param log message logger |
67 | | * \param mod module to map |
68 | | * |
69 | | * \return the module activation function on success, NULL on failure |
70 | | */ |
71 | | VLC_API |
72 | | void *vlc_module_map(struct vlc_logger *log, module_t *mod); |
73 | | |
74 | | /** |
75 | | * Finds and instantiates the best module of a certain type. |
76 | | * All candidates modules having the specified capability and name will be |
77 | | * sorted in decreasing order of priority. Then the probe callback will be |
78 | | * invoked for each module, until it succeeds (returns 0), or all candidate |
79 | | * module failed to initialize. |
80 | | * |
81 | | * The probe callback first parameter is the address of the module entry point. |
82 | | * Further parameters are passed as an argument list; it corresponds to the |
83 | | * variable arguments passed to this function. This scheme is meant to |
84 | | * support arbitrary prototypes for the module entry point. |
85 | | * |
86 | | * \param log logger for debugging (or NULL to ignore) |
87 | | * \param capability capability, i.e. class of module |
88 | | * \param name name of the module asked, if any |
89 | | * \param strict if true, do not fallback to plugin with a different name |
90 | | * but the same capability |
91 | | * \param probe module probe callback |
92 | | * \return the module or NULL in case of a failure |
93 | | */ |
94 | | VLC_API module_t *vlc_module_load(struct vlc_logger *log, const char *cap, |
95 | | const char *name, bool strict, |
96 | | vlc_activate_t probe, ... ) VLC_USED; |
97 | | #ifndef __cplusplus |
98 | | #define vlc_module_load(ctx, cap, name, strict, ...) \ |
99 | | _Generic ((ctx), \ |
100 | | struct vlc_logger *: \ |
101 | | vlc_module_load((void *)(ctx), cap, name, strict, __VA_ARGS__), \ |
102 | | void *: \ |
103 | | vlc_module_load((void *)(ctx), cap, name, strict, __VA_ARGS__), \ |
104 | | default: \ |
105 | | vlc_module_load(vlc_object_logger((vlc_object_t *)(ctx)), cap, \ |
106 | | name, strict, __VA_ARGS__)) |
107 | | #endif |
108 | | |
109 | | VLC_API module_t * module_need( vlc_object_t *, const char *, const char *, bool ) VLC_USED; |
110 | 0 | #define module_need(a,b,c,d) module_need(VLC_OBJECT(a),b,c,d) |
111 | | |
112 | | VLC_USED |
113 | | static inline module_t *module_need_var(vlc_object_t *obj, const char *cap, |
114 | | const char *varname) |
115 | | { |
116 | | char *list = var_InheritString(obj, varname); |
117 | | if (unlikely(list == NULL)) |
118 | | return NULL; |
119 | | |
120 | | module_t *m = module_need(obj, cap, list, false); |
121 | | |
122 | | free(list); |
123 | | return m; |
124 | | } |
125 | | #define module_need_var(a,b,c) module_need_var(VLC_OBJECT(a),b,c) |
126 | | |
127 | | VLC_API void module_unneed( vlc_object_t *, module_t * ); |
128 | | #define module_unneed(a,b) module_unneed(VLC_OBJECT(a),b) |
129 | | |
130 | | /** |
131 | | * Get a pointer to a module_t given it's name. |
132 | | * |
133 | | * \param name the name of the module |
134 | | * \return a pointer to the module or NULL in case of a failure |
135 | | */ |
136 | | VLC_API module_t *module_find(const char *name) VLC_USED; |
137 | | |
138 | | /** |
139 | | * Checks if a module exists. |
140 | | * |
141 | | * \param name name of the module |
142 | | * \retval true if the module exists |
143 | | * \retval false if the module does not exist (in the running installation) |
144 | | */ |
145 | | VLC_USED static inline bool module_exists(const char * name) |
146 | 0 | { |
147 | 0 | return module_find(name) != NULL; |
148 | 0 | } |
149 | | |
150 | | /** |
151 | | * Gets the table of module configuration items. |
152 | | * |
153 | | * \note Use module_config_free() to release the allocated memory. |
154 | | * |
155 | | * \param module the module |
156 | | * \param psize the size of the configuration returned |
157 | | * \return the configuration as an array |
158 | | */ |
159 | | VLC_API module_config_t *module_config_get(const module_t *module, |
160 | | unsigned *restrict psize) VLC_USED; |
161 | | |
162 | | /** |
163 | | * Releases a configuration items table. |
164 | | * |
165 | | * \param tab base address of a table returned by module_config_get() |
166 | | */ |
167 | | VLC_API void module_config_free( module_config_t *tab); |
168 | | |
169 | | /** |
170 | | * Frees a flat list of VLC modules. |
171 | | * |
172 | | * \param list list obtained by module_list_get() |
173 | | */ |
174 | | VLC_API void module_list_free(module_t **); |
175 | | |
176 | | /** |
177 | | * Gets the flat list of VLC modules. |
178 | | * |
179 | | * \param n [OUT] pointer to the number of modules |
180 | | * \return table of module pointers (release with module_list_free()), |
181 | | * or NULL in case of error (in that case, *n is zeroed). |
182 | | */ |
183 | | VLC_API module_t ** module_list_get(size_t *n) VLC_USED; |
184 | | |
185 | | /** |
186 | | * Checks whether a module implements a capability. |
187 | | * |
188 | | * \param m the module |
189 | | * \param cap the capability to check |
190 | | * \retval true if the module has the capability |
191 | | * \retval false if the module has another capability |
192 | | */ |
193 | | VLC_API bool module_provides(const module_t *m, const char *cap); |
194 | | |
195 | | /** |
196 | | * Gets the internal name of a module. |
197 | | * |
198 | | * \param m the module |
199 | | * \return the module name |
200 | | */ |
201 | | VLC_API const char * module_get_object(const module_t *m) VLC_USED; |
202 | | |
203 | | /** |
204 | | * Gets the human-friendly name of a module. |
205 | | * |
206 | | * \param m the module |
207 | | * \param longname TRUE to have the long name of the module |
208 | | * \return the short or long name of the module |
209 | | */ |
210 | | VLC_API const char *module_get_name(const module_t *m, bool longname) VLC_USED; |
211 | | #define module_GetShortName( m ) module_get_name( m, false ) |
212 | | #define module_GetLongName( m ) module_get_name( m, true ) |
213 | | |
214 | | /** |
215 | | * Gets the help text for a module. |
216 | | * |
217 | | * \param m the module |
218 | | * \return the help |
219 | | */ |
220 | | VLC_API const char *module_get_help(const module_t *m) VLC_USED; |
221 | | |
222 | | /** |
223 | | * Gets the capability string of a module. |
224 | | * |
225 | | * \param m the module |
226 | | * \return the capability, or "none" if unspecified |
227 | | */ |
228 | | VLC_API const char *module_get_capability(const module_t *m) VLC_USED; |
229 | | |
230 | | /** |
231 | | * Gets the precedence of a module. |
232 | | * |
233 | | * \param m the module |
234 | | * return the score for the capability |
235 | | */ |
236 | | VLC_API int module_get_score(const module_t *m) VLC_USED; |
237 | | |
238 | | /** |
239 | | * Translates a string using the module's text domain |
240 | | * |
241 | | * \param m the module |
242 | | * \param s the American English ASCII string to localize |
243 | | * \return the gettext-translated string |
244 | | */ |
245 | | VLC_API const char *module_gettext(const module_t *m, const char *s) VLC_USED; |
246 | | |
247 | | VLC_USED static inline module_t *module_get_main (void) |
248 | 0 | { |
249 | 0 | return module_find ("core"); |
250 | 0 | } |
251 | | |
252 | | VLC_USED static inline bool module_is_main( const module_t * p_module ) |
253 | 0 | { |
254 | 0 | return !strcmp( module_get_object( p_module ), "core" ); |
255 | 0 | } |
256 | | |
257 | | #endif /* VLC_MODULES_H */ |