summaryrefslogblamecommitdiffstats
path: root/src/main/java/org/openslx/virtualization/disk/DiskImageUtils.java
blob: 6bcef7fd1d58c189e30fa4fa7274db0923faecf0 (plain) (tree)
1
                                        


















































































































                                                                                                          
                                                                                                                                      

                                                                     

                                                                                 
                                                                         
           
                                                                                    
           
                                                                                                      














                                                                                        
                              
         
 
package org.openslx.virtualization.disk;

import java.io.IOException;
import java.io.RandomAccessFile;

/**
 * Utilities to parse disk image format elements and control versions of disk images.
 * 
 * @author Manuel Bentele
 * @version 1.0
 */
public class DiskImageUtils
{
	/**
	 * Returns the size of a specified disk image file.
	 * 
	 * @param diskImage file to a disk storing the image content.
	 * @return size of the disk image file in bytes.
	 * 
	 * @throws DiskImageException unable to obtain the size of the disk image file.
	 */
	public static long getImageSize( RandomAccessFile diskImage ) throws DiskImageException
	{
		final long imageSize;

		try {
			imageSize = diskImage.length();
		} catch ( IOException e ) {
			throw new DiskImageException( e.getLocalizedMessage() );
		}

		return imageSize;
	}

	/**
	 * Reads two bytes ({@link Short}) at a given <code>offset</code> from the specified disk image
	 * file.
	 * 
	 * @param diskImage file to a disk storing the image content.
	 * @param offset offset in bytes for reading the two bytes.
	 * @return value of the two bytes from the disk image file as {@link Short}.
	 * 
	 * @throws DiskImageException unable to read two bytes from the disk image file.
	 */
	public static short readShort( RandomAccessFile diskImage, long offset ) throws DiskImageException
	{
		final long imageSize = DiskImageUtils.getImageSize( diskImage );
		short value = 0;

		if ( imageSize >= ( offset + Short.BYTES ) ) {
			try {
				diskImage.seek( offset );
				value = diskImage.readShort();
			} catch ( IOException e ) {
				throw new DiskImageException( e.getLocalizedMessage() );
			}
		}

		return value;
	}

	/**
	 * Reads four bytes ({@link Integer}) at a given <code>offset</code> from the specified disk
	 * image file.
	 * 
	 * @param diskImage file to a disk storing the image content.
	 * @param offset offset in bytes for reading the four bytes.
	 * @return value of the four bytes from the disk image file as {@link Integer}.
	 * 
	 * @throws DiskImageException unable to read four bytes from the disk image file.
	 */
	public static int readInt( RandomAccessFile diskImage, long offset ) throws DiskImageException
	{
		final long imageSize = DiskImageUtils.getImageSize( diskImage );
		int value = 0;

		if ( imageSize >= ( offset + Integer.BYTES ) ) {
			try {
				diskImage.seek( offset );
				value = diskImage.readInt();
			} catch ( IOException e ) {
				throw new DiskImageException( e.getLocalizedMessage() );
			}
		}

		return value;
	}

	/**
	 * Reads eight bytes ({@link Long}) at a given <code>offset</code> from the specified disk image
	 * file.
	 * 
	 * @param diskImage file to a disk storing the image content.
	 * @param offset offset in bytes for reading the eight bytes.
	 * @return value of the eight bytes from the disk image file as {@link Long}.
	 * 
	 * @throws DiskImageException unable to read eight bytes from the disk image file.
	 */
	public static long readLong( RandomAccessFile diskImage, long offset ) throws DiskImageException
	{
		final long imageSize = DiskImageUtils.getImageSize( diskImage );
		long value = 0;

		if ( imageSize >= ( offset + Long.BYTES ) ) {
			try {
				diskImage.seek( offset );
				value = diskImage.readLong();
			} catch ( IOException e ) {
				throw new DiskImageException( e.getLocalizedMessage() );
			}
		}

		return value;
	}

	/**
	 * Reads a variable number of bytes (<code>numBytes</code>) at a given <code>offset</code> from the specified disk image file.
	 * 
	 * @param diskImage file to a disk storing the image content.
	 * @param offset offset in bytes for reading <code>numBytes</code> bytes.
	 * @param numBytes number of bytes to read at <code>offset</code>.
	 * @return read bytes from the disk image file as {@link byte[]}.
	 * 
	 * @throws DiskImageException unable to read bytes from the disk image file.
	 */
	public static byte[] readBytesAsArray( RandomAccessFile diskImage, long offset, int numBytes )
			throws DiskImageException
	{
		final long imageSize = DiskImageUtils.getImageSize( diskImage );
		byte values[] = {};

		if ( imageSize >= ( offset + numBytes ) ) {
			try {
				diskImage.seek( offset );
				values = new byte[ numBytes ];
				diskImage.readFully( values );
			} catch ( IOException e ) {
				throw new DiskImageException( e.getLocalizedMessage() );
			}
		}

		return values;
	}
}