X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Finterface%2Fintf_eject.c;h=87b9f7c5089fff2bb5625d947c7032e99216c6ff;hb=14f37b2101842fa6e427f962f689db74eff6faba;hp=615808998ab20e2fa742e95525b71c92a351b17e;hpb=bc061e8455fa11eec3167681d53f9df3974b13a5;p=vlc diff --git a/src/interface/intf_eject.c b/src/interface/intf_eject.c index 615808998a..87b9f7c508 100644 --- a/src/interface/intf_eject.c +++ b/src/interface/intf_eject.c @@ -1,13 +1,13 @@ /***************************************************************************** * intf_eject.c: CD/DVD-ROM ejection handling functions ***************************************************************************** - * Copyright (C) 2001, 2002 VideoLAN - * $Id: intf_eject.c,v 1.17 2002/11/11 14:39:12 sam Exp $ + * Copyright (C) 2001-2004 the VideoLAN team + * $Id$ * - * Author: Julien Blache for the Linux part - * with code taken from the Linux "eject" command - * Jon Lech Johansen for Darwin - * Xavier Marchesini for Win32 + * Authors: Julien Blache for the Linux part + * with code taken from the Linux "eject" command + * Jon Lech Johansen for Darwin + * Gildas Bazin for Win32 * * 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 @@ -21,20 +21,24 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ -#include +/** + * \file + * This file contain functions to eject CD and DVD drives + */ -#include -#include +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include #ifdef HAVE_UNISTD_H # include #endif -#include - #ifdef HAVE_FCNTL_H # include #endif @@ -43,7 +47,7 @@ # include #endif -#if defined(SYS_LINUX) && defined(HAVE_LINUX_VERSION_H) +#if defined(__linux__) && defined(HAVE_LINUX_VERSION_H) # include /* handy macro found in 2.1 kernels, but not in older ones */ # ifndef KERNEL_VERSION @@ -68,35 +72,15 @@ #endif #if defined( WIN32 ) && !defined( UNDER_CE ) -# include -# include -# include -# include -# include - -/* define the structures to eject under Win95/98/Me */ - -#if !defined (VWIN32_DIOC_DOS_IOCTL) -#define VWIN32_DIOC_DOS_IOCTL 1 - -typedef struct _DIOC_REGISTERS { - DWORD reg_EBX; - DWORD reg_EDX; - DWORD reg_ECX; - DWORD reg_EAX; - DWORD reg_EDI; - DWORD reg_ESI; - DWORD reg_Flags; -} DIOC_REGISTERS, *PDIOC_REGISTERS; -#endif /* VWIN32_DIOC_DOS_IOCTL */ - +# include #endif +#include /***************************************************************************** * Local prototypes *****************************************************************************/ -#if defined(SYS_LINUX) && defined(HAVE_LINUX_VERSION_H) +#if defined(__linux__) && defined(HAVE_LINUX_VERSION_H) static int EjectSCSI ( int i_fd ); #endif @@ -107,11 +91,19 @@ static int EjectSCSI ( int i_fd ); * returns 1 on failure * returns -1 if not implemented *****************************************************************************/ +/** + * \brief Ejects the CD /DVD + * \ingroup vlc_interface + * \param p_this the calling vlc_object_t + * \param psz_device the CD/DVD to eject + * \return 0 on success, 1 on failure, -1 if not implemented + */ int __intf_Eject( vlc_object_t *p_this, const char *psz_device ) { - int i_ret; + VLC_UNUSED(p_this); + int i_ret = VLC_SUCCESS; -#ifdef SYS_DARWIN +#ifdef __APPLE__ FILE *p_eject; char *psz_disk; char sz_cmd[32]; @@ -120,7 +112,7 @@ int __intf_Eject( vlc_object_t *p_this, const char *psz_device ) * The only way to cleanly unmount the disc under MacOS X * is to use the 'disktool' command line utility. It uses * the non-public Disk Arbitration API, which can not be - * used by Cocoa or Carbon applications. + * used by Cocoa or Carbon applications. */ if( ( psz_disk = (char *)strstr( psz_device, "disk" ) ) != NULL && @@ -152,73 +144,40 @@ int __intf_Eject( vlc_object_t *p_this, const char *psz_device ) } } - return 1; + return VLC_EGENERIC; #elif defined(UNDER_CE) msg_Warn( p_this, "CD-Rom ejection unsupported on this platform" ); - return 1; + return i_ret; #elif defined(WIN32) - HANDLE h_drive ; - TCHAR psz_drive_id[8] ; - DWORD dw_access_flags = GENERIC_READ ; - DWORD dw_result ; - LPTSTR psz_volume_format = TEXT("\\\\.\\%s") ; - BYTE by_drive ; - DIOC_REGISTERS regs = {0} ; - - /* Win2K ejection code */ - if ( GetVersion() < 0x80000000 ) - { - wsprintf(psz_drive_id, psz_volume_format, psz_device) ; - - msg_Dbg( p_this, "ejecting drive %s", psz_drive_id ); - - /* Create the file handle */ - h_drive = CreateFile( psz_drive_id, - dw_access_flags, - FILE_SHARE_READ | FILE_SHARE_WRITE, - NULL, - OPEN_EXISTING, - 0, - NULL ); - - if (h_drive == INVALID_HANDLE_VALUE ) - { - msg_Err( p_this, "could not create handle for device %s", - psz_device ); - } + MCI_OPEN_PARMS op; + MCI_STATUS_PARMS st; + DWORD i_flags; + char psz_drive[4]; - i_ret = DeviceIoControl ( h_drive, - IOCTL_STORAGE_EJECT_MEDIA, - NULL, 0, - NULL, 0, - &dw_result, - NULL); - return (i_ret) ; - } - else /* Win95/98/ME */ + memset( &op, 0, sizeof(MCI_OPEN_PARMS) ); + op.lpstrDeviceType = (LPCSTR)MCI_DEVTYPE_CD_AUDIO; + + strcpy( psz_drive, "X:" ); + psz_drive[0] = psz_device[0]; + op.lpstrElementName = psz_drive; + + /* Set the flags for the device type */ + i_flags = MCI_OPEN_TYPE | MCI_OPEN_TYPE_ID | + MCI_OPEN_ELEMENT | MCI_OPEN_SHAREABLE; + + if( !mciSendCommand( 0, MCI_OPEN, i_flags, (unsigned long)&op ) ) { - /* Create the handle to VWIN32 */ - h_drive = CreateFile ("\\\\.\\vwin32", 0, 0, NULL, 0, - FILE_FLAG_DELETE_ON_CLOSE, NULL ) ; - - /* Convert logical disk name to DOS-like disk name */ - by_drive = (toupper (*psz_device) - 'A') + 1; - - /* Let's eject now : Int 21H function 440DH minor code 49h*/ - regs.reg_EAX = 0x440D ; - regs.reg_EBX = by_drive ; - regs.reg_ECX = MAKEWORD(0x49 , 0x08) ; // minor code - - i_ret = DeviceIoControl (h_drive, VWIN32_DIOC_DOS_IOCTL, - ®s, sizeof(regs), ®s, sizeof(regs), - &dw_result, 0) ; - - CloseHandle (h_drive) ; - return (i_ret) ; + st.dwItem = MCI_STATUS_READY; + /* Eject disc */ + i_ret = mciSendCommand( op.wDeviceID, MCI_SET, MCI_SET_DOOR_OPEN, 0 ); + /* Release access to the device */ + mciSendCommand( op.wDeviceID, MCI_CLOSE, MCI_WAIT, 0 ); } + else i_ret = VLC_EGENERIC; + return i_ret; #else /* WIN32 */ int i_fd; @@ -226,14 +185,14 @@ int __intf_Eject( vlc_object_t *p_this, const char *psz_device ) /* This code could be extended to support CD/DVD-ROM chargers */ i_fd = open( psz_device, O_RDONLY | O_NONBLOCK ); - + if( i_fd == -1 ) { msg_Err( p_this, "could not open device %s", psz_device ); return VLC_EGENERIC; } -#if defined(SYS_LINUX) && defined(HAVE_LINUX_VERSION_H) +#if defined(__linux__) && defined(HAVE_LINUX_VERSION_H) /* Try a simple ATAPI eject */ i_ret = ioctl( i_fd, CDROMEJECT, 0 ); @@ -251,7 +210,7 @@ int __intf_Eject( vlc_object_t *p_this, const char *psz_device ) i_ret = ioctl( i_fd, CDROMEJECT, 0 ); #else - msg_Warn( p_this, "CD-Rom ejection unsupported on this platform" ); + msg_Warn( p_this, "CD-ROM ejection unsupported on this platform" ); i_ret = -1; #endif @@ -263,10 +222,17 @@ int __intf_Eject( vlc_object_t *p_this, const char *psz_device ) /* The following functions are local */ -#if defined(SYS_LINUX) && defined(HAVE_LINUX_VERSION_H) +#if defined(__linux__) && defined(HAVE_LINUX_VERSION_H) /***************************************************************************** * Eject using SCSI commands. Return 0 if successful *****************************************************************************/ +/** + * \brief Ejects the CD /DVD using SCSI commands + * \ingroup vlc_interface + * This function is local + * \param i_fd a device nummber + * \return 0 on success, VLC_EGENERIC on failure + */ static int EjectSCSI( int i_fd ) { int i_status; @@ -305,7 +271,7 @@ static int EjectSCSI( int i_fd ) { return VLC_EGENERIC; } - + scsi_cmd.inlen = 0; scsi_cmd.outlen = 0; scsi_cmd.cmd[0] = START_STOP; @@ -319,10 +285,10 @@ static int EjectSCSI( int i_fd ) { return VLC_EGENERIC; } - + /* Force kernel to reread partition table when new disc inserted */ i_status = ioctl( i_fd, BLKRRPART ); - + return i_status; } #endif