Improve the Settings serialization API, expose to JS.

This not only makes it easier to expose to JavaScript, it also paves the
way for a much more efficient implementation.
This commit is contained in:
Philip Rideout
2021-03-04 16:14:37 -08:00
parent 65f4b600bc
commit b7ad20249d
10 changed files with 153 additions and 75 deletions

View File

@@ -27,10 +27,16 @@ using namespace utils;
namespace filament {
namespace viewer {
class WsHandler : public CivetWebSocketHandler {
class MessageSender : public CivetServer {
public:
MessageSender(const char** options) : CivetServer(options) {}
void sendMessage(const char* label, const char* buffer, size_t bufsize);
};
class MessageReceiver : public CivetWebSocketHandler {
public:
WsHandler(RemoteServer* server) : mServer(server) {}
~WsHandler() { delete mReceivedMessage; }
MessageReceiver(RemoteServer* server) : mServer(server) {}
~MessageReceiver() { delete mReceivedMessage; }
bool handleData(CivetServer* server, struct mg_connection*, int, char* , size_t) override;
private:
RemoteServer* mServer;
@@ -47,22 +53,22 @@ RemoteServer::RemoteServer(int port) {
};
std::string portString = std::to_string(port);
kServerOptions[1] = portString.c_str();
mCivetServer = new CivetServer(kServerOptions);
if (!mCivetServer->getContext()) {
mMessageSender = new MessageSender(kServerOptions);
if (!mMessageSender->getContext()) {
slog.e << "Unable to start RemoteServer, see civetweb.txt for details." << io::endl;
delete mCivetServer;
mCivetServer = nullptr;
mWsHandler = nullptr;
delete mMessageSender;
mMessageSender = nullptr;
mMessageReceiver = nullptr;
return;
}
mWsHandler = new WsHandler(this);
mCivetServer->addWebSocketHandler("", mWsHandler);
mMessageReceiver = new MessageReceiver(this);
mMessageSender->addWebSocketHandler("", mMessageReceiver);
slog.i << "RemoteServer listening at ws://localhost:" << port << io::endl;
}
RemoteServer::~RemoteServer() {
delete mCivetServer;
delete mWsHandler;
delete mMessageSender;
delete mMessageReceiver;
for (auto msg : mReceivedMessages) {
releaseReceivedMessage(msg);
}
@@ -122,8 +128,17 @@ void RemoteServer::releaseReceivedMessage(ReceivedMessage const* message) {
}
}
void RemoteServer::sendMessage(const Settings& settings) {
const auto& json = mSerializer.writeJson(settings);
mMessageSender->sendMessage("settings.json", json.c_str(), json.size() + 1);
}
void RemoteServer::sendMessage(const char* label, const char* buffer, size_t bufsize) {
mMessageSender->sendMessage(label, buffer, bufsize);
}
// NOTE: This is invoked off the main thread.
bool WsHandler::handleData(CivetServer* server, struct mg_connection* conn, int bits,
bool MessageReceiver::handleData(CivetServer* server, struct mg_connection* conn, int bits,
char* data, size_t size) {
const bool final = bits & 0x80;
const int opcode = bits & 0xf;
@@ -162,5 +177,12 @@ bool WsHandler::handleData(CivetServer* server, struct mg_connection* conn, int
return true;
}
void MessageSender::sendMessage(const char* label, const char* buffer, size_t bufsize) {
for (auto iter : connections) {
mg_websocket_write(iter.first, 0x80, label, strlen(label) + 1);
mg_websocket_write(iter.first, 0x80, buffer, bufsize);
}
}
} // namespace viewer
} // namespace filament