VLC  4.0.0-dev
vlc_modules.h
Go to the documentation of this file.
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 #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  module_t *m = module_need(obj, cap, list, false);
118 
119  free(list);
120  return m;
121 }
122 #define module_need_var(a,b,c) module_need_var(VLC_OBJECT(a),b,c)
123 
125 #define module_unneed(a,b) module_unneed(VLC_OBJECT(a),b)
126 
127 /**
128  * Checks if a module exists.
129  *
130  * \param name name of the module
131  * \retval true if the module exists
132  * \retval false if the module does not exist (in the running installation)
133  */
134 VLC_API bool module_exists(const char *) VLC_USED;
135 
136 /**
137  * Get a pointer to a module_t given it's name.
138  *
139  * \param name the name of the module
140  * \return a pointer to the module or NULL in case of a failure
141  */
143 
144 /**
145  * Gets the table of module configuration items.
146  *
147  * \note Use module_config_free() to release the allocated memory.
148  *
149  * \param module the module
150  * \param psize the size of the configuration returned
151  * \return the configuration as an array
152  */
154  unsigned *restrict psize) VLC_USED;
155 
156 /**
157  * Releases the configuration items table.
158  *
159  * \param tab base address of a table returned by module_config_get()
160  */
162 
165 
166 /**
167  * Checks whether a module implements a capability.
168  *
169  * \param m the module
170  * \param cap the capability to check
171  * \retval true if the module has the capability
172  * \retval false if the module has another capability
173  */
174 VLC_API bool module_provides(const module_t *m, const char *cap);
175 
176 /**
177  * Gets the internal name of a module.
178  *
179  * \param m the module
180  * \return the module name
181  */
182 VLC_API const char * module_get_object(const module_t *m) VLC_USED;
183 
184 /**
185  * Gets the human-friendly name of a module.
186  *
187  * \param m the module
188  * \param longname TRUE to have the long name of the module
189  * \return the short or long name of the module
190  */
191 VLC_API const char *module_get_name(const module_t *m, bool longname) VLC_USED;
192 #define module_GetLongName( m ) module_get_name( m, true )
193 
194 /**
195  * Gets the help text for a module.
196  *
197  * \param m the module
198  * \return the help
199  */
200 VLC_API const char *module_get_help(const module_t *m) VLC_USED;
201 
202 /**
203  * Gets the capability string of a module.
204  *
205  * \param m the module
206  * \return the capability, or "none" if unspecified
207  */
208 VLC_API const char *module_get_capability(const module_t *m) VLC_USED;
209 
210 /**
211  * Gets the precedence of a module.
212  *
213  * \param m the module
214  * return the score for the capability
215  */
217 
218 /**
219  * Translates a string using the module's text domain
220  *
221  * \param m the module
222  * \param s the American English ASCII string to localize
223  * \return the gettext-translated string
224  */
225 VLC_API const char *module_gettext(const module_t *m, const char *s) VLC_USED;
226 
227 VLC_USED static inline module_t *module_get_main (void)
228 {
229  return module_find ("core");
230 }
231 #define module_get_main(a) module_get_main()
232 
233 VLC_USED static inline bool module_is_main( const module_t * p_module )
234 {
235  return !strcmp( module_get_object( p_module ), "core" );
236 }
237 
238 #endif /* VLC_MODULES_H */
VLC_API
#define VLC_API
Definition: fourcc_gen.c:31
module_get_main
#define module_get_main(a)
Definition: vlc_modules.h:232
vlc_common.h
vlc_logger
Definition: messages.c:54
module_need_var
#define module_need_var(a, b, c)
Definition: vlc_modules.h:123
module_gettext
const VLC_EXPORT char * module_gettext(const module_t *m, const char *s)
Translates a string using the module's text domain.
Definition: modules.c:82
vlc_activate_t
int(* vlc_activate_t)(void *func, bool forced, va_list args)
Definition: vlc_modules.h:32
vlc_module_load
#define vlc_module_load(ctx, cap, name, strict,...)
Definition: vlc_modules.h:99
modules
static struct @95 modules
module_get_capability
const VLC_EXPORT char * module_get_capability(const module_t *m)
Gets the capability string of a module.
Definition: modules.c:72
var_InheritString
static char * var_InheritString(vlc_object_t *obj, const char *name)
Definition: vlc_variables.h:705
module_list_free
VLC_EXPORT void module_list_free(module_t **)
Frees the flat list of VLC modules.
Definition: bank.c:754
module_exists
VLC_EXPORT bool module_exists(const char *)
Checks if a module exists.
Definition: modules.c:332
module_t
Internal module descriptor.
Definition: modules.h:78
module_get_name
const VLC_EXPORT char * module_get_name(const module_t *m, bool longname)
Gets the human-friendly name of a module.
Definition: modules.c:57
module_config_free
VLC_EXPORT void module_config_free(module_config_t *tab)
Releases the configuration items table.
Definition: modules.c:372
module_provides
VLC_EXPORT bool module_provides(const module_t *m, const char *cap)
Checks whether a module implements a capability.
Definition: modules.c:45
vlc_object_t
VLC object common members.
Definition: vlc_objects.h:43
module_config_t
Configuration item.
Definition: vlc_configuration.h:76
module_get_help
const VLC_EXPORT char * module_get_help(const module_t *m)
Gets the help text for a module.
Definition: modules.c:67
VLC_USED
#define VLC_USED
Definition: fourcc_gen.c:32
list
module_config_t ** list
Definition: core.c:400
name
const char name[16]
Definition: httpd.c:1268
module_list_get
VLC_EXPORT module_t ** module_list_get(size_t *n)
Gets the flat list of VLC modules.
Definition: bank.c:765
module_config_get
VLC_EXPORT module_config_t * module_config_get(const module_t *module, unsigned *restrict psize)
Gets the table of module configuration items.
Definition: modules.c:337
module_get_object
const VLC_EXPORT char * module_get_object(const module_t *m)
Gets the internal name of a module.
Definition: modules.c:50
vlc_module_map
VLC_EXPORT void * vlc_module_map(struct vlc_logger *log, module_t *mod)
Maps a module in memory.
Definition: modules.c:185
module_get_score
VLC_EXPORT int module_get_score(const module_t *m)
Gets the precedence of a module.
Definition: modules.c:77
module_is_main
static bool module_is_main(const module_t *p_module)
Definition: vlc_modules.h:234
module_unneed
#define module_unneed(a, b)
Definition: vlc_modules.h:126
module_find
VLC_EXPORT module_t * module_find(const char *name)
Get a pointer to a module_t given it's name.
Definition: modules.c:309
module_need
#define module_need(a, b, c, d)
Definition: vlc_modules.h:111
vlc_module_match
VLC_EXPORT ssize_t vlc_module_match(const char *capability, const char *names, bool strict, module_t ***restrict modules, size_t *restrict strict_matches)
Finds the candidate modules for given criteria.
Definition: modules.c:105