extern "C" void AsebaSendBuffer(AsebaVMState *vm, const uint8* data, uint16 length) { Enki::AsebaMarxbot& marxBot = *asebaSocketMaps[vm]; Dashel::Stream* stream = marxBot.stream; if (!stream) return; // send to stream try { uint16 temp; temp = bswap16(length - 2); stream->write(&temp, 2); temp = bswap16(vm->nodeId); stream->write(&temp, 2); stream->write(data, length); stream->flush(); // push to other nodes for (size_t i = 0; i < marxBot.modules.size(); ++i) { Enki::AsebaMarxbot::Module& module = *(marxBot.modules[i]); if (&(module.vm) != vm) { module.events.push_back(Enki::AsebaMarxbot::Event(vm->nodeId, data, length)); AsebaProcessIncomingEvents(&(module.vm)); } } } catch (Dashel::DashelException e) { std::cerr << "Cannot write to socket: " << stream->getFailReason() << std::endl; } }
void AsebaMarxbot::incomingData(Stream *stream) { Event event(stream); // push to other nodes for (size_t i = 0; i < modules.size(); ++i) { Module& module = *(modules[i]); module.events.push_back(event); AsebaProcessIncomingEvents(&(module.vm)); } }
virtual void incomingData(Dashel::Stream *stream) { uint16 temp; uint16 len; stream->read(&temp, 2); len = bswap16(temp); stream->read(&temp, 2); lastMessageSource = bswap16(temp); lastMessageData.resize(len+2); stream->read(&lastMessageData[0], lastMessageData.size()); AsebaProcessIncomingEvents(&vm); }
void SimpleDashelConnection::incomingData(Dashel::Stream *stream) { // if we receive data from an old connection, disregard as we'll close the old stream soon if (stream != this->stream) { // read one byte to avoid deadlock char c; stream->read(&c, 1); return; } try { // receive data uint16_t temp; uint16_t len; stream->read(&temp, 2); len = bswap16(temp); stream->read(&temp, 2); lastMessageSource = bswap16(temp); lastMessageData.resize(len+2); stream->read(&lastMessageData[0], lastMessageData.size()); // execute event on all VM that are linked to this connection for (auto vmStateToEnvironmentKV: vmStateToEnvironment) { if (vmStateToEnvironmentKV.second.second == this) { AsebaProcessIncomingEvents(vmStateToEnvironmentKV.first); AsebaVMRun(vmStateToEnvironmentKV.first, 1000); } } } catch (Dashel::DashelException e) { SEND_NOTIFICATION(LOG_ERROR, "cannot read from socket", stream->getTargetName(), e.what()); } }