Esempio n. 1
0
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;

}
Esempio n. 2
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;
	}
}
Esempio n. 3
0
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;
}
Esempio n. 4
0
//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;
}