author | Myhailo Danylenko <isbear@ukrpost.net> |
Sat, 21 Feb 2009 12:43:51 +0200 | |
changeset 7 | 5db1448eb857 |
parent 6 | 90073cbb535d |
child 11 | a8c6460d612b |
permissions | -rw-r--r-- |
0 | 1 |
|
2 |
#include <lua.h> |
|
3 |
#include <lauxlib.h> |
|
4 |
#include <loudmouth/loudmouth.h> // lm_*ref |
|
5 |
||
6
90073cbb535d
Logging and chained methods
Myhailo Danylenko <isbear@ukrpost.net>
parents:
0
diff
changeset
|
6 |
#include "config.h" |
0 | 7 |
#include "lm_types.h" |
8 |
#include "util.h" |
|
9 |
||
10 |
void llm_callback_destroy (llm_callback_t *cb) |
|
11 |
{ |
|
6
90073cbb535d
Logging and chained methods
Myhailo Danylenko <isbear@ukrpost.net>
parents:
0
diff
changeset
|
12 |
D ("Destroying callback %X", (int) cb); |
0 | 13 |
luaL_unref (cb->L, LUA_REGISTRYINDEX, cb->reference); |
14 |
luaL_free (cb->L, cb); |
|
15 |
} |
|
16 |
||
17 |
#define LLM_CHECK(WHAT, TYPE) \ |
|
18 |
llm_##WHAT##_t *luaL_checklm_##WHAT (lua_State *L, int index) \ |
|
19 |
{ \ |
|
20 |
llm_##WHAT##_t *object = luaL_checkudata (L, index, "loudmouth." #WHAT); \ |
|
21 |
luaL_argcheck (L, object != NULL, index, "loudmouth " #WHAT " expected"); \ |
|
22 |
return object; \ |
|
23 |
} |
|
24 |
||
25 |
#define LLM_BLESS(WHAT, TYPE) \ |
|
26 |
llm_##WHAT##_t *llm_##WHAT##_bless (lua_State *L, TYPE *WHAT) \ |
|
27 |
{ \ |
|
28 |
llm_##WHAT##_t *object; /* top of stack */ \ |
|
29 |
lua_pushstring (L, LLM_OBJREGISTRY); /* 1 registry table name */ \ |
|
30 |
lua_rawget (L, LUA_REGISTRYINDEX); /* 1 registry table */ \ |
|
31 |
lua_pushlightuserdata (L, WHAT); /* 2 light userdata */ \ |
|
32 |
lua_rawget (L, -2); /* 2 object/nil */ \ |
|
33 |
if (!lua_isnil (L, -1)) { /* 2 object */ \ |
|
34 |
lua_remove (L, -2); /* 1 object */ \ |
|
35 |
object = lua_touserdata (L, -1); \ |
|
6
90073cbb535d
Logging and chained methods
Myhailo Danylenko <isbear@ukrpost.net>
parents:
0
diff
changeset
|
36 |
D ("Existing " #WHAT " object %X requested", (int) object); \ |
0 | 37 |
return object; \ |
38 |
} \ |
|
39 |
/* 2 nil */ \ |
|
40 |
lua_remove (L, -1); /* 1 registry table */ \ |
|
41 |
object = lua_newuserdata (L, sizeof (llm_##WHAT##_t)); /* 2 userdata */ \ |
|
42 |
luaL_getmetatable (L, "loudmouth." #WHAT); /* 3 metatable */ \ |
|
43 |
lua_setmetatable (L, -2); /* 2 object */ \ |
|
44 |
lua_pushlightuserdata (L, WHAT); /* 3 light userdata */ \ |
|
45 |
lua_pushvalue (L, -2); /* 4 object */ \ |
|
46 |
lua_rawset (L, -4); /* 2 object */ \ |
|
47 |
lua_remove (L, -2); /* 1 object */ \ |
|
48 |
object->WHAT = WHAT; \ |
|
49 |
lm_##WHAT##_ref (WHAT); \ |
|
6
90073cbb535d
Logging and chained methods
Myhailo Danylenko <isbear@ukrpost.net>
parents:
0
diff
changeset
|
50 |
D ("New " #WHAT " object %X blessed", (int) object); \ |
0 | 51 |
return object; \ |
52 |
} |
|
53 |
||
54 |
#define LLM_DEFINE(WHAT, TYPE) \ |
|
55 |
LLM_CHECK (WHAT, TYPE) \ |
|
56 |
LLM_BLESS (WHAT, TYPE) |
|
57 |
||
58 |
LLM_DEFINE (connection, LmConnection) |
|
59 |
LLM_DEFINE (message, LmMessage) |
|
60 |
LLM_DEFINE (message_handler, LmMessageHandler) |
|
61 |
LLM_DEFINE (message_node, LmMessageNode) |
|
62 |
LLM_DEFINE (proxy, LmProxy) |
|
63 |
LLM_DEFINE (ssl, LmSSL) |
|
64 |
||
7
5db1448eb857
Message have node methods
Myhailo Danylenko <isbear@ukrpost.net>
parents:
6
diff
changeset
|
65 |
LmMessageNode *luaL_checkLmMessageNode (lua_State *L, int index) |
5db1448eb857
Message have node methods
Myhailo Danylenko <isbear@ukrpost.net>
parents:
6
diff
changeset
|
66 |
{ |
5db1448eb857
Message have node methods
Myhailo Danylenko <isbear@ukrpost.net>
parents:
6
diff
changeset
|
67 |
void *object; |
5db1448eb857
Message have node methods
Myhailo Danylenko <isbear@ukrpost.net>
parents:
6
diff
changeset
|
68 |
luaL_argcheck (L, lua_type (L, index) == LUA_TUSERDATA, index, "loudmouth message or message node expected"); |
5db1448eb857
Message have node methods
Myhailo Danylenko <isbear@ukrpost.net>
parents:
6
diff
changeset
|
69 |
object = lua_touserdata (L, index); |
5db1448eb857
Message have node methods
Myhailo Danylenko <isbear@ukrpost.net>
parents:
6
diff
changeset
|
70 |
lua_getmetatable (L, index); |
5db1448eb857
Message have node methods
Myhailo Danylenko <isbear@ukrpost.net>
parents:
6
diff
changeset
|
71 |
luaL_getmetatable (L, "loudmouth.message"); |
5db1448eb857
Message have node methods
Myhailo Danylenko <isbear@ukrpost.net>
parents:
6
diff
changeset
|
72 |
luaL_getmetatable (L, "loudmouth.message_node"); |
5db1448eb857
Message have node methods
Myhailo Danylenko <isbear@ukrpost.net>
parents:
6
diff
changeset
|
73 |
if (lua_rawequal (L, -2, -3)) // Message |
5db1448eb857
Message have node methods
Myhailo Danylenko <isbear@ukrpost.net>
parents:
6
diff
changeset
|
74 |
object = (void *) lm_message_get_node (((llm_message_t *) object)->message); |
5db1448eb857
Message have node methods
Myhailo Danylenko <isbear@ukrpost.net>
parents:
6
diff
changeset
|
75 |
else if (lua_rawequal (L, -1, -3)) // Node |
5db1448eb857
Message have node methods
Myhailo Danylenko <isbear@ukrpost.net>
parents:
6
diff
changeset
|
76 |
object = (void *) (((llm_message_node_t *) object)->message_node); |
5db1448eb857
Message have node methods
Myhailo Danylenko <isbear@ukrpost.net>
parents:
6
diff
changeset
|
77 |
else |
5db1448eb857
Message have node methods
Myhailo Danylenko <isbear@ukrpost.net>
parents:
6
diff
changeset
|
78 |
luaL_argerror (L, index, "loudmouth message or message node expected"); |
5db1448eb857
Message have node methods
Myhailo Danylenko <isbear@ukrpost.net>
parents:
6
diff
changeset
|
79 |
lua_pop (L, 3); |
5db1448eb857
Message have node methods
Myhailo Danylenko <isbear@ukrpost.net>
parents:
6
diff
changeset
|
80 |
return (LmMessageNode *) object; |
5db1448eb857
Message have node methods
Myhailo Danylenko <isbear@ukrpost.net>
parents:
6
diff
changeset
|
81 |
} |
5db1448eb857
Message have node methods
Myhailo Danylenko <isbear@ukrpost.net>
parents:
6
diff
changeset
|
82 |
|
0 | 83 |
#undef LLM_DEFINE |
84 |