lm_message.c
changeset 6 90073cbb535d
parent 4 5770be2d5f3f
child 7 5db1448eb857
equal deleted inserted replaced
5:e617c9cf6dd3 6:90073cbb535d
     1 
     1 
     2 #include <lua.h>
     2 #include <lua.h>
     3 #include <lauxlib.h>
     3 #include <lauxlib.h>
     4 #include <loudmouth/loudmouth.h>
     4 #include <loudmouth/loudmouth.h>
     5 
     5 
       
     6 #include "config.h"
     6 #include "util.h"
     7 #include "util.h"
     7 #include "lm_types.h"
     8 #include "lm_types.h"
     8 
     9 
     9 /// lm.message
    10 /// lm.message
    10 /// Module, representing individual message.
    11 /// Module, representing individual message.
    29 	{ "starttls",        LM_MESSAGE_TYPE_STARTTLS        },
    30 	{ "starttls",        LM_MESSAGE_TYPE_STARTTLS        },
    30 	{ "unknown",         LM_MESSAGE_TYPE_UNKNOWN         },
    31 	{ "unknown",         LM_MESSAGE_TYPE_UNKNOWN         },
    31 	{ "stream:stream",   LM_MESSAGE_TYPE_STREAM          },
    32 	{ "stream:stream",   LM_MESSAGE_TYPE_STREAM          },
    32 	{ "stream:error",    LM_MESSAGE_TYPE_STREAM_ERROR    },
    33 	{ "stream:error",    LM_MESSAGE_TYPE_STREAM_ERROR    },
    33 	{ "stream:features", LM_MESSAGE_TYPE_STREAM_FEATURES },
    34 	{ "stream:features", LM_MESSAGE_TYPE_STREAM_FEATURES },
       
    35 	{ "stream_error",    LM_MESSAGE_TYPE_STREAM_ERROR    },
       
    36 	{ "stream_features", LM_MESSAGE_TYPE_STREAM_FEATURES },
    34 	{ NULL,              0                               },
    37 	{ NULL,              0                               },
    35 };
    38 };
    36 
    39 
    37 /// message sub type
    40 /// message sub type
    38 /// Message subtype, not all combinations of type and subtype are possible.
    41 /// Message subtype, not all combinations of type and subtype are possible.
    65 static int llm_message_new (lua_State *L)
    68 static int llm_message_new (lua_State *L)
    66 {
    69 {
    67 	const char *to   = luaL_checkstring (L, 1);
    70 	const char *to   = luaL_checkstring (L, 1);
    68 	int         type = luaL_checkenum (L, 2, llm_message_type);
    71 	int         type = luaL_checkenum (L, 2, llm_message_type);
    69 	LmMessage *message;
    72 	LmMessage *message;
    70 	if (lua_gettop (L) > 2) {
    73 	if (lua_gettop (L) > 2)
    71 		message = lm_message_new_with_sub_type (to, type,
    74 		message = lm_message_new_with_sub_type (to, type,
    72 						luaL_checkenum (L, 3, llm_message_sub_type));
    75 						luaL_checkenum (L, 3, llm_message_sub_type));
    73 		lua_pop (L, 1);
    76 	else
    74 	} else
       
    75 		message = lm_message_new (to, type);
    77 		message = lm_message_new (to, type);
    76 	lua_pop (L, 2);
       
    77 	llm_message_bless (L, message);
    78 	llm_message_bless (L, message);
    78 	lm_message_unref (message);
    79 	lm_message_unref (message);
       
    80 	D ("Message %X created", (int) message);
    79 	return 1;
    81 	return 1;
    80 }
    82 }
    81 
    83 
    82 /// lm.message.bless
    84 /// lm.message.bless
    83 /// Blesses given pointer to lm message object.
    85 /// Blesses given pointer to lm message object.
    85 /// R: lm message object
    87 /// R: lm message object
    86 static int llm_message_bless_lua (lua_State *L)
    88 static int llm_message_bless_lua (lua_State *L)
    87 {
    89 {
    88 	luaL_argcheck (L, lua_islightuserdata (L, 1), 1, "lm message lightuserdata expected");
    90 	luaL_argcheck (L, lua_islightuserdata (L, 1), 1, "lm message lightuserdata expected");
    89 	llm_message_bless (L, lua_touserdata (L, 1));
    91 	llm_message_bless (L, lua_touserdata (L, 1));
    90 	lua_remove (L, -2);
       
    91 	return 1;
    92 	return 1;
    92 }
    93 }
    93 
    94 
    94 /// message:node
    95 /// message:node
    95 /// Returns root node object of message.
    96 /// Returns root node object of message.
    98 {
    99 {
    99 	llm_message_t *object = luaL_checklm_message (L, 1);
   100 	llm_message_t *object = luaL_checklm_message (L, 1);
   100 	LmMessageNode *node = lm_message_get_node (object->message);
   101 	LmMessageNode *node = lm_message_get_node (object->message);
   101 	llm_message_node_bless (L, node);
   102 	llm_message_node_bless (L, node);
   102 	// XXX lm_message_node_unref (node);
   103 	// XXX lm_message_node_unref (node);
   103 	lua_remove (L, -2);
       
   104 	return 1;
   104 	return 1;
   105 }
   105 }
       
   106 
       
   107 // XXX: add node methods here to allow omitting of :node(): element
       
   108 // BTW, we can jus adapt node methods to work on messages too and register them here also
   106 
   109 
   107 /// message:type
   110 /// message:type
   108 /// Returns two strings: message type and message sub type.
   111 /// Returns two strings: message type and message sub type.
   109 /// R: message type, message sub type
   112 /// R: message type, message sub type
   110 static int llm_message_kind (lua_State *L)
   113 static int llm_message_kind (lua_State *L)
   111 {
   114 {
   112 	llm_message_t *object = luaL_checklm_message (L, 1);
   115 	llm_message_t *object = luaL_checklm_message (L, 1);
   113 	luaL_pushenum (L, lm_message_get_type (object->message), llm_message_type);
   116 	luaL_pushenum (L, lm_message_get_type (object->message), llm_message_type);
   114 	luaL_pushenum (L, lm_message_get_sub_type (object->message), llm_message_sub_type);
   117 	luaL_pushenum (L, lm_message_get_sub_type (object->message), llm_message_sub_type);
   115 	lua_remove (L, -3);
       
   116 	return 2;
   118 	return 2;
   117 }
   119 }
   118 
   120 
   119 /// message:pointer
   121 /// message:pointer
   120 /// Returns pointer to underlying C loudmouth structure.
   122 /// Returns pointer to underlying C loudmouth structure.
   121 /// R: lightuserdata
   123 /// R: lightuserdata
   122 static int llm_message_pointer (lua_State *L)
   124 static int llm_message_pointer (lua_State *L)
   123 {
   125 {
   124 	llm_message_t *object = luaL_checklm_message (L, 1);
   126 	llm_message_t *object = luaL_checklm_message (L, 1);
   125 	lua_pushlightuserdata (L, object->message);
   127 	lua_pushlightuserdata (L, object->message);
   126 	lua_remove (L, -2);
       
   127 	return 1;
   128 	return 1;
   128 }
   129 }
   129 
   130 
   130 static int llm_message_gc (lua_State *L)
   131 static int llm_message_gc (lua_State *L)
   131 {
   132 {
   132 	llm_message_t *object = luaL_checklm_message (L, 1);
   133 	llm_message_t *message = luaL_checklm_message (L, 1);
   133 	lm_message_unref (object->message);
   134 	D ("Message %X gc called", (int) message);
   134 	lua_pop (L, 1);
   135 	lm_message_unref (message->message);
   135 	return 0;
   136 	return 0;
   136 }
   137 }
   137 
   138 
   138 static const luaL_Reg llm_message_reg_f[] = {
   139 static const luaL_Reg llm_message_reg_f[] = {
   139 	{ "new",   llm_message_new       },
   140 	{ "new",   llm_message_new       },