|
@@ -21,90 +21,92 @@
|
|
|
*/
|
|
|
package sys.net;
|
|
|
|
|
|
-import sys.io.File;
|
|
|
+import php.*;
|
|
|
+import php.Global.*;
|
|
|
+import php.Const.*;
|
|
|
+import sys.io.FileInput;
|
|
|
+import sys.io.FileOutput;
|
|
|
|
|
|
@:coreApi
|
|
|
class Socket {
|
|
|
|
|
|
- private var __s : FileHandle;
|
|
|
+ private var __s : Resource;
|
|
|
private var protocol : String;
|
|
|
public var input(default,null) : haxe.io.Input;
|
|
|
public var output(default,null) : haxe.io.Output;
|
|
|
public var custom : Dynamic;
|
|
|
|
|
|
public function new() : Void {
|
|
|
- input = untyped new sys.io.FileInput(null);
|
|
|
- output = untyped new sys.io.FileOutput(null);
|
|
|
+ input = @:privateAccess new sys.io.FileInput(null);
|
|
|
+ output = @:privateAccess new sys.io.FileOutput(null);
|
|
|
protocol = "tcp";
|
|
|
}
|
|
|
|
|
|
private function assignHandler() : Void {
|
|
|
- untyped input.__f = __s;
|
|
|
- untyped output.__f = __s;
|
|
|
+ @:privateAccess (cast input:FileInput).__f = __s;
|
|
|
+ @:privateAccess (cast output:FileOutput).__f = __s;
|
|
|
}
|
|
|
|
|
|
public function close() : Void {
|
|
|
- untyped __call__('fclose', __s);
|
|
|
- untyped {
|
|
|
- input.__f = null;
|
|
|
- output.__f = null;
|
|
|
- }
|
|
|
+ fclose(__s);
|
|
|
+ @:privateAccess (cast input:FileInput).__f = null;
|
|
|
+ @:privateAccess (cast output:FileOutput).__f = null;
|
|
|
input.close();
|
|
|
output.close();
|
|
|
}
|
|
|
|
|
|
public function read() : String {
|
|
|
var b = '';
|
|
|
- untyped __php__("while (!feof($this->__s)) $b .= fgets($this->__s)");
|
|
|
+ while(!feof(__s)) Syntax.binop(b, '.=', fgets(__s));
|
|
|
return b;
|
|
|
}
|
|
|
|
|
|
public function write( content : String ) : Void {
|
|
|
- return untyped __call__('fwrite', __s, content);
|
|
|
+ fwrite(__s, content);
|
|
|
}
|
|
|
|
|
|
public function connect(host : Host, port : Int) : Void {
|
|
|
var errs = null;
|
|
|
var errn = null;
|
|
|
- var r = untyped __call__('stream_socket_client', protocol + '://' +host.host + ':' + port, errn, errs);
|
|
|
+ var r = stream_socket_client(protocol + '://' + host.host + ':' + port, errn, errs);
|
|
|
Socket.checkError(r, errn, errs);
|
|
|
- __s = cast r;
|
|
|
+ __s = r;
|
|
|
assignHandler();
|
|
|
}
|
|
|
|
|
|
public function listen(connections : Int) : Void {
|
|
|
throw "Not implemented";
|
|
|
/* TODO: ??????
|
|
|
- var r = untyped __call__('socket_listen', __s, connections);
|
|
|
+ var r = socket_listen(__s, connections);
|
|
|
checkError(r);
|
|
|
*/
|
|
|
}
|
|
|
|
|
|
public function shutdown( read : Bool, write : Bool ) : Void {
|
|
|
- var r;
|
|
|
- if(untyped __call__("function_exists", "stream_socket_shutdown")) {
|
|
|
- var rw = read && write ? 2 : (write ? 1 : (read ? 0 : 2));
|
|
|
- r = untyped __call__('stream_socket_shutdown', __s, rw);
|
|
|
- } else {
|
|
|
- r = untyped __call__('fclose', __s);
|
|
|
- }
|
|
|
+ var rw = read && write ? 2 : (write ? 1 : (read ? 0 : 2));
|
|
|
+ var r = stream_socket_shutdown(__s, rw);
|
|
|
checkError(r, 0, 'Unable to Shutdown');
|
|
|
}
|
|
|
|
|
|
public function bind(host : Host, port : Int) : Void {
|
|
|
- var errs = null;
|
|
|
- var errn = null;
|
|
|
- var r = untyped __call__('stream_socket_server', protocol + '://' +host._ip + ':' + port, errn, errs, (protocol=="udp") ? __php__('STREAM_SERVER_BIND') : __php__('STREAM_SERVER_BIND | STREAM_SERVER_LISTEN'));
|
|
|
+ var errs = Boot.deref(null);
|
|
|
+ var errn = Boot.deref(null);
|
|
|
+ var r = stream_socket_server(
|
|
|
+ protocol + '://' + host.ip + ':' + port,
|
|
|
+ errn,
|
|
|
+ errs,
|
|
|
+ (protocol == "udp" ? STREAM_SERVER_BIND : STREAM_SERVER_BIND | STREAM_SERVER_LISTEN)
|
|
|
+ );
|
|
|
Socket.checkError(r, errn, errs);
|
|
|
__s = cast r;
|
|
|
assignHandler();
|
|
|
}
|
|
|
|
|
|
public function accept() : Socket {
|
|
|
- var r = untyped __call__('stream_socket_accept', __s);
|
|
|
+ var r = stream_socket_accept(__s);
|
|
|
checkError(r, 0, 'Unable to accept connections on socket');
|
|
|
var s = new Socket();
|
|
|
- s.__s = cast r;
|
|
|
+ s.__s = r;
|
|
|
s.assignHandler();
|
|
|
return s;
|
|
|
}
|
|
@@ -119,26 +121,26 @@ class Socket {
|
|
|
}
|
|
|
|
|
|
public function peer() : { host : Host, port : Int } {
|
|
|
- var r : String = untyped __call__('stream_socket_get_name', __s, true);
|
|
|
- checkError(cast r, 0, 'Unable to retrieve the peer name');
|
|
|
+ var r = stream_socket_get_name(__s, true);
|
|
|
+ checkError(r, 0, 'Unable to retrieve the peer name');
|
|
|
return hpOfString(r);
|
|
|
}
|
|
|
|
|
|
public function host() : { host : Host, port : Int } {
|
|
|
- var r : String = untyped __call__('stream_socket_get_name', __s, false);
|
|
|
- checkError(cast r, 0, 'Unable to retrieve the host name');
|
|
|
+ var r = stream_socket_get_name(__s, false);
|
|
|
+ checkError(r, 0, 'Unable to retrieve the host name');
|
|
|
return hpOfString(r);
|
|
|
}
|
|
|
|
|
|
public function setTimeout( timeout : Float ) : Void {
|
|
|
var s = Std.int(timeout);
|
|
|
- var ms = Std.int((timeout-s)*1000000);
|
|
|
- var r = untyped __call__('stream_set_timeout', __s, s, ms);
|
|
|
+ var ms = Std.int((timeout - s) * 1000000);
|
|
|
+ var r = stream_set_timeout(__s, s, ms);
|
|
|
checkError(r, 0, 'Unable to set timeout');
|
|
|
}
|
|
|
|
|
|
public function setBlocking( b : Bool ) : Void {
|
|
|
- var r = untyped __call__('stream_set_blocking', __s, b);
|
|
|
+ var r = stream_set_blocking(__s, b);
|
|
|
checkError(r, 0, 'Unable to block');
|
|
|
}
|
|
|
|
|
@@ -147,20 +149,20 @@ class Socket {
|
|
|
}
|
|
|
|
|
|
public function waitForRead() : Void {
|
|
|
- select([this],null,null);
|
|
|
+ select([this], null, null);
|
|
|
}
|
|
|
|
|
|
private static function checkError(r : Bool, code : Int, msg : String) : Void {
|
|
|
- if(!untyped __physeq__(r, false)) return;
|
|
|
- throw haxe.io.Error.Custom('Error ['+code+']: ' +msg);
|
|
|
+ if(r != false) return;
|
|
|
+ throw haxe.io.Error.Custom('Error [$code]: $msg');
|
|
|
}
|
|
|
|
|
|
private static function getType(isUdp : Bool) : Int {
|
|
|
- return isUdp ? untyped __php__('SOCK_DGRAM') : untyped __php__('SOCK_STREAM');
|
|
|
+ return isUdp ? SOCK_DGRAM : SOCK_STREAM;
|
|
|
}
|
|
|
|
|
|
private static function getProtocol(protocol : String) : Int {
|
|
|
- return untyped __call__('getprotobyname', protocol);
|
|
|
+ return getprotobyname(protocol);
|
|
|
}
|
|
|
|
|
|
public static function select(read : Array<Socket>, write : Array<Socket>, others : Array<Socket>, ?timeout : Float) : { read: Array<Socket>,write: Array<Socket>,others: Array<Socket> }
|