package net.fusejna;
import java.util.Arrays;
import java.util.List;
import net.fusejna.types.TypeOff;
import net.fusejna.types.TypePid;
import com.sun.jna.Structure;
public abstract class StructFlock extends Structure
{
public static enum FlockType
{
READ_LOCK, WRITE_LOCK, NO_LOCK;
public static FlockType fromBits(final long bits)
{
switch ((int) bits) {
case F_RDLCK:
return READ_LOCK;
case F_WRLCK:
return WRITE_LOCK;
case F_UNLCK:
return NO_LOCK;
}
return null;
}
public long getBits()
{
switch (this) {
case READ_LOCK:
return F_RDLCK;
case WRITE_LOCK:
return F_WRLCK;
case NO_LOCK:
return F_UNLCK;
}
return -1;
}
}
public static final class FlockWrapper
{
private final StructFlock structFlock;
private final String path;
FlockWrapper(final String path, final StructFlock structFlock)
{
this.path = path;
this.structFlock = structFlock;
}
FlockWrapper(final StructFlock structFlock)
{
this(null, structFlock);
}
public final FlockType flockType()
{
return FlockType.fromBits(type());
}
public final FlockWrapper flockType(final FlockType type)
{
return type(type.getBits());
}
public final long len()
{
return structFlock.l_len();
}
public final FlockWrapper len(final long l_len)
{
structFlock.l_len(l_len);
return this;
}
public final long pid()
{
return structFlock.l_pid();
}
public final FlockWrapper pid(final long l_pid)
{
structFlock.l_pid(l_pid);
return this;
}
public final long start()
{
return structFlock.l_start();
}
public final FlockWrapper start(final long l_start)
{
structFlock.l_start(l_start);
return this;
}
public final long sysid()
{
return structFlock.l_sysid();
}
public final FlockWrapper sysid(final long l_sysid)
{
structFlock.l_sysid(l_sysid);
return this;
}
@Override
public final String toString()
{
if (path != null) {
return path + "\n" + structFlock;
}
return structFlock.toString();
}
public final long type()
{
return structFlock.l_type();
}
public final FlockWrapper type(final long l_type)
{
structFlock.l_type(l_type);
return this;
}
public final long whence()
{
return structFlock.l_whence();
}
public final FlockWrapper whence(final long l_whence)
{
structFlock.l_whence(l_whence);
return this;
}
final void write()
{
structFlock.write();
}
}
public static class FreeBSD extends StructFlock
{
public static final class ByReference extends FreeBSD implements Structure.ByReference
{
}
public static final class ByValue extends FreeBSD implements Structure.ByValue
{
}
public static final List<String> FIELD_ORDER = Arrays.asList("l_start", "l_len", "l_pid", "l_type", "l_whence",
"l_sysid");
public TypeOff l_start;
public TypeOff l_len;
public TypePid l_pid;
public short l_type;
public short l_whence;
public int l_sysid;
@Override
protected List<String> getFieldOrder()
{
return FIELD_ORDER;
}
@Override
final long l_len()
{
return l_len.longValue();
}
@Override
final void l_len(final long l_len)
{
this.l_len.setValue(l_len);
}
@Override
final long l_pid()
{
return l_pid.longValue();
}
@Override
final void l_pid(final long l_pid)
{
this.l_pid.setValue(l_pid);
}
@Override
final long l_start()
{
return l_start.longValue();
}
@Override
final void l_start(final long l_start)
{
this.l_start.setValue(l_start);
}
@Override
final long l_sysid()
{
return l_sysid;
}
@Override
final void l_sysid(final long l_sysid)
{
this.l_sysid = (int) l_sysid;
}
@Override
final long l_type()
{
return l_type;
}
@Override
final void l_type(final long l_type)
{
this.l_type = (short) l_type;
}
@Override
final long l_whence()
{
return l_whence;
}
@Override
final void l_whence(final long l_whence)
{
this.l_whence = (short) l_whence;
}
}
public static class NotFreeBSD extends StructFlock
{
public static final class ByReference extends FreeBSD implements Structure.ByReference
{
}
public static final class ByValue extends FreeBSD implements Structure.ByValue
{
}
public static final List<String> FIELD_ORDER = Arrays.asList("l_type", "l_whence", "l_start", "l_len", "l_pid");
public short l_type;
public short l_whence;
public TypeOff l_start;
public TypeOff l_len;
public TypePid l_pid;
@Override
protected List<String> getFieldOrder()
{
return FIELD_ORDER;
}
@Override
final long l_len()
{
return l_len.longValue();
}
@Override
final void l_len(final long l_len)
{
this.l_len.setValue(l_len);
}
@Override
final long l_pid()
{
return l_pid.longValue();
}
@Override
final void l_pid(final long l_pid)
{
this.l_pid.setValue(l_pid);
}
@Override
final long l_start()
{
return l_start.longValue();
}
@Override
final void l_start(final long l_start)
{
this.l_start.setValue(l_start);
}
@Override
final long l_sysid()
{
return -1L;
}
@Override
final void l_sysid(final long l_sysid)
{
// Not implemented
}
@Override
final long l_type()
{
return l_type;
}
@Override
final void l_type(final long l_type)
{
this.l_type = (short) l_type;
}
@Override
final long l_whence()
{
return l_whence;
}
@Override
final void l_whence(final long l_whence)
{
this.l_whence = (short) l_whence;
}
}
public static final int F_RDLCK = 0;
public static final int F_WRLCK = 1;
public static final int F_UNLCK = 2;
abstract long l_len();
abstract void l_len(long l_len);
abstract long l_pid();
abstract void l_pid(long l_pid);
abstract long l_start();
abstract void l_start(long l_start);
abstract long l_sysid();
abstract void l_sysid(long l_sysid);
abstract long l_type();
abstract void l_type(long l_type);
abstract long l_whence();
abstract void l_whence(long l_whence);
}