/* JPC: An x86 PC Hardware Emulator for a pure Java Virtual Machine Release Version 2.4 A project from the Physics Dept, The University of Oxford Copyright (C) 2007-2010 The University of Oxford This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License version 2 as published by the Free Software Foundation. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Details (including contact information) can be found at: jpc.sourceforge.net or the developer website sourceforge.net/projects/jpc/ Conceived and Developed by: Rhys Newman, Ian Preston, Chris Dennis End of licence header */ package org.jpc.support; /** * A <code>RawBlockDevice</code> instance representing a cdrom device. * Instances of this class will report cdrom-like geometries and behaviours. In * particular it supports locking and ejecting of drives, and will always be * read-only. * @author Chris Dennis */ public class CDROMBlockDevice extends RawBlockDevice { private boolean locked; /** * Create a device backed by the given <code>SeekableIODevice</code> object. * @param data backing device */ public CDROMBlockDevice(SeekableIODevice data) { super(data); } /** * Create a device with no backing storage. This is the equivalent of a * cdrom drive with no disc inserted. */ public CDROMBlockDevice() { this(null); } public void close() { super.close(); eject(); } public boolean isLocked() { return locked; } public boolean isReadOnly() { return true; } /** * Locks or unlocks the drive to prevents or allow the ejection or insertion * of discs. * @param locked <code>true</code> to lock the device */ public void setLock(boolean locked) { this.locked = locked; } /** * Inserts the given media into this device. If the drive contains a disc * then this is first ejected. If the drive is locked then insertion will * fail. * @param media disc to insert * @return <code>true</code> if insertion was successful */ public boolean insert(SeekableIODevice media) { if (!eject()) return false; setData(media); return true; } /** * Ejects the current disc (if any). If the drive is locked then ejection * will fail regardless of whether there is a disc in the drive. * @return <code>true</code> if ejection was successful */ public boolean eject() { if (isLocked()) return false; setData(null); return true; } /** * Hard coded to return the type constant for a cdrom device. * @return <code>TYPE_CDROM</code> */ public Type getType() { return Type.CDROM; } public int getCylinders() { return 2; } public int getHeads() { return 16; } public int getSectors() { return 63; } public String toString() { return "CDROM: " + super.toString(); } }