package php.runtime.ext.core.classes.net;
import php.runtime.Memory;
import php.runtime.common.HintType;
import php.runtime.env.Environment;
import php.runtime.lang.BaseObject;
import php.runtime.memory.LongMemory;
import php.runtime.memory.ObjectMemory;
import php.runtime.reflection.ClassEntity;
import java.io.IOException;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.SocketException;
import static php.runtime.annotation.Reflection.*;
@Name("php\\net\\ServerSocket")
public class WrapServerSocket extends BaseObject {
protected ServerSocket socket;
public WrapServerSocket(Environment env) {
super(env);
}
public WrapServerSocket(Environment env, ServerSocket socket) {
super(env);
setSocket(socket);
}
public WrapServerSocket(Environment env, ClassEntity clazz) {
super(env, clazz);
}
public ServerSocket getSocket() {
return socket;
}
public void setSocket(ServerSocket socket) {
this.socket = socket;
}
@Signature({
@Arg(value = "port", optional = @Optional("NULL")),
@Arg(value = "backLog", optional = @Optional(value = "50", type = HintType.INT))
})
public Memory __construct(Environment env, Memory... args) throws IOException {
if (args[0].isNull())
setSocket(new ServerSocket());
else
setSocket(new ServerSocket(args[0].toInteger(), args[1].toInteger()));
return Memory.NULL;
}
@Signature
public Memory accept(Environment env, Memory... args) throws IOException {
return new ObjectMemory(new WrapSocket(env, socket.accept()));
}
@Signature({@Arg("hostname"), @Arg("port"),
@Arg(value = "backLog", optional = @Optional(value = "50", type = HintType.INT))})
public Memory bind(Environment env, Memory... args) throws IOException {
socket.bind(new InetSocketAddress(args[0].toString(), args[1].toInteger()), args[2].toInteger());
return Memory.NULL;
}
@Signature
public Memory close(Environment env, Memory... args) throws IOException {
socket.close();
return Memory.NULL;
}
@Signature
public Memory isClosed(Environment env, Memory... args) {
return socket.isClosed() ? Memory.TRUE : Memory.FALSE;
}
@Signature
public Memory isBound(Environment env, Memory... args) {
return socket.isBound() ? Memory.TRUE : Memory.FALSE;
}
@Signature(@Arg("timeout"))
public Memory setSoTimeout(Environment env, Memory... args) throws SocketException {
socket.setSoTimeout(args[0].toInteger());
return Memory.NULL;
}
@Signature(@Arg("on"))
public Memory setReuseAddress(Environment env, Memory... args) throws SocketException {
socket.setReuseAddress(args[0].toBoolean());
return Memory.NULL;
}
@Signature(@Arg("size"))
public Memory setReceiveBufferSize(Environment env, Memory... args) throws SocketException {
socket.setReceiveBufferSize(args[0].toInteger());
return Memory.NULL;
}
@Signature({@Arg("connectTime"), @Arg("latency"), @Arg("bandWidth")})
public Memory setPerformancePreferences(Environment env, Memory... args) throws SocketException {
socket.setPerformancePreferences(args[0].toInteger(), args[1].toInteger(), args[2].toInteger());
return Memory.NULL;
}
@Signature
public static Memory findAvailableLocalPort(Environment env, Memory... args) {
try {
ServerSocket serverSocket = new ServerSocket(0);
serverSocket.close();
return LongMemory.valueOf(serverSocket.getLocalPort());
} catch (IOException e) {
return Memory.FALSE;
}
}
}