]> git.sesse.net Git - vlc/commitdiff
First pass at Media Resource Locator parsing in the rc interface. It allows the follo...
authorJean-Paul Saman <jpsaman@videolan.org>
Sun, 7 Nov 2004 14:17:31 +0000 (14:17 +0000)
committerJean-Paul Saman <jpsaman@videolan.org>
Sun, 7 Nov 2004 14:17:31 +0000 (14:17 +0000)
add dvd:///dev/dvd:sout='#std{mux="ts",access="udp",url="127.0.0.1:1234"}'
add dvd:///dev/dvd --sout '#std{mux="ts",access="udp",url="127.0.0.1:1234"}'

modules/control/rc.c

index 40f7d09b7165080e17f7b4a29ddea27027eb0368..c2ba149c02e02fb8d849cbc1fbae27fe17ff3b21 100644 (file)
@@ -5,6 +5,7 @@
  * $Id$
  *
  * Author: Peter Surda <shurdeek@panorama.sth.ac.at>
+ *         Jean-Paul Saman <M2X>
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -71,6 +72,8 @@ static void Run          ( intf_thread_t * );
 
 static vlc_bool_t ReadCommand( intf_thread_t *, char *, int * );
 
+static void mrl_Split( vlc_object_t *, char const *, char **, char **, int * );
+
 static int  Input        ( vlc_object_t *, char const *,
                            vlc_value_t, vlc_value_t, void * );
 static int  Playlist     ( vlc_object_t *, char const *,
@@ -825,9 +828,38 @@ static int Playlist( vlc_object_t *p_this, char const *psz_cmd,
     }
     else if( !strcmp( psz_cmd, "add" ) )
     {
+        playlist_item_t *p_item = NULL;
+        char *psz_options = NULL;
+        char *psz_uri = NULL;
+        int i_count = 0;
+        int i = 0;
+        int i_id;
+
         msg_rc( _("trying to add %s to playlist\n"), newval.psz_string );
-        playlist_Add( p_playlist, newval.psz_string, newval.psz_string,
-                      PLAYLIST_GO|PLAYLIST_APPEND, PLAYLIST_END );
+        mrl_Split( p_this, newval.psz_string, &psz_uri, &psz_options, &i_count );
+
+        msg_Dbg( p_intf, "found [%s] with options [%s] to playlist", psz_uri, psz_options );
+
+        /* Create a playlist Item */
+        p_item = playlist_ItemNew( p_intf, (const char*)psz_uri, (const char *)newval.psz_string );
+        if( !p_item )
+        {
+            msg_rc( _("failed adding %s to playlist\n"), newval.psz_string);
+            goto failed;
+        }
+
+        /* Insert options */
+        for( i=0; i < i_count; i++ )
+        {
+            playlist_ItemAddOption( p_item, psz_options );
+        }
+        i_id = playlist_AddItem( p_playlist, p_item,
+                             PLAYLIST_GO|PLAYLIST_APPEND, PLAYLIST_END );
+        if( i_id < 0 )
+        {
+            msg_rc( _("(%d) failed adding %s to playlist\n"), i_id, newval.psz_string );
+            goto failed;
+        }
     }
     else if( !strcmp( psz_cmd, "playlist" ) )
     {
@@ -850,10 +882,15 @@ static int Playlist( vlc_object_t *p_this, char const *psz_cmd,
     else
     {
         msg_rc( _("unknown command!\n") );
+        goto failed;
     }
 
     vlc_object_release( p_playlist );
     return VLC_SUCCESS;
+
+failed:
+    vlc_object_release( p_playlist );
+    return VLC_EGENERIC;
 }
 
 static int Other( vlc_object_t *p_this, char const *psz_cmd,
@@ -1195,3 +1232,63 @@ vlc_bool_t ReadCommand( intf_thread_t *p_intf, char *p_buffer, int *pi_size )
 
     return VLC_FALSE;
 }
+
+static void mrl_Split( vlc_object_t *p_this, char const *psz_mrl, char **ppsz_uri, char **ppsz_options, int *i_count )
+{
+    char *psz_name = strdup( psz_mrl );
+    char *psz_parser = psz_name;
+
+    char *psz_option = "";
+    char *psz_protocol = psz_parser;
+    *i_count = 0;
+    vlc_bool_t b_found = VLC_FALSE;
+
+    msg_Dbg( p_this, "Parsing %s for MRL options", psz_mrl );
+    while( *psz_parser && *psz_parser != '\0' && b_found == VLC_FALSE )
+    {
+        if( *psz_parser == ':' )
+        {   /* Found first (protocol/demux) part of MRL */
+            *psz_parser++;
+            while( *psz_parser && *psz_parser != '\0' )
+            {
+                if( *psz_parser == ':' )
+                {   
+                    *psz_parser++ = '\0';    /* terminate first part of MRL */
+                    psz_option = psz_parser; /* options start here */
+                    b_found = VLC_TRUE;
+                    break;
+                }
+                else if( *psz_parser == ' ' )
+                {
+                    /* Should be followed by '--<protocol>[/<demux>] <options>' part */
+                    *psz_parser++ = '\0';
+                    if( *psz_parser && *psz_parser == '-' )
+                        psz_parser++;
+                    if( *psz_parser && *psz_parser == '-' )
+                        *psz_parser++ = '\0';
+                    psz_option = psz_parser; /* options start here */
+                    b_found = VLC_TRUE;
+                    /* Keep <protocol>[/<demux>] part and replace ' ' by ':' */
+                    while( *psz_parser && *psz_parser != '\0' )
+                    {
+                        if( *psz_parser == ' ' )
+                        {
+                            *psz_parser++ = '=';
+                            break;
+                        }
+                        psz_parser++;
+                    }
+                    break;
+                }
+                psz_parser++;
+            }
+        }
+        psz_parser++;
+    }
+
+    *i_count = 1;
+    (*ppsz_uri) = strdup( psz_protocol );
+    (*ppsz_options) = strdup( psz_option );
+    msg_Dbg( p_this, "Leaving mrl_Split(psz_mrl, %s, %s, %d)", *ppsz_uri, *ppsz_options, *i_count );
+    free( psz_name );
+}