78 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
		
		
			
		
	
	
			78 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
|  | package kha.netsync; | ||
|  | 
 | ||
|  | import haxe.io.Bytes; | ||
|  | 
 | ||
|  | @:headerCode("
 | ||
|  | #include <kinc/network/socket.h> | ||
|  | ")
 | ||
|  | @:headerClassCode("kinc_socket_t socket;") | ||
|  | class Network { | ||
|  | 	var url: String; | ||
|  | 	var port: Int; | ||
|  | 	var bufferPos: Int; | ||
|  | 	var buffer: Bytes; | ||
|  | 	var tempBuffer: Bytes; | ||
|  | 	var listener: Bytes->Void; | ||
|  | 
 | ||
|  | 	public function new(url: String, port: Int, errorCallback: Void->Void, closeCallback: Void->Void) { | ||
|  | 		this.url = url; | ||
|  | 		this.port = port + 1; // TODO: This is somewhat ugly, but necessary to maintain both websocket and UPD connections at the same time (see also Server.hx) | ||
|  | 		bufferPos = 0; | ||
|  | 		buffer = Bytes.alloc(256); // TODO: Size | ||
|  | 		tempBuffer = Bytes.alloc(256); // TODO: Size | ||
|  | 		init(url, port); | ||
|  | 		kha.Scheduler.addFrameTask(update, 0); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	@:functionCode("
 | ||
|  | 		kinc_socket_init(&socket); | ||
|  | 		kinc_socket_options options; | ||
|  | 		kinc_socket_options_set_defaults(&options); | ||
|  | 		kinc_socket_set(&socket, \"127.0.0.1\", port, KINC_SOCKET_FAMILY_IP4, KINC_SOCKET_PROTOCOL_UDP);
 | ||
|  | 		kinc_socket_open(&socket, &options); | ||
|  | 	")
 | ||
|  | 	public function init(url: String, port: Int) { | ||
|  | 		send(Bytes.ofString("JOIN"), true); // TODO: Discuss, dependency with Server.hx | ||
|  | 	} | ||
|  | 
 | ||
|  | 	@:functionCode("
 | ||
|  | 		// TODO: mandatory | ||
|  | 		kinc_socket_send_url(&socket, url, port, (const unsigned char*)bytes->b->getBase(), bytes->length); | ||
|  | 	")
 | ||
|  | 	public function send(bytes: Bytes, mandatory: Bool): Void {} | ||
|  | 
 | ||
|  | 	public function listen(listener: Bytes->Void): Void { | ||
|  | 		this.listener = listener; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	function update() { | ||
|  | 		var received = getBytesFromSocket(tempBuffer); | ||
|  | 		buffer.blit(bufferPos, tempBuffer, 0, received); | ||
|  | 		bufferPos += received; | ||
|  | 		// if (received > 0) trace("received " + received + " bytes"); | ||
|  | 
 | ||
|  | 		// TODO: Handle partial packets, don't choke on garbage | ||
|  | 		if (listener != null && bufferPos > 0) { | ||
|  | 			var result = Bytes.alloc(bufferPos); | ||
|  | 			result.blit(0, buffer, 0, bufferPos); | ||
|  | 			listener(result); | ||
|  | 			bufferPos = 0; | ||
|  | 		} | ||
|  | 	} | ||
|  | 
 | ||
|  | 	@:functionCode("
 | ||
|  | 		unsigned int recAddr; | ||
|  | 		unsigned int recPort; | ||
|  | 		int size = kinc_socket_receive(&socket, (unsigned char*)inBuffer->b->getBase(), inBuffer->length, &recAddr, &recPort); | ||
|  | 		if (size >= 0) { | ||
|  | 			return size; | ||
|  | 		} | ||
|  | 		else { | ||
|  | 			return 0; | ||
|  | 		} | ||
|  | 	")
 | ||
|  | 	function getBytesFromSocket(inBuffer: Bytes): Int { | ||
|  | 		return 0; | ||
|  | 	} | ||
|  | } |