1 | /***************************************************************************** |
2 | * vlc_configuration.h : configuration management module |
3 | * This file describes the programming interface for the configuration module. |
4 | * It includes functions allowing to declare, get or set configuration options. |
5 | ***************************************************************************** |
6 | * Copyright (C) 1999-2006 VLC authors and VideoLAN |
7 | * $Id: 209168615be2a7bc5db889282b32389093ab262e $ |
8 | * |
9 | * Authors: Gildas Bazin <gbazin@videolan.org> |
10 | * |
11 | * This program is free software; you can redistribute it and/or modify it |
12 | * under the terms of the GNU Lesser General Public License as published by |
13 | * the Free Software Foundation; either version 2.1 of the License, or |
14 | * (at your option) any later version. |
15 | * |
16 | * This program is distributed in the hope that it will be useful, |
17 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
18 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
19 | * GNU Lesser General Public License for more details. |
20 | * |
21 | * You should have received a copy of the GNU Lesser General Public License |
22 | * along with this program; if not, write to the Free Software Foundation, |
23 | * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. |
24 | *****************************************************************************/ |
25 | |
26 | #ifndef VLC_CONFIGURATION_H |
27 | #define VLC_CONFIGURATION_H 1 |
28 | |
29 | /** |
30 | * \file |
31 | * This file describes the programming interface for the configuration module. |
32 | * It includes functions allowing to declare, get or set configuration options. |
33 | */ |
34 | |
35 | #include <sys/types.h> /* for ssize_t */ |
36 | |
37 | # ifdef __cplusplus |
38 | extern "C" { |
39 | # endif |
40 | |
41 | struct config_category_t |
42 | { |
43 | int i_id; |
44 | const char *psz_name; |
45 | const char *psz_help; |
46 | }; |
47 | |
48 | typedef union |
49 | { |
50 | char *psz; |
51 | int64_t i; |
52 | float f; |
53 | } module_value_t; |
54 | |
55 | typedef int (*vlc_string_list_cb)(vlc_object_t *, const char *, |
56 | char ***, char ***); |
57 | typedef int (*vlc_integer_list_cb)(vlc_object_t *, const char *, |
58 | int64_t **, char ***); |
59 | |
60 | struct module_config_t |
61 | { |
62 | uint8_t i_type; /* Configuration type */ |
63 | char i_short; /* Optional short option name */ |
64 | unsigned b_advanced:1; /* Advanced option */ |
65 | unsigned b_internal:1; /* Hidden from prefs and help */ |
66 | unsigned b_unsaveable:1; /* Not stored in configuration */ |
67 | unsigned b_safe:1; /* Safe in web plugins and playlists */ |
68 | unsigned b_removed:1; /* Deprecated */ |
69 | |
70 | const char *psz_type; /* Configuration subtype */ |
71 | const char *psz_name; /* Option name */ |
72 | const char *psz_text; /* Short comment on the configuration option */ |
73 | const char *psz_longtext; /* Long comment on the configuration option */ |
74 | |
75 | module_value_t value; /* Option value */ |
76 | module_value_t orig; |
77 | module_value_t min; |
78 | module_value_t max; |
79 | |
80 | /* Values list */ |
81 | uint16_t list_count; /* Options list size */ |
82 | union |
83 | { |
84 | const char **psz; /* List of possible values for the option */ |
85 | const int *i; |
86 | vlc_string_list_cb psz_cb; |
87 | vlc_integer_list_cb i_cb; |
88 | } list; |
89 | const char **list_text; /* Friendly names for list values */ |
90 | const char *list_cb_name; |
91 | void *owner; |
92 | }; |
93 | |
94 | /***************************************************************************** |
95 | * Prototypes - these methods are used to get, set or manipulate configuration |
96 | * data. |
97 | *****************************************************************************/ |
98 | VLC_API int config_GetType(const char *) VLC_USED; |
99 | VLC_API int64_t config_GetInt(vlc_object_t *, const char *) VLC_USED; |
100 | VLC_API void config_PutInt(vlc_object_t *, const char *, int64_t); |
101 | VLC_API float config_GetFloat(vlc_object_t *, const char *) VLC_USED; |
102 | VLC_API void config_PutFloat(vlc_object_t *, const char *, float); |
103 | VLC_API char * config_GetPsz(vlc_object_t *, const char *) VLC_USED VLC_MALLOC; |
104 | VLC_API void config_PutPsz(vlc_object_t *, const char *, const char *); |
105 | VLC_API ssize_t config_GetIntChoices(vlc_object_t *, const char *, |
106 | int64_t **, char ***) VLC_USED; |
107 | VLC_API ssize_t config_GetPszChoices(vlc_object_t *, const char *, |
108 | char ***, char ***) VLC_USED; |
109 | |
110 | VLC_API int config_SaveConfigFile( vlc_object_t * ); |
111 | #define config_SaveConfigFile(a) config_SaveConfigFile(VLC_OBJECT(a)) |
112 | |
113 | VLC_API void config_ResetAll( vlc_object_t * ); |
114 | #define config_ResetAll(a) config_ResetAll(VLC_OBJECT(a)) |
115 | |
116 | VLC_API module_config_t * config_FindConfig(const char *) VLC_USED; |
117 | VLC_API char * config_GetDataDir(void) VLC_USED VLC_MALLOC; |
118 | VLC_API char *config_GetLibDir(void) VLC_USED; |
119 | |
120 | typedef enum vlc_userdir |
121 | { |
122 | VLC_HOME_DIR, /* User's home */ |
123 | VLC_CONFIG_DIR, /* VLC-specific configuration directory */ |
124 | VLC_DATA_DIR, /* VLC-specific data directory */ |
125 | VLC_CACHE_DIR, /* VLC-specific user cached data directory */ |
126 | /* Generic directories (same as XDG) */ |
127 | VLC_DESKTOP_DIR=0x80, |
128 | VLC_DOWNLOAD_DIR, |
129 | VLC_TEMPLATES_DIR, |
130 | VLC_PUBLICSHARE_DIR, |
131 | VLC_DOCUMENTS_DIR, |
132 | VLC_MUSIC_DIR, |
133 | VLC_PICTURES_DIR, |
134 | VLC_VIDEOS_DIR, |
135 | } vlc_userdir_t; |
136 | |
137 | VLC_API char * config_GetUserDir( vlc_userdir_t ) VLC_USED VLC_MALLOC; |
138 | |
139 | VLC_API void config_AddIntf( vlc_object_t *, const char * ); |
140 | VLC_API void config_RemoveIntf( vlc_object_t *, const char * ); |
141 | VLC_API bool config_ExistIntf( vlc_object_t *, const char * ) VLC_USED; |
142 | |
143 | #define config_GetInt(a,b) config_GetInt(VLC_OBJECT(a),b) |
144 | #define config_PutInt(a,b,c) config_PutInt(VLC_OBJECT(a),b,c) |
145 | #define config_GetFloat(a,b) config_GetFloat(VLC_OBJECT(a),b) |
146 | #define config_PutFloat(a,b,c) config_PutFloat(VLC_OBJECT(a),b,c) |
147 | #define config_GetPsz(a,b) config_GetPsz(VLC_OBJECT(a),b) |
148 | #define config_PutPsz(a,b,c) config_PutPsz(VLC_OBJECT(a),b,c) |
149 | |
150 | #define config_AddIntf(a,b) config_AddIntf(VLC_OBJECT(a),b) |
151 | #define config_RemoveIntf(a,b) config_RemoveIntf(VLC_OBJECT(a),b) |
152 | #define config_ExistIntf(a,b) config_ExistIntf(VLC_OBJECT(a),b) |
153 | |
154 | /**************************************************************************** |
155 | * config_chain_t: |
156 | ****************************************************************************/ |
157 | struct config_chain_t |
158 | { |
159 | config_chain_t *p_next; /**< Pointer on the next config_chain_t element */ |
160 | |
161 | char *psz_name; /**< Option name */ |
162 | char *psz_value; /**< Option value */ |
163 | }; |
164 | |
165 | /** |
166 | * This function will |
167 | * - create all options in the array ppsz_options (var_Create). |
168 | * - parse the given linked list of config_chain_t and set the value (var_Set). |
169 | * |
170 | * The option names will be created by adding the psz_prefix prefix. |
171 | */ |
172 | VLC_API void config_ChainParse( vlc_object_t *, const char *psz_prefix, const char *const *ppsz_options, config_chain_t * ); |
173 | #define config_ChainParse( a, b, c, d ) config_ChainParse( VLC_OBJECT(a), b, c, d ) |
174 | |
175 | /** |
176 | * This function will parse a configuration string (psz_opts) and |
177 | * - set all options for this module in a chained list (*pp_cfg) |
178 | * - returns a pointer on the next module if any. |
179 | * |
180 | * The string format is |
181 | * module{option=*,option=*} |
182 | * |
183 | * The options values are unescaped using config_StringUnescape. |
184 | */ |
185 | VLC_API const char *config_ChainParseOptions( config_chain_t **pp_cfg, const char *ppsz_opts ); |
186 | |
187 | /** |
188 | * This function will parse a configuration string (psz_string) and |
189 | * - set the module name (*ppsz_name) |
190 | * - set all options for this module in a chained list (*pp_cfg) |
191 | * - returns a pointer on the next module if any. |
192 | * |
193 | * The string format is |
194 | * module{option=*,option=*}[:modulenext{option=*,...}] |
195 | * |
196 | * The options values are unescaped using config_StringUnescape. |
197 | */ |
198 | VLC_API char *config_ChainCreate( char **ppsz_name, config_chain_t **pp_cfg, const char *psz_string ) VLC_USED VLC_MALLOC; |
199 | |
200 | /** |
201 | * This function will release a linked list of config_chain_t |
202 | * (Including the head) |
203 | */ |
204 | VLC_API void config_ChainDestroy( config_chain_t * ); |
205 | |
206 | /** |
207 | * This function will duplicate a linked list of config_chain_t |
208 | */ |
209 | VLC_API config_chain_t * config_ChainDuplicate( const config_chain_t * ) VLC_USED VLC_MALLOC; |
210 | |
211 | /** |
212 | * This function will unescape a string in place and will return a pointer on |
213 | * the given string. |
214 | * No memory is allocated by it (unlike config_StringEscape). |
215 | * If NULL is given as parameter nothing will be done (NULL will be returned). |
216 | * |
217 | * The following sequences will be unescaped (only one time): |
218 | * \\ \' and \" |
219 | */ |
220 | VLC_API char * config_StringUnescape( char *psz_string ); |
221 | |
222 | /** |
223 | * This function will escape a string that can be unescaped by |
224 | * config_StringUnescape. |
225 | * The returned value is allocated by it. You have to free it once you |
226 | * do not need it anymore (unlike config_StringUnescape). |
227 | * If NULL is given as parameter nothing will be done (NULL will be returned). |
228 | * |
229 | * The escaped characters are ' " and \ |
230 | */ |
231 | VLC_API char * config_StringEscape( const char *psz_string ) VLC_USED VLC_MALLOC; |
232 | |
233 | # ifdef __cplusplus |
234 | } |
235 | # endif |
236 | |
237 | #endif /* _VLC_CONFIGURATION_H */ |
238 | |