* mms: reduce mtu (avoid too much delay with slow connection)
[vlc.git] / modules / access / mms / mmsh.h
1 /*****************************************************************************
2  * mmsh.h:
3  *****************************************************************************
4  * Copyright (C) 2001, 2002 VideoLAN
5  * $Id: mmsh.h,v 1.1 2003/04/20 19:29:43 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 #if 0
25 /* url: [/]host[:port][/path][@username[:password]] */
26 typedef struct url_s
27 {
28     char    *psz_host;
29     int     i_port;
30
31     char    *psz_path;
32
33     char    *psz_username;
34     char    *psz_password;
35 } url_t;
36
37 static url_t *url_new   ( char * );
38 static void   url_free  ( url_t * );
39 #endif
40
41 typedef struct
42 {
43     uint16_t i_type;
44     uint16_t i_size;
45
46     uint32_t i_sequence;
47     uint16_t i_unknown;
48
49     uint16_t i_size2;
50
51     int      i_data;
52     uint8_t  *p_data;
53
54 } chunk_t;
55
56 static int chunk_parse( chunk_t *, uint8_t *, int );
57
58 #define BUFFER_SIZE 150000
59 struct access_sys_t
60 {
61     int             i_proto;
62
63     input_socket_t  *p_socket;
64     url_t           *p_url;
65
66     int             i_request_context;
67
68     int             i_buffer;
69     int             i_buffer_pos;
70     uint8_t         buffer[BUFFER_SIZE + 1];
71
72     vlc_bool_t      b_broadcast;
73
74     uint8_t         *p_header;
75     int             i_header;
76
77     uint8_t         *p_packet;
78     uint32_t        i_packet_sequence;
79     unsigned int    i_packet_used;
80     unsigned int    i_packet_length;
81
82     off_t           i_pos;
83
84     asf_header_t    asfh;
85     guid_t          guid;
86 };
87
88 static input_socket_t * NetOpenTCP  ( input_thread_t *, url_t * );
89 static ssize_t          NetRead     ( input_thread_t *, input_socket_t *, byte_t *, size_t );
90 static ssize_t          NetWrite    ( input_thread_t *, input_socket_t *, byte_t *, size_t );
91 static void             NetClose    ( input_thread_t *, input_socket_t * );
92
93
94 static ssize_t NetFill( input_thread_t *, access_sys_t *, int );
95
96 typedef struct http_field_s
97 {
98     char *psz_name;
99     char *psz_value;
100
101     struct http_field_s *p_next;
102
103 } http_field_t;
104
105 typedef struct
106 {
107     int     i_version;
108     int     i_error;
109     char    *psz_answer;
110
111     http_field_t *p_fields;
112
113     uint8_t *p_body;
114     int     i_body;
115
116 } http_answer_t;
117
118 static http_answer_t    *http_answer_parse  ( uint8_t *, int );
119 static void              http_answer_free   ( http_answer_t * );
120 static char             *http_field_get_value   ( http_answer_t *, char * );
121 static http_field_t     *http_field_find    ( http_field_t *, char * );
122
123 static int  mmsh_start( input_thread_t *, access_sys_t *, off_t );
124 static void mmsh_stop ( input_thread_t *, access_sys_t * );