big file support
[pandora-libraries.git] / lib / pnd_desktop.c
index 4bb8130..5420116 100644 (file)
@@ -413,7 +413,7 @@ unsigned char pnd_emit_icon ( char *targetpath, pnd_disco_t *p ) {
 
   // prelim .. if a pnd file, and no offset found, discovery code didn't locate icon.. so bail.
   if ( ( p -> object_type == pnd_object_type_pnd ) &&
-       ( ! p -> pnd_icon_pos ) )
+       ( ! p -> pnd_icon_pos64 ) )
   {
     return ( 0 ); // discover code didn't find it, so FAIL
   }
@@ -437,7 +437,7 @@ unsigned char pnd_emit_icon ( char *targetpath, pnd_disco_t *p ) {
     return ( 0 );
   }
 
-  unsigned int len;
+  off_t len;
 
   target = fopen ( buffer, "wb" );
 
@@ -447,15 +447,19 @@ unsigned char pnd_emit_icon ( char *targetpath, pnd_disco_t *p ) {
     return ( 0 );
   }
 
-  fseek ( pnd, 0, SEEK_END );
-  len = ftell ( pnd );
-  //fseek ( pnd, 0, SEEK_SET );
+  fseeko ( pnd, 0, SEEK_END );
+  len = ftello ( pnd );
 
-  fseek ( pnd, p -> pnd_icon_pos, SEEK_SET );
+  fseeko ( pnd, p -> pnd_icon_pos64, SEEK_SET );
 
-  len -= p -> pnd_icon_pos;
+  len -= p -> pnd_icon_pos64;
 
-  pnd_log ( PND_LOG_DEFAULT, "    Emit icon, length: %u\n", len );
+  if ( len <= 0 ) {
+    fclose ( pnd );
+    return ( 0 );
+  }
+
+  pnd_log ( PND_LOG_DEFAULT, "    Emit icon, length: %u\n", (int)len );
 
   while ( len ) {
 
@@ -718,7 +722,7 @@ unsigned char *pnd_emit_icon_to_buffer ( pnd_disco_t *p, unsigned int *r_buflen
 
   // prelim .. if a pnd file, and no offset found, discovery code didn't locate icon.. so bail.
   if ( ( p -> object_type == pnd_object_type_pnd ) &&
-       ( ! p -> pnd_icon_pos ) )
+       ( ! p -> pnd_icon_pos64 ) )
   {
     return ( NULL ); // discover code didn't find it, so FAIL
   }
@@ -739,15 +743,19 @@ unsigned char *pnd_emit_icon_to_buffer ( pnd_disco_t *p, unsigned int *r_buflen
   }
 
   // determine length of file, then adjust by icon position to find begin of icon
-  unsigned int len;
+  off_t len;
 
-  fseek ( pnd, 0, SEEK_END );
-  len = ftell ( pnd );
-  //fseek ( pnd, 0, SEEK_SET );
+  fseeko ( pnd, 0, SEEK_END );
+  len = ftello ( pnd );
 
-  fseek ( pnd, p -> pnd_icon_pos, SEEK_SET );
+  fseeko ( pnd, p -> pnd_icon_pos64, SEEK_SET );
 
-  len -= p -> pnd_icon_pos;
+  len -= p -> pnd_icon_pos64;
+
+  if ( len <= 0 ) {
+    fclose ( pnd );
+    return ( NULL );
+  }
 
   // create target buffer
   target = malloc ( len );
@@ -1010,7 +1018,7 @@ pnd_disco_t *pnd_parse_dotdesktop ( char *ddpath, unsigned int flags ) {
       return ( NULL );
     } else {
       char hack [ 100 ];
-      snprintf ( hack, 100, "inode-%lu", statbuf.st_ino );
+      snprintf ( hack, 100, "inode-%lu", (long)statbuf.st_ino );
       p -> unique_id = strdup ( hack );
     }
   }