[vlc-devel] commit: Fix opening of file:// URIs (not tested on Windows) ( Rémi Denis-Courmont )

git version control git at videolan.org
Fri Jun 12 18:45:29 CEST 2009


vlc | branch: 1.0-bugfix | Rémi Denis-Courmont <remi at remlab.net> | Fri Jun 12 19:44:35 2009 +0300| [5377d1df8caf79bd6fb195daf91b918e70018d6a] | committer: Rémi Denis-Courmont 

Fix opening of file:// URIs (not tested on Windows)
(cherry picked from commit 81a05711bb6d5ff26da0cce4ed1e0cf650310184)

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=5377d1df8caf79bd6fb195daf91b918e70018d6a
---

 src/input/input.c |   42 ++++++++++++++++++++++++++++++------------
 1 files changed, 30 insertions(+), 12 deletions(-)

diff --git a/src/input/input.c b/src/input/input.c
index a87bff8..3ddc367 100644
--- a/src/input/input.c
+++ b/src/input/input.c
@@ -2343,6 +2343,36 @@ static int InputSourceInit( input_thread_t *p_input,
     /* Split uri */
     input_SplitMRL( &psz_access, &psz_demux, &psz_path, psz_dup );
 
+    /* FIXME: file:// handling plugins do not support URIs properly...
+     * So we pre-decoded the URI to a path for them. Note that we do not do it
+     * for non-standard VLC-specific schemes. */
+    if( !strcmp( psz_access, "file" ) )
+    {
+        if( psz_path[0] != '/' )
+        {   /* host specified -> not supported currently */
+            msg_Err( p_input, "cannot open remote file `%s://%s'",
+                     psz_access, psz_path );
+            msg_Info( p_input, "Did you mean `%s:///%s'?",
+                      psz_access, psz_path );
+            goto error;
+        }
+        /* Remove HTML anchor if present (not supported). */
+        char *p = strchr( psz_path, '#' );
+        if( p )
+            *p = '\0';
+        /* Then URI-decode the path. */
+        decode_URI( psz_path );
+#ifdef WIN32
+        /* Strip leading slash in front of the drive letter */
+        psz_path++;
+#endif
+#if (DIR_SEP_CHAR != '/')
+        /* Turn slashes into anti-slashes */
+        for( char *s = strchr( psz_path, '/' ); s; s = strchr( s + 1, '/' ) )
+            *s = DIR_SEP_CHAR;
+#endif
+    }
+
     msg_Dbg( p_input, "`%s' gives access `%s' demux `%s' path `%s'",
              psz_mrl, psz_access, psz_demux, psz_path );
     if( !p_input->b_preparsing )
@@ -2442,18 +2472,6 @@ static int InputSourceInit( input_thread_t *p_input,
     {
         /* Now try a real access */
         in->p_access = access_New( p_input, psz_access, psz_demux, psz_path );
-
-        /* Access failed, URL encoded ? */
-        if( in->p_access == NULL && strchr( psz_path, '%' ) )
-        {
-            decode_URI( psz_path );
-
-            msg_Dbg( p_input, "retrying with access `%s' demux `%s' path `%s'",
-                     psz_access, psz_demux, psz_path );
-
-            in->p_access = access_New( p_input,
-                                        psz_access, psz_demux, psz_path );
-        }
         if( in->p_access == NULL )
         {
             msg_Err( p_input, "open of `%s' failed: %s", psz_mrl,




More information about the vlc-devel mailing list