]> git.sesse.net Git - vlc/blob - modules/control/http/http.h
Merge back branch 0.8.6-playlist-vlm to trunk.
[vlc] / modules / control / http / http.h
1 /*****************************************************************************
2  * http.h: Headers for the HTTP interface
3  *****************************************************************************
4  * Copyright (C) 2001-2005 the VideoLAN team
5  * $Id$
6  *
7  * Authors: Gildas Bazin <gbazin@netcourrier.com>
8  *          Laurent Aimar <fenrir@via.ecp.fr>
9  *          Christophe Massiot <massiot@via.ecp.fr>
10  *
11  * This program is free software; you can redistribute it and/or modify
12  * it under the terms of the GNU General Public License as published by
13  * the Free Software Foundation; either version 2 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 General Public License for more details.
20  *
21  * You should have received a copy of the GNU General Public License
22  * along with this program; if not, write to the Free Software
23  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
24  *****************************************************************************/
25
26 #ifndef _HTTP_H_
27 #define _HTTP_H_
28
29 /*****************************************************************************
30  * Preamble
31  *****************************************************************************/
32 #include <stdlib.h>
33 #include <strings.h>
34 #include <ctype.h>
35 #include <vlc/vlc.h>
36 #include <vlc/intf.h>
37
38 #include <vlc/aout.h>
39 #include <vlc/vout.h> /* for fullscreen */
40
41 #include "vlc_httpd.h"
42 #include "vlc_vlm.h"
43 #include "vlc_tls.h"
44 #include "vlc_acl.h"
45 #include "charset.h"
46
47 #ifdef HAVE_SYS_STAT_H
48 #   include <sys/stat.h>
49 #endif
50 #ifdef HAVE_ERRNO_H
51 #   include <errno.h>
52 #endif
53 #ifdef HAVE_FCNTL_H
54 #   include <fcntl.h>
55 #endif
56
57 #ifdef HAVE_UNISTD_H
58 #   include <unistd.h>
59 #elif defined( WIN32 ) && !defined( UNDER_CE )
60 #   include <io.h>
61 #endif
62
63 #ifdef HAVE_DIRENT_H
64 #   include <dirent.h>
65 #endif
66
67 /* stat() support for large files on win32 */
68 #if defined( WIN32 ) && !defined( UNDER_CE )
69 #   define stat _stati64
70 #endif
71
72 /** \defgroup http_intf HTTP Interface
73  * This is the HTTP remote control interface. It is fully customizable
74  * by writing HTML pages using custom <vlc> tags.
75  *
76  * These tags use so-called macros.
77  *
78  * These macros can manipulate variables. For more complex operations,
79  * a custom RPN evaluator with many built-in functions is provided.
80  * @{
81  */
82
83 /*****************************************************************************
84  * Local defines
85  *****************************************************************************/
86 #define MAX_DIR_SIZE 2560
87 #define STACK_MAX 100        //< Maximum RPN stack size
88
89
90 /*****************************************************************************
91  * Utility functions
92  *****************************************************************************/
93
94 /** \defgroup http_utils Utilities
95  * \ingroup http_intf
96  * Utilities
97  * @{
98  */
99
100 /* File and directory functions */
101
102 /** This function recursively parses a directory and adds all files */
103 int E_(ParseDirectory)( intf_thread_t *p_intf, char *psz_root,
104                         char *psz_dir );
105 /** This function loads a file into a buffer */
106 int E_(FileLoad)( FILE *f, char **pp_data, int *pi_data );
107 /** This function creates a suitable URL for a filename */
108 char *E_(FileToUrl)( char *name, vlc_bool_t *pb_index );
109 /** This function returns the real path of a file or directory */
110 char *E_(RealPath)( intf_thread_t *p_intf, const char *psz_src );
111
112 /* Locale handling functions */
113
114 /** This fuction converts a locale string to UTF-8 */
115 char *E_(FromUTF8)( intf_thread_t *p_intf, char *psz_utf8 );
116 /** This function converts an UTF-8 to locale */
117 char *E_(ToUTF8)( intf_thread_t *p_intf, char *psz_local );
118
119 /** This command parses the "seek" command for the HTTP interface
120  * and performs the requested action */
121 void E_(HandleSeek)( intf_thread_t *p_intf, char *p_value );
122
123 /* URI Handling functions */
124
125 /** This function extracts the value for a given argument name
126  * from an HTTP request */
127 char *E_(ExtractURIValue)( char *psz_uri, const char *psz_name,
128                              char *psz_value, int i_value_max );
129 /** \todo Describe this function */
130 int E_(TestURIParam)( char *psz_uri, const char *psz_name );
131
132 /** This function parses a MRL */
133 input_item_t *E_(MRLParse)( intf_thread_t *, char *psz, char *psz_name );
134
135 /** Return the first word from a string (works in-place) */
136 char *E_(FirstWord)( char *psz, char *new );
137
138 /**@}*/
139
140 /****************************************************************************
141  * Variable handling functions
142  ****************************************************************************/
143
144 /** \defgroup http_vars Macro variables
145  * \ingroup http_intf
146  * These variables can be used in the <vlc> macros and in the RPN evaluator.
147  * The variables make a tree: each variable can have an arbitrary
148  * number of "children" variables.
149  * A number of helper functions are provided to manipulate the main variable
150  * structure
151  * @{
152  */
153
154 /**
155  * \struct mvar_t
156  * This structure defines a macro variable
157  */
158 typedef struct mvar_s
159 {
160     char *name;                 ///< Variable name
161     char *value;                ///< Variable value
162
163     int           i_field;      ///< Number of children variables
164     struct mvar_s **field;      ///< Children variables array
165 } mvar_t;
166
167
168 /** This function creates a new variable */
169 mvar_t  *E_(mvar_New)( const char *name, const char *value );
170 /** This function deletes a variable */
171 void     E_(mvar_Delete)( mvar_t *v );
172 /** This function adds f to the children variables of v, at last position */
173 void     E_(mvar_AppendVar)( mvar_t *v, mvar_t *f );
174 /** This function duplicates a variable */
175 mvar_t  *E_(mvar_Duplicate)( const mvar_t *v );
176 /** This function adds f to the children variables of v, at fist position */
177 void     E_(mvar_PushVar)( mvar_t *v, mvar_t *f );
178 /** This function removes f from the children variables of v */
179 void     E_(mvar_RemoveVar)( mvar_t *v, mvar_t *f );
180 /** This function retrieves the child variable named "name" */
181 mvar_t  *E_(mvar_GetVar)( mvar_t *s, const char *name );
182 /** This function retrieves the value of the child variable named "field" */
183 char    *E_(mvar_GetValue)( mvar_t *v, char *field );
184 /** This function creates a variable with the given name and value and
185  * adds it as first child of vars */
186 void     E_(mvar_PushNewVar)( mvar_t *vars, const char *name,
187                               const char *value );
188 /** This function creates a variable with the given name and value and
189  * adds it as last child of vars */
190 void     E_(mvar_AppendNewVar)( mvar_t *vars, const char *name,
191                                 const char *value );
192 /** @} */
193
194 /** \defgroup http_sets Sets *
195  * \ingroup http_intf
196  * Sets are an application of the macro variables. There are a number of
197  * predefined functions that will give you variables whose children represent
198  * VLC internal data (playlist, stream info, ...)
199  * @{
200  */
201
202 /** This function creates a set variable which represents a series of integer
203  * The arg parameter must be of the form "start[:stop[:step]]"  */
204 mvar_t *E_(mvar_IntegerSetNew)( const char *name, const char *arg );
205
206 /** This function creates a set variable with a list of VLC objects */
207 mvar_t *E_(mvar_ObjectSetNew)( intf_thread_t *p_intf, char *name, char *arg );
208
209 /** This function creates a set variable with the contents of the playlist */
210 mvar_t *E_(mvar_PlaylistSetNew)( intf_thread_t *p_intf, char *name,
211                                  playlist_t *p_pl );
212 /** This function creates a set variable with the contents of the Stream
213  * and media info box */
214 mvar_t *E_(mvar_InfoSetNew)( intf_thread_t *p_intf, char *name,
215                              input_thread_t *p_input );
216 /** This function creates a set variable with the input parameters */
217 mvar_t *E_(mvar_InputVarSetNew)( intf_thread_t *p_intf, char *name,
218                                  input_thread_t *p_input,
219                                  const char *psz_variable );
220 /** This function creates a set variable representing the files of the psz_dir
221  * directory */
222 mvar_t *E_(mvar_FileSetNew)( intf_thread_t *p_intf, char *name,
223                              char *psz_dir );
224 /** This function creates a set variable representing the VLM streams */
225 mvar_t *E_(mvar_VlmSetNew)( char *name, vlm_t *vlm );
226
227 /** This function converts the listing of a playlist node into a mvar set */
228 void E_(PlaylistListNode)( intf_thread_t *p_intf, playlist_t *p_pl,
229                            playlist_item_t *p_node, char *name, mvar_t *s,
230                            int i_depth );
231
232 /**@}*/
233
234 /*****************************************************************************
235  * RPN Evaluator
236  *****************************************************************************/
237
238 /** \defgroup http_rpn RPN Evaluator
239  * \ingroup http_intf
240  * @{
241  */
242
243 /**
244  * \struct rpn_stack_t
245  * This structure represents a stack of RPN commands for the HTTP interface
246  * It is attached to a request
247  */
248 typedef struct
249 {
250     char *stack[STACK_MAX];
251     int  i_stack;
252 } rpn_stack_t;
253
254 /** This function creates the RPN evaluator stack */
255 void E_(SSInit)( rpn_stack_t * );
256 /** This function cleans the evaluator stack */
257 void E_(SSClean)( rpn_stack_t * );
258 /* Evaluate and execute the RPN Stack */
259 void  E_(EvaluateRPN)( intf_thread_t *p_intf, mvar_t  *vars,
260                        rpn_stack_t *st, char *exp );
261
262 /* Push an operand on top of the RPN stack */
263 void E_(SSPush)  ( rpn_stack_t *, const char * );
264 /* Remove the first operand from the RPN Stack */
265 char *E_(SSPop)  ( rpn_stack_t * );
266 /* Pushes an operand at a given position in the stack */
267 void E_(SSPushN) ( rpn_stack_t *, int );
268 /* Removes an operand at the given position in the stack */
269 int  E_(SSPopN)  ( rpn_stack_t *, mvar_t  * );
270
271 /**@}*/
272
273
274 /****************************************************************************
275  * Macro handling (<vlc ... stuff)
276  ****************************************************************************/
277
278 /** \defgroup http_macros <vlc> Macros Handling
279  * \ingroup http_intf
280  * A macro is a code snippet in the HTML page looking like
281  * <vlc id="macro_id" param1="value1" param2="value2">
282  * Macros string ids are mapped to macro types, and specific handling code
283  * must be written for each macro type
284  * @{
285  */
286
287
288 /** \struct macro_t
289  * This structure represents a HTTP Interface macro.
290  */
291 typedef struct
292 {
293     char *id;           ///< Macro ID string
294     char *param1;       ///< First parameter
295     char *param2;       ///< Second parameter
296 } macro_t;
297
298 /** This function creates a macro from a <vlc ....> tag */
299 int E_(MacroParse)( macro_t *m, char *psz_src );
300 /** This function cleans a macro */
301 void E_(MacroClean)( macro_t *m );
302
303 /** This function returns the macro type identifier from its id= string value
304  * It uses the StrToMacroTypeTab mapping array for this */
305 int E_(StrToMacroType)( char *name );
306 /** This function actually executes the macro */
307 void E_(MacroDo)( httpd_file_sys_t *p_args, macro_t *m,
308                   char *p_request, int i_request, char **pp_data,
309                   int *pi_data, char **pp_dst );
310 /** This function looks for macros in a string */
311 char *E_(MacroSearch)( char *src, char *end,
312                    int i_mvlc, vlc_bool_t b_after );
313
314 /** This function parses a file for macros */
315 void E_(Execute)( httpd_file_sys_t *p_args,
316                   char *p_request, int i_request,
317                   char **pp_data, int *pi_data,
318                   char **pp_dst,
319                   char *_src, char *_end );
320
321 /**@}*/
322
323 /**
324  * Core stuff
325  */
326 /** \struct
327  * This structure represent a single HTML file to be parsed by the macros
328  * handling engine */
329 struct httpd_file_sys_t
330 {
331     intf_thread_t    *p_intf;
332     httpd_file_t     *p_file;
333     httpd_redirect_t *p_redir;
334     httpd_redirect_t *p_redir2;
335
336     char          *file;
337     char          *name;
338
339     vlc_bool_t    b_html, b_handler;
340
341     /* inited for each access */
342     rpn_stack_t   stack;
343     mvar_t        *vars;
344 };
345
346 /** \struct
347  * Structure associating an extension to an external program
348  */
349 typedef struct http_association_t
350 {
351     char                *psz_ext;
352     int                 i_argc;
353     char                **ppsz_argv;
354 } http_association_t;
355
356 /** \struct
357  * This structure represent a single CGI file to be parsed by the macros
358  * handling engine */
359 struct httpd_handler_sys_t
360 {
361     httpd_file_sys_t file;
362
363     /* HACK ALERT: this is added below so that casting httpd_handler_sys_t
364      * to httpd_file_sys_t works */
365     httpd_handler_t  *p_handler;
366     http_association_t *p_association;
367 };
368
369 /** \struct
370  * Internal service structure for the HTTP interface
371  */
372 struct intf_sys_t
373 {
374     httpd_host_t        *p_httpd_host;
375
376     int                 i_files;
377     httpd_file_sys_t    **pp_files;
378
379     int                 i_handlers;
380     http_association_t  **pp_handlers;
381
382     playlist_t          *p_playlist;
383     input_thread_t      *p_input;
384     vlm_t               *p_vlm;
385     char                *psz_html_type;
386     char                *psz_charset;
387     vlc_iconv_t         iconv_from_utf8, iconv_to_utf8;
388
389     char                *psz_address;
390     unsigned short      i_port;
391 };
392
393 /** This function is the main HTTPD Callback used by the HTTP Interface */
394 int E_(HttpCallback)( httpd_file_sys_t *p_args,
395                       httpd_file_t *,
396                       uint8_t *p_request,
397                       uint8_t **pp_data, int *pi_data );
398 /** This function is the HTTPD Callback used for CGIs */
399 int  E_(HandlerCallback)( httpd_handler_sys_t *p_args,
400                           httpd_handler_t *p_handler, char *_p_url,
401                           uint8_t *_p_request, int i_type,
402                           uint8_t *_p_in, int i_in,
403                           char *psz_remote_addr, char *psz_remote_host,
404                           uint8_t **_pp_data, int *pi_data );
405 /**@}*/
406
407 #endif
408