The native virStreamSend function is meant to be used to transfer
byte data.
Wrapping the function to use a Java String as the data depends on
the default charset of the JVM and might impose further problems
transferring \0 characters.
Use a byte Array as the parameter type instead, as for virStreamRecv.
Add the Stream.receive(byte[]) method which should be used instead
of the legacy Stream.receive(String) method. The old method is kept
for backward compatibility, but marked as deprecated.
---
src/main/java/org/libvirt/Stream.java | 27 +++++++++++++++++++++++++--
src/main/java/org/libvirt/jna/Libvirt.java | 2 +-
2 files changed, 26 insertions(+), 3 deletions(-)
diff --git a/src/main/java/org/libvirt/Stream.java
b/src/main/java/org/libvirt/Stream.java
index bd8e87f..404c9a0 100644
--- a/src/main/java/org/libvirt/Stream.java
+++ b/src/main/java/org/libvirt/Stream.java
@@ -142,6 +142,27 @@ public class Stream {
}
/**
+ * Write the data of the given string to a stream.
+ *
+ * @param data
+ * the string data to write
+ * @return the number of bytes written, -1 on error, -2 if the buffer is
+ * full
+ * @throws LibvirtException
+ *
+ * @deprecated This libvirt API was previously wrapped incorrectly, since
+ * the native function is meant to transfer bytes, not string
+ * data.<p>
+ * Its effect depends on the default Charset on your platform
+ * which is determined on JVM startup.<p>
+ * Use the {@link #send(byte[])} method instead.
+ */
+ @Deprecated
+ public int send(String data) throws LibvirtException {
+ return send(data.getBytes(java.nio.charset.Charset.defaultCharset()));
+ }
+
+ /**
* Write a series of bytes to the stream.
*
* @param data
@@ -149,9 +170,11 @@ public class Stream {
* @return the number of bytes written, -1 on error, -2 if the buffer is
* full
* @throws LibvirtException
+ *
+ * @since 1.5.2
*/
- public int send(String data) throws LibvirtException {
- int returnValue = libvirt.virStreamSend(VSP, data, new
NativeLong(data.length()));
+ public int send(byte[] data) throws LibvirtException {
+ int returnValue = libvirt.virStreamSend(VSP, data, new NativeLong(data.length));
processError();
return returnValue;
}
diff --git a/src/main/java/org/libvirt/jna/Libvirt.java
b/src/main/java/org/libvirt/jna/Libvirt.java
index 813f09b..98f2125 100644
--- a/src/main/java/org/libvirt/jna/Libvirt.java
+++ b/src/main/java/org/libvirt/jna/Libvirt.java
@@ -368,7 +368,7 @@ public interface Libvirt extends Library {
int virStreamFinish(StreamPointer virStreamPtr) ;
int virStreamFree(StreamPointer virStreamPtr) ;
StreamPointer virStreamNew(ConnectionPointer virConnectPtr, int flags) ;
- int virStreamSend(StreamPointer virStreamPtr, String data, NativeLong size);
+ int virStreamSend(StreamPointer virStreamPtr, byte[] data, NativeLong size);
int virStreamSendAll(StreamPointer virStreamPtr, Libvirt.VirStreamSourceFunc handler,
Pointer opaque);
int virStreamRecv(StreamPointer virStreamPtr, byte[] data, NativeLong length);
int virStreamRecvAll(StreamPointer virStreamPtr, Libvirt.VirStreamSinkFunc handler,
Pointer opaque);
--
1.8.5.2.msysgit.0