1 /* 2 * Copyright (C) 2003-2009 JNode.org 3 * 2009,2010 Matthias Treydte <mt@waldheinz.de> 4 * 5 * This library is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU Lesser General Public License as published 7 * by the Free Software Foundation; either version 2.1 of the License, or 8 * (at your option) any later version. 9 * 10 * This library is distributed in the hope that it will be useful, but 11 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 12 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public 13 * License for more details. 14 * 15 * You should have received a copy of the GNU Lesser General Public License 16 * along with this library; If not, write to the Free Software Foundation, Inc., 17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 18 */ 19 20 package de.waldheinz.fs; 21 22 import java.io.IOException; 23 import java.nio.ByteBuffer; 24 25 /** 26 * This is the abstraction used for a device that can hold a {@link FileSystem}. 27 * 28 * @author Ewout Prangsma <epr at jnode.org> 29 * @author Matthias Treydte <waldheinz at gmail.com> 30 */ 31 public interface BlockDevice { 32 33 /** 34 * Gets the total length of this device in bytes. 35 * 36 * @return the total number of bytes on this device 37 * @throws IOException on error getting the size of this device 38 */ getSize()39 public abstract long getSize() throws IOException; 40 41 /** 42 * Read a block of data from this device. 43 * 44 * @param devOffset the byte offset where to read the data from 45 * @param dest the destination buffer where to store the data read 46 * @throws IOException on read error 47 */ read(long devOffset, ByteBuffer dest)48 public abstract void read(long devOffset, ByteBuffer dest) 49 throws IOException; 50 51 /** 52 * Writes a block of data to this device. 53 * 54 * @param devOffset the byte offset where to store the data 55 * @param src the source {@code ByteBuffer} to write to the device 56 * @throws ReadOnlyException if this {@code BlockDevice} is read-only 57 * @throws IOException on write error 58 * @throws IllegalArgumentException if the {@code devOffset} is negative 59 * or the write would go beyond the end of the device 60 * @see #isReadOnly() 61 */ write(long devOffset, ByteBuffer src)62 public abstract void write(long devOffset, ByteBuffer src) 63 throws ReadOnlyException, IOException, 64 IllegalArgumentException; 65 66 /** 67 * Flushes data in caches to the actual storage. 68 * 69 * @throws IOException on write error 70 */ flush()71 public abstract void flush() throws IOException; 72 73 /** 74 * Returns the size of a sector on this device. 75 * 76 * @return the sector size in bytes 77 * @throws IOException on error determining the sector size 78 */ getSectorSize()79 public int getSectorSize() throws IOException; 80 81 /** 82 * Closes this {@code BlockDevice}. No methods of this device may be 83 * accesses after this method was called. 84 * 85 * @throws IOException on error closing this device 86 * @see #isClosed() 87 */ close()88 public void close() throws IOException; 89 90 /** 91 * Checks if this device was already closed. No methods may be called 92 * on a closed device (except this method). 93 * 94 * @return if this device is closed 95 */ isClosed()96 public boolean isClosed(); 97 98 /** 99 * Checks if this {@code BlockDevice} is read-only. 100 * 101 * @return if this {@code BlockDevice} is read-only 102 */ isReadOnly()103 public boolean isReadOnly(); 104 105 } 106