package org.libvirt; import org.libvirt.jna.Libvirt; import org.libvirt.jna.StreamPointer; import com.sun.jna.NativeLong; public class Stream { public static int VIR_STREAM_NONBLOCK = (1 << 0); /** * the native virStreamPtr. */ StreamPointer VSP; /** * The Connect Object that represents the Hypervisor of this Domain */ private Connect virConnect; /** * The libvirt connection from the hypervisor */ protected Libvirt libvirt; Stream(Connect virConnect, StreamPointer VSP) { this.virConnect = virConnect; this.VSP = VSP; libvirt = virConnect.libvirt; } /** * Request that the in progress data transfer be cancelled abnormally before * the end of the stream has been reached */ public int abort() throws LibvirtException { int returnValue = libvirt.virStreamAbort(VSP); processError(); return returnValue; } /** * Register a callback to be notified when a stream becomes writable, or * readable. * * @see <a * href="http://www.libvirt.org/html/libvirt-libvirt.html#virStreamEventAddCallback">Libvirt * Docs</a> * @param events * the events to monitor * @param cb * the callback method * @return 0 for success, -1 for failure * @throws LibvirtException */ public int addCallback(int events, Libvirt.VirStreamEventCallback cb) throws LibvirtException { int returnValue = libvirt.virStreamEventAddCallback(VSP, events, cb, null, null); processError(); return returnValue; } @Override public void finalize() throws LibvirtException { free(); } /** * Indicate that there is no further data is to be transmitted on the * stream. * * @return 0 if success, -1 if failure * @throws LibvirtException */ public int finish() throws LibvirtException { int returnValue = libvirt.virStreamFinish(VSP); processError(); return returnValue; } /** * Decrement the reference count on a stream, releasing the stream object if * the reference count has hit zero. * * @throws LibvirtException * @return 0 on success, or -1 on error. */ public int free() throws LibvirtException { int success = 0; if (VSP != null) { success = libvirt.virStreamFree(VSP); processError(); VSP = null; } return success; } /** * Error handling logic to throw errors. Must be called after every libvirt * call. */ protected void processError() throws LibvirtException { virConnect.processError(); } /** * Receieves data from teh stream into the buffer provided. * * @param data * the put the sata into * @return the number of bytes read, -1 on error, -2 if the buffer is empty * @throws LibvirtException */ public int receive(byte[] data) throws LibvirtException { int returnValue = libvirt.virStreamRecv(VSP, data, new NativeLong(data.length)); processError(); return returnValue; } /** * Batch receive method * * @see http://www.libvirt.org/html/libvirt-libvirt.html#virStreamRecvAll * @param handler * the callback handler * @return 0 if successfule, -1 otherwise * @throws LibvirtException */ public int receiveAll(Libvirt.VirStreamSinkFunc handler) throws LibvirtException { int returnValue = libvirt.virStreamRecvAll(VSP, handler, null); processError(); return returnValue; } /** * Remove an event callback from the stream * * @see <a * href="http://www.libvirt.org/html/libvirt-libvirt.html#virStreamEventRemoveCallback">Libvirt * Docs</a> * @return 0 for success, -1 for failure * @throws LibvirtException */ public int removeCallback() throws LibvirtException { int returnValue = libvirt.virStreamEventRemoveCallback(VSP); processError(); return returnValue; } /** * Write a series of bytes to the stream. * * @param data * the data to write * @return the number of bytes written, -1 on error, -2 if the buffer is * full * @throws LibvirtException */ public int send(String data) throws LibvirtException { int returnValue = libvirt.virStreamSend(VSP, data, new NativeLong(data.length())); processError(); return returnValue; } /** * Batch send method * * @see <a * href="http://www.libvirt.org/html/libvirt-libvirt.html#virStreamSendAll">Libvirt * Documentation</a> * @param handler * the callback handler * @return 0 if successfule, -1 otherwise * @throws LibvirtException */ public int sendAll(Libvirt.VirStreamSourceFunc handler) throws LibvirtException { int returnValue = libvirt.virStreamSendAll(VSP, handler, null); processError(); return returnValue; } /** * Changes the set of events to monitor for a stream. * * @see <a * href="http://www.libvirt.org/html/libvirt-libvirt.html#virStreamEventUpdateCallback">Libvirt * Docs</a> * @param events * the events to monitor * @return 0 for success, -1 for failure * @throws LibvirtException */ public int updateCallback(int events) throws LibvirtException { int returnValue = libvirt.virStreamEventUpdateCallback(VSP, events); processError(); return returnValue; } }