From 13d3e161d94c02bd9b5803f23399c8dc90dac3b1 Mon Sep 17 00:00:00 2001
From: Anton Podavalov <[email protected]>
Date: Thu, 14 Jul 2011 18:08:44 +0400
Subject: [PATCH] Add another portion of virStream bindings
Recv, RecvAll, Ref.
---
Stream.cs | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++------
Types.cs | 15 +++++++++++++++
2 files changed, 69 insertions(+), 6 deletions(-)
diff --git a/Stream.cs b/Stream.cs
index 428df90..b349605 100644
--- a/Stream.cs
+++ b/Stream.cs
@@ -94,12 +94,60 @@ namespace Libvirt
/// <returns>the new stream, or NULL upon error</returns>
[DllImport("libvirt-0.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "virStreamNew")]
public static extern int New(IntPtr conn, uint flags);
-
- // TODO virStreamRecv
-
- // TODO virStreamRecvAll
-
- // TODO virStreamRef
+ /// <summary>
+ /// Reads a series of bytes from the stream. This method may block the calling application
+ /// for an arbitrary amount of time. Errors are not guaranteed to be reported synchronously
+ /// with the call, but may instead be delayed until a subsequent call.
+ /// </summary>
+ /// <param name="stream">
+ /// pointer to the stream object
+ /// </param>
+ /// <param name="data">
+ /// buffer to read into from stream
+ /// </param>
+ /// <param name="size">
+ /// size of @data buffer
+ /// </param>
+ /// <returns>
+ /// completion. Returns -1 upon error, at which time the stream will be marked as aborted,
+ /// and the caller should now release the stream with virStreamFree. Returns -2 if there is no
+ /// data pending to be read & the stream is marked as non-blocking.
+ /// </returns>
+ [DllImport("libvirt-0.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "virStreamRecv")]
+ public static extern int Recv(IntPtr stream, IntPtr data, int size);
+ /// <summary>
+ /// Receive the entire data stream, sending the data to the requested data sink. This is simply a
+ /// convenient alternative to virStreamRecv, for apps that do blocking-I/O.
+ /// </summary>
+ /// <param name="stream">
+ /// pointer to the stream object
+ /// </param>
+ /// <param name="handler">
+ /// sink callback for writing data to application
+ /// </param>
+ /// <param name="opaque">
+ /// application defined data
+ /// </param>
+ /// <returns>
+ /// 0 if all the data was successfully received. The caller should invoke virStreamFinish(st) to flush
+ /// the stream upon success and then virStreamFree Returns -1 upon any error, with virStreamAbort()
+ /// already having been called, so the caller need only call virStreamFree()
+ /// </returns>
+ [DllImport("libvirt-0.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "virStreamRecvAll")]
+ public static extern int RecvAll(IntPtr stream, [MarshalAs(UnmanagedType.FunctionPtr)] StreamSinkFunc handler, IntPtr opaque);
+ /// <summary>
+ /// Increment the reference count on the stream. For each additional call to this method, there shall be a
+ /// corresponding call to virStreamFree to release the reference count, once the caller no longer needs
+ /// the reference to this object.
+ /// </summary>
+ /// <param name="stream">
+ /// pointer to the stream
+ /// </param>
+ /// <returns>
+ /// 0 in case of success, -1 in case of failure
+ /// </returns>
+ [DllImport("libvirt-0.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "virStreamRef")]
+ public static extern int Ref(IntPtr stream);
// TODO virStreamSend
diff --git a/Types.cs b/Types.cs
index 67ea002..46c1d7e 100644
--- a/Types.cs
+++ b/Types.cs
@@ -126,6 +126,21 @@ namespace Libvirt
/// <param name="opaque">user data registered with handle</param>
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate void StreamEventCallback(IntPtr stream, int events, IntPtr opaque);
+ /// <summary>
+ /// The virStreamSinkFunc callback is used together with the virStreamRecvAll function for libvirt
+ /// to provide the data that has been received. The callback will be invoked multiple times, providing
+ /// data in small chunks. The application should consume up 'nbytes' from the 'data' array of data and
+ /// then return the number actual number of bytes consumed. The callback will continue to be invoked until
+ /// it indicates the end of the stream has been reached. A return value of -1 at any time will abort the
+ /// receive operation
+ /// </summary>
+ /// <param name="st">the stream object</param>
+ /// <param name="data">preallocated array to be filled with data</param>
+ /// <param name="nbytes">size of the data array</param>
+ /// <param name="opaque">optional application provided data</param>
+ /// <returns>the number of bytes filled, 0 upon end of file, or -1 upon error</returns>
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ public delegate int StreamSinkFunc(IntPtr st, IntPtr data, int nbytes, IntPtr opaque);
#endregion
#region structs
--
1.7.4.1
--
libvir-list mailing list
[email protected]
https://www.redhat.com/mailman/listinfo/libvir-list