package info.kghost.android.openvpn; import java.io.File; import java.io.IOException; import java.nio.ByteBuffer; class ManagementSocket { protected int socket; protected native static int open(String socketFile); protected native static int read(int socket, ByteBuffer data, int offset, int length); protected native static int read(int socket, ByteBuffer data, int offset, int length, FileDescriptorHolder fd); protected native static int write(int socket, ByteBuffer data, int offset, int length); protected native static int write(int socket, ByteBuffer data, int offset, int length, FileDescriptorHolder fd); protected native static int close(int socket); protected native static int shutdown(int socket, int how); public ManagementSocket(File file) throws IOException { socket = open(file.getAbsolutePath()); } public void close() { close(socket); } public int shutdownInput() { return shutdown(socket, 0); } public int shutdownOutput() { return shutdown(socket, 1); } public int shutdownAll() { return shutdown(socket, 2); } public int read(ByteBuffer data) { int read = read(socket, data, data.limit(), data.capacity() - data.limit()); if (read > 0) { data.limit(data.limit() + read); } return read; } public int read(ByteBuffer data, FileDescriptorHolder fd) { int read = read(socket, data, data.limit(), data.capacity() - data.limit(), fd); if (read > 0) { data.limit(data.limit() + read); } return read; } public int write(ByteBuffer data) { int write = write(socket, data, data.position(), data.remaining()); if (write > 0) { data.position(data.position() + write); } return write; } public int write(ByteBuffer data, FileDescriptorHolder fd) { int write = write(socket, data, data.position(), data.remaining(), fd); if (write > 0) { data.position(data.position() + write); } return write; } }