* http: rework of the http interface.
[vlc.git] / include / httpd.h
1 /*****************************************************************************
2  * httpd.h
3  *****************************************************************************
4  * Copyright (C) 2001-2003 VideoLAN
5  * $Id: httpd.h,v 1.6 2003/07/10 22:24:09 fenrir Exp $
6  *
7  * Authors: Laurent Aimar <fenrir@via.ecp.fr>
8  *
9  * This program is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation; either version 2 of the License, or
12  * (at your option) any later version.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program; if not, write to the Free Software
21  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
22  *****************************************************************************/
23
24 typedef struct httpd_host_t     httpd_host_t;
25
26 typedef struct httpd_file_t     httpd_file_t;
27 //typedef struct httpd_stream_t   httpd_stream_t;
28 typedef httpd_file_t httpd_stream_t;
29
30 typedef struct httpd_file_callback_args_t httpd_file_callback_args_t;
31 typedef int (*httpd_file_callback)( httpd_file_callback_args_t *p_args, uint8_t *p_request, int i_request, uint8_t **pp_data, int *pi_data );
32
33 typedef struct httpd_sys_t httpd_sys_t;
34
35 enum httpdControl_e
36 {
37     HTTPD_GET_HOSTS,
38     HTTPD_GET_URLS,
39     HTTPD_GET_CONNECTIONS,
40     HTTPD_GET_ACL,          /* not implemented */
41
42     HTTPD_SET_CLOSE,
43     HTTPD_SET_ACL           /* not implemented */
44 };
45
46 typedef struct
47 {
48     char *psz_name;
49     char *psz_value;
50 } httpd_val_t;
51
52 typedef struct
53 {
54     int         i_count;
55     httpd_val_t *info;
56 } httpd_info_t;
57
58
59 struct httpd_t
60 {
61     VLC_COMMON_MEMBERS
62
63     module_t        *p_module;
64     httpd_sys_t     *p_sys;
65
66     httpd_host_t   *(*pf_register_host)     ( httpd_t *, char *, int );
67     void            (*pf_unregister_host)   ( httpd_t *, httpd_host_t * );
68
69     httpd_file_t   *(*pf_register_file)     ( httpd_t *,
70                                               char *psz_file, char *psz_mime,
71                                               char *psz_user, char *psz_password,
72                                               httpd_file_callback pf_get,
73                                               httpd_file_callback pf_post,
74                                               httpd_file_callback_args_t *p_args );
75     void            (*pf_unregister_file)   ( httpd_t *, httpd_file_t * );
76
77     httpd_stream_t *(*pf_register_stream)   ( httpd_t *,
78                                               char *psz_file, char *psz_mime,
79                                               char *psz_user, char *psz_password );
80     int             (*pf_send_stream)       ( httpd_t *,
81                                               httpd_stream_t *,
82                                               uint8_t *, int );
83     int             (*pf_header_stream)     ( httpd_t *,
84                                               httpd_stream_t *,
85                                               uint8_t *, int );
86     void            (*pf_unregister_stream) ( httpd_t *, httpd_stream_t * );
87     int             (*pf_control)           ( httpd_t *,
88                                               int i_query,
89                                               void *arg1, void *arg2 );
90 };
91
92
93 /*****************************************************************************
94  * httpd_Find:
95  *  Return the running httpd instance (if none and b_create then a new one is created)
96  * httpd_release:
97  *****************************************************************************/
98
99 static inline httpd_t* httpd_Find( vlc_object_t *p_this, vlc_bool_t b_create )
100 {
101     httpd_t *p_httpd = NULL;
102     vlc_value_t lockval;
103
104     var_Get( p_this->p_libvlc, "httpd", &lockval );
105     vlc_mutex_lock( lockval.p_address );
106
107     p_httpd = vlc_object_find( p_this, VLC_OBJECT_HTTPD, FIND_ANYWHERE );
108     if( !p_httpd && b_create)
109     {
110         msg_Info(p_this, "creating new http daemon" );
111
112         p_httpd = vlc_object_create( p_this, VLC_OBJECT_HTTPD );
113         if( !p_httpd )
114         {
115             msg_Err( p_this, "out of memory" );
116             vlc_mutex_unlock( lockval.p_address );
117             return( NULL );
118         }
119
120         p_httpd->p_module = module_Need( p_httpd, "httpd", "" );
121
122         if( !p_httpd->p_module )
123         {
124             msg_Err( p_this, "no suitable httpd module" );
125             vlc_object_destroy( p_httpd );
126             vlc_mutex_unlock( lockval.p_address );
127             return( NULL );
128         }
129
130         vlc_object_yield( p_httpd );
131         vlc_object_attach( p_httpd, p_this->p_vlc );
132     }
133     vlc_mutex_unlock( lockval.p_address );
134
135     return( p_httpd );
136 }
137
138 static inline void  httpd_Release( httpd_t *p_httpd )
139 {
140     vlc_object_release( p_httpd );
141
142     if( p_httpd->i_refcount <= 0 )
143     {
144         msg_Info( p_httpd, "destroying unused httpd" );
145         vlc_object_detach( p_httpd );
146         module_Unneed( p_httpd, p_httpd->p_module );
147         vlc_object_destroy( p_httpd );
148     }
149 }