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. |
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 }, |