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: