lm_message_handler.c
changeset 11 a8c6460d612b
parent 9 50f55d494efb
child 12 63f06a23c235
equal deleted inserted replaced
10:aed141accdd9 11:a8c6460d612b
    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