]> git.sesse.net Git - vlc/blobdiff - modules/access/zip/zipstream.c
Update LGPL license blurb, choosing v2.1+.
[vlc] / modules / access / zip / zipstream.c
index 0250312cbee0bdc247d5ff8043233ef884d77b40..ac3f87cf30fa5368982acf8d5c111e90117d0b54 100644 (file)
@@ -52,8 +52,7 @@ vlc_module_begin()
         set_subcategory( SUBCAT_INPUT_ACCESS )
         set_description( N_( "Zip access" ) )
         set_capability( "access", 0 )
-        add_shortcut( "unzip" )
-        add_shortcut( "zip" )
+        add_shortcut( "unzip", "zip" )
         set_callbacks( AccessOpen, AccessClose )
 vlc_module_end()
 
@@ -67,6 +66,7 @@ static int Control( stream_t *, int i_query, va_list );
 typedef struct node node;
 typedef struct item item;
 
+static int Fill( stream_t * );
 static int CreatePlaylist( stream_t *s, char **pp_buffer );
 static int GetFilesInZip( stream_t*, unzFile, vlc_array_t*, vlc_array_t* );
 static node* findOrCreateParentNode( node *root, const char *fullpath );
@@ -205,8 +205,8 @@ int StreamOpen( vlc_object_t *p_this )
     if( !p_sys->zipFile )
     {
         msg_Warn( s, "unable to open file" );
-        free( p_sys );
         free( p_sys->fileFunctions );
+        free( p_sys );
         return VLC_EGENERIC;
     }
 
@@ -214,8 +214,8 @@ int StreamOpen( vlc_object_t *p_this )
     char *psz_tmp;
     if( asprintf( &psz_tmp, "%s.xspf", s->psz_path ) == -1 )
     {
-        free( p_sys );
         free( p_sys->fileFunctions );
+        free( p_sys );
         return VLC_ENOMEM;
     }
     p_sys->psz_path = s->psz_path;
@@ -232,6 +232,9 @@ void StreamClose( vlc_object_t *p_this )
     stream_t *s = (stream_t*)p_this;
     stream_sys_t *p_sys = s->p_sys;
 
+    if( p_sys->zipFile )
+        unzClose( p_sys->zipFile );
+
     free( p_sys->fileFunctions );
     free( p_sys->psz_xspf );
     free( p_sys->psz_path );
@@ -249,21 +252,14 @@ static int Read( stream_t *s, void *p_read, unsigned int i_read )
 {
     stream_sys_t *p_sys = s->p_sys;
 
-    if( !p_read ) return 0;
-
     /* Fill the buffer */
-    if( p_sys->psz_xspf == NULL )
-    {
-        int i_ret = CreatePlaylist( s, &p_sys->psz_xspf );
-        if( i_ret < 0 )
-            return -1;
-        p_sys->i_len = strlen( p_sys->psz_xspf );
-        p_sys->i_pos = 0;
-    }
+    if( Fill( s ) )
+        return -1;
 
     /* Read the buffer */
-    int i_len = __MIN( i_read, p_sys->i_len - p_sys->i_pos );
-    memcpy( p_read, p_sys->psz_xspf + p_sys->i_pos, i_len );
+    unsigned i_len = __MIN( i_read, p_sys->i_len - p_sys->i_pos );
+    if( p_read )
+        memcpy( p_read, p_sys->psz_xspf + p_sys->i_pos, i_len );
     p_sys->i_pos += i_len;
 
     return i_len;
@@ -277,15 +273,8 @@ static int Peek( stream_t *s, const uint8_t **pp_peek, unsigned int i_peek )
     stream_sys_t *p_sys = s->p_sys;
 
     /* Fill the buffer */
-    if( p_sys->psz_xspf == NULL )
-    {
-        int i_ret = CreatePlaylist( s, &p_sys->psz_xspf );
-        if( i_ret < 0 )
-            return -1;
-        p_sys->i_len = strlen( p_sys->psz_xspf );
-        p_sys->i_pos = 0;
-    }
-
+    if( Fill( s ) )
+        return -1;
 
     /* Point to the buffer */
     int i_len = __MIN( i_peek, p_sys->i_len - p_sys->i_pos );
@@ -305,27 +294,27 @@ static int Control( stream_t *s, int i_query, va_list args )
     {
         case STREAM_SET_POSITION:
         {
-            int64_t i_position = (int64_t)va_arg( args, int64_t );
+            uint64_t i_position = va_arg( args, uint64_t );
             if( i_position >= p_sys->i_len )
                 return VLC_EGENERIC;
             else
             {
-                p_sys->i_len = (size_t) i_position;
+                p_sys->i_pos = (size_t) i_position;
                 return VLC_SUCCESS;
             }
         }
 
         case STREAM_GET_POSITION:
         {
-            int64_t *pi_position = (int64_t*)va_arg( args, int64_t* );
+            uint64_t *pi_position = va_arg( args, uint64_t* );
             *pi_position = p_sys->i_pos;
             return VLC_SUCCESS;
         }
 
         case STREAM_GET_SIZE:
         {
-            int64_t *pi_size = (int64_t*)va_arg( args, int64_t* );
-            *pi_size = (int64_t) p_sys->i_len;
+            uint64_t *pi_size = va_arg( args, uint64_t* );
+            *pi_size = p_sys->i_len;
             return VLC_SUCCESS;
         }
 
@@ -344,34 +333,53 @@ static int Control( stream_t *s, int i_query, va_list args )
     }
 }
 
+static int Fill( stream_t *s )
+{
+    stream_sys_t *p_sys = s->p_sys;
+
+    if( p_sys->psz_xspf )
+        return VLC_SUCCESS;
+
+    if( CreatePlaylist( s, &p_sys->psz_xspf ) < 0 )
+        return VLC_EGENERIC;
+
+    p_sys->i_len = strlen( p_sys->psz_xspf );
+    p_sys->i_pos = 0;
+    return VLC_SUCCESS;
+}
+
 static int CreatePlaylist( stream_t *s, char **pp_buffer )
 {
+    stream_sys_t *p_sys = s->p_sys;
+
+    unzFile file = p_sys->zipFile;
+    if( !file )
+        return -1;
+
     /* Get some infos about zip archive */
     int i_ret = 0;
-    unzFile file = s->p_sys->zipFile;
     vlc_array_t *p_filenames = vlc_array_new(); /* Will contain char* */
 
     /* List all file names in Zip archive */
     i_ret = GetFilesInZip( s, file, p_filenames, NULL );
     if( i_ret < 0 )
     {
-        unzClose( file );
         i_ret = -1;
         goto exit;
     }
 
-    /* Close archive */
-    unzClose( file );
-    s->p_sys->zipFile = NULL;
-
     /* Construct the xspf playlist */
-    i_ret = WriteXSPF( pp_buffer, p_filenames, s->p_sys->psz_path );
+    i_ret = WriteXSPF( pp_buffer, p_filenames, p_sys->psz_path );
     if( i_ret > 0 )
         i_ret = 1;
     else if( i_ret < 0 )
         i_ret = -1;
 
 exit:
+    /* Close archive */
+    unzClose( file );
+    p_sys->zipFile = NULL;
+
     for( int i = 0; i < vlc_array_count( p_filenames ); i++ )
     {
         free( vlc_array_item_at_index( p_filenames, i ) );