package jnr.posix;
import jnr.ffi.
Runtime;
import jnr.ffi.
Memory;
import jnr.ffi.
Pointer;
import jnr.ffi.
StructLayout;
import java.nio.
ByteBuffer;
/**
* @author Bob McWhirter
*/
public class
BaseIovec implements
Iovec {
public static class
Layout extends
StructLayout {
protected
Layout(
Runtime runtime) {
super(
runtime);
}
public final
Pointer iov_base = new
Pointer();
public final
size_t iov_len = new
size_t();
}
public static final
Layout layout = new
Layout(
Runtime.
getSystemRuntime());
private final
NativePOSIX posix;
protected final
Pointer memory;
public
String toString(
String indent) {
StringBuffer buf = new
StringBuffer();
buf.
append(
indent ).
append( "iovec {\n" );
buf.
append(
indent).
append( " iov_base=" ).
append(
layout.
iov_base.
get(this.
memory)).
append( ",\n" );
buf.
append(
indent ).
append( " iov_len=" ).
append(
layout.
iov_len.
get( this.
memory ) ).
append(",\n");
buf.
append(
indent).
append( "}" );
return
buf.
toString();
}
protected
BaseIovec(
NativePOSIX posix) {
this.
posix =
posix;
this.
memory =
Memory.
allocate(
posix.
getRuntime(),
layout.
size());
}
BaseIovec(
NativePOSIX posix,
Pointer memory) {
this.
posix =
posix;
this.
memory =
memory;
}
public
ByteBuffer get() {
int
len =
getLen();
byte[]
bytes = new byte[
len];
layout.
iov_base.
get( this.
memory ).
get(0,
bytes, 0,
len );
return
ByteBuffer.
wrap(
bytes );
}
public void
set(
ByteBuffer buf) {
int
len =
buf.
remaining();
layout.
iov_base.
set( this.
memory,
Pointer.
wrap(
posix.
getRuntime(),
buf ) );
setLen(
len);
}
protected void
setLen(int
len) {
layout.
iov_len.
set( this.
memory,
len );
}
protected int
getLen() {
return (int)
layout.
iov_len.
get( this.
memory );
}
}