http.h
上传用户:kjfoods
上传日期:2020-07-06
资源大小:29949k
文件大小:13k
源码类别:

midi

开发平台:

Unix_Linux

  1. /*****************************************************************************
  2.  * http.h: Headers for the HTTP interface
  3.  *****************************************************************************
  4.  * Copyright (C) 2001-2007 the VideoLAN team
  5.  * $Id: 038b36baf8faec8a81fa29ed2bbbc9782c68b2b0 $
  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. #ifndef _HTTP_H_
  26. #define _HTTP_H_
  27. /*****************************************************************************
  28.  * Preamble
  29.  *****************************************************************************/
  30. #include <vlc_common.h>
  31. #include <stdlib.h>
  32. #include <strings.h>
  33. #include <ctype.h>
  34. #include <vlc_interface.h>
  35. #include <vlc_playlist.h>
  36. #include <vlc_aout.h>
  37. #include <vlc_vout.h> /* for fullscreen */
  38. #include "vlc_httpd.h"
  39. #include "vlc_vlm.h"
  40. #include "vlc_network.h"
  41. #include "vlc_acl.h"
  42. #include "vlc_charset.h"
  43. #ifdef HAVE_SYS_STAT_H
  44. #   include <sys/stat.h>
  45. #endif
  46. #include <errno.h>
  47. #ifdef HAVE_FCNTL_H
  48. #   include <fcntl.h>
  49. #endif
  50. #ifdef HAVE_UNISTD_H
  51. #   include <unistd.h>
  52. #elif defined( WIN32 ) && !defined( UNDER_CE )
  53. #   include <io.h>
  54. #endif
  55. #ifdef HAVE_DIRENT_H
  56. #   include <dirent.h>
  57. #endif
  58. /* stat() support for large files on win32 */
  59. #if defined( WIN32 ) && !defined( UNDER_CE )
  60. #   define stat _stati64
  61. #endif
  62. /** defgroup http_intf HTTP Interface
  63.  * This is the HTTP remote control interface. It is fully customizable
  64.  * by writing HTML pages using custom <vlc> tags.
  65.  *
  66.  * These tags use so-called macros.
  67.  *
  68.  * These macros can manipulate variables. For more complex operations,
  69.  * a custom RPN evaluator with many built-in functions is provided.
  70.  * @{
  71.  */
  72. /*****************************************************************************
  73.  * Local defines
  74.  *****************************************************************************/
  75. #define MAX_DIR_SIZE 2560
  76. #define STACK_MAX 100        //< Maximum RPN stack size
  77. /*****************************************************************************
  78.  * Utility functions
  79.  *****************************************************************************/
  80. /** defgroup http_utils Utilities
  81.  * ingroup http_intf
  82.  * Utilities
  83.  * @{
  84.  */
  85. /* File and directory functions */
  86. /** This function recursively parses a directory and adds all files */
  87. int ParseDirectory( intf_thread_t *p_intf, char *psz_root,
  88.                         char *psz_dir );
  89. /** This function loads a file into a buffer */
  90. int FileLoad( FILE *f, char **pp_data, int *pi_data );
  91. /** This function creates a suitable URL for a filename */
  92. char *FileToUrl( char *name, bool *pb_index );
  93. /** This function returns the real path of a file or directory */
  94. char *RealPath( const char *psz_src );
  95. /** This command parses the "seek" command for the HTTP interface
  96.  * and performs the requested action */
  97. void HandleSeek( intf_thread_t *p_intf, char *p_value );
  98. /* URI Handling functions */
  99. /** This function extracts the value for a given argument name
  100.  * from an HTTP request */
  101. const char *ExtractURIValue( const char *restrict psz_uri,
  102.                            const char *restrict psz_name,
  103.                            char *restrict psz_value, size_t i_value_max );
  104. char *ExtractURIString( const char *restrict psz_uri,
  105.                             const char *restrict psz_name );
  106. /** todo Describe this function */
  107. int TestURIParam( char *psz_uri, const char *psz_name );
  108. /** This function parses a MRL */
  109. input_item_t *MRLParse( intf_thread_t *, const char *psz, char *psz_name );
  110. /** Return the first word from a string (works in-place) */
  111. char *FirstWord( char *psz, char *new );
  112. /**@}*/
  113. /****************************************************************************
  114.  * Variable handling functions
  115.  ****************************************************************************/
  116. /** defgroup http_vars Macro variables
  117.  * ingroup http_intf
  118.  * These variables can be used in the <vlc> macros and in the RPN evaluator.
  119.  * The variables make a tree: each variable can have an arbitrary
  120.  * number of "children" variables.
  121.  * A number of helper functions are provided to manipulate the main variable
  122.  * structure
  123.  * @{
  124.  */
  125. /**
  126.  * struct mvar_t
  127.  * This structure defines a macro variable
  128.  */
  129. typedef struct mvar_s
  130. {
  131.     char *name;                 ///< Variable name
  132.     char *value;                ///< Variable value
  133.     int           i_field;      ///< Number of children variables
  134.     struct mvar_s **field;      ///< Children variables array
  135. } mvar_t;
  136. /** This function creates a new variable */
  137. mvar_t  *mvar_New( const char *name, const char *value );
  138. /** This function deletes a variable */
  139. void     mvar_Delete( mvar_t *v );
  140. /** This function adds f to the children variables of v, at last position */
  141. void     mvar_AppendVar( mvar_t *v, mvar_t *f );
  142. /** This function duplicates a variable */
  143. mvar_t  *mvar_Duplicate( const mvar_t *v );
  144. /** This function adds f to the children variables of v, at fist position */
  145. void     mvar_PushVar( mvar_t *v, mvar_t *f );
  146. /** This function removes f from the children variables of v */
  147. void     mvar_RemoveVar( mvar_t *v, mvar_t *f );
  148. /** This function retrieves the child variable named "name" */
  149. mvar_t  *mvar_GetVar( mvar_t *s, const char *name );
  150. /** This function retrieves the value of the child variable named "field" */
  151. const char *mvar_GetValue( mvar_t *v, const char *field );
  152. /** This function creates a variable with the given name and value and
  153.  * adds it as first child of vars */
  154. void     mvar_PushNewVar( mvar_t *vars, const char *name,
  155.                               const char *value );
  156. /** This function creates a variable with the given name and value and
  157.  * adds it as last child of vars */
  158. void     mvar_AppendNewVar( mvar_t *vars, const char *name,
  159.                                 const char *value );
  160. /** @} */
  161. /** defgroup http_sets Sets *
  162.  * ingroup http_intf
  163.  * Sets are an application of the macro variables. There are a number of
  164.  * predefined functions that will give you variables whose children represent
  165.  * VLC internal data (playlist, stream info, ...)
  166.  * @{
  167.  */
  168. /** This function creates a set variable which represents a series of integer
  169.  * The arg parameter must be of the form "start[:stop[:step]]"  */
  170. mvar_t *mvar_IntegerSetNew( const char *name, const char *arg );
  171. /** This function creates a set variable with a list of VLC objects */
  172. mvar_t *mvar_ObjectSetNew( intf_thread_t *p_intf, char *name, const char *arg );
  173. /** This function creates a set variable with the contents of the playlist */
  174. mvar_t *mvar_PlaylistSetNew( intf_thread_t *p_intf, char *name,
  175.                                  playlist_t *p_pl );
  176. /** This function creates a set variable with the contents of the Stream
  177.  * and media info box */
  178. mvar_t *mvar_InfoSetNew( char *name, input_thread_t *p_input );
  179. /** This function creates a set variable with the input parameters */
  180. mvar_t *mvar_InputVarSetNew( intf_thread_t *p_intf, char *name,
  181.                                  input_thread_t *p_input,
  182.                                  const char *psz_variable );
  183. /** This function creates a set variable representing the files of the psz_dir
  184.  * directory */
  185. mvar_t *mvar_FileSetNew( intf_thread_t *p_intf, char *name,
  186.                              char *psz_dir );
  187. /** This function creates a set variable representing the VLM streams */
  188. mvar_t *mvar_VlmSetNew( char *name, vlm_t *vlm );
  189. /** This function converts the listing of a playlist node into a mvar set */
  190. void PlaylistListNode( intf_thread_t *p_intf, playlist_t *p_pl,
  191.                            playlist_item_t *p_node, char *name, mvar_t *s,
  192.                            int i_depth );
  193. /**@}*/
  194. /*****************************************************************************
  195.  * RPN Evaluator
  196.  *****************************************************************************/
  197. /** defgroup http_rpn RPN Evaluator
  198.  * ingroup http_intf
  199.  * @{
  200.  */
  201. /**
  202.  * struct rpn_stack_t
  203.  * This structure represents a stack of RPN commands for the HTTP interface
  204.  * It is attached to a request
  205.  */
  206. typedef struct
  207. {
  208.     char *stack[STACK_MAX];
  209.     int  i_stack;
  210. } rpn_stack_t;
  211. /** This function creates the RPN evaluator stack */
  212. void SSInit( rpn_stack_t * );
  213. /** This function cleans the evaluator stack */
  214. void SSClean( rpn_stack_t * );
  215. /* Evaluate and execute the RPN Stack */
  216. void  EvaluateRPN( intf_thread_t *p_intf, mvar_t  *vars,
  217.                        rpn_stack_t *st, char *exp );
  218. /* Push an operand on top of the RPN stack */
  219. void SSPush  ( rpn_stack_t *, const char * );
  220. /* Remove the first operand from the RPN Stack */
  221. char *SSPop  ( rpn_stack_t * );
  222. /* Pushes an operand at a given position in the stack */
  223. void SSPushN ( rpn_stack_t *, int );
  224. /* Removes an operand at the given position in the stack */
  225. int  SSPopN  ( rpn_stack_t *, mvar_t  * );
  226. /**@}*/
  227. /****************************************************************************
  228.  * Macro handling (<vlc ... stuff)
  229.  ****************************************************************************/
  230. /** defgroup http_macros <vlc> Macros Handling
  231.  * ingroup http_intf
  232.  * A macro is a code snippet in the HTML page looking like
  233.  * <vlc id="macro_id" param1="value1" param2="value2">
  234.  * Macros string ids are mapped to macro types, and specific handling code
  235.  * must be written for each macro type
  236.  * @{
  237.  */
  238. /** struct macro_t
  239.  * This structure represents a HTTP Interface macro.
  240.  */
  241. typedef struct
  242. {
  243.     char *id;           ///< Macro ID string
  244.     char *param1;       ///< First parameter
  245.     char *param2;       ///< Second parameter
  246. } macro_t;
  247. /** This function parses a file for macros */
  248. void Execute( httpd_file_sys_t *p_args,
  249.                   char *p_request, int i_request,
  250.                   char **pp_data, int *pi_data,
  251.                   char **pp_dst,
  252.                   char *_src, char *_end );
  253. /**@}*/
  254. /**
  255.  * Core stuff
  256.  */
  257. /** struct
  258.  * This structure represent a single HTML file to be parsed by the macros
  259.  * handling engine */
  260. struct httpd_file_sys_t
  261. {
  262.     intf_thread_t    *p_intf;
  263.     httpd_file_t     *p_file;
  264.     httpd_redirect_t *p_redir;
  265.     httpd_redirect_t *p_redir2;
  266.     char          *file;
  267.     char          *name;
  268.     bool    b_html, b_handler;
  269.     /* inited for each access */
  270.     rpn_stack_t   stack;
  271.     mvar_t        *vars;
  272. };
  273. /** struct
  274.  * Structure associating an extension to an external program
  275.  */
  276. typedef struct http_association_t
  277. {
  278.     char                *psz_ext;
  279.     int                 i_argc;
  280.     char                **ppsz_argv;
  281. } http_association_t;
  282. /** struct
  283.  * This structure represent a single CGI file to be parsed by the macros
  284.  * handling engine */
  285. struct httpd_handler_sys_t
  286. {
  287.     httpd_file_sys_t file;
  288.     /* HACK ALERT: this is added below so that casting httpd_handler_sys_t
  289.      * to httpd_file_sys_t works */
  290.     httpd_handler_t  *p_handler;
  291.     http_association_t *p_association;
  292. };
  293. /** struct
  294.  * Internal service structure for the HTTP interface
  295.  */
  296. struct intf_sys_t
  297. {
  298.     httpd_host_t        *p_httpd_host;
  299.     int                 i_files;
  300.     httpd_file_sys_t    **pp_files;
  301.     int                 i_handlers;
  302.     http_association_t  **pp_handlers;
  303.     httpd_handler_t     *p_art_handler;
  304.     playlist_t          *p_playlist;
  305.     input_thread_t      *p_input;
  306.     vlm_t               *p_vlm;
  307.     char                *psz_address;
  308.     unsigned short      i_port;
  309. };
  310. /** This function is the main HTTPD Callback used by the HTTP Interface */
  311. int HttpCallback( httpd_file_sys_t *p_args,
  312.                       httpd_file_t *,
  313.                       uint8_t *p_request,
  314.                       uint8_t **pp_data, int *pi_data );
  315. /** This function is the HTTPD Callback used for CGIs */
  316. int  HandlerCallback( httpd_handler_sys_t *p_args,
  317.                           httpd_handler_t *p_handler, char *_p_url,
  318.                           uint8_t *_p_request, int i_type,
  319.                           uint8_t *_p_in, int i_in,
  320.                           char *psz_remote_addr, char *psz_remote_host,
  321.                           uint8_t **_pp_data, int *pi_data );
  322. /**@}*/
  323. #endif