载入中...
搜索中...
未找到
NetRpc.cpp
浏览该文件的文档.
1#include "network/NetRpc.h"
2#include "network/NetStream.h"
3
4#include <simplesquirrel/simplesquirrel.hpp>
5
6#include <cstring>
7
8namespace eve::network {
9
10namespace {
11
12void callScriptFn(const ssq::Object& fn, const std::string& arg) {
13 if (fn.isEmpty()) return;
14 ssq::Function f = fn.toFunction();
15 if (f.isEmpty()) return;
16 HSQUIRRELVM raw = f.getHandle();
17 SQInteger top = sq_gettop(raw);
18 sq_pushobject(raw, f.getRaw());
19 sq_pushroottable(raw);
20 ssq::detail::pushValue(raw, arg);
21 if (SQ_SUCCEEDED(sq_call(raw, 2, SQFalse, SQTrue))) {
22 // discard result
23 }
24 sq_settop(raw, top);
25}
26
27} // namespace
28
29NetRpc::NetRpc(UdpLink* link) : link_(link) {
30 if (link_) {
31 link_->setMessageHandler(
32 [this](UdpLink::MsgType type, uint8_t channel, const char* data, size_t n) {
33 onLinkMessage(type, channel, data, n);
34 });
35 }
36}
37
39 if (link_) link_->setMessageHandler(nullptr);
40}
41
42void NetRpc::call(uint16_t msgId, const void* data, size_t n, bool reliable) {
43 if (!link_ || (data == nullptr && n > 0)) return;
44 std::vector<char> env;
45 env.push_back(static_cast<char>(msgId & 0xff));
46 env.push_back(static_cast<char>((msgId >> 8) & 0xff));
47 const char* p = static_cast<const char*>(data);
48 env.insert(env.end(), p, p + n);
50 env.data(), env.size());
51}
52
53bool NetRpc::callString(uint16_t msgId, const std::string& payload, bool reliable) {
54 if (!link_) return false;
55 call(msgId, payload.data(), payload.size(), reliable);
56 return true;
57}
58
59void NetRpc::registerHandler(uint16_t msgId, Handler h) {
60 handlers_[msgId] = std::move(h);
61}
62
63void NetRpc::registerScript(uint16_t msgId, ssq::Object fn) {
64 if (fn.isEmpty()) return;
65 scriptHandlers_[msgId] = fn;
66}
67
68void NetRpc::onLinkMessage(UdpLink::MsgType type, uint8_t channel,
69 const char* data, size_t n) {
70 (void)type;
71 if (channel != 0 || n < 2) return;
72 const uint16_t msgId = static_cast<uint16_t>(uint8_t(data[0])) |
73 (static_cast<uint16_t>(uint8_t(data[1])) << 8);
74 const char* payload = data + 2;
75 const size_t payloadLen = n - 2;
76
77 auto sit = scriptHandlers_.find(msgId);
78 if (sit != scriptHandlers_.end()) {
79 callScriptFn(sit->second, std::string(payload, payloadLen));
80 return;
81 }
82 auto it = handlers_.find(msgId);
83 if (it == handlers_.end()) return;
84 NetReader reader(payload, payloadLen);
85 it->second(reader);
86}
87
88} // namespace eve::network
struct SQVM * HSQUIRRELVM
std::string type
glm::vec3 n
Definition Grass.cpp:64
int h
float f
glm::vec4 p[6]
Light2D::Data * data
SettlementPipeline::Stage fn
void registerScript(uint16_t msgId, ssq::Object fn)
Definition NetRpc.cpp:63
void registerHandler(uint16_t msgId, Handler h)
Definition NetRpc.cpp:59
bool callString(uint16_t msgId, const std::string &payload, bool reliable=true)
Definition NetRpc.cpp:53
std::function< void(NetReader &)> Handler
Definition NetRpc.h:30
NetRpc(UdpLink *link)
Definition NetRpc.cpp:29
void call(uint16_t msgId, const void *data, size_t n, bool reliable=true)
Definition NetRpc.cpp:42
void pushValue(HSQUIRRELVM vm, const eve::rx::Value &v)
Definition Rx.cpp:91