15 /// Callback function, used on incoming messages. |
15 /// Callback function, used on incoming messages. |
16 /// Should return true if message has been fully handled and no more |
16 /// Should return true if message has been fully handled and no more |
17 /// handlers should be called. |
17 /// handlers should be called. |
18 /// A: lm connection object, lm message object |
18 /// A: lm connection object, lm message object |
19 /// R: boolean |
19 /// R: boolean |
20 LmHandlerResult llm_message_handler_callback (LmMessageHandler *handler, LmConnection *connection, LmMessage *message, llm_callback_t *cb) |
20 LmHandlerResult callback_lm_handler (LmMessageHandler *handler, LmConnection *connection, LmMessage *message, llm_callback_t *cb) |
21 { |
21 { |
22 int ret; |
22 int ret; |
23 lua_rawgeti (cb->L, LUA_REGISTRYINDEX, cb->reference); |
23 lua_rawgeti (cb->L, LUA_REGISTRYINDEX, cb->reference); |
24 llm_connection_bless (cb->L, connection); |
24 bless_lm_connection (cb->L, connection); |
25 // XXX lm_connection_unref (connection); |
25 // XXX lm_connection_unref (connection); |
26 llm_message_bless (cb->L, message); |
26 bless_lm_message (cb->L, message); |
27 // XXX lm_message_unref (message); |
27 // XXX lm_message_unref (message); |
28 if (lua_pcall (cb->L, 2, 1, 0)) { |
28 if (lua_pcall (cb->L, 2, 1, 0)) { |
29 W ("Message handler callback error: %s", lua_tostring (cb->L, -1)); |
29 W ("Message handler callback error: %s", lua_tostring (cb->L, -1)); |
30 lua_pop (cb->L, 1); |
30 lua_pop (cb->L, 1); |
31 return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS; |
31 return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS; |
40 |
40 |
41 /// lm.message_handler.new |
41 /// lm.message_handler.new |
42 /// Creates new message handler object. |
42 /// Creates new message handler object. |
43 /// A: message handler callback function |
43 /// A: message handler callback function |
44 /// R: lm message handler object |
44 /// R: lm message handler object |
45 static int llm_message_handler_new (lua_State *L) |
45 static int new_lm_handler (lua_State *L) |
46 { |
46 { |
47 llm_callback_t *cb; |
47 llm_callback_t *cb; |
48 LmMessageHandler *handler; |
48 LmMessageHandler *handler; |
49 luaL_argcheck (L, lua_isfunction (L, 1), 1, "function expected"); |
49 luaL_argcheck (L, lua_isfunction (L, 1), 1, "function expected"); |
50 |
50 |
51 cb = luaL_malloc (L, sizeof (llm_callback_t)); |
51 cb = luaL_malloc (L, sizeof (llm_callback_t)); |
52 cb->reference = luaL_ref (L, LUA_REGISTRYINDEX); |
52 cb->reference = luaL_ref (L, LUA_REGISTRYINDEX); |
53 cb->L = L; |
53 cb->L = L; |
54 |
54 |
55 handler = lm_message_handler_new ((LmHandleMessageFunction)llm_message_handler_callback, |
55 handler = lm_message_handler_new ((LmHandleMessageFunction)callback_lm_handler, |
56 cb, (GDestroyNotify)llm_callback_destroy); |
56 cb, (GDestroyNotify)llm_callback_destroy); |
57 llm_message_handler_bless (L, handler); |
57 bless_lm_handler (L, handler); |
58 lm_message_handler_unref (handler); // XXX |
58 lm_message_handler_unref (handler); // XXX |
59 D ("Message handler %X created", (int) handler); |
59 D ("Message handler %X created", (int) handler); |
60 return 1; |
60 return 1; |
61 } |
61 } |
62 |
62 |
63 /// lm.message_handler.bless |
63 /// lm.message_handler.bless |
64 /// Blesses given pointer to lm message handler object. |
64 /// Blesses given pointer to lm message handler object. |
65 /// A: lightuserdata (C lm message handler object) |
65 /// A: lightuserdata (C lm message handler object) |
66 /// R: lm message handler object |
66 /// R: lm message handler object |
67 static int llm_message_handler_bless_lua (lua_State *L) |
67 static int bless_lua_lm_handler (lua_State *L) |
68 { |
68 { |
69 luaL_argcheck (L, lua_islightuserdata (L, 1), 1, "loudmouth message handler pointer expected"); |
69 luaL_argcheck (L, lua_islightuserdata (L, 1), 1, "loudmouth message handler pointer expected"); |
70 llm_message_handler_bless (L, lua_touserdata (L, 1)); |
70 bless_lm_handler (L, lua_touserdata (L, 1)); |
71 return 1; |
71 return 1; |
72 } |
72 } |
73 |
73 |
74 // XXX: merge with next? |
74 // XXX: merge with next? |
75 /// message_handler:invalidate |
75 /// message_handler:invalidate |
76 /// Invalidates handler. |
76 /// Invalidates handler. |
77 /// R: lm message handler object |
77 /// R: lm message handler object |
78 static int llm_message_handler_invalidate (lua_State *L) |
78 static int invalidate_lm_handler (lua_State *L) |
79 { |
79 { |
80 llm_message_handler_t *object = luaL_checklm_message_handler (L, 1); |
80 llm_handler_t *object = luaL_checklm_handler (L, 1); |
81 lm_message_handler_invalidate (object->message_handler); |
81 lm_message_handler_invalidate (object->handler); |
82 return 1; |
82 return 1; |
83 } |
83 } |
84 |
84 |
85 /// message_handler:valid |
85 /// message_handler:valid |
86 /// Returns true if message handler is still valid. |
86 /// Returns true if message handler is still valid. |
87 /// R: boolean |
87 /// R: boolean |
88 static int llm_message_handler_valid (lua_State *L) |
88 static int valid_lm_handler (lua_State *L) |
89 { |
89 { |
90 llm_message_handler_t *object = luaL_checklm_message_handler (L, 1); |
90 llm_handler_t *object = luaL_checklm_handler (L, 1); |
91 lua_pushboolean (L, lm_message_handler_is_valid (object->message_handler)); |
91 lua_pushboolean (L, lm_message_handler_is_valid (object->handler)); |
92 return 1; |
92 return 1; |
93 } |
93 } |
94 |
94 |
95 /// message_handler:pointer |
95 /// message_handler:pointer |
96 /// Returns pointer to underlying C loudmouth structure. |
96 /// Returns pointer to underlying C loudmouth structure. |
97 /// R: lightuserdata |
97 /// R: lightuserdata |
98 static int llm_message_handler_pointer (lua_State *L) |
98 static int pointer_lm_handler (lua_State *L) |
99 { |
99 { |
100 llm_message_handler_t *object = luaL_checklm_message_handler (L, 1); |
100 llm_handler_t *object = luaL_checklm_handler (L, 1); |
101 lua_pushlightuserdata (L, object->message_handler); |
101 lua_pushlightuserdata (L, object->handler); |
102 return 1; |
102 return 1; |
103 } |
103 } |
104 |
104 |
105 static int llm_message_handler_gc (lua_State *L) |
105 static int gc_lm_handler (lua_State *L) |
106 { |
106 { |
107 llm_message_handler_t *object = luaL_checklm_message_handler (L, 1); |
107 llm_handler_t *object = luaL_checklm_handler (L, 1); |
108 D ("Message handler %X gc called", (int) object); |
108 D ("Message handler %X gc called", (int) object); |
109 lm_message_handler_unref (object->message_handler); |
109 lm_message_handler_unref (object->handler); |
110 return 0; |
110 return 0; |
111 } |
111 } |
112 |
112 |
113 static const luaL_Reg llm_message_handler_reg_f[] = { |
113 static const luaL_Reg reg_f_lm_handler[] = { |
114 { "new", llm_message_handler_new }, |
114 { "new", new_lm_handler }, |
115 { "bless", llm_message_handler_bless_lua }, |
115 { "bless", bless_lua_lm_handler }, |
116 { NULL, NULL }, |
116 { NULL, NULL }, |
117 }; |
117 }; |
118 |
118 |
119 static const luaL_Reg llm_message_handler_reg_m[] = { |
119 static const luaL_Reg reg_m_lm_handler[] = { |
120 { "invalidate", llm_message_handler_invalidate }, |
120 { "invalidate", invalidate_lm_handler }, |
121 { "valid", llm_message_handler_valid }, |
121 { "valid", valid_lm_handler }, |
122 { "pointer", llm_message_handler_pointer }, |
122 { "pointer", pointer_lm_handler }, |
123 { "__gc", llm_message_handler_gc }, |
123 { "__gc", gc_lm_handler }, |
124 { NULL, NULL }, |
124 { NULL, NULL }, |
125 }; |
125 }; |
126 |
126 |
127 int luaopen_lm_message_handler (lua_State *L) |
127 int luaopen_lm_message_handler (lua_State *L) |
128 { |
128 { |
129 luaL_newmetatable (L, "loudmouth.message_handler"); |
129 luaL_newmetatable (L, "loudmouth.message_handler"); |
130 lua_pushstring (L, "__index"); |
130 lua_pushstring (L, "__index"); |
131 lua_pushvalue (L, -2); |
131 lua_pushvalue (L, -2); |
132 lua_settable (L, -3); |
132 lua_settable (L, -3); |
133 luaL_register (L, NULL, llm_message_handler_reg_m); |
133 luaL_register (L, NULL, reg_m_lm_handler); |
134 lua_pop (L, 1); |
134 lua_pop (L, 1); |
135 luaL_register (L, "lm.message_handler", llm_message_handler_reg_f); |
135 luaL_register (L, "lm.message_handler", reg_f_lm_handler); |
136 return 1; |
136 return 1; |
137 } |
137 } |
138 |
138 |