nkeynes@1097 | 1 | /**
|
nkeynes@1097 | 2 | * $Id$
|
nkeynes@1097 | 3 | *
|
nkeynes@1097 | 4 | * Copyright (c) 2009 Nathan Keynes.
|
nkeynes@1097 | 5 | *
|
nkeynes@1097 | 6 | * Internal CD-ROM implementation header
|
nkeynes@1097 | 7 | *
|
nkeynes@1097 | 8 | * This program is free software; you can redistribute it and/or modify
|
nkeynes@1097 | 9 | * it under the terms of the GNU General Public License as published by
|
nkeynes@1097 | 10 | * the Free Software Foundation; either version 2 of the License, or
|
nkeynes@1097 | 11 | * (at your option) any later version.
|
nkeynes@1097 | 12 | *
|
nkeynes@1097 | 13 | * This program is distributed in the hope that it will be useful,
|
nkeynes@1097 | 14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
nkeynes@1097 | 15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
nkeynes@1097 | 16 | * GNU General Public License for more details.
|
nkeynes@1097 | 17 | */
|
nkeynes@1097 | 18 |
|
nkeynes@1097 | 19 | #ifndef cdrom_cdimpl_H
|
nkeynes@1097 | 20 | #define cdrom_cdimpl_H 1
|
nkeynes@1097 | 21 |
|
nkeynes@1097 | 22 | #include "drivers/cdrom/cdrom.h"
|
nkeynes@1097 | 23 | #include "drivers/cdrom/drive.h"
|
nkeynes@1097 | 24 | #include <stdio.h>
|
nkeynes@1097 | 25 |
|
nkeynes@1097 | 26 | #ifdef __cplusplus
|
nkeynes@1097 | 27 | extern "C" {
|
nkeynes@1097 | 28 | #endif
|
nkeynes@1097 | 29 |
|
nkeynes@1097 | 30 | /**
|
nkeynes@1097 | 31 | * Disc factory implementation, to construct cdrom_disc_t objects from a file
|
nkeynes@1097 | 32 | * (if possible).
|
nkeynes@1097 | 33 | */
|
nkeynes@1097 | 34 | typedef struct cdrom_disc_factory {
|
nkeynes@1097 | 35 | /* Human-readable name for the discs constructed by the factory */
|
nkeynes@1097 | 36 | const char *display_name;
|
nkeynes@1097 | 37 | /* Default file extension for supported discs */
|
nkeynes@1097 | 38 | const char *extension;
|
nkeynes@1097 | 39 |
|
nkeynes@1097 | 40 | /* Test if the given file is facially valid for the factory
|
nkeynes@1097 | 41 | * (that is, it passes all file magic etc checks)
|
nkeynes@1097 | 42 | */
|
nkeynes@1097 | 43 | gboolean (*is_valid_file)(FILE *f);
|
nkeynes@1097 | 44 |
|
nkeynes@1097 | 45 | /* Perform any additional initialization needed for the disc type
|
nkeynes@1097 | 46 | * (run after the default initialization). May be NULL if no init
|
nkeynes@1097 | 47 | * is needed
|
nkeynes@1097 | 48 | * @return TRUE on success, FALSE on error.
|
nkeynes@1097 | 49 | */
|
nkeynes@1097 | 50 | gboolean (*init)(cdrom_disc_t disc, ERROR *err);
|
nkeynes@1097 | 51 |
|
nkeynes@1097 | 52 | /* Read the table of contents from the given file, and update the disc
|
nkeynes@1097 | 53 | * accordingly. On error, set the err message and return FALSE.
|
nkeynes@1097 | 54 | */
|
nkeynes@1097 | 55 | gboolean (*read_toc)(cdrom_disc_t disc, ERROR *err);
|
nkeynes@1097 | 56 |
|
nkeynes@1097 | 57 | } *cdrom_disc_factory_t;
|
nkeynes@1097 | 58 |
|
nkeynes@1097 | 59 | /**
|
nkeynes@1097 | 60 | * Low-level SCSI transport provided to the main SCSI/MMC driver. When used
|
nkeynes@1097 | 61 | * this will be set as the disc->impl_data field.
|
nkeynes@1097 | 62 | * Note: For symmetry there should be a packet_write variant, but we don't
|
nkeynes@1097 | 63 | * currently need it for anything. YAGNI, etc.
|
nkeynes@1097 | 64 | */
|
nkeynes@1097 | 65 | typedef struct cdrom_scsi_transport {
|
nkeynes@1097 | 66 | /* Execute a read command (ie a command that returns a block of data in
|
nkeynes@1097 | 67 | * response, not necessarily a CD read).
|
nkeynes@1097 | 68 | * @param disc The disc to execute the command
|
nkeynes@1097 | 69 | * @param cmd The 12-byte command packet
|
nkeynes@1097 | 70 | * @param buf The buffer to receive the read results
|
nkeynes@1097 | 71 | * @param length On entry, the size of buf. Modified on exit to the number
|
nkeynes@1097 | 72 | * of bytes actually read.
|
nkeynes@1097 | 73 | * @return PKT_ERR_OK on success, otherwise the host error code.
|
nkeynes@1097 | 74 | */
|
nkeynes@1097 | 75 | cdrom_error_t (*packet_read)( struct cdrom_disc *disc,
|
nkeynes@1097 | 76 | char *cmd, unsigned char *buf,
|
nkeynes@1097 | 77 | unsigned int *length );
|
nkeynes@1097 | 78 |
|
nkeynes@1097 | 79 | /* Execute a generic command that does not write or return any data.
|
nkeynes@1097 | 80 | * (eg play audio).
|
nkeynes@1097 | 81 | * @param scsi The disc to execute the command
|
nkeynes@1097 | 82 | * @param cmd The 12-byte command packet
|
nkeynes@1097 | 83 | * @return PKT_ERR_OK on success, otherwise the host error code.
|
nkeynes@1097 | 84 | */
|
nkeynes@1097 | 85 | cdrom_error_t (*packet_cmd)( struct cdrom_disc *disc,
|
nkeynes@1097 | 86 | char *cmd );
|
nkeynes@1097 | 87 |
|
nkeynes@1097 | 88 | /* Return TRUE if the media has changed since the last call, otherwise
|
nkeynes@1097 | 89 | * FALSE. This method is used to implement the disc-level check_status
|
nkeynes@1097 | 90 | * and should have no side-effects.
|
nkeynes@1097 | 91 | */
|
nkeynes@1097 | 92 | gboolean (*media_changed)( struct cdrom_disc *disc );
|
nkeynes@1097 | 93 | } *cdrom_scsi_transport_t;
|
nkeynes@1097 | 94 |
|
nkeynes@1097 | 95 | #define SCSI_TRANSPORT(disc) ((cdrom_scsi_transport_t)disc->impl_data)
|
nkeynes@1097 | 96 |
|
nkeynes@1097 | 97 | /**
|
nkeynes@1097 | 98 | * Initialize a previously allocated cdrom_disc_t.
|
nkeynes@1097 | 99 | */
|
nkeynes@1097 | 100 | cdrom_disc_t cdrom_disc_init( cdrom_disc_t disc, const char *filename );
|
nkeynes@1097 | 101 |
|
nkeynes@1097 | 102 | /**
|
nkeynes@1097 | 103 | * Allocate and initialize a new cdrom_disc_t with the defaults for image files
|
nkeynes@1097 | 104 | */
|
nkeynes@1097 | 105 | cdrom_disc_t cdrom_disc_new( const char *name, ERROR *err );
|
nkeynes@1097 | 106 |
|
nkeynes@1097 | 107 | /**
|
nkeynes@1097 | 108 | * Read the table of contents from a scsi disc.
|
nkeynes@1097 | 109 | */
|
nkeynes@1097 | 110 | gboolean cdrom_disc_scsi_read_toc( cdrom_disc_t disc, ERROR *err );
|
nkeynes@1097 | 111 |
|
nkeynes@1097 | 112 | /**
|
nkeynes@1097 | 113 | * Allocate and initialize a new cdrom_disc_t using a scsi transport.
|
nkeynes@1097 | 114 | */
|
nkeynes@1097 | 115 | cdrom_disc_t cdrom_disc_scsi_new( const char *name, cdrom_scsi_transport_t transport, ERROR *err );
|
nkeynes@1097 | 116 |
|
nkeynes@1097 | 117 | /**
|
nkeynes@1097 | 118 | * Allocate and initialize a new cdrom_disc_t using a scsi transport and an
|
nkeynes@1097 | 119 | * open file
|
nkeynes@1097 | 120 | */
|
nkeynes@1097 | 121 | cdrom_disc_t cdrom_disc_scsi_new_file( FILE *f, const char *filename, cdrom_scsi_transport_t transport, ERROR *err );
|
nkeynes@1097 | 122 |
|
nkeynes@1097 | 123 |
|
nkeynes@1097 | 124 | void cdrom_disc_scsi_init( cdrom_disc_t disc, cdrom_scsi_transport_t scsi );
|
nkeynes@1097 | 125 |
|
nkeynes@1097 | 126 | /**
|
nkeynes@1097 | 127 | * Compute derived values for the TOC where they have not already been set
|
nkeynes@1097 | 128 | * - Determine disc leadout from end of the last track
|
nkeynes@1097 | 129 | * - Set the disc type to the based on the track types present.
|
nkeynes@1097 | 130 | */
|
nkeynes@1097 | 131 | void cdrom_disc_finalize_toc( cdrom_disc_t disc );
|
nkeynes@1097 | 132 |
|
nkeynes@1097 | 133 | /**
|
nkeynes@1097 | 134 | * Clear all TOC values in preparation for replacing with a new TOC
|
nkeynes@1097 | 135 | */
|
nkeynes@1097 | 136 | void cdrom_disc_clear_toc( cdrom_disc_t disc );
|
nkeynes@1097 | 137 |
|
nkeynes@1097 | 138 | /**
|
nkeynes@1097 | 139 | * Re-read the table of contents of the disc
|
nkeynes@1097 | 140 | */
|
nkeynes@1097 | 141 | gboolean cdrom_disc_read_toc( cdrom_disc_t disc, ERROR *err );
|
nkeynes@1097 | 142 |
|
nkeynes@1097 | 143 | /**
|
nkeynes@1097 | 144 | * track source for a host CD-ROM device, for use by host implementations
|
nkeynes@1097 | 145 | */
|
nkeynes@1097 | 146 | sector_source_t track_sector_source_new( cdrom_disc_t disc, sector_mode_t mode, cdrom_lba_t lba, cdrom_count_t count );
|
nkeynes@1097 | 147 |
|
nkeynes@1097 | 148 | /**
|
nkeynes@1097 | 149 | * Get the base file used by the cdrom, or NULL if there is no such file.
|
nkeynes@1097 | 150 | */
|
nkeynes@1097 | 151 | FILE *cdrom_disc_get_base_file( cdrom_disc_t disc );
|
nkeynes@1097 | 152 |
|
nkeynes@1097 | 153 | #define cdrom_disc_get_base_fd(disc) fileno(cdrom_disc_get_base_file(disc))
|
nkeynes@1097 | 154 |
|
nkeynes@1097 | 155 | /**
|
nkeynes@1097 | 156 | * Default disc destructor method
|
nkeynes@1097 | 157 | */
|
nkeynes@1097 | 158 | void default_cdrom_disc_destroy( sector_source_t device );
|
nkeynes@1097 | 159 |
|
nkeynes@1097 | 160 | /******************** Physical drive support *********************/
|
nkeynes@1097 | 161 |
|
nkeynes@1097 | 162 | /**
|
nkeynes@1097 | 163 | * Add a physical drive to the list.
|
nkeynes@1097 | 164 | * @return the new cdrom_drive_t entry. If the drive was already in the list,
|
nkeynes@1097 | 165 | * returns the existing entry instead and does not add a new one.
|
nkeynes@1097 | 166 | */
|
nkeynes@1097 | 167 | cdrom_drive_t cdrom_drive_add( const char *name, const char *display_name, cdrom_drive_open_fn_t open_fn );
|
nkeynes@1097 | 168 |
|
nkeynes@1097 | 169 | /**
|
nkeynes@1097 | 170 | * Remove a physical drive from the list, specified by name.
|
nkeynes@1097 | 171 | * @return TRUE if the drive was removed, FALSE if the drive was not in the list.
|
nkeynes@1097 | 172 | */
|
nkeynes@1097 | 173 | gboolean cdrom_drive_remove( const char *name );
|
nkeynes@1097 | 174 |
|
nkeynes@1097 | 175 | /**
|
nkeynes@1097 | 176 | * Clear the cdrom drive list.
|
nkeynes@1097 | 177 | */
|
nkeynes@1097 | 178 | void cdrom_drive_remove_all();
|
nkeynes@1097 | 179 |
|
nkeynes@1097 | 180 | /************************* MMC support ***************************/
|
nkeynes@1097 | 181 |
|
nkeynes@1097 | 182 | /**
|
nkeynes@1097 | 183 | * Parse a standard MMC format-2 TOC into the disc structure.
|
nkeynes@1097 | 184 | */
|
nkeynes@1097 | 185 | void mmc_parse_toc2( cdrom_disc_t disc, unsigned char *buf );
|
nkeynes@1097 | 186 |
|
nkeynes@1097 | 187 | /**
|
nkeynes@1097 | 188 | * Read a standard MMC inquiry response, returning a newly allocated string
|
nkeynes@1097 | 189 | * of the form "<vendor> <product> <revision>"
|
nkeynes@1097 | 190 | */
|
nkeynes@1097 | 191 | const char *mmc_parse_inquiry( unsigned char *buf );
|
nkeynes@1097 | 192 |
|
nkeynes@1097 | 193 |
|
nkeynes@1097 | 194 |
|
nkeynes@1097 | 195 | #ifdef __cplusplus
|
nkeynes@1097 | 196 | }
|
nkeynes@1097 | 197 | #endif
|
nkeynes@1097 | 198 |
|
nkeynes@1097 | 199 | #endif /* !cdrom_cdimpl_H */
|