isbear@23:
isbear@23: /* Copyright 2009 Myhailo Danylenko
isbear@23:
isbear@23: This file is part of lua-lm.
isbear@23:
isbear@23: lua-lm is free software: you can redistribute it and/or modify
isbear@23: it under the terms of the GNU General Public License as published by
isbear@23: the Free Software Foundation, either version 2 of the License, or
isbear@23: (at your option) any later version.
isbear@23:
isbear@23: This program is distributed in the hope that it will be useful,
isbear@23: but WITHOUT ANY WARRANTY; without even the implied warranty of
isbear@23: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
isbear@23: GNU General Public License for more details.
isbear@23:
isbear@23: You should have received a copy of the GNU General Public License
isbear@23: along with this program. If not, see . */
isbear@0:
isbear@0: #include
isbear@0: #include
isbear@27: #include
isbear@0:
isbear@6: #include "config.h"
isbear@0: #include "lm_types.h"
isbear@0: #include "util.h"
isbear@0:
isbear@0: void llm_callback_destroy (llm_callback_t *cb)
isbear@0: {
isbear@38: D ("Destroying callback %p", cb);
isbear@0: luaL_unref (cb->L, LUA_REGISTRYINDEX, cb->reference);
isbear@0: luaL_free (cb->L, cb);
isbear@0: }
isbear@0:
isbear@12: #define LLM_CHECK(WHAT, LWHAT, TYPE) \
isbear@0: llm_##WHAT##_t *luaL_checklm_##WHAT (lua_State *L, int index) \
isbear@0: { \
isbear@12: llm_##WHAT##_t *object = luaL_checkudata (L, index, "loudmouth." #LWHAT); \
isbear@0: luaL_argcheck (L, object != NULL, index, "loudmouth " #WHAT " expected"); \
isbear@0: return object; \
isbear@0: }
isbear@0:
isbear@12: #define LLM_BLESS(WHAT, LWHAT, TYPE) \
isbear@11: llm_##WHAT##_t *bless_lm_##WHAT (lua_State *L, TYPE *WHAT) \
isbear@0: { \
isbear@0: llm_##WHAT##_t *object; /* top of stack */ \
isbear@19: lua_pushliteral (L, LLM_OBJREGISTRY); /* 1 registry table name */ \
isbear@0: lua_rawget (L, LUA_REGISTRYINDEX); /* 1 registry table */ \
isbear@0: lua_pushlightuserdata (L, WHAT); /* 2 light userdata */ \
isbear@0: lua_rawget (L, -2); /* 2 object/nil */ \
isbear@0: if (!lua_isnil (L, -1)) { /* 2 object */ \
isbear@0: lua_remove (L, -2); /* 1 object */ \
isbear@0: object = lua_touserdata (L, -1); \
isbear@38: D ("Existing " #LWHAT " object %p requested", object); \
isbear@0: return object; \
isbear@0: } \
isbear@0: /* 2 nil */ \
isbear@0: lua_remove (L, -1); /* 1 registry table */ \
isbear@0: object = lua_newuserdata (L, sizeof (llm_##WHAT##_t)); /* 2 userdata */ \
isbear@12: luaL_getmetatable (L, "loudmouth." #LWHAT); /* 3 metatable */ \
isbear@0: lua_setmetatable (L, -2); /* 2 object */ \
isbear@0: lua_pushlightuserdata (L, WHAT); /* 3 light userdata */ \
isbear@0: lua_pushvalue (L, -2); /* 4 object */ \
isbear@0: lua_rawset (L, -4); /* 2 object */ \
isbear@0: lua_remove (L, -2); /* 1 object */ \
isbear@0: object->WHAT = WHAT; \
isbear@12: lm_##LWHAT##_ref (WHAT); \
isbear@38: D ("New " #LWHAT " object %p blessed", object); \
isbear@0: return object; \
isbear@0: }
isbear@0:
isbear@11: #define LLM_DEFINE(WHAT, LWHAT, TYPE) \
isbear@12: LLM_CHECK (WHAT, LWHAT, TYPE) \
isbear@11: LLM_BLESS (WHAT, LWHAT, TYPE)
isbear@0:
isbear@11: LLM_DEFINE (connection, connection, LmConnection)
isbear@11: LLM_DEFINE (message, message, LmMessage)
isbear@11: LLM_DEFINE (handler, message_handler, LmMessageHandler)
isbear@11: LLM_DEFINE (node, message_node, LmMessageNode)
isbear@11: LLM_DEFINE (proxy, proxy, LmProxy)
isbear@11: LLM_DEFINE (ssl, ssl, LmSSL)
isbear@0:
isbear@7: LmMessageNode *luaL_checkLmMessageNode (lua_State *L, int index)
isbear@7: {
isbear@7: void *object;
isbear@7: luaL_argcheck (L, lua_type (L, index) == LUA_TUSERDATA, index, "loudmouth message or message node expected");
isbear@7: object = lua_touserdata (L, index);
isbear@7: lua_getmetatable (L, index);
isbear@7: luaL_getmetatable (L, "loudmouth.message");
isbear@7: luaL_getmetatable (L, "loudmouth.message_node");
isbear@7: if (lua_rawequal (L, -2, -3)) // Message
isbear@7: object = (void *) lm_message_get_node (((llm_message_t *) object)->message);
isbear@7: else if (lua_rawequal (L, -1, -3)) // Node
isbear@11: object = (void *) (((llm_node_t *) object)->node);
isbear@7: else
isbear@7: luaL_argerror (L, index, "loudmouth message or message node expected");
isbear@7: lua_pop (L, 3);
isbear@7: return (LmMessageNode *) object;
isbear@7: }
isbear@7:
isbear@0: #undef LLM_DEFINE
isbear@27: #undef LLM_BLESS
isbear@27: #undef LLM_CHECK
isbear@0: