]> git.sesse.net Git - vlc/commitdiff
* all: use net_*.
authorLaurent Aimar <fenrir@videolan.org>
Wed, 21 Jan 2004 16:56:16 +0000 (16:56 +0000)
committerLaurent Aimar <fenrir@videolan.org>
Wed, 21 Jan 2004 16:56:16 +0000 (16:56 +0000)
modules/access/mms/mms.c
modules/access/mms/mmsh.c
modules/access/mms/mmsh.h
modules/access/mms/mmstu.c

index edf603d1a007cab063a2d6edfe62c8e81f799887..75a1a7745622601753fccd74deb208d13f63ab67 100644 (file)
@@ -2,7 +2,7 @@
  * mms.c: MMS over tcp, udp and http access plug-in
  *****************************************************************************
  * Copyright (C) 2001, 2002 VideoLAN
- * $Id: mms.c,v 1.34 2003/05/15 22:27:36 massiot Exp $
+ * $Id: mms.c,v 1.35 2004/01/21 16:56:16 fenrir Exp $
  *
  * Authors: Laurent Aimar <fenrir@via.ecp.fr>
  *
@@ -69,11 +69,6 @@ vlc_module_begin();
         add_bool( "mms-all", 0, NULL,
                   "force selection of all streams",
                   "force selection of all streams", VLC_TRUE );
-#if 0
-        add_string( "mms-stream", NULL, NULL,
-                    "streams selection",
-                    "force this stream selection", VLC_TRUE );
-#endif
         add_integer( "mms-maxbitrate", 0, NULL,
                      "max bitrate",
                      "set max bitrate for auto streams selections", VLC_FALSE );
@@ -89,9 +84,14 @@ static int Open( vlc_object_t *p_this )
 {
     input_thread_t  *p_input = (input_thread_t*)p_this;
 
-    int i_err;
+    /* First set ipv4/ipv6 */
+    var_Create( p_input, "ipv4", VLC_VAR_BOOL | VLC_VAR_DOINHERIT );
+    var_Create( p_input, "ipv6", VLC_VAR_BOOL | VLC_VAR_DOINHERIT );
 
+    /* mms-caching */
+    var_Create( p_input, "mms-caching", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );
 
+    /* use specified method */
     if( *p_input->psz_access )
     {
         if( !strncmp( p_input->psz_access, "mmsu", 4 ) )
@@ -108,15 +108,12 @@ static int Open( vlc_object_t *p_this )
         }
     }
 
-
-    i_err = E_( MMSTUOpen )( p_input );
-
-    if( i_err )
+    if( E_( MMSTUOpen )( p_input ) )
     {
-        i_err = E_( MMSHOpen )( p_input );
+        /* try mmsh if mmstu failed */
+        return E_( MMSHOpen )( p_input );
     }
-
-    return i_err;
+    return VLC_SUCCESS;
 }
 
 /*****************************************************************************
index c3b23df0048e504a86a4c476ff7bfabe7330e359..80fa7fd50222b134290e139da3676837762a2b14 100644 (file)
@@ -2,7 +2,7 @@
  * mmsh.c:
  *****************************************************************************
  * Copyright (C) 2001, 2002 VideoLAN
- * $Id: mmsh.c,v 1.6 2003/08/26 00:51:19 fenrir Exp $
+ * $Id: mmsh.c,v 1.7 2004/01/21 16:56:16 fenrir Exp $
  *
  * Authors: Laurent Aimar <fenrir@via.ecp.fr>
  *
 #include <vlc/vlc.h>
 #include <vlc/input.h>
 
-#ifdef HAVE_ERRNO_H
-#   include <errno.h>
-#endif
-#ifdef HAVE_FCNTL_H
-#   include <fcntl.h>
-#endif
-#ifdef HAVE_SYS_TIME_H
-#    include <sys/time.h>
-#endif
-
-#ifdef HAVE_UNISTD_H
-#   include <unistd.h>
-#endif
-
-#if defined( UNDER_CE )
-#   include <winsock.h>
-#elif defined( WIN32 )
-#   include <winsock2.h>
-#   include <ws2tcpip.h>
-#   ifndef IN_MULTICAST
-#       define IN_MULTICAST(a) IN_CLASSD(a)
-#   endif
-#else
-#   include <sys/socket.h>
-#endif
-
 #include "network.h"
 #include "asf.h"
 #include "buffer.h"
 /*****************************************************************************
  * Local prototypes
  *****************************************************************************/
-int  E_( MMSHOpen )  ( input_thread_t * );
-void E_( MMSHClose ) ( input_thread_t * );
+int  E_(MMSHOpen)  ( input_thread_t * );
+void E_(MMSHClose) ( input_thread_t * );
+static ssize_t Read( input_thread_t *, byte_t *, size_t );
+static void    Seek( input_thread_t *, off_t );
 
-static ssize_t Read        ( input_thread_t * p_input, byte_t * p_buffer,
-                             size_t i_len );
-static void    Seek        ( input_thread_t *, off_t );
+static ssize_t NetFill( input_thread_t *, access_sys_t *, int );
 
-/****************************************************************************
- ****************************************************************************
- *******************                                      *******************
- *******************       Main functions                 *******************
- *******************                                      *******************
- ****************************************************************************
- ****************************************************************************/
+static int  mmsh_start     ( input_thread_t *, off_t );
+static void mmsh_stop      ( input_thread_t * );
+static int  mmsh_get_packet( input_thread_t *, chunk_t * );
+
+static http_answer_t *http_answer_parse( uint8_t *, int );
+static void           http_answer_free ( http_answer_t * );
+static http_field_t  *http_field_find  ( http_field_t *, char * );
+
+static int chunk_parse( chunk_t *, uint8_t *, int );
 
 /****************************************************************************
  * Open: connect to ftp server and ask for file
@@ -98,11 +74,13 @@ int  E_( MMSHOpen )  ( input_thread_t *p_input )
     http_field_t    *p_field;
     chunk_t         ck;
 
+    vlc_value_t     val;
+
     /* init p_sys */
     p_input->p_access_data = p_sys = malloc( sizeof( access_sys_t ) );
     p_sys->i_proto = MMS_PROTO_HTTP;
 
-    p_sys->p_socket = NULL;
+    p_sys->fd       = -1;
     p_sys->i_request_context = 1;
     p_sys->i_buffer = 0;
     p_sys->i_buffer_pos = 0;
@@ -128,7 +106,8 @@ int  E_( MMSHOpen )  ( input_thread_t *p_input )
         p_sys->p_url->i_port = 80;
     }
 
-    if( ( p_sys->p_socket = NetOpenTCP( p_input, p_sys->p_url ) ) == NULL )
+    if( ( p_sys->fd = net_OpenTCP( p_input, p_sys->p_url->psz_host,
+                                            p_sys->p_url->i_port ) ) < 0 )
     {
         msg_Err( p_input, "cannot connect" );
         goto exit_error;
@@ -146,16 +125,15 @@ int  E_( MMSHOpen )  ( input_thread_t *p_input )
     p += sprintf( p, "Pragma: xClientGUID={"GUID_FMT"}\r\n",
                   GUID_PRINT( p_sys->guid ) );
     p += sprintf( p, "Connection: Close\r\n\r\n" );
-    NetWrite( p_input, p_sys->p_socket, p_sys->buffer,  p - p_sys->buffer );
 
+    net_Write( p_input, p_sys->fd, p_sys->buffer,  p - p_sys->buffer );
 
     if( NetFill ( p_input, p_sys, BUFFER_SIZE ) <= 0 )
     {
         msg_Err( p_input, "cannot read answer" );
         goto exit_error;
     }
-    NetClose( p_input, p_sys->p_socket );
-    p_sys->p_socket = NULL;
+    net_Close( p_sys->fd ); p_sys->fd = -1;
 
     p_ans = http_answer_parse( p_sys->buffer, p_sys->i_buffer );
     if( !p_ans )
@@ -300,21 +278,21 @@ int  E_( MMSHOpen )  ( input_thread_t *p_input )
     p_input->stream.i_method = INPUT_METHOD_NETWORK;
     vlc_mutex_unlock( &p_input->stream.stream_lock );
 
-    /* Update default_pts to a suitable value for ftp access */
-    p_input->i_pts_delay = config_GetInt( p_input, "mms-caching" ) * 1000;
-
+    /* Update default_pts to a suitable value for mms access */
+    var_Get( p_input, "mms-caching", &val );
+    p_input->i_pts_delay = val.i_int * 1000;
 
-    return( VLC_SUCCESS );
+    return VLC_SUCCESS;
 
 exit_error:
     E_( url_free )( p_sys->p_url );
 
-    if( p_sys->p_socket )
+    if( p_sys->fd > 0 )
     {
-        NetClose( p_input, p_sys->p_socket );
+        net_Close( p_sys->fd  );
     }
     free( p_sys );
-    return( VLC_EGENERIC );
+    return VLC_EGENERIC;
 }
 
 /*****************************************************************************
@@ -331,74 +309,6 @@ void E_( MMSHClose ) ( input_thread_t *p_input )
     free( p_sys );
 }
 
-static int mmsh_get_packet( input_thread_t * p_input,
-                            chunk_t *p_ck )
-{
-    access_sys_t *p_sys = p_input->p_access_data;
-
-    int i_mov = p_sys->i_buffer - p_sys->i_buffer_pos;
-
-    if( p_sys->i_buffer_pos > BUFFER_SIZE / 2 )
-    {
-        if( i_mov > 0 )
-        {
-            memmove( &p_sys->buffer[0],
-                     &p_sys->buffer[p_sys->i_buffer_pos],
-                     i_mov );
-        }
-
-        p_sys->i_buffer     = i_mov;
-        p_sys->i_buffer_pos = 0;
-    }
-
-    if( NetFill( p_input, p_sys, 12 ) < 12 )
-    {
-        msg_Warn( p_input, "cannot fill buffer" );
-        return VLC_EGENERIC;
-    }
-
-    chunk_parse( p_ck, &p_sys->buffer[p_sys->i_buffer_pos],
-                 p_sys->i_buffer - p_sys->i_buffer_pos );
-
-    if( p_ck->i_type == 0x4524 )   // Transfer complete
-    {
-        msg_Warn( p_input, "EOF" );
-        return VLC_EGENERIC;
-    }
-    else if( p_ck->i_type != 0x4824 && p_ck->i_type != 0x4424 )
-    {
-        msg_Err( p_input, "invalid chunk FATAL" );
-        return VLC_EGENERIC;
-    }
-
-    if( p_ck->i_data < p_ck->i_size2 - 8 )
-    {
-        if( NetFill( p_input, p_sys, p_ck->i_size2 - 8 - p_ck->i_data ) <= 0 )
-        {
-            msg_Warn( p_input, "cannot fill buffer" );
-            return VLC_EGENERIC;
-        }
-        chunk_parse( p_ck, &p_sys->buffer[p_sys->i_buffer_pos],
-                     p_sys->i_buffer - p_sys->i_buffer_pos );
-    }
-
-    if( p_sys->i_packet_sequence != 0 &&
-        p_ck->i_sequence != p_sys->i_packet_sequence )
-    {
-        msg_Warn( p_input, "packet lost ?" );
-    }
-
-    p_sys->i_packet_sequence = p_ck->i_sequence + 1;
-    p_sys->i_packet_used   = 0;
-    p_sys->i_packet_length = p_ck->i_data;
-    p_sys->p_packet        = p_ck->p_data;
-
-    p_sys->i_buffer_pos += 12 + p_ck->i_data;
-
-    return VLC_SUCCESS;
-}
-
-
 /*****************************************************************************
  * Seek: try to go at the right place
  *****************************************************************************/
@@ -437,10 +347,8 @@ static void Seek( input_thread_t * p_input, off_t i_pos )
     p_sys->i_pos = i_pos;
     p_sys->i_packet_used += i_offset;
 
-
     p_input->stream.p_selected_area->i_tell = i_pos;
     vlc_mutex_unlock( &p_input->stream.stream_lock );
-
 }
 
 /*****************************************************************************
@@ -498,15 +406,60 @@ static ssize_t Read        ( input_thread_t * p_input, byte_t * p_buffer,
     return( i_data );
 }
 
+/*****************************************************************************
+ * NetFill:
+ *****************************************************************************/
+static ssize_t NetFill( input_thread_t *p_input, access_sys_t *p_sys, int i_size )
+{
+    int i_try   = 0;
+    int i_total = 0;
+
+    i_size = __MIN( i_size, BUFFER_SIZE - p_sys->i_buffer );
+    if( i_size <= 0 )
+    {
+        return 0;
+    }
+
+    for( ;; )
+    {
+        int i_read;
 
-/****************************************************************************/
-/****************************************************************************/
-/****************************************************************************/
-/****************************************************************************/
-/****************************************************************************/
+        i_read = net_Read( p_input, p_sys->fd,
+                          &p_sys->buffer[p_sys->i_buffer], i_size, VLC_FALSE );
 
-static int mmsh_start( input_thread_t *p_input,
-                       off_t i_pos )
+        if( i_read == 0 )
+        {
+            if( i_try++ > 2 )
+            {
+                break;
+            }
+            msg_Dbg( p_input, "another try %d/2", i_try );
+            continue;
+        }
+
+        if( i_read < 0 || p_input->b_die || p_input->b_error )
+        {
+            break;
+        }
+        i_total += i_read;
+
+        p_sys->i_buffer += i_read;
+        if( i_total >= i_size )
+        {
+            break;
+        }
+    }
+
+    p_sys->buffer[p_sys->i_buffer] = '\0';
+
+    return i_total;
+}
+
+
+/*****************************************************************************
+ *
+ *****************************************************************************/
+static int mmsh_start( input_thread_t *p_input, off_t i_pos )
 {
     access_sys_t *p_sys = p_input->p_access_data;
     uint8_t *p;
@@ -516,7 +469,8 @@ static int mmsh_start( input_thread_t *p_input,
 
     msg_Dbg( p_input, "starting stream" );
 
-    if( ( p_sys->p_socket = NetOpenTCP( p_input, p_sys->p_url ) ) == NULL )
+    if( ( p_sys->fd = net_OpenTCP( p_input, p_sys->p_url->psz_host,
+                                            p_sys->p_url->i_port ) ) < 0 )
     {
         /* should not occur */
         msg_Err( p_input, "cannot connect to the server" );
@@ -574,8 +528,7 @@ static int mmsh_start( input_thread_t *p_input,
     p += sprintf( p, "\r\n" );
     p += sprintf( p, "Connection: Close\r\n\r\n" );
 
-
-    NetWrite( p_input, p_sys->p_socket, p_sys->buffer,  p - p_sys->buffer );
+    net_Write( p_input, p_sys->fd, p_sys->buffer,  p - p_sys->buffer );
 
     msg_Dbg( p_input, "filling buffer" );
     /* we read until we found a \r\n\r\n or \n\n */
@@ -588,10 +541,7 @@ static int mmsh_start( input_thread_t *p_input,
         uint8_t *p;
 
         p = &p_sys->buffer[p_sys->i_buffer];
-        i_read =
-            NetRead( p_input, p_sys->p_socket,
-                     &p_sys->buffer[p_sys->i_buffer],
-                      1024 );
+        i_read = net_Read( p_input, p_sys->fd, &p_sys->buffer[p_sys->i_buffer], 1024, VLC_FALSE );
 
         if( i_read == 0 )
         {
@@ -651,229 +601,89 @@ static int mmsh_start( input_thread_t *p_input,
     return VLC_SUCCESS;
 }
 
+/*****************************************************************************
+ *
+ *****************************************************************************/
 static void mmsh_stop( input_thread_t *p_input )
 {
     access_sys_t *p_sys = p_input->p_access_data;
 
     msg_Dbg( p_input, "closing stream" );
-    NetClose( p_input, p_sys->p_socket );
-    p_sys->p_socket = NULL;
+    net_Close( p_sys->fd ); p_sys->fd = -1;
 }
 
-static ssize_t NetFill( input_thread_t *p_input,
-                        access_sys_t   *p_sys, int i_size )
+/*****************************************************************************
+ *
+ *****************************************************************************/
+static int mmsh_get_packet( input_thread_t * p_input, chunk_t *p_ck )
 {
-    int i_try   = 0;
-    int i_total = 0;
+    access_sys_t *p_sys = p_input->p_access_data;
 
-    i_size = __MIN( i_size, BUFFER_SIZE - p_sys->i_buffer );
-    if( i_size <= 0 )
-    {
-        return 0;
-    }
+    int i_mov = p_sys->i_buffer - p_sys->i_buffer_pos;
 
-    for( ;; )
+    if( p_sys->i_buffer_pos > BUFFER_SIZE / 2 )
     {
-        int i_read;
-
-        i_read = NetRead( p_input, p_sys->p_socket,
-                          &p_sys->buffer[p_sys->i_buffer], i_size );
-
-        if( i_read == 0 )
-        {
-            if( i_try++ > 2 )
-            {
-                break;
-            }
-            msg_Dbg( p_input, "another try %d/2", i_try );
-            continue;
-        }
-
-        if( i_read < 0 || p_input->b_die || p_input->b_error )
-        {
-            break;
-        }
-        i_total += i_read;
-
-        p_sys->i_buffer += i_read;
-        if( i_total >= i_size )
+        if( i_mov > 0 )
         {
-            break;
+            memmove( &p_sys->buffer[0],
+                     &p_sys->buffer[p_sys->i_buffer_pos],
+                     i_mov );
         }
-    }
 
-    p_sys->buffer[p_sys->i_buffer] = '\0';
-
-    return i_total;
-}
-
-/****************************************************************************
- * NetOpenTCP:
- ****************************************************************************/
-static input_socket_t * NetOpenTCP( input_thread_t *p_input, url_t *p_url )
-{
-    input_socket_t   *p_socket;
-    char             *psz_network;
-    module_t         *p_network;
-    network_socket_t socket_desc;
-
-
-    p_socket = malloc( sizeof( input_socket_t ) );
-    memset( p_socket, 0, sizeof( input_socket_t ) );
-
-    psz_network = "";
-    if( config_GetInt( p_input, "ipv4" ) )
-    {
-        psz_network = "ipv4";
-    }
-    else if( config_GetInt( p_input, "ipv6" ) )
-    {
-        psz_network = "ipv6";
+        p_sys->i_buffer     = i_mov;
+        p_sys->i_buffer_pos = 0;
     }
 
-    msg_Dbg( p_input, "waiting for connection..." );
-
-    socket_desc.i_type = NETWORK_TCP;
-    socket_desc.psz_server_addr = p_url->psz_host;
-    socket_desc.i_server_port   = p_url->i_port;
-    socket_desc.psz_bind_addr   = "";
-    socket_desc.i_bind_port     = 0;
-    socket_desc.i_ttl           = 0;
-    p_input->p_private = (void*)&socket_desc;
-    if( !( p_network = module_Need( p_input, "network", psz_network ) ) )
+    if( NetFill( p_input, p_sys, 12 ) < 12 )
     {
-        msg_Err( p_input, "failed to connect with server" );
-        return NULL;
+        msg_Warn( p_input, "cannot fill buffer" );
+        return VLC_EGENERIC;
     }
-    module_Unneed( p_input, p_network );
-    p_socket->i_handle = socket_desc.i_handle;
-    p_input->i_mtu     = socket_desc.i_mtu;
-
-    msg_Dbg( p_input,
-             "connection with \"%s:%d\" successful",
-             p_url->psz_host,
-             p_url->i_port );
-
-    return p_socket;
-}
-
-/*****************************************************************************
- * Read: read on a file descriptor, checking b_die periodically
- *****************************************************************************/
-static ssize_t NetRead( input_thread_t *p_input,
-                        input_socket_t *p_socket,
-                        byte_t *p_buffer, size_t i_len )
-{
-    struct timeval  timeout;
-    fd_set          fds;
-    ssize_t         i_recv;
-    int             i_ret;
-
-    /* Initialize file descriptor set */
-    FD_ZERO( &fds );
-    FD_SET( p_socket->i_handle, &fds );
-
-    /* We'll wait 1 second if nothing happens */
-    timeout.tv_sec  = 1;
-    timeout.tv_usec = 0;
-
-    /* Find if some data is available */
-    while( ( i_ret = select( p_socket->i_handle + 1, &fds,
-                             NULL, NULL, &timeout )) == 0 ||
-#ifdef HAVE_ERRNO_H
-           ( i_ret < 0 && errno == EINTR )
-#endif
-         )
-    {
-        FD_ZERO( &fds );
-        FD_SET( p_socket->i_handle, &fds );
-        timeout.tv_sec  = 1;
-        timeout.tv_usec = 0;
 
-        if( p_input->b_die || p_input->b_error )
-        {
-            return 0;
-        }
-    }
+    chunk_parse( p_ck, &p_sys->buffer[p_sys->i_buffer_pos],
+                 p_sys->i_buffer - p_sys->i_buffer_pos );
 
-    if( i_ret < 0 )
+    if( p_ck->i_type == 0x4524 )   // Transfer complete
     {
-        msg_Err( p_input, "network select error (%s)", strerror(errno) );
-        return -1;
+        msg_Warn( p_input, "EOF" );
+        return VLC_EGENERIC;
     }
-
-    i_recv = recv( p_socket->i_handle, p_buffer, i_len, 0 );
-
-    if( i_recv < 0 )
+    else if( p_ck->i_type != 0x4824 && p_ck->i_type != 0x4424 )
     {
-        msg_Err( p_input, "recv failed (%s)", strerror(errno) );
+        msg_Err( p_input, "invalid chunk FATAL" );
+        return VLC_EGENERIC;
     }
 
-    return i_recv;
-}
-
-static ssize_t NetWrite( input_thread_t *p_input,
-                         input_socket_t *p_socket,
-                         byte_t *p_buffer, size_t i_len )
-{
-    struct timeval  timeout;
-    fd_set          fds;
-    ssize_t         i_send;
-    int             i_ret;
-
-    /* Initialize file descriptor set */
-    FD_ZERO( &fds );
-    FD_SET( p_socket->i_handle, &fds );
-
-    /* We'll wait 1 second if nothing happens */
-    timeout.tv_sec  = 1;
-    timeout.tv_usec = 0;
-
-    /* Find if some data is available */
-    while( ( i_ret = select( p_socket->i_handle + 1, NULL, &fds, NULL, &timeout ) ) == 0 ||
-#ifdef HAVE_ERRNO_H
-           ( i_ret < 0 && errno == EINTR )
-#endif
-         )
+    if( p_ck->i_data < p_ck->i_size2 - 8 )
     {
-        FD_ZERO( &fds );
-        FD_SET( p_socket->i_handle, &fds );
-        timeout.tv_sec  = 1;
-        timeout.tv_usec = 0;
-
-        if( p_input->b_die || p_input->b_error )
+        if( NetFill( p_input, p_sys, p_ck->i_size2 - 8 - p_ck->i_data ) <= 0 )
         {
-            return 0;
+            msg_Warn( p_input, "cannot fill buffer" );
+            return VLC_EGENERIC;
         }
+        chunk_parse( p_ck, &p_sys->buffer[p_sys->i_buffer_pos],
+                     p_sys->i_buffer - p_sys->i_buffer_pos );
     }
 
-    if( i_ret < 0 )
-    {
-        msg_Err( p_input, "network select error (%s)", strerror(errno) );
-        return -1;
-    }
-
-    i_send = send( p_socket->i_handle, p_buffer, i_len, 0 );
-
-    if( i_send < 0 )
+    if( p_sys->i_packet_sequence != 0 &&
+        p_ck->i_sequence != p_sys->i_packet_sequence )
     {
-        msg_Err( p_input, "send failed (%s)", strerror(errno) );
+        msg_Warn( p_input, "packet lost ?" );
     }
 
-    return i_send;
-}
+    p_sys->i_packet_sequence = p_ck->i_sequence + 1;
+    p_sys->i_packet_used   = 0;
+    p_sys->i_packet_length = p_ck->i_data;
+    p_sys->p_packet        = p_ck->p_data;
 
-static void NetClose( input_thread_t *p_input, input_socket_t *p_socket )
-{
-#if defined( WIN32 ) || defined( UNDER_CE )
-    closesocket( p_socket->i_handle );
-#else
-    close( p_socket->i_handle );
-#endif
+    p_sys->i_buffer_pos += 12 + p_ck->i_data;
 
-    free( p_socket );
+    return VLC_SUCCESS;
 }
 
+/*****************************************************************************
+ *
+ *****************************************************************************/
 static int http_next_line( uint8_t **pp_data, int *pi_data )
 {
     char *p, *p_end = *pp_data + *pi_data;
@@ -898,6 +708,9 @@ static int http_next_line( uint8_t **pp_data, int *pi_data )
     return VLC_EGENERIC;
 }
 
+/*****************************************************************************
+ *
+ *****************************************************************************/
 static http_answer_t *http_answer_parse( uint8_t *p_data, int i_data )
 {
     http_answer_t *ans = malloc( sizeof( http_answer_t ) );
@@ -981,6 +794,9 @@ static http_answer_t *http_answer_parse( uint8_t *p_data, int i_data )
     return ans;
 }
 
+/*****************************************************************************
+ *
+ *****************************************************************************/
 static void http_answer_free( http_answer_t *ans )
 {
     http_field_t  *p_field = ans->p_fields;
@@ -1001,6 +817,9 @@ static void http_answer_free( http_answer_t *ans )
     free( ans );
 }
 
+/*****************************************************************************
+ *
+ *****************************************************************************/
 static http_field_t *http_field_find( http_field_t *p_field, char *psz_name )
 {
 
@@ -1017,6 +836,9 @@ static http_field_t *http_field_find( http_field_t *p_field, char *psz_name )
     return NULL;
 }
 
+/*****************************************************************************
+ *
+ *****************************************************************************/
 static int chunk_parse( chunk_t *ck, uint8_t *p_data, int i_data )
 {
     if( i_data < 12 )
index 5f871bd03f8de56e2753907f7b83a717fb5476ee..0c05707bf9ef47831bc2e7534318c4ca50704162 100644 (file)
@@ -2,7 +2,7 @@
  * mmsh.h:
  *****************************************************************************
  * Copyright (C) 2001, 2002 VideoLAN
- * $Id: mmsh.h,v 1.4 2003/08/26 00:51:19 fenrir Exp $
+ * $Id: mmsh.h,v 1.5 2004/01/21 16:56:16 fenrir Exp $
  *
  * Authors: Laurent Aimar <fenrir@via.ecp.fr>
  *
@@ -36,14 +36,12 @@ typedef struct
 
 } chunk_t;
 
-static int chunk_parse( chunk_t *, uint8_t *, int );
-
 #define BUFFER_SIZE 150000
 struct access_sys_t
 {
     int             i_proto;
 
-    input_socket_t  *p_socket;
+    int             fd;
     url_t           *p_url;
 
     int             i_request_context;
@@ -68,14 +66,6 @@ struct access_sys_t
     guid_t          guid;
 };
 
-static input_socket_t * NetOpenTCP  ( input_thread_t *, url_t * );
-static ssize_t          NetRead     ( input_thread_t *, input_socket_t *, byte_t *, size_t );
-static ssize_t          NetWrite    ( input_thread_t *, input_socket_t *, byte_t *, size_t );
-static void             NetClose    ( input_thread_t *, input_socket_t * );
-
-
-static ssize_t NetFill( input_thread_t *, access_sys_t *, int );
-
 typedef struct http_field_s
 {
     char *psz_name;
@@ -98,10 +88,4 @@ typedef struct
 
 } http_answer_t;
 
-static http_answer_t    *http_answer_parse  ( uint8_t *, int );
-static void              http_answer_free   ( http_answer_t * );
-/* static char             *http_field_get_value   ( http_answer_t *, char * ); */
-static http_field_t     *http_field_find    ( http_field_t *, char * );
 
-static int  mmsh_start( input_thread_t *, off_t );
-static void mmsh_stop ( input_thread_t * );
index b6bda8e96200576ea8fa443ce3533db77c4938c1..701049581690538333c0550a5ee129d59c445b6e 100644 (file)
@@ -2,7 +2,7 @@
  * mms.c: MMS access plug-in
  *****************************************************************************
  * Copyright (C) 2001, 2002 VideoLAN
- * $Id: mmstu.c,v 1.6 2003/07/31 23:44:49 fenrir Exp $
+ * $Id: mmstu.c,v 1.7 2004/01/21 16:56:16 fenrir Exp $
  *
  * Authors: Laurent Aimar <fenrir@via.ecp.fr>
  *
@@ -81,7 +81,7 @@ static ssize_t Read        ( input_thread_t * p_input, byte_t * p_buffer,
                              size_t i_len );
 static void    Seek        ( input_thread_t *, off_t );
 
-static int    MMSOpen( input_thread_t  *, url_t *, int, char * );
+static int    MMSOpen( input_thread_t  *, url_t *, int );
 
 static int    MMSStart  ( input_thread_t  *, uint32_t );
 static int    MMSStop  ( input_thread_t  *p_input );
@@ -96,9 +96,6 @@ static int     mms_HeaderMediaRead( input_thread_t *, int );
 
 static int     mms_ReceivePacket( input_thread_t * );
 
-//static void mms_ParseURL( url_t *p_url, char *psz_url );
-
-
 
 /*
  * XXX DON'T FREE MY MEMORY !!! XXX
@@ -119,10 +116,10 @@ static int     mms_ReceivePacket( input_thread_t * );
 
 int  E_( MMSTUOpen )  ( input_thread_t *p_input )
 {
-    access_sys_t    *p_sys;
-    int         i_proto;
-    char        *psz_network;
-    int         i_status;
+    access_sys_t   *p_sys;
+    int             i_proto;
+    int             i_status;
+    vlc_value_t val;
 
     /* *** allocate p_sys_data *** */
     p_input->p_access_data = p_sys = malloc( sizeof( access_sys_t ) );
@@ -130,28 +127,21 @@ int  E_( MMSTUOpen )  ( input_thread_t *p_input )
 
 
     /* *** Parse URL and get server addr/port and path *** */
-    //mms_ParseURL( &p_sys->url, p_input->psz_name );
     p_sys->p_url = E_( url_new )( p_input->psz_name );
 
     if( *p_sys->p_url->psz_host == '\0' )
     {
         E_( url_free )( p_sys->p_url );
         msg_Err( p_input, "invalid server name" );
-        return( -1 );
+        return VLC_EGENERIC;
     }
     if( p_sys->p_url->i_port <= 0 )
     {
         p_sys->p_url->i_port = 1755;
     }
-#if 0
-    if( p_sys->url.i_bind_port == 0 )
-    {
-        p_sys->url.i_bind_port = 7000;   /* default port */
-    }
-#endif
 
     /* *** connect to this server *** */
-    /* 1: look at  requested protocol (udp/tcp) */
+    /* look at  requested protocol (udp/tcp) */
     i_proto = MMS_PROTO_AUTO;
     if( *p_input->psz_access )
     {
@@ -164,42 +154,28 @@ int  E_( MMSTUOpen )  ( input_thread_t *p_input )
             i_proto = MMS_PROTO_TCP;
         }
     }
-    /* 2: look at ip version ipv4/ipv6 */
-    psz_network = "";
-    if( config_GetInt( p_input, "ipv4" ) )
-    {
-        psz_network = "ipv4";
-    }
-    else if( config_GetInt( p_input, "ipv6" ) )
-    {
-        psz_network = "ipv6";
-    }
-    /* 3: connect */
+
+    /* connect */
     if( i_proto == MMS_PROTO_AUTO )
     {   /* first try with TCP */
-        i_status =
-            MMSOpen( p_input, p_sys->p_url, MMS_PROTO_TCP, psz_network );
-        if( i_status < 0 )
+        if( ( i_status = MMSOpen( p_input, p_sys->p_url, MMS_PROTO_TCP ) ) )
         {   /* then with UDP */
-            i_status =
-             MMSOpen( p_input, p_sys->p_url, MMS_PROTO_UDP, psz_network );
+            i_status = MMSOpen( p_input, p_sys->p_url, MMS_PROTO_UDP );
         }
     }
     else
     {
-
-        i_status =
-            MMSOpen( p_input, p_sys->p_url, i_proto, psz_network );
+        i_status = MMSOpen( p_input, p_sys->p_url, i_proto );
     }
 
-    if( i_status < 0 )
+    if( i_status )
     {
         msg_Err( p_input, "cannot connect to server" );
         E_( url_free )( p_sys->p_url );
-        return( -1 );
+        return VLC_EGENERIC;
     }
-    msg_Dbg( p_input, "connected to %s:%d", p_sys->p_url->psz_host, p_sys->p_url->i_port );
 
+    msg_Dbg( p_input, "connected to %s:%d", p_sys->p_url->psz_host, p_sys->p_url->i_port );
 
     /* *** set exported functions *** */
     p_input->pf_read = Read;
@@ -241,13 +217,14 @@ int  E_( MMSTUOpen )  ( input_thread_t *p_input )
         msg_Err( p_input, "cannot start stream" );
         MMSClose( p_input );
         E_( url_free )( p_sys->p_url );
-        return( -1 );
+        return VLC_EGENERIC;
     }
 
     /* Update default_pts to a suitable value for mms access */
-    p_input->i_pts_delay = config_GetInt( p_input, "mms-caching" ) * 1000;
+    var_Get( p_input, "mms-caching", &val );
+    p_input->i_pts_delay = val.i_int * 1000;
 
-    return( 0 );
+    return VLC_SUCCESS;
 }
 
 /*****************************************************************************
@@ -419,16 +396,10 @@ static ssize_t Read        ( input_thread_t * p_input, byte_t * p_buffer,
 /****************************************************************************
  * MMSOpen : Open a connection with the server over mmst or mmsu
  ****************************************************************************/
-static int MMSOpen( input_thread_t  *p_input,
-                    url_t *p_url,
-                    int  i_proto,
-                    char *psz_network ) /* "", "ipv4", "ipv6" */
+static int MMSOpen( input_thread_t  *p_input, url_t *p_url, int  i_proto )
 {
-    module_t    *p_network;
     access_sys_t    *p_sys = p_input->p_access_data;
-
-    network_socket_t    socket_desc;
-    int b_udp = ( i_proto == MMS_PROTO_UDP ) ? 1 : 0;
+    int             b_udp = ( i_proto == MMS_PROTO_UDP ) ? 1 : 0;
 
     var_buffer_t buffer;
     char         tmp[4096];
@@ -444,21 +415,13 @@ static int MMSOpen( input_thread_t  *p_input,
 
     /* *** Open a TCP connection with server *** */
     msg_Dbg( p_input, "waiting for connection..." );
-    socket_desc.i_type = NETWORK_TCP;
-    socket_desc.psz_server_addr = p_url->psz_host;
-    socket_desc.i_server_port   = p_url->i_port;
-    socket_desc.psz_bind_addr   = "";
-    socket_desc.i_bind_port     = 0;
-    socket_desc.i_ttl           = 0;
-    p_input->p_private = (void*)&socket_desc;
-    if( !( p_network = module_Need( p_input, "network", psz_network ) ) )
+    p_sys->socket_tcp.i_handle = net_OpenTCP( p_input, p_url->psz_host, p_url->i_port );
+    if( p_sys->socket_tcp.i_handle < 0 )
     {
         msg_Err( p_input, "failed to open a connection (tcp)" );
-        return( -1 );
+        return VLC_EGENERIC;
     }
-    module_Unneed( p_input, p_network );
-    p_sys->socket_tcp.i_handle = socket_desc.i_handle;
-    p_input->i_mtu    = 0; /*socket_desc.i_mtu;*/
+    p_input->i_mtu = 0;
     msg_Dbg( p_input,
              "connection(tcp) with \"%s:%d\" successful",
              p_url->psz_host,
@@ -475,44 +438,21 @@ static int MMSOpen( input_thread_t  *p_input,
         {
 
             msg_Err( p_input, "for udp you have to provide bind address (mms://<server_addr>@<bind_addr/<path> (FIXME)" );
-#if defined( UNDER_CE )
-            CloseHandle( (HANDLE)p_sys->socket_tcp.i_handle );
-#elif defined( WIN32 )
-            closesocket( p_sys->socket_tcp.i_handle );
-#else
-            close( p_sys->socket_tcp.i_handle );
-#endif
-            return( -1 );
+            net_Close( p_sys->socket_tcp.i_handle );
+            return VLC_EGENERIC;
         }
         p_sys->psz_bind_addr = inet_ntoa( name.sin_addr );
 
-        socket_desc.i_type = NETWORK_UDP;
-        socket_desc.psz_server_addr = "";
-        socket_desc.i_server_port   = 0;
-        socket_desc.psz_bind_addr   = p_sys->psz_bind_addr;
-        socket_desc.i_bind_port     = 7000; //p_url->i_bind_port; FIXME
-        socket_desc.i_ttl           = 0;
-        p_input->p_private = (void*)&socket_desc;
-        if( !( p_network = module_Need( p_input, "network", psz_network ) ) )
+        p_sys->socket_udp.i_handle = net_OpenUDP( p_input, p_sys->psz_bind_addr, 7000, "", 0 );
+        if( p_sys->socket_udp.i_handle < 0 )
         {
             msg_Err( p_input, "failed to open a connection (udp)" );
-#if defined( UNDER_CE )
-            CloseHandle( (HANDLE)p_sys->socket_tcp.i_handle );
-#elif defined( WIN32 )
-            closesocket( p_sys->socket_tcp.i_handle );
-#else
-            close( p_sys->socket_tcp.i_handle );
-#endif
-            return( -1 );
+            net_Close( p_sys->socket_tcp.i_handle );
+            return VLC_EGENERIC;
         }
-        module_Unneed( p_input, p_network );
-        p_sys->socket_udp.i_handle = socket_desc.i_handle;
-        p_input->i_mtu    = 0;/*socket_desc.i_mtu;  FIXME */
-
         msg_Dbg( p_input,
                  "connection(udp) at \"%s:%d\" successful",
-                 p_sys->psz_bind_addr,
-                 7000 );
+                 p_sys->psz_bind_addr, 7000 );
     }
     else
     {
@@ -564,7 +504,7 @@ static int MMSOpen( input_thread_t  *p_input,
     {
         var_buffer_free( &buffer );
         MMSClose( p_input );
-        return( -1 );
+        return VLC_EGENERIC;
     }
 
     i_server_version = GetDWLE( p_sys->p_cmd + MMS_CMD_HEADERSIZE + 32 );
@@ -631,7 +571,7 @@ static int MMSOpen( input_thread_t  *p_input,
                  "%s protocol selection failed", b_udp ? "UDP" : "TCP" );
         var_buffer_free( &buffer );
         MMSClose( p_input );
-        return( -1 );
+        return VLC_EGENERIC;
     }
     else if( p_sys->i_command != 0x02 )
     {
@@ -660,7 +600,7 @@ static int MMSOpen( input_thread_t  *p_input,
         /*  FIXME */
         var_buffer_free( &buffer );
         MMSClose( p_input );
-        return( -1 );
+        return VLC_EGENERIC;
     }
     if( p_sys->i_command != 0x06 )
     {
@@ -687,7 +627,7 @@ static int MMSOpen( input_thread_t  *p_input,
                  GetDWLE( p_sys->p_cmd + MMS_CMD_HEADERSIZE ) );
         var_buffer_free( &buffer );
         MMSClose( p_input );
-        return( -1 );
+        return VLC_EGENERIC;
     }
 
     p_sys->i_flags_broadcast =
@@ -756,7 +696,7 @@ static int MMSOpen( input_thread_t  *p_input,
             msg_Err( p_input, "cannot receive header" );
             var_buffer_free( &buffer );
             MMSClose( p_input );
-            return( -1 );
+            return VLC_EGENERIC;
         }
         if( p_sys->i_header >= p_sys->i_header_size )
         {
@@ -834,7 +774,7 @@ static int MMSOpen( input_thread_t  *p_input,
         msg_Err( p_input, "cannot find any stream" );
         var_buffer_free( &buffer );
         MMSClose( p_input );
-        return( -1 );
+        return VLC_EGENERIC;
     }
     mms_CommandSend( p_input, 0x33,
                      i_streams,
@@ -849,7 +789,7 @@ static int MMSOpen( input_thread_t  *p_input,
                  p_sys->i_command );
         var_buffer_free( &buffer );
         MMSClose( p_input );
-        return( -1 );
+        return VLC_EGENERIC;
     }
 
 
@@ -857,7 +797,7 @@ static int MMSOpen( input_thread_t  *p_input,
 
     msg_Info( p_input, "connection sucessful" );
 
-    return( 0 );
+    return VLC_SUCCESS;
 }
 
 /****************************************************************************
@@ -933,24 +873,12 @@ static int MMSClose  ( input_thread_t  *p_input )
                      p_sys->i_command_level,
                      0x00000001,
                      NULL, 0 );
-    /* *** close sockets *** */
-#if defined( UNDER_CE )
-    CloseHandle( (HANDLE)p_sys->socket_tcp.i_handle );
-#elif defined( WIN32 )
-    closesocket( p_sys->socket_tcp.i_handle );
-#else
-    close( p_sys->socket_tcp.i_handle );
-#endif
 
+    /* *** close sockets *** */
+    net_Close( p_sys->socket_tcp.i_handle );
     if( p_sys->i_proto == MMS_PROTO_UDP )
     {
-#if defined( UNDER_CE )
-        CloseHandle( (HANDLE)p_sys->socket_udp.i_handle );
-#elif defined( WIN32 )
-        closesocket( p_sys->socket_udp.i_handle );
-#else
-        close( p_sys->socket_udp.i_handle );
-#endif
+        net_Close( p_sys->socket_udp.i_handle );
     }
 
     FREE( p_sys->p_cmd );