int32_t context_lua_t::wakeup_ref_session(int32_t ref, message_t& message, bool free_callback) { if (ref != LUA_REFNIL && m_lstate != NULL) { lua_push_ref_session(m_lstate, ref); int32_t type = lua_type(m_lstate, -1); if (type == LUA_TNIL) { lua_pop(m_lstate, 1); return 0; } lua_State *co; bool blocking = (type == LUA_TTHREAD); if (blocking) { co = lua_tothread(m_lstate, -1); lua_pop(m_lstate, 1); } else { co = lua_new_root_coro(m_lstate); lua_xmove(m_lstate, co, 1); } if (blocking || free_callback) { lua_free_ref_session(m_lstate, ref); } int32_t oldTop = lua_gettop(m_lstate); lua_pushboolean(co, !message_is_pure_error(message)); lua_pushmessage(co, message); lua_pushnumber(co, message.m_source); lua_pushinteger(co, message.m_session); int32_t newTop = lua_gettop(m_lstate); resume_coroutine(co, newTop - oldTop); return 1; } return 0; }
void context_lua_t::lua_pushmessage(lua_State *L, message_t& message) { message_array_t *array = NULL; switch (message_data_type(message)) { case NIL: lua_pushnil(L); return; case TBOOLEAN: lua_pushboolean(L, message_bool(message)); return; case USERDATA: lua_pushlightuserdata(L, message_userdata(message)); return; case NUMBER: lua_pushnumber(L, message_number(message)); return; case INTEGER: lua_pushinteger(L, message_integer(message)); return; case BUFFER: create_buffer(L, message_buffer(message)); return; case STRING: lua_pushstring(L, message_string(message)); return; case BSON: if (message_bson(message)->extract) { bson_decode(message_bson(message), L); } else { create_bson(message_bson(message), L); } return; case TERROR: lua_pushinteger(L, message_error(message)); return; case ARRAY: array = message_array(message); if (array != NULL && array->m_count > 0) { for (int32_t i = 0; i < array->m_count; ++i) { //extract them lua_pushmessage(L, array->m_array[i]); } } else { lua_pushnil(L); } return; default: lua_pushnil(L); return; } }
static int l_Messenger_retrieveMessages(lua_State *L) { Messenger* messenger = nullptr; if (lua_hasMessenger(L)) { messenger = lua_getMessenger(L); } else { luaL_error(L, "Messenger has not been registered in lua"); } auto messageVector = messenger->retrieveMessages(); lua_newtable(L); int index = 1; for (auto msg : messageVector) { lua_pushmessage(L, &msg); lua_rawseti(L, -1, index++); } return 1; }
//appends the message to the messenger, and returns the Message static int l_Messenger_appendMessage(lua_State *L) { auto message = lua_pushmessage(L); return 1; }