summaryrefslogblamecommitdiffstats
path: root/src/main/java/org/openslx/libvirt/domain/device/Video.java
blob: a674715464372ea84385f88285f4c0f30d3f4c75 (plain) (tree)








































































                                                                                                 
                                                                                                                       
                                

                                                                                                                                                 

























                                                                                                 
                                                                                                               
                        

                                                                                                                                         




                                                                       








                                                                                




























































                                                                                                     
                                                                                                













                                                                          
package org.openslx.libvirt.domain.device;

import org.openslx.libvirt.xml.LibvirtXmlNode;

/**
 * A video (GPU) device node in a Libvirt domain XML document.
 * 
 * @author Manuel Bentele
 * @version 1.0
 */
public class Video extends Device
{
	/**
	 * Creates an empty video device.
	 */
	public Video()
	{
		super();
	}

	/**
	 * Creates a video device representing an existing Libvirt XML video device element.
	 * 
	 * @param xmlNode existing Libvirt XML video device element.
	 */
	public Video( LibvirtXmlNode xmlNode )
	{
		super( xmlNode );
	}

	/**
	 * Returns hardware model of the video device.
	 * 
	 * @return hardware model of the video device.
	 */
	public Model getModel()
	{
		String model = this.getXmlElementAttributeValue( "model", "type" );
		return Model.fromString( model );
	}

	/**
	 * Sets hardware model for the video device.
	 * 
	 * @param model hardware model for the video device.
	 */
	public void setModel( Model model )
	{
		this.setXmlElementAttributeValue( "model", "type", model.toString() );
	}

	/**
	 * Checks whether 2D hardware video acceleration is turned on or off.
	 * 
	 * @return state of 2D hardware video acceleration.
	 */
	public boolean get2DAcceleration()
	{
		return this.getXmlElementAttributeValueAsBool( "model/acceleration", "accel2d" );
	}

	/**
	 * Turns 2D hardware video acceleration on or off.
	 * 
	 * @param acceleration state of 2D hardware video acceleration.
	 */
	public void set2DAcceleration( boolean acceleration )
	{
		Model model = this.getModel();

		if ( model != null ) {
			if ( model == Model.VIRTIO ) {
				// only set acceleration on supported Virtio GPUs
				this.setXmlElementAttributeValueYesNo( "model/acceleration", "accel2d", acceleration );
			} else {
				String errorMsg =
						"Video card model '" + model.toString() + "' does not support enabled 2D hardware acceleration.";
				throw new IllegalArgumentException( errorMsg );
			}
		}
	}

	/**
	 * Checks whether 3D hardware video acceleration is turned on or off.
	 * 
	 * @return state of 3D hardware video acceleration.
	 */
	public boolean get3DAcceleration()
	{
		return this.getXmlElementAttributeValueAsBool( "model/acceleration", "accel3d" );
	}

	/**
	 * Turns 3D hardware video acceleration on or off.
	 * 
	 * @param acceleration state of 3D hardware video acceleration.
	 */
	public void set3DAcceleration( boolean acceleration )
	{
		Model model = this.getModel();

		if ( model == Model.VIRTIO ) {
			// only set acceleration on supported Virtio GPUs
			this.setXmlElementAttributeValueYesNo( "model/acceleration", "accel3d", acceleration );
		} else {
			String errorMsg =
					"Video card model '" + model.toString() + "' does not support enabled 3D hardware acceleration.";
			throw new IllegalArgumentException( errorMsg );
		}
	}

	/**
	 * Disables the video device by setting the model to {@link Model#NONE}.
	 */
	public void disable()
	{
		this.removeXmlElementChilds();
		this.setModel( Model.NONE );
	}

	/**
	 * Creates a non-existent video device as Libvirt XML device element.
	 * 
	 * @param xmlNode Libvirt XML node of the Libvirt XML device that is created.
	 * @return created video device instance.
	 */
	public static Video createInstance( LibvirtXmlNode xmlNode )
	{
		return Video.newInstance( xmlNode );
	}

	/**
	 * Creates a video device representing an existing Libvirt XML video device element.
	 * 
	 * @param xmlNode existing Libvirt XML video device element.
	 * @return video device instance.
	 */
	public static Video newInstance( LibvirtXmlNode xmlNode )
	{
		return new Video( xmlNode );
	}

	/**
	 * Model of video device.
	 * 
	 * @author Manuel Bentele
	 * @version 1.0
	 */
	public enum Model
	{
		// @formatter:off
		NONE  ( "none" ),
		QXL   ( "qxl" ),
		VGA   ( "vga" ),
		VMVGA ( "vmvga" ),
		VIRTIO( "virtio" );
		// @formatter:on

		/**
		 * Name of the video device model.
		 */
		private String model = null;

		/**
		 * Creates video device model.
		 * 
		 * @param type valid name of the video device model in a Libvirt domain XML document.
		 */
		Model( String model )
		{
			this.model = model;
		}

		@Override
		public String toString()
		{
			return this.model;
		}

		/**
		 * Creates video device model from its name with error check.
		 * 
		 * @param model name of the video device model in a Libvirt domain XML document.
		 * @return valid video device model.
		 */
		public static Model fromString( String model )
		{
			for ( Model m : Model.values() ) {
				if ( m.model.equalsIgnoreCase( model ) ) {
					return m;
				}
			}

			return null;
		}
	}
}