lm_message_node.c
changeset 6 90073cbb535d
parent 0 84fdfb0344c9
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 "lm_types.h"
     7 #include "lm_types.h"
     7 
     8 
     8 /// lm.message_node
     9 /// lm.message_node
     9 /// Object, representing xml node of the message.
    10 /// Object, representing xml node of the message.
    10 /// Cannot be created directly, only as a part of message tree.
    11 /// Cannot be created directly, only as a part of message tree.
    15 /// R: lm message node object
    16 /// R: lm message node object
    16 static int llm_message_node_bless_lua (lua_State *L)
    17 static int llm_message_node_bless_lua (lua_State *L)
    17 {
    18 {
    18 	luaL_argcheck (L, lua_islightuserdata (L, 1), 1, "loudmouth message node lightuserdata expected");
    19 	luaL_argcheck (L, lua_islightuserdata (L, 1), 1, "loudmouth message node lightuserdata expected");
    19 	llm_message_node_bless (L, lua_touserdata (L, 1));
    20 	llm_message_node_bless (L, lua_touserdata (L, 1));
    20 	lua_remove (L, -2);
       
    21 	return 1;
    21 	return 1;
    22 }
    22 }
    23 
    23 
    24 /// message_node:name
    24 /// message_node:name
    25 /// Gets a name of message node.
    25 /// Gets a name of message node.
    26 /// R: string
    26 /// R: string
    27 static int llm_message_node_name (lua_State *L)
    27 static int llm_message_node_name (lua_State *L)
    28 {
    28 {
    29 	llm_message_node_t *object = luaL_checklm_message_node (L, 1);
    29 	llm_message_node_t *object = luaL_checklm_message_node (L, 1);
    30 	lua_pushstring (L, object->message_node->name);
    30 	lua_pushstring (L, object->message_node->name);
    31 	lua_remove (L, -2);
       
    32 	return 1;
    31 	return 1;
    33 }
    32 }
    34 
    33 
    35 /// message_node:next
    34 /// message_node:next
    36 /// Gets next message node.
    35 /// Gets next message node.
    41 	LmMessageNode *node = object->message_node->next;
    40 	LmMessageNode *node = object->message_node->next;
    42 	if (node)
    41 	if (node)
    43 		llm_message_node_bless (L, node);
    42 		llm_message_node_bless (L, node);
    44 	else
    43 	else
    45 		lua_pushnil (L);
    44 		lua_pushnil (L);
    46 	lua_remove (L, -2);
       
    47 	return 1;
    45 	return 1;
    48 }
    46 }
    49 
    47 
    50 /// message_node:prev
    48 /// message_node:prev
    51 /// Gets previous message node.
    49 /// Gets previous message node.
    56 	LmMessageNode *node = object->message_node->prev;
    54 	LmMessageNode *node = object->message_node->prev;
    57 	if (node)
    55 	if (node)
    58 		llm_message_node_bless (L, node);
    56 		llm_message_node_bless (L, node);
    59 	else
    57 	else
    60 		lua_pushnil (L);
    58 		lua_pushnil (L);
    61 	lua_remove (L, -2);
       
    62 	return 1;
    59 	return 1;
    63 }
    60 }
    64 
    61 
    65 /// message_node:children
    62 /// message_node:children
    66 /// Gets first child node (raw access used).
    63 /// Gets first child node (raw access used).
    71 	LmMessageNode *node = object->message_node->children;
    68 	LmMessageNode *node = object->message_node->children;
    72 	if (node)
    69 	if (node)
    73 		llm_message_node_bless (L, node);
    70 		llm_message_node_bless (L, node);
    74 	else
    71 	else
    75 		lua_pushnil (L);
    72 		lua_pushnil (L);
    76 	lua_remove (L, -2);
       
    77 	return 1;
    73 	return 1;
    78 }
    74 }
    79 
    75 
    80 /// message_node:parent
    76 /// message_node:parent
    81 /// Gets parent message node.
    77 /// Gets parent message node.
    86 	LmMessageNode *node = object->message_node->parent;
    82 	LmMessageNode *node = object->message_node->parent;
    87 	if (node)
    83 	if (node)
    88 		llm_message_node_bless (L, node);
    84 		llm_message_node_bless (L, node);
    89 	else
    85 	else
    90 		lua_pushnil (L);
    86 		lua_pushnil (L);
    91 	lua_remove (L, -2);
       
    92 	return 1;
    87 	return 1;
    93 }
    88 }
    94 
    89 
    95 /// message_node:value
    90 /// message_node:value
    96 /// Gets or sets a value of message node.
    91 /// Gets or sets a value of message node.
    97 /// A: string (optional value)
    92 /// A: string (optional value)
    98 /// R: string (if called without arguments)
    93 /// R: string (if called without arguments) or lm message node object
    99 static int llm_message_node_value (lua_State *L)
    94 static int llm_message_node_value (lua_State *L)
   100 {
    95 {
   101 	llm_message_node_t *object = luaL_checklm_message_node (L, 1);
    96 	llm_message_node_t *object = luaL_checklm_message_node (L, 1);
   102 	if (lua_gettop (L) > 1) { // Set
    97 	if (lua_gettop (L) > 1) { // Set
   103 		const char *value = luaL_checkstring (L, 2);
    98 		const char *value = luaL_checkstring (L, 2);
   104 		lm_message_node_set_value (object->message_node, value);
    99 		lm_message_node_set_value (object->message_node, value);
   105 		lua_pop (L, 2);
   100 		lua_pop (L, 1);
   106 		return 0;
   101 	} else // Get
   107 	} else { // Get
       
   108 		lua_pushstring (L, lm_message_node_get_value (object->message_node));
   102 		lua_pushstring (L, lm_message_node_get_value (object->message_node));
   109 		lua_remove (L, -2);
   103 	return 1;
   110 		return 1;
       
   111 	}
       
   112 }
   104 }
   113 
   105 
   114 /// message_node:child
   106 /// message_node:child
   115 /// Gets or creates child node object with given name.
   107 /// Gets or creates child node object with given name.
   116 /// A: string (name), string (optional value)
   108 /// A: string (name), string (optional value)
   119 {
   111 {
   120 	llm_message_node_t *object = luaL_checklm_message_node (L, 1);
   112 	llm_message_node_t *object = luaL_checklm_message_node (L, 1);
   121 	const char *name = luaL_checkstring (L, 2);
   113 	const char *name = luaL_checkstring (L, 2);
   122 	LmMessageNode *child;
   114 	LmMessageNode *child;
   123 
   115 
   124 	if (lua_gettop (L) > 2) { // Add
   116 	if (lua_gettop (L) > 2) // Add
   125 		child = lm_message_node_add_child (object->message_node, name,
   117 		child = lm_message_node_add_child (object->message_node, name,
   126 						   luaL_checkstring (L, 3));
   118 						   luaL_checkstring (L, 3));
   127 		lua_pop (L, 1);
   119 	else { // Get
   128 	} else { // Get
       
   129 		child = lm_message_node_get_child (object->message_node, name);
   120 		child = lm_message_node_get_child (object->message_node, name);
   130 		if (!child) {
   121 		if (!child) {
   131 			lua_pushnil (L);
   122 			lua_pushnil (L);
   132 			return 1;
   123 			return 1;
   133 		}
   124 		}
   134 	}
   125 	}
   135 	llm_message_node_bless (L, child);
   126 	llm_message_node_bless (L, child);
   136 	// XXX lm_message_node_unref (child);
   127 	// XXX lm_message_node_unref (child);
   137 	lua_remove (L, -2);
       
   138 	lua_remove (L, -2);
       
   139 	return 1;
   128 	return 1;
   140 }
   129 }
   141 
   130 
   142 /// message_node:find_child
   131 /// message_node:find_child
   143 /// Searches for node with a given name over all node subtree.
   132 /// Searches for node with a given name over all node subtree.
   154 		lua_pushnil (L);
   143 		lua_pushnil (L);
   155 	else {
   144 	else {
   156 		llm_message_node_bless (L, child);
   145 		llm_message_node_bless (L, child);
   157 		// XXX lm_message_node_unref (child);
   146 		// XXX lm_message_node_unref (child);
   158 	}
   147 	}
   159 	lua_remove (L, -2);
       
   160 	lua_remove (L, -2);
       
   161 	return 1;
   148 	return 1;
   162 }
   149 }
   163 
   150 
   164 /// message_node:raw
   151 /// message_node:raw
   165 /// Gets or sets raw mode flag for node.
   152 /// Gets or sets raw mode flag for node.
   166 /// When set, value of node will not be escaped.
   153 /// When set, value of node will not be escaped.
   167 /// A: boolean (optional)
   154 /// A: boolean (optional)
   168 /// V: boolean (if called with no apguments)
   155 /// V: boolean (if called with no apguments) or lm message node object
   169 static int llm_message_node_raw (lua_State *L)
   156 static int llm_message_node_raw (lua_State *L)
   170 {
   157 {
   171 	llm_message_node_t *object = luaL_checklm_message_node (L, 1);
   158 	llm_message_node_t *object = luaL_checklm_message_node (L, 1);
   172 	if (lua_gettop (L) > 1) { // Set
   159 	if (lua_gettop (L) > 1) { // Set
   173 		luaL_checktype (L, 2, LUA_TBOOLEAN);
   160 		luaL_checktype (L, 2, LUA_TBOOLEAN);
   174 		lm_message_node_set_raw_mode (object->message_node, lua_toboolean (L, 2));
   161 		lm_message_node_set_raw_mode (object->message_node, lua_toboolean (L, 2));
   175 		lua_pop (L, 2);
   162 		lua_pop (L, 1);
   176 		return 0;
   163 	} else // Get
   177 	} else { // Get
       
   178 		lua_pushboolean (L, lm_message_node_get_raw_mode (object->message_node));
   164 		lua_pushboolean (L, lm_message_node_get_raw_mode (object->message_node));
   179 		lua_remove (L, -2);
   165 	return 1;
   180 		return 1;
       
   181 	}
       
   182 }
   166 }
   183 
   167 
   184 /// message_node:attribute
   168 /// message_node:attribute
   185 /// Gets or sets value of node attribute with a given name.
   169 /// Gets or sets value of node attribute with a given name.
   186 /// A: string (name), string (optional value)
   170 /// A: string (name), string (optional value)
   187 /// R: string (when called with one aprgument)
   171 /// R: string (when called with one aprgument) or lm message node object
   188 static int llm_message_node_attribute (lua_State *L)
   172 static int llm_message_node_attribute (lua_State *L)
   189 {
   173 {
   190 	llm_message_node_t *object = luaL_checklm_message_node (L, 1);
   174 	llm_message_node_t *object = luaL_checklm_message_node (L, 1);
   191 	const char *name = luaL_checkstring (L, 2);
   175 	const char *name = luaL_checkstring (L, 2);
   192 	if (lua_gettop (L) > 2) { // Set
   176 	if (lua_gettop (L) > 2) { // Set
   193 		lm_message_node_set_attribute (object->message_node, name, luaL_checkstring (L, 3));
   177 		lm_message_node_set_attribute (object->message_node, name, luaL_checkstring (L, 3));
   194 		lua_pop (L, 3);
   178 		lua_pop (L, 2);
   195 		return 0;
   179 	} else // Get
   196 	} else { // Get
       
   197 		lua_pushstring (L, lm_message_node_get_attribute (object->message_node, name));
   180 		lua_pushstring (L, lm_message_node_get_attribute (object->message_node, name));
   198 		lua_remove (L, -2);
   181 	return 1;
   199 		lua_remove (L, -2);
       
   200 		return 1;
       
   201 	}
       
   202 }
   182 }
   203 
   183 
   204 /// message_node:xml
   184 /// message_node:xml
   205 /// Returns node representation in xml.
   185 /// Returns node representation in xml.
   206 /// R: string
   186 /// R: string
   207 static int llm_message_node_xml (lua_State *L)
   187 static int llm_message_node_xml (lua_State *L)
   208 {
   188 {
   209 	llm_message_node_t *object = luaL_checklm_message_node (L, 1);
   189 	llm_message_node_t *object = luaL_checklm_message_node (L, 1);
   210 	lua_pushstring (L, lm_message_node_to_string (object->message_node));
   190 	lua_pushstring (L, lm_message_node_to_string (object->message_node));
   211 	lua_remove (L, -2);
       
   212 	return 1;
   191 	return 1;
   213 }
   192 }
   214 
   193 
   215 /// message_node:pointer
   194 /// message_node:pointer
   216 /// Returns pointer to underlying C structure.
   195 /// Returns pointer to underlying C structure.
   217 /// R: lightuserdata
   196 /// R: lightuserdata
   218 static int llm_message_node_pointer (lua_State *L)
   197 static int llm_message_node_pointer (lua_State *L)
   219 {
   198 {
   220 	llm_message_node_t *object = luaL_checklm_message_node (L, 1);
   199 	llm_message_node_t *object = luaL_checklm_message_node (L, 1);
   221 	lua_pushlightuserdata (L, object->message_node);
   200 	lua_pushlightuserdata (L, object->message_node);
   222 	lua_remove (L, -2);
       
   223 	return 1;
   201 	return 1;
   224 }
   202 }
   225 
   203 
   226 static int llm_message_node_gc (lua_State *L)
   204 static int llm_message_node_gc (lua_State *L)
   227 {
   205 {
   228 	llm_message_node_t *object = luaL_checklm_message_node (L, 1);
   206 	llm_message_node_t *object = luaL_checklm_message_node (L, 1);
       
   207 	D ("Message node %X gc called", (int) object);
   229 	lm_message_node_unref (object->message_node);
   208 	lm_message_node_unref (object->message_node);
   230 	lua_pop (L, 1);
       
   231 	return 0;
   209 	return 0;
   232 }
   210 }
   233 
   211 
   234 static const luaL_Reg llm_message_node_reg_f[] = {
   212 static const luaL_Reg llm_message_node_reg_f[] = {
   235 	{ "bless", llm_message_node_bless_lua },
   213 	{ "bless", llm_message_node_bless_lua },