]> git.sesse.net Git - vlc/commitdiff
* src/extras/dirent.c, ALL: fixed win32/ce dirent replacement and made it accessible...
authorGildas Bazin <gbazin@videolan.org>
Mon, 21 Feb 2005 13:00:20 +0000 (13:00 +0000)
committerGildas Bazin <gbazin@videolan.org>
Mon, 21 Feb 2005 13:00:20 +0000 (13:00 +0000)
Makefile.am
include/vlc_common.h
modules/access/directory.c
modules/control/http.c
modules/demux/mkv.cpp
modules/gui/skins2/src/theme_loader.cpp
modules/gui/skins2/src/theme_repository.cpp
modules/gui/wince/wince.h
src/extras/dirent.c
src/input/subtitles.c

index 0f930e6c6565e60a1a9fe051132df90c3fb10dd2..a6d53140c5ac93a86ca8e31d9a90610c4e9820bd 100644 (file)
@@ -327,7 +327,6 @@ SOURCES_libvlc_win32 = \
 
 SOURCES_libvlc_dirent = \
        src/extras/dirent.c \
-       src/extras/dirent.h \
        $(NULL)
 
 SOURCES_libvlc_getopt = \
index 65aeab7abdff099b7df9238e7f7d50ae090537e0..dfde7ac4f999b45668819f0b0e2133f01cff4815 100644 (file)
@@ -872,6 +872,30 @@ static inline void _SetQWBE( uint8_t *p, uint64_t i_qw )
 #   define vlc_strcasestr NULL
 #endif
 
+#ifndef HAVE_DIRENT_H
+    typedef struct DIR DIR;
+#   ifndef FILENAME_MAX
+#       define FILENAME_MAX (260)
+#   endif
+    struct dirent
+    {
+        long            d_ino;          /* Always zero. */
+        unsigned short  d_reclen;       /* Always zero. */
+        unsigned short  d_namlen;       /* Length of name in d_name. */
+        char            d_name[FILENAME_MAX]; /* File name. */
+    };
+#   define opendir vlc_opendir
+#   define readdir vlc_readdir
+#   define closedir vlc_closedir
+    VLC_EXPORT( DIR *, vlc_opendir, ( const char * ) );
+    VLC_EXPORT( struct dirent *, vlc_readdir, ( DIR * ) );
+    VLC_EXPORT( int, vlc_closedir, ( DIR * ) );
+#elif !defined(__PLUGIN__)
+#   define vlc_opendir  NULL
+#   define vlc_readdir  NULL
+#   define vlc_closedir NULL
+#endif
+
 /* Format type specifiers for 64 bits numbers */
 #if !defined(WIN32) && !defined(UNDER_CE)
 #   define I64Fd "%lld"
index 2ec55d5f9a0f6ffdd486c8d63681e7b546e07f6f..342df80ff4cb90ae3147a8c94d6ac4ca7475ba46 100644 (file)
@@ -50,8 +50,7 @@
 #   include <io.h>
 #endif
 
-#if (!defined( WIN32 ) || defined(__MINGW32__))
-/* Mingw has its own version of dirent */
+#ifdef HAVE_DIRENT_H
 #   include <dirent.h>
 #endif
 
index bafc5cad39514b2f18cd0172f603a059ac1b1d13..61182718936e30045a06275942fc576b77e9116b 100644 (file)
@@ -57,8 +57,7 @@
 #   include <io.h>
 #endif
 
-#if (!defined( WIN32 ) || defined(__MINGW32__))
-/* Mingw has its own version of dirent */
+#ifdef HAVE_DIRENT_H
 #   include <dirent.h>
 #endif
 
@@ -302,16 +301,12 @@ static int Open( vlc_object_t *p_this )
     p_sys->i_files  = 0;
     p_sys->pp_files = NULL;
 
-#if defined(SYS_DARWIN) || defined(SYS_BEOS) || \
-        ( defined(WIN32) && !defined(UNDER_CE ) )
+#if defined(SYS_DARWIN) || defined(SYS_BEOS) || defined(WIN32)
     if ( ( psz_src = config_GetPsz( p_intf, "http-src" )) == NULL )
     {
         char * psz_vlcpath = p_intf->p_libvlc->psz_vlcpath;
         psz_src = malloc( strlen(psz_vlcpath) + strlen("/share/http" ) + 1 );
-        if( !psz_src )
-        {
-            return VLC_ENOMEM;
-        }
+        if( !psz_src ) return VLC_ENOMEM;
 #if defined(WIN32)
         sprintf( psz_src, "%s/http", psz_vlcpath);
 #else
index 27c04d0386aebdbefcf042448e9a85503e87fbf5..2cf9c914c8a828dad23679d6cdd7ef26d0b23a86 100644 (file)
@@ -47,8 +47,6 @@
 
 #ifdef HAVE_DIRENT_H
 #   include <dirent.h>
-#else
-#   include "../../src/extras/dirent.h"
 #endif
 
 /* libebml and matroska */
index 57ee84f65b939c950e5ee2a377fa08dbc4347bfc..0295a6ddd0b429af3273cb6fcf8835a24f5e8cfc 100644 (file)
@@ -42,8 +42,7 @@
 #   include <direct.h>
 #endif
 
-#if (!defined( WIN32 ) || defined(__MINGW32__))
-/* Mingw has its own version of dirent */
+#ifdef HAVE_DIRENT_H
 #   include <dirent.h>
 #endif
 
index b6c3f2898ad626a36031d2ad4e9346b2d00ecc84..a4f2d484f24a545f0796ff6e343751eb38861378 100644 (file)
@@ -30,8 +30,7 @@
 #elif defined( WIN32 )
 #   include <direct.h>
 #endif
-#if (!defined( WIN32 ) || defined(__MINGW32__))
-/* Mingw has its own version of dirent */
+#ifdef HAVE_DIRENT_H
 #   include <dirent.h>
 #endif
 
index 072df8c8b94ea2edb7ee57915a7a9e44fc794aad..bd8dd1c8a0cfb8b20bbb6aef1e17d70497c2f3a1 100644 (file)
@@ -534,13 +534,13 @@ protected:
     static inline wchar_t *_FROMMB( const char *psz_in )
     {
         mbstowcs( pwsz_mbtow, psz_in, 2048 );
-        pwsz_mbtow[2048] = 0;
+        pwsz_mbtow[2048-1] = 0;
         return pwsz_mbtow;
     }
     static inline char *_TOMB( const wchar_t *pwsz_in )
     {
         wcstombs( psz_wtomb, pwsz_in, 2048 );
-        psz_wtomb[2048] = 0;
+        psz_wtomb[2048-1] = 0;
         return psz_wtomb;
     }
 #else
index b70635c2b94c9c4a55235434caa2405ee02bd9e4..073cc137da51b24504f6acbfa6604f3fb4fc7dd8 100644 (file)
@@ -8,7 +8,7 @@
  * Updated by Jeremy Bettis <jeremy@hksys.com>
  * Significantly revised and rewinddir, seekdir and telldir added by Colin
  * Peters <colin@fu.is.saga-u.ac.jp>
- *     
+ *      
  * $Revision: 1.6 $
  * $Author: sam $
  * $Date: 2002/11/13 20:51:04 $
@@ -18,6 +18,8 @@
 #include "config.h"
 
 #include <stdlib.h>
+#include <stdio.h>
+
 #ifdef HAVE_ERRNO_H
 #   include <errno.h>
 #else
 #ifndef UNDER_CE
 #   include <io.h>
 #   include <direct.h>
+#else
+#   define FILENAME_MAX (260)
 #endif
 
 #define WIN32_LEAN_AND_MEAN
 #include <windows.h> /* for GetFileAttributes */
 
-#include "dirent.h"
+#include <tchar.h>
+#define SUFFIX  "*"
+#define SLASH   "\\"
+
+struct dirent
+{
+       long            d_ino;          /* Always zero. */
+       unsigned short  d_reclen;       /* Always zero. */
+       unsigned short  d_namlen;       /* Length of name in d_name. */
+       char            d_name[FILENAME_MAX]; /* File name. */
+};
+
+typedef struct
+{
+       /* disk transfer area for this dir */
+       WIN32_FIND_DATA         dd_dta;
+
+       /* dirent struct to return from dir (NOTE: this makes this thread
+        * safe as long as only one thread uses a particular DIR struct at
+        * a time) */
+       struct dirent           dd_dir;
+
+       /* findnext handle */
+       HANDLE                  dd_handle;
+
+       /*
+         * Status of search:
+        *   0 = not started yet (next entry to read is first entry)
+        *  -1 = off the end
+        *   positive = 0 based index of next entry
+        */
+       int                     dd_stat;
 
-#define SUFFIX "*"
-#define        SLASH   "\\"
+       /* given path for dir with search pattern (struct is extended) */
+       char                    dd_name[1];
+} DIR;
 
 /*
  * opendir
  * searching a directory.
  */
 DIR * 
-opendir (const CHAR *szPath)
+vlc_opendir (const CHAR *szPath)
 {
   DIR *nd;
   unsigned int rc;
   CHAR szFullPath[MAX_PATH];
-       
+
   errno = 0;
 
   if (!szPath)
@@ -71,8 +107,17 @@ opendir (const CHAR *szPath)
     }
 
   /* Attempt to determine if the given path really is a directory. */
+#ifdef UNICODE
+  {
+    wchar_t szPathTmp[MAX_PATH];
+    mbstowcs( szPathTmp, szPath, MAX_PATH );
+    szPathTmp[MAX_PATH-1] = 0;
+    rc = GetFileAttributes (szPathTmp);
+  }
+#else
   rc = GetFileAttributes (szPath);
-  if (rc == -1)
+#endif
+  if (rc == (unsigned int)-1)
     {
       /* call GetLastError for more error info */
       errno = ENOENT;
@@ -89,13 +134,22 @@ opendir (const CHAR *szPath)
 #if defined( UNDER_CE )
   if (szPath[0] == '\\' || szPath[0] == '/')
     {
-      sprintf (szFullPath, MAX_PATH, "%s", szPath);
+      sprintf (szFullPath, "%s", szPath);
       szFullPath[0] = '\\';
     }
   else
     {
-      /* FIXME: if I wasn't lazy, I'd check for overflows here. */
-      sprintf (szFullPath, MAX_PATH, "\\%s", szPath );
+      wchar_t szFullPathTmp[MAX_PATH];
+      if (GetModuleFileName( NULL, szFullPathTmp, MAX_PATH ) )
+        {
+          wcstombs( szFullPath, szFullPathTmp, MAX_PATH );
+          szFullPath[MAX_PATH-1] = 0;
+        }
+      else
+        {
+          /* FIXME: if I wasn't lazy, I'd check for overflows here. */
+          sprintf (szFullPath, "\\%s", szPath );
+        }
     }
 #else
   _fullpath (szFullPath, szPath, MAX_PATH);
@@ -103,8 +157,8 @@ opendir (const CHAR *szPath)
 
   /* Allocate enough space to store DIR structure and the complete
    * directory path given. */
-  nd = (DIR *) malloc (sizeof (DIR) + strlen (szFullPath) + strlen (SLASH) +
-                      strlen (SUFFIX));
+  nd = (DIR *) malloc (sizeof (DIR) + strlen (szFullPath) + sizeof (SLASH) +
+                       sizeof (SUFFIX));
 
   if (!nd)
     {
@@ -127,9 +181,9 @@ opendir (const CHAR *szPath)
   /* Add on the search pattern */
   strcat (nd->dd_name, SUFFIX);
 
-  /* Initialize handle to -1 so that a premature closedir doesn't try
+  /* Initialize handle so that a premature closedir doesn't try
    * to call FindClose on it. */
-  nd->dd_handle = -1;
+  nd->dd_handle = INVALID_HANDLE_VALUE;
 
   /* Initialize the status. */
   nd->dd_stat = 0;
@@ -140,7 +194,7 @@ opendir (const CHAR *szPath)
   nd->dd_dir.d_ino = 0;
   nd->dd_dir.d_reclen = 0;
   nd->dd_dir.d_namlen = 0;
-  nd->dd_dir.d_name = nd->dd_dta.cFileName;
+  memset (nd->dd_dir.d_name, 0, FILENAME_MAX);
 
   return nd;
 }
@@ -153,7 +207,7 @@ opendir (const CHAR *szPath)
  * next entry in the directory.
  */
 struct dirent *
-readdir (DIR * dirp)
+vlc_readdir (DIR * dirp)
 {
   errno = 0;
 
@@ -164,13 +218,6 @@ readdir (DIR * dirp)
       return (struct dirent *) 0;
     }
 
-  if (dirp->dd_dir.d_name != dirp->dd_dta.cFileName)
-    {
-      /* The structure does not seem to be set up correctly. */
-      errno = EINVAL;
-      return (struct dirent *) 0;
-    }
-
   if (dirp->dd_stat < 0)
     {
       /* We have already returned all files in the directory
@@ -179,44 +226,59 @@ readdir (DIR * dirp)
     }
   else if (dirp->dd_stat == 0)
     {
+#ifdef UNICODE
+        wchar_t dd_name[MAX_PATH];
+        mbstowcs( dd_name, dirp->dd_name, MAX_PATH );
+        dd_name[MAX_PATH-1] = 0;
+#else
+        char *dd_name = dirp->dd_name;
+#endif
       /* We haven't started the search yet. */
       /* Start the search */
-      dirp->dd_handle = (long)FindFirstFile (dirp->dd_name, &(dirp->dd_dta));
-
-         if (dirp->dd_handle == -1)
-       {
-         /* Whoops! Seems there are no files in that
-          * directory. */
-         dirp->dd_stat = -1;
-       }
+      dirp->dd_handle = FindFirstFile (dd_name, &(dirp->dd_dta));
+
+          if (dirp->dd_handle == INVALID_HANDLE_VALUE)
+        {
+          /* Whoops! Seems there are no files in that
+           * directory. */
+          dirp->dd_stat = -1;
+        }
       else
-       {
-         dirp->dd_stat = 1;
-       }
+        {
+          dirp->dd_stat = 1;
+        }
     }
   else
     {
       /* Get the next search entry. */
-      if (FindNextFile ((HANDLE)dirp->dd_handle, &(dirp->dd_dta)))
-       {
-         /* We are off the end or otherwise error. */
-         FindClose ((HANDLE)dirp->dd_handle);
-         dirp->dd_handle = -1;
-         dirp->dd_stat = -1;
-       }
+      if (!FindNextFile ((HANDLE)dirp->dd_handle, &(dirp->dd_dta)))
+        {
+          /* We are off the end or otherwise error. */
+          FindClose ((HANDLE)dirp->dd_handle);
+          dirp->dd_handle = INVALID_HANDLE_VALUE;
+          dirp->dd_stat = -1;
+        }
       else
-       {
-         /* Update the status to indicate the correct
-          * number. */
-         dirp->dd_stat++;
-       }
+        {
+          /* Update the status to indicate the correct
+           * number. */
+          dirp->dd_stat++;
+        }
     }
 
   if (dirp->dd_stat > 0)
     {
-      /* Successfully got an entry. Everything about the file is
-       * already appropriately filled in except the length of the
-       * file name. */
+      /* Successfully got an entry */
+
+#ifdef UNICODE
+      char d_name[MAX_PATH];
+      wcstombs( d_name, dirp->dd_dta.cFileName, MAX_PATH );
+      d_name[MAX_PATH-1] = 0;
+#else
+      char *d_name = dirp->dd_dta.cFileName;
+#endif
+
+      strcpy (dirp->dd_dir.d_name, d_name);
       dirp->dd_dir.d_namlen = strlen (dirp->dd_dir.d_name);
       return &dirp->dd_dir;
     }
@@ -231,7 +293,7 @@ readdir (DIR * dirp)
  * Frees up resources allocated by opendir.
  */
 int
-closedir (DIR * dirp)
+vlc_closedir (DIR * dirp)
 {
   int rc;
 
@@ -244,7 +306,7 @@ closedir (DIR * dirp)
       return -1;
     }
 
-  if (dirp->dd_handle != -1)
+  if (dirp->dd_handle != INVALID_HANDLE_VALUE)
     {
       rc = FindClose ((HANDLE)dirp->dd_handle);
     }
@@ -262,7 +324,7 @@ closedir (DIR * dirp)
  * and then reset things like an opendir.
  */
 void
-rewinddir (DIR * dirp)
+vlc_rewinddir (DIR * dirp)
 {
   errno = 0;
 
@@ -272,12 +334,12 @@ rewinddir (DIR * dirp)
       return;
     }
 
-  if (dirp->dd_handle != -1)
+  if (dirp->dd_handle != INVALID_HANDLE_VALUE)
     {
       FindClose ((HANDLE)dirp->dd_handle);
     }
 
-  dirp->dd_handle = -1;
+  dirp->dd_handle = INVALID_HANDLE_VALUE;
   dirp->dd_stat = 0;
 }
 
@@ -288,7 +350,7 @@ rewinddir (DIR * dirp)
  * seekdir to go back to an old entry. We simply return the value in stat.
  */
 long
-telldir (DIR * dirp)
+vlc_telldir (DIR * dirp)
 {
   errno = 0;
 
@@ -310,7 +372,7 @@ telldir (DIR * dirp)
  * any such system.
  */
 void
-seekdir (DIR * dirp, long lPos)
+vlc_seekdir (DIR * dirp, long lPos)
 {
   errno = 0;
 
@@ -329,19 +391,19 @@ seekdir (DIR * dirp, long lPos)
   else if (lPos == -1)
     {
       /* Seek past end. */
-      if (dirp->dd_handle != -1)
-       {
-         FindClose ((HANDLE)dirp->dd_handle);
-       }
-      dirp->dd_handle = -1;
+      if (dirp->dd_handle != INVALID_HANDLE_VALUE)
+        {
+          FindClose ((HANDLE)dirp->dd_handle);
+        }
+      dirp->dd_handle = INVALID_HANDLE_VALUE;
       dirp->dd_stat = -1;
     }
   else
     {
       /* Rewind and read forward to the appropriate index. */
-      rewinddir (dirp);
+      vlc_rewinddir (dirp);
 
-      while ((dirp->dd_stat < lPos) && readdir (dirp))
-       ;
+      while ((dirp->dd_stat < lPos) && vlc_readdir (dirp))
+        ;
     }
 }
index 310d1de49f06a572afd7a2cc84580fa78ca4b27f..c0e6f7ae72bd7218bdf364cc8d94e38f664c5172 100644 (file)
@@ -33,8 +33,6 @@
 
 #ifdef HAVE_DIRENT_H
 #   include <dirent.h>
-#else
-#   include "../extras/dirent.h"
 #endif
 
 #include <ctype.h>
@@ -299,7 +297,6 @@ char **subtitles_Detect( input_thread_t *p_this, char *psz_path,
     for( j = -1; j == -1 || ( j >= 0 && subdirs != NULL && *subdirs != NULL );
          j++)
     {
-#ifdef HAVE_DIRENT_H
         d = opendir( j < 0 ? f_dir : *subdirs );
         if( d )
         {
@@ -378,7 +375,6 @@ char **subtitles_Detect( input_thread_t *p_this, char *psz_path,
             }
             closedir( d );
         }
-#endif
         if( j >= 0 ) free( *subdirs++ );
     }