diff src/audacious/vfs_common.c @ 4129:d9870d3e9550

Fix downloading of dynamically generated content with vfs_get_file_contents(). (Bugzilla #46)
author Maciej Grela <thermal@o2.pl>
date Fri, 28 Dec 2007 04:31:02 -0600
parents f1c756f39e6c
children 694ce1a806f8
line wrap: on
line diff
--- a/src/audacious/vfs_common.c	Thu Dec 27 20:55:05 2007 +0100
+++ b/src/audacious/vfs_common.c	Fri Dec 28 04:31:02 2007 -0600
@@ -142,22 +142,57 @@
 vfs_file_get_contents(const gchar *filename, gchar **buf, gsize *size)
 {
     VFSFile *fd;
-
+    size_t filled_size = 0;
+    size_t buf_size = 4096;
+    gchar *ptr;
+    
     fd = vfs_fopen(filename, "rb");
 
     if (fd == NULL)
         return;
 
-    vfs_fseek(fd, 0, SEEK_END);
-    *size = vfs_ftell(fd);
+    if ( vfs_fseek(fd, 0, SEEK_END) == 0) { // seeking supported by VFS backend
+	    *size = vfs_ftell(fd);
+
+	    *buf = g_new(gchar, *size);
+    
+	    if (*buf == NULL)
+    		goto close_handle;
 
-    *buf = g_new(gchar, *size);
+	    vfs_fseek(fd, 0, SEEK_SET);
+	    vfs_fread(*buf, 1, *size, fd);
 
+	    goto close_handle;
+    }
+
+
+    *buf = g_new(gchar, buf_size);
+    
     if (*buf == NULL)
-        return;
+    	goto close_handle;
 
-    vfs_fseek(fd, 0, SEEK_SET);
-    vfs_fread(*buf, 1, *size, fd);
+    ptr=*buf;
+    while ( 1 ) {
+	    size_t read_size = vfs_fread(ptr, 1, buf_size - filled_size, fd);
+	    if ( read_size == 0 ) break;
+	    
+	    filled_size+=read_size;
+	    ptr+=read_size;
+	    
+	    if ( filled_size == buf_size ) {
+		    buf_size+=4096;
+		    
+		    *buf = g_realloc(*buf, buf_size);
+		    
+		    if ( *buf == NULL )
+			goto close_handle;
+			
+		    ptr=*buf + filled_size;
+	    }
+    }
 
-    vfs_fclose(fd);
+    *size = filled_size;
+    
+    close_handle:
+    vfs_fclose(fd);    
 }