lm_message_handler.c
changeset 6 90073cbb535d
parent 0 84fdfb0344c9
child 9 50f55d494efb
equal deleted inserted replaced
5:e617c9cf6dd3 6:90073cbb535d
     2 #include <lua.h>
     2 #include <lua.h>
     3 #include <lauxlib.h>
     3 #include <lauxlib.h>
     4 #include <glib.h>
     4 #include <glib.h>
     5 #include <loudmouth/loudmouth.h>
     5 #include <loudmouth/loudmouth.h>
     6 
     6 
       
     7 #include "config.h"
     7 #include "lm_types.h"
     8 #include "lm_types.h"
     8 #include "util.h"
     9 #include "util.h"
     9 
    10 
    10 /// lm.message_handler
    11 /// lm.message_handler
    11 /// Module, representing message handling functions.
    12 /// Module, representing message handling functions.
    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       },