]> git.sesse.net Git - vlc/blobdiff - modules/access/file.c
Make Zorglub less unhappy
[vlc] / modules / access / file.c
index cf4b2695652a664f59f7c94b5bcd0068c60315ad..6d51d1aab4a77f0069270ff5eec4ec01f3f457c1 100644 (file)
@@ -1,7 +1,7 @@
 /*****************************************************************************
  * file.c: file input (file: access plug-in)
  *****************************************************************************
- * Copyright (C) 2001-2004 VideoLAN
+ * Copyright (C) 2001-2004 the VideoLAN team
  * $Id$
  *
  * Authors: Christophe Massiot <massiot@via.ecp.fr>
@@ -29,6 +29,7 @@
 
 #include <stdlib.h>
 #include <string.h>
+#include <errno.h>
 #ifdef HAVE_SYS_TYPES_H
 #   include <sys/types.h>
 #endif
@@ -38,9 +39,6 @@
 #ifdef HAVE_SYS_STAT_H
 #   include <sys/stat.h>
 #endif
-#ifdef HAVE_ERRNO_H
-#   include <errno.h>
-#endif
 #ifdef HAVE_FCNTL_H
 #   include <fcntl.h>
 #endif
 #   include <io.h>
 #endif
 
-/* stat() support for large files on win32 */
 #if defined( WIN32 ) && !defined( UNDER_CE )
-#define stat _stati64
-#define fstat(a,b) _fstati64(a,b)
-#endif
-
-#ifdef UNDER_CE
-#   define close(a) CloseHandle((HANDLE)a)
+/* stat() support for large files on win32 */
+#   define stat _stati64
+#   define fstat(a,b) _fstati64(a,b)
+#   ifdef lseek
+#      undef lseek
+#   endif
+#   define lseek _lseeki64
+#elif defined( UNDER_CE )
+#   ifdef read
+#      undef read
+#   endif
+#   define read(a,b,c) fread(b,1,c,a)
+#   define close(a) fclose(a)
+#   ifdef lseek
+#      undef lseek
+#   endif
+#   define lseek fseek
 #endif
 
 /*****************************************************************************
@@ -78,6 +86,9 @@ static void Close( vlc_object_t * );
 
 vlc_module_begin();
     set_description( _("Standard filesystem file input") );
+    set_shortname( _("File") );
+    set_category( CAT_INPUT );
+    set_subcategory( SUBCAT_INPUT_ACCESS );
     add_integer( "file-caching", DEFAULT_PTS_DELAY / 1000, NULL, CACHING_TEXT, CACHING_LONGTEXT, VLC_TRUE );
     add_string( "file-cat", NULL, NULL, CAT_TEXT, CAT_LONGTEXT, VLC_TRUE );
     set_capability( "access2", 50 );
@@ -95,7 +106,7 @@ static int  Seek( access_t *, int64_t );
 static int  Read( access_t *, uint8_t *, int );
 static int  Control( access_t *, int, va_list );
 
-static int     _OpenFile( access_t *, char * );
+static int  _OpenFile( access_t *, char * );
 
 typedef struct
 {
@@ -115,7 +126,13 @@ struct access_sys_t
 
     /* Current file */
     int  i_index;
+#ifndef UNDER_CE
     int  fd;
+    int  fd_backup;
+#else
+    FILE *fd;
+    FILE *fd_backup;
+#endif
 
     /* */
     vlc_bool_t b_seekable;
@@ -129,15 +146,14 @@ static int Open( vlc_object_t *p_this )
 {
     access_t     *p_access = (access_t*)p_this;
     access_sys_t *p_sys;
-
-    char *              psz_name = p_access->psz_path;
+    char *psz_name = p_access->psz_path;
+    char *psz;
 
 #ifdef HAVE_SYS_STAT_H
     int                 i_stat;
     struct stat         stat_info;
 #endif
     vlc_bool_t          b_stdin;
-    vlc_value_t         val;
 
     file_entry_t *      p_file;
 
@@ -169,7 +185,9 @@ static int Open( vlc_object_t *p_this )
     p_sys->file = NULL;
     p_sys->i_file = 0;
     p_sys->i_index = 0;
+#ifndef UNDER_CE
     p_sys->fd = -1;
+#endif
 
     if( !strcasecmp( p_access->psz_access, "stream" ) )
     {
@@ -251,12 +269,10 @@ static int Open( vlc_object_t *p_this )
     p_file->psz_name = strdup( psz_name );
     TAB_APPEND( p_sys->i_file, p_sys->file, p_file );
 
-    var_Create( p_access, "file-cat", VLC_VAR_STRING | VLC_VAR_DOINHERIT );
-    var_Get( p_access, "file-cat", &val );
-
-    if( *val.psz_string )
+    psz = var_CreateGetString( p_access, "file-cat" );
+    if( *psz )
     {
-        char *psz_parser = psz_name = val.psz_string;
+        char *psz_parser = psz_name = psz;
         int64_t i_size;
 
         while( psz_name && *psz_name )
@@ -268,6 +284,7 @@ static int Open( vlc_object_t *p_this )
             if( psz_name )
             {
                 msg_Dbg( p_access, "adding file `%s'", psz_name );
+                i_size = 0;
 
 #ifdef HAVE_SYS_STAT_H
                 if( !stat( psz_name, &stat_info ) )
@@ -278,7 +295,6 @@ static int Open( vlc_object_t *p_this )
                 else
                 {
                     msg_Dbg( p_access, "cannot stat() file `%s'", psz_name );
-                    i_size = 0;
                 }
 #endif
                 p_file = malloc( sizeof(file_entry_t) );
@@ -292,7 +308,7 @@ static int Open( vlc_object_t *p_this )
             if( psz_name ) psz_name++;
         }
     }
-    free( val.psz_string );
+    free( psz );
 
     return VLC_SUCCESS;
 }
@@ -326,13 +342,7 @@ static int Read( access_t *p_access, uint8_t *p_buffer, int i_len )
     access_sys_t *p_sys = p_access->p_sys;
     int i_ret;
 
-#ifdef UNDER_CE
-    if( !ReadFile( (HANDLE)p_sys->fd, p_buffer, i_len, (LPDWORD)&i_ret, NULL ) )
-    {
-        i_ret = -1;
-    }
-#else
-#ifndef WIN32
+#if !defined(WIN32) && !defined(UNDER_CE)
     if( !p_sys->b_pace_control )
     {
         if( !p_sys->b_kfir )
@@ -373,19 +383,19 @@ static int Read( access_t *p_access, uint8_t *p_buffer, int i_len )
         else
         {
             /* b_kfir ; work around a buggy poll() driver implementation */
-            while ( (i_ret = read( p_sys->fd, p_buffer, i_len )) == 0 && !p_access->b_die )
+            while ( (i_ret = read( p_sys->fd, p_buffer, i_len )) == 0 &&
+                    !p_access->b_die )
             {
                 msleep( INPUT_ERROR_SLEEP );
             }
         }
     }
     else
-#   endif
+#endif /* WIN32 || UNDER_CE */
     {
         /* b_pace_control || WIN32 */
         i_ret = read( p_sys->fd, p_buffer, i_len );
     }
-#endif
 
     if( i_ret < 0 )
     {
@@ -399,7 +409,8 @@ static int Read( access_t *p_access, uint8_t *p_buffer, int i_len )
 
     p_sys->i_nb_reads++;
 #ifdef HAVE_SYS_STAT_H
-    if( p_access->info.i_size != 0 && (p_sys->i_nb_reads % INPUT_FSTAT_NB_READS) == 0 )
+    if( p_access->info.i_size != 0 &&
+        (p_sys->i_nb_reads % INPUT_FSTAT_NB_READS) == 0 )
     {
         struct stat stat_info;
         int i_file = p_sys->i_index;
@@ -419,18 +430,18 @@ static int Read( access_t *p_access, uint8_t *p_buffer, int i_len )
     /* If we reached an EOF then switch to the next file in the list */
     if ( i_ret == 0 && p_sys->i_index + 1 < p_sys->i_file )
     {
-        int fd = p_sys->fd;
         char *psz_name = p_sys->file[++p_sys->i_index]->psz_name;
+        p_sys->fd_backup = p_sys->fd;
 
         msg_Dbg( p_access, "opening file `%s'", psz_name );
 
         if ( _OpenFile( p_access, psz_name ) )
         {
-            p_sys->fd = fd;
+            p_sys->fd = p_sys->fd_backup;
             return 0;
         }
 
-        close( fd );
+        close( p_sys->fd_backup );
 
         /* We have to read some data */
         return Read( p_access, p_buffer, i_len );
@@ -455,9 +466,9 @@ static int Seek( access_t *p_access, int64_t i_pos )
     /* Check which file we need to access */
     if( p_sys->i_file > 1 )
     {
-        int fd = p_sys->fd;
         int i;
         char *psz_name;
+        p_sys->fd_backup = p_sys->fd;
 
         for( i = 0; i < p_sys->i_file - 1; i++ )
         {
@@ -472,20 +483,16 @@ static int Seek( access_t *p_access, int64_t i_pos )
         if ( i != p_sys->i_index && !_OpenFile( p_access, psz_name ) )
         {
             /* Close old file */
-            close( fd );
+            close( p_sys->fd_backup );
             p_sys->i_index = i;
         }
         else
         {
-            p_sys->fd = fd;
+            p_sys->fd = p_sys->fd_backup;
         }
     }
 
-#if defined( WIN32 ) && !defined( UNDER_CE )
-    _lseeki64( p_sys->fd, i_pos - i_size, SEEK_SET );
-#else
     lseek( p_sys->fd, i_pos - i_size, SEEK_SET );
-#endif
 
     p_access->info.i_pos = i_pos;
     if( p_access->info.i_size < p_access->info.i_pos )
@@ -505,7 +512,6 @@ static int Seek( access_t *p_access, int64_t i_pos )
     return VLC_SUCCESS;
 }
 
-
 /*****************************************************************************
  * Control:
  *****************************************************************************/
@@ -515,7 +521,6 @@ static int Control( access_t *p_access, int i_query, va_list args )
     vlc_bool_t   *pb_bool;
     int          *pi_int;
     int64_t      *pi_64;
-    vlc_value_t  val;
 
     switch( i_query )
     {
@@ -540,9 +545,9 @@ static int Control( access_t *p_access, int i_query, va_list args )
 
         case ACCESS_GET_PTS_DELAY:
             pi_64 = (int64_t*)va_arg( args, int64_t * );
-            var_Get( p_access, "file-caching", &val );
-            *pi_64 = val.i_int * 1000;
+            *pi_64 = var_GetInteger( p_access, "file-caching" ) * I64C(1000);
             break;
+
         /* */
         case ACCESS_SET_PAUSE_STATE:
             /* Nothing to do */
@@ -552,10 +557,11 @@ static int Control( access_t *p_access, int i_query, va_list args )
         case ACCESS_SET_TITLE:
         case ACCESS_SET_SEEKPOINT:
         case ACCESS_SET_PRIVATE_ID_STATE:
+        case ACCESS_GET_META:
             return VLC_EGENERIC;
 
         default:
-            msg_Err( p_access, "unimplemented query in control" );
+            msg_Warn( p_access, "unimplemented query in control" );
             return VLC_EGENERIC;
 
     }
@@ -571,21 +577,17 @@ static int _OpenFile( access_t * p_access, char * psz_name )
     access_sys_t *p_sys = p_access->p_sys;
 
 #ifdef UNDER_CE
-    wchar_t psz_filename[MAX_PATH];
-    MultiByteToWideChar( CP_ACP, 0, psz_name, -1, psz_filename, MAX_PATH );
-
-    p_sys->fd =
-       (int)CreateFile( psz_filename, GENERIC_READ, FILE_SHARE_READ,
-                        NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );
-
-    if ( (HANDLE)p_sys->fd == INVALID_HANDLE_VALUE )
+    p_sys->fd = fopen( psz_name, "rb" );
+    if ( !p_sys->fd )
     {
         msg_Err( p_access, "cannot open file %s", psz_name );
         return VLC_EGENERIC;
     }
-    p_access->info.i_size =
-        GetFileSize( (HANDLE)p_access_data->i_handle, NULL );
+
+    fseek( p_sys->fd, 0, SEEK_END );
+    p_access->info.i_size = ftell( p_sys->fd );
     p_access->info.i_update |= INPUT_UPDATE_SIZE;
+    fseek( p_sys->fd, 0, SEEK_SET );
 #else
 
     p_sys->fd = open( psz_name, O_NONBLOCK /*| O_LARGEFILE*/ );