1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2026-01-15 19:13:07 +01:00

Add ability to connect

This commit is contained in:
Ted John
2020-08-17 14:15:35 +01:00
parent 182bcaf21a
commit 703dc1efa7

View File

@@ -67,6 +67,12 @@ namespace OpenRCT2::Scripting
listeners.erase(it);
}
}
void RemoveAllListeners(uint32_t id)
{
auto& listeners = GetListenerList(id);
listeners.clear();
}
};
class ScSocketBase
@@ -105,10 +111,13 @@ namespace OpenRCT2::Scripting
static constexpr uint32_t EVENT_NONE = std::numeric_limits<uint32_t>::max();
static constexpr uint32_t EVENT_CLOSE = 0;
static constexpr uint32_t EVENT_DATA = 1;
static constexpr uint32_t EVENT_CONNECT_ONCE = 2;
static constexpr uint32_t EVENT_ERROR = 3;
EventList _eventList;
std::unique_ptr<ITcpSocket> _socket;
bool _disposed{};
bool _connecting{};
public:
ScSocket(const std::shared_ptr<Plugin>& plugin)
@@ -142,6 +151,31 @@ namespace OpenRCT2::Scripting
return this;
}
ScSocket* connect(uint16_t port, const std::string& host, const DukValue& callback)
{
auto ctx = GetContext()->GetScriptEngine().GetContext();
if (_socket != nullptr)
{
duk_error(ctx, DUK_ERR_ERROR, "Socket has already been created.");
}
else if (_disposed)
{
duk_error(ctx, DUK_ERR_ERROR, "Socket is disposed.");
}
else if (_connecting)
{
duk_error(ctx, DUK_ERR_ERROR, "Socket is already connecting.");
}
else
{
_socket = CreateTcpSocket();
_socket->Connect(host, port);
_eventList.AddListener(EVENT_CONNECT_ONCE, callback);
_connecting = true;
}
return this;
}
ScSocket* end(const DukValue& data)
{
if (_disposed)
@@ -224,6 +258,8 @@ namespace OpenRCT2::Scripting
return EVENT_CLOSE;
if (name == "data")
return EVENT_DATA;
if (name == "error")
return EVENT_ERROR;
return EVENT_NONE;
}
@@ -235,9 +271,24 @@ namespace OpenRCT2::Scripting
if (_socket != nullptr)
{
if (_socket->GetStatus() == SOCKET_STATUS_CONNECTED)
auto status = _socket->GetStatus();
if (_connecting)
{
char buffer[128];
if (status == SOCKET_STATUS_CONNECTED)
{
_connecting = false;
_eventList.Raise(EVENT_CONNECT_ONCE, GetPlugin(), {}, false);
_eventList.RemoveAllListeners(EVENT_CONNECT_ONCE);
}
else if (status == SOCKET_STATUS_CLOSED)
{
_connecting = false;
_eventList.Raise(EVENT_ERROR, GetPlugin(), {}, false);
}
}
else if (status == SOCKET_STATUS_CONNECTED)
{
char buffer[2048];
size_t bytesRead{};
auto result = _socket->ReceiveData(buffer, sizeof(buffer), &bytesRead);
switch (result)
@@ -278,6 +329,7 @@ namespace OpenRCT2::Scripting
{
dukglue_register_method(ctx, &ScSocket::destroy, "destroy");
dukglue_register_method(ctx, &ScSocket::setNoDelay, "setNoDelay");
dukglue_register_method(ctx, &ScSocket::connect, "connect");
dukglue_register_method(ctx, &ScSocket::end, "end");
dukglue_register_method(ctx, &ScSocket::write, "write");
dukglue_register_method(ctx, &ScSocket::on, "on");