23 llm_connection_bless (cb->L, connection); |
24 llm_connection_bless (cb->L, connection); |
24 // XXX lm_connection_unref (connection); |
25 // XXX lm_connection_unref (connection); |
25 llm_message_bless (cb->L, message); |
26 llm_message_bless (cb->L, message); |
26 // XXX lm_message_unref (message); |
27 // XXX lm_message_unref (message); |
27 if (lua_pcall (cb->L, 2, 1, 0)) { |
28 if (lua_pcall (cb->L, 2, 1, 0)) { |
28 // XXX lua_error (cb->L); |
29 E ("Message handler callback error: %s", lua_tostring (cb->L, -1)); |
29 lua_pop (cb->L, 1); |
30 lua_pop (cb->L, 1); |
30 return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS; |
31 return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS; |
31 } |
32 } |
32 ret = lua_toboolean (cb->L, -1); |
33 ret = lua_toboolean (cb->L, -1); |
33 lua_pop (cb->L, 1); |
34 lua_pop (cb->L, 1); |
53 |
54 |
54 handler = lm_message_handler_new ((LmHandleMessageFunction)llm_message_handler_callback, |
55 handler = lm_message_handler_new ((LmHandleMessageFunction)llm_message_handler_callback, |
55 cb, (GDestroyNotify)llm_callback_destroy); |
56 cb, (GDestroyNotify)llm_callback_destroy); |
56 llm_message_handler_bless (L, handler); |
57 llm_message_handler_bless (L, handler); |
57 lm_message_handler_unref (handler); // XXX |
58 lm_message_handler_unref (handler); // XXX |
|
59 D ("Message handler %X created", (int) handler); |
58 return 1; |
60 return 1; |
59 } |
61 } |
60 |
62 |
61 /// lm.message_handler.bless |
63 /// lm.message_handler.bless |
62 /// Blesses given pointer to lm message handler object. |
64 /// Blesses given pointer to lm message handler object. |
64 /// R: lm message handler object |
66 /// R: lm message handler object |
65 static int llm_message_handler_bless_lua (lua_State *L) |
67 static int llm_message_handler_bless_lua (lua_State *L) |
66 { |
68 { |
67 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"); |
68 llm_message_handler_bless (L, lua_touserdata (L, 1)); |
70 llm_message_handler_bless (L, lua_touserdata (L, 1)); |
69 lua_remove (L, -2); |
|
70 return 1; |
71 return 1; |
71 } |
72 } |
72 |
73 |
|
74 // XXX: merge with next? |
73 /// message_handler:invalidate |
75 /// message_handler:invalidate |
74 /// Invalidates handler. |
76 /// Invalidates handler. |
|
77 /// R: lm message handler object |
75 static int llm_message_handler_invalidate (lua_State *L) |
78 static int llm_message_handler_invalidate (lua_State *L) |
76 { |
79 { |
77 llm_message_handler_t *object = luaL_checklm_message_handler (L, 1); |
80 llm_message_handler_t *object = luaL_checklm_message_handler (L, 1); |
78 lm_message_handler_invalidate (object->message_handler); |
81 lm_message_handler_invalidate (object->message_handler); |
79 lua_pop (L, 1); |
82 return 1; |
80 return 0; |
|
81 } |
83 } |
82 |
84 |
83 /// message_handler:valid |
85 /// message_handler:valid |
84 /// Returns true if message handler is still valid. |
86 /// Returns true if message handler is still valid. |
85 /// R: boolean |
87 /// R: boolean |
86 static int llm_message_handler_valid (lua_State *L) |
88 static int llm_message_handler_valid (lua_State *L) |
87 { |
89 { |
88 llm_message_handler_t *object = luaL_checklm_message_handler (L, 1); |
90 llm_message_handler_t *object = luaL_checklm_message_handler (L, 1); |
89 lua_pushboolean (L, lm_message_handler_is_valid (object->message_handler)); |
91 lua_pushboolean (L, lm_message_handler_is_valid (object->message_handler)); |
90 lua_remove (L, -2); |
|
91 return 1; |
92 return 1; |
92 } |
93 } |
93 |
94 |
94 /// message_handler:pointer |
95 /// message_handler:pointer |
95 /// Returns pointer to underlying C loudmouth structure. |
96 /// Returns pointer to underlying C loudmouth structure. |
96 /// R: lightuserdata |
97 /// R: lightuserdata |
97 static int llm_message_handler_pointer (lua_State *L) |
98 static int llm_message_handler_pointer (lua_State *L) |
98 { |
99 { |
99 llm_message_handler_t *object = luaL_checklm_message_handler (L, 1); |
100 llm_message_handler_t *object = luaL_checklm_message_handler (L, 1); |
100 lua_pushlightuserdata (L, object->message_handler); |
101 lua_pushlightuserdata (L, object->message_handler); |
101 lua_remove (L, -2); |
|
102 return 1; |
102 return 1; |
103 } |
103 } |
104 |
104 |
105 static int llm_message_handler_gc (lua_State *L) |
105 static int llm_message_handler_gc (lua_State *L) |
106 { |
106 { |
107 llm_message_handler_t *object = luaL_checklm_message_handler (L, 1); |
107 llm_message_handler_t *object = luaL_checklm_message_handler (L, 1); |
|
108 D ("Message handler %X gc called", (int) object); |
108 lm_message_handler_unref (object->message_handler); |
109 lm_message_handler_unref (object->message_handler); |
109 lua_pop (L, 1); |
|
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 llm_message_handler_reg_f[] = { |
114 { "new", llm_message_handler_new }, |
114 { "new", llm_message_handler_new }, |