]> git.sesse.net Git - vlc/blobdiff - plugins/dvd/dvd_udf.c
*Removed an occurance of former angle item in gtk.
[vlc] / plugins / dvd / dvd_udf.c
index 8147aa4f5cdcfa71ef559d7cabb26c88420276d8..4ee667e38578f86afbc438fa3d1fb120c8f8055d 100644 (file)
@@ -5,7 +5,7 @@
  * contains the basic udf handling functions
  *****************************************************************************
  * Copyright (C) 1998-2001 VideoLAN
- * $Id: dvd_udf.c,v 1.8 2001/05/31 03:12:49 sam Exp $
+ * $Id: dvd_udf.c,v 1.19 2002/03/06 01:20:56 stef Exp $
  *
  * Author: Stéphane Borel <stef@via.ecp.fr>
  *
  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
  *****************************************************************************/
 
-/*
+/*****************************************************************************
  * Preamble
- */
-#include "defs.h"
-
-#ifdef HAVE_CSS
-#   define MODULE_NAME dvd
-#else /* HAVE_CSS */
-#   define MODULE_NAME dvdnocss
-#endif /* HAVE_CSS */
-
-#include "modules_inner.h"
-
+ *****************************************************************************/
 #include <stdio.h>
 #include <string.h>
 #include <fcntl.h>
 
+#include <videolan/vlc.h>
+
 #ifdef HAVE_UNISTD_H
 #   include <unistd.h>
 #elif defined( _MSC_VER ) && defined( _WIN32 )
 #   include <strings.h>
 #endif
 
-#include "common.h"
-#include "intf_msg.h"
-#include "dvd_css.h"
+#ifdef GOD_DAMN_DMCA
+#   include "dummy_dvdcss.h"
+#else
+#   include <videolan/dvdcss.h>
+#endif
+
+#include "dvd.h"
 #include "dvd_ifo.h"
-#include "input_dvd.h"
 
 #define UDFADshort      1
 #define UDFADlong       2
 
 typedef struct partition_s
 {
-    boolean_t   b_valid;
-    u8          pi_volume_desc[128];
-    u16         i_flags;
-    u16         i_number;
-    u8          pi_contents[32];
-    u32         i_access_type;
-    u32         i_start;
-    u32         i_length;
-    int         i_fd;
+    boolean_t     b_valid;
+    u8            pi_volume_desc[128];
+    u16           i_flags;
+    u16           i_number;
+    u8            pi_contents[32];
+    u32           i_access_type;
+    u32           i_start;
+    u32           i_length;
+    dvdcss_handle dvdhandle;
 } partition_t;
 
 typedef struct ad_s
@@ -98,41 +93,16 @@ typedef struct ad_s
  *****************************************************************************
  * Returns number of read bytes on success, 0 on error
  *****************************************************************************/
-static int UDFReadLB( int i_fd, off_t i_lba, size_t i_block_count, u8 *pi_data )
+static int UDFReadLB( dvdcss_handle dvdhandle, off_t i_lba,
+                      size_t i_block_count, u8 *pi_data )
 {
-#if !defined( WIN32 )
-    if( i_fd < 0 )
-#else
-    DWORD read;
-
-    if( (HANDLE) i_fd == INVALID_HANDLE_VALUE )
-#endif
+    if( dvdcss_seek( dvdhandle, i_lba, DVDCSS_NOFLAGS ) < 0 )
     {
+        intf_ErrMsg( "dvd error: block %i not found", i_lba );
         return 0;
     }
 
-#if !defined( WIN32 )
-    if( lseek( i_fd, i_lba * (off_t) DVD_LB_SIZE, SEEK_SET ) < 0 )
-#else
-    if( SetFilePointer( (HANDLE) i_fd, i_lba * (off_t) DVD_LB_SIZE,
-        NULL, FILE_BEGIN ) == -1 )
-#endif
-    {
-        intf_ErrMsg( "UDF: Postion not found" );
-        return 0;
-    }
-
-#if !defined( WIN32 )
-    return read( i_fd, pi_data, i_block_count *DVD_LB_SIZE);
-#else
-    if(!ReadFile( (HANDLE) i_fd, pi_data, i_block_count * DVD_LB_SIZE,
-        &read, NULL) || read != i_block_count * DVD_LB_SIZE )
-    {
-        return 0;
-    }
-
-    return read;
-#endif
+    return dvdcss_read( dvdhandle, pi_data, i_block_count, DVDCSS_NOFLAGS );
 }
 
 
@@ -292,7 +262,7 @@ static int UDFLogVolume(u8 * pi_data, char * p_volume_descriptor )
 
     if( i_lb_size != DVD_LB_SIZE )
     {
-        intf_ErrMsg( "UDF: Non valid sector size (%d)", i_lb_size );
+        intf_ErrMsg( "dvd error: invalid UDF sector size (%d)", i_lb_size );
         return 1;
     }
 
@@ -405,7 +375,7 @@ static int UDFMapICB( struct ad_s icb, u8 * pi_file_type, struct ad_s * p_file,
 
     do
     {
-        if( !UDFReadLB( partition.i_fd, i_lba++, 1, pi_lb ) )
+        if( !UDFReadLB( partition.dvdhandle, i_lba++, 1, pi_lb ) )
         {
             i_tag_id = 0;
         }
@@ -449,7 +419,7 @@ static int UDFScanDir( struct ad_s dir, char * psz_filename,
 #if 0
     do
     {
-        if( !UDFReadLB( partition.i_fd, i_lba++, 1, pi_lb ) )
+        if( !UDFReadLB( partition.dvdhandle, i_lba++, 1, pi_lb ) )
         {
             i_tag_id = 0;
         }
@@ -481,7 +451,7 @@ static int UDFScanDir( struct ad_s dir, char * psz_filename,
 
 #else
 
-    if( UDFReadLB( partition.i_fd, i_lba, 2, pi_lb ) <= 0 ) {
+    if( UDFReadLB( partition.dvdhandle, i_lba, 2, pi_lb ) <= 0 ) {
         return 0;
     }
 
@@ -493,7 +463,7 @@ static int UDFScanDir( struct ad_s dir, char * psz_filename,
             ++i_lba;
             p -= DVD_LB_SIZE;
             dir.i_length -= DVD_LB_SIZE;
-            if( UDFReadLB( partition.i_fd, i_lba, 2, pi_lb ) <= 0 )
+            if( UDFReadLB( partition.dvdhandle, i_lba, 2, pi_lb ) <= 0 )
             {
                 return 0;
             }
@@ -550,7 +520,7 @@ static int UDFFindPartition( int i_part_nb, struct partition_s *p_partition )
     /* Search anchor loop */
     while( 1 )
     {
-        if( UDFReadLB( p_partition->i_fd, i_lba, 1, pi_anchor ) )
+        if( UDFReadLB( p_partition->dvdhandle, i_lba, 1, pi_anchor ) )
         {
             UDFDescriptor( pi_anchor, &i_tag_id );
         }
@@ -614,7 +584,7 @@ static int UDFFindPartition( int i_part_nb, struct partition_s *p_partition )
 
         do
         {
-            if( !UDFReadLB( p_partition->i_fd, i_lba++, 1, pi_lb ) )
+            if( !UDFReadLB( p_partition->dvdhandle, i_lba++, 1, pi_lb ) )
             {
                 i_tag_id = 0;
             }
@@ -665,13 +635,13 @@ static int UDFFindPartition( int i_part_nb, struct partition_s *p_partition )
 
 
 /*****************************************************************************
- * UDFFindFile: looks for a file on the UDF disc/imagefile
+ * DVDUDFFindFile: looks for a file on the UDF disc/imagefile
  *****************************************************************************
  * Path has to be the absolute pathname on the UDF filesystem,
  * starting with '/'.
  * returns absolute LB number, or 0 on error
  *****************************************************************************/
-u32 UDFFindFile( int i_fd, char * psz_path )
+u32 DVDUDFFindFile( dvdcss_handle dvdhandle, char * psz_path )
 {
     struct partition_s  partition;
     struct ad_s         root_icb;
@@ -688,13 +658,13 @@ u32 UDFFindFile( int i_fd, char * psz_path )
     strcat( psz_tokenline, psz_path );
 
     /* Init file descriptor of UDF filesystem (== DVD) */
-    partition.i_fd = i_fd;
+    partition.dvdhandle = dvdhandle;
 
     /* Find partition 0, standard partition for DVD-Video */
     i_partition = 0;
     if( !UDFFindPartition( i_partition, &partition ) )
     {
-        intf_ErrMsg( "UDF: Partition 0 not found" );
+        intf_ErrMsg( "dvd error: partition 0 not found" );
         return 0;
     }
   
@@ -703,7 +673,7 @@ u32 UDFFindFile( int i_fd, char * psz_path )
 
     do
     {
-        if( !UDFReadLB( i_fd, i_lba++, 1, pi_lb ) )
+        if( !UDFReadLB( dvdhandle, i_lba++, 1, pi_lb ) )
         {
             i_tag_id = 0;
         }
@@ -723,26 +693,26 @@ u32 UDFFindFile( int i_fd, char * psz_path )
 
     if( i_tag_id != 256 )
     {
-        intf_ErrMsg( "UDF: Bad descriptor" );
+        intf_ErrMsg( "dvd error: bad UDF descriptor" );
         return 0;
     }
     if( root_icb.i_partition != i_partition )
     {
-        intf_ErrMsg( "UDF: Bad partition" );
+        intf_ErrMsg( "dvd error: bad UDF partition" );
         return 0;
     }
   
     /* Find root dir */
     if( !UDFMapICB( root_icb, &i_file_type, &file, partition ) )
     {
-        intf_ErrMsg( "UDF: Can't find root dir" );
+        intf_ErrMsg( "dvd error: can't find root dir" );
         return 0;
     }
 
     /* root dir should be dir */
     if( i_file_type != 4 )
     {
-        intf_ErrMsg( "UDF: Root dir error" );
+        intf_ErrMsg( "dvd error: root dir error" );
         return 0;
     }
 
@@ -752,13 +722,13 @@ u32 UDFFindFile( int i_fd, char * psz_path )
     {
         if( !UDFScanDir( file, psz_token, &icb, partition ) )
         {
-            intf_ErrMsg( "UDF: Scan dir error" );
+            intf_ErrMsg( "dvd error: scan dir error" );
             return 0;
         }
 
         if( !UDFMapICB ( icb, &i_file_type, &file, partition ) )
         {
-            intf_ErrMsg( "UDF: ICB error" );
+            intf_ErrMsg( "dvd error: ICB error" );
             return 0;
         }