69 |
69 |
70 /// lm.message.new |
70 /// lm.message.new |
71 /// Creates new message object. |
71 /// Creates new message object. |
72 /// A: string (to), message type, message sub type (optional) |
72 /// A: string (to), message type, message sub type (optional) |
73 /// R: lm message object |
73 /// R: lm message object |
74 static int llm_message_new (lua_State *L) |
74 static int new_lm_message (lua_State *L) |
75 { |
75 { |
76 const char *to = luaL_checkstring (L, 1); |
76 const char *to = luaL_checkstring (L, 1); |
77 int type = luaL_checkenum (L, 2, llm_message_type); |
77 int type = luaL_checkenum (L, 2, type_lm_message); |
78 LmMessage *message; |
78 LmMessage *message; |
79 if (lua_gettop (L) > 2) |
79 if (lua_gettop (L) > 2) |
80 message = lm_message_new_with_sub_type (to, type, |
80 message = lm_message_new_with_sub_type (to, type, |
81 luaL_checkenum (L, 3, llm_message_sub_type)); |
81 luaL_checkenum (L, 3, sub_type_lm_message)); |
82 else |
82 else |
83 message = lm_message_new (to, type); |
83 message = lm_message_new (to, type); |
84 llm_message_bless (L, message); |
84 bless_lm_message (L, message); |
85 lm_message_unref (message); |
85 lm_message_unref (message); |
86 D ("Message %X created", (int) message); |
86 D ("Message %X created", (int) message); |
87 return 1; |
87 return 1; |
88 } |
88 } |
89 |
89 |
90 /// lm.message.bless |
90 /// lm.message.bless |
91 /// Blesses given pointer to lm message object. |
91 /// Blesses given pointer to lm message object. |
92 /// A: lightuserdata (C lm message object) |
92 /// A: lightuserdata (C lm message object) |
93 /// R: lm message object |
93 /// R: lm message object |
94 static int llm_message_bless_lua (lua_State *L) |
94 static int bless_lua_lm_message (lua_State *L) |
95 { |
95 { |
96 luaL_argcheck (L, lua_islightuserdata (L, 1), 1, "lm message lightuserdata expected"); |
96 luaL_argcheck (L, lua_islightuserdata (L, 1), 1, "lm message lightuserdata expected"); |
97 llm_message_bless (L, lua_touserdata (L, 1)); |
97 bless_lm_message (L, lua_touserdata (L, 1)); |
98 return 1; |
98 return 1; |
99 } |
99 } |
100 |
100 |
101 /// message:node |
101 /// message:node |
102 /// Returns root node object of message. |
102 /// Returns root node object of message. |
103 /// R: lm message node object |
103 /// R: lm message node object |
104 static int llm_message_node (lua_State *L) |
104 static int node_lm_message (lua_State *L) |
105 { |
105 { |
106 llm_message_t *object = luaL_checklm_message (L, 1); |
106 llm_message_t *object = luaL_checklm_message (L, 1); |
107 LmMessageNode *node = lm_message_get_node (object->message); |
107 LmMessageNode *node = lm_message_get_node (object->message); |
108 llm_message_node_bless (L, node); |
108 bless_lm_node (L, node); |
109 // XXX lm_message_node_unref (node); |
109 // XXX lm_message_node_unref (node); |
110 return 1; |
110 return 1; |
111 } |
111 } |
112 |
112 |
113 /// message:type |
113 /// message:type |
114 /// Returns two strings: message type and message sub type. |
114 /// Returns two strings: message type and message sub type. |
115 /// R: message type, message sub type |
115 /// R: message type, message sub type |
116 static int llm_message_kind (lua_State *L) |
116 static int kind_lm_message (lua_State *L) |
117 { |
117 { |
118 llm_message_t *object = luaL_checklm_message (L, 1); |
118 llm_message_t *object = luaL_checklm_message (L, 1); |
119 luaL_pushenum (L, lm_message_get_type (object->message), llm_message_type); |
119 luaL_pushenum (L, lm_message_get_type (object->message), type_lm_message); |
120 luaL_pushenum (L, lm_message_get_sub_type (object->message), llm_message_sub_type); |
120 luaL_pushenum (L, lm_message_get_sub_type (object->message), sub_type_lm_message); |
121 return 2; |
121 return 2; |
122 } |
122 } |
123 |
123 |
124 /// message:pointer |
124 /// message:pointer |
125 /// Returns pointer to underlying C loudmouth structure. |
125 /// Returns pointer to underlying C loudmouth structure. |
126 /// R: lightuserdata |
126 /// R: lightuserdata |
127 static int llm_message_pointer (lua_State *L) |
127 static int pointer_lm_message (lua_State *L) |
128 { |
128 { |
129 llm_message_t *object = luaL_checklm_message (L, 1); |
129 llm_message_t *object = luaL_checklm_message (L, 1); |
130 lua_pushlightuserdata (L, object->message); |
130 lua_pushlightuserdata (L, object->message); |
131 return 1; |
131 return 1; |
132 } |
132 } |
133 |
133 |
134 static int llm_message_gc (lua_State *L) |
134 static int gc_lm_message (lua_State *L) |
135 { |
135 { |
136 llm_message_t *message = luaL_checklm_message (L, 1); |
136 llm_message_t *message = luaL_checklm_message (L, 1); |
137 D ("Message %X gc called", (int) message); |
137 D ("Message %X gc called", (int) message); |
138 lm_message_unref (message->message); |
138 lm_message_unref (message->message); |
139 return 0; |
139 return 0; |
140 } |
140 } |
141 |
141 |
142 static const luaL_Reg llm_message_reg_f[] = { |
142 static const luaL_Reg reg_f_lm_message[] = { |
143 { "new", llm_message_new }, |
143 { "new", new_lm_message }, |
144 { "bless", llm_message_bless_lua }, |
144 { "bless", bless_lua_lm_message }, |
145 { NULL, NULL }, |
145 { NULL, NULL }, |
146 }; |
146 }; |
147 |
147 |
148 static const luaL_Reg llm_message_reg_m[] = { |
148 static const luaL_Reg reg_m_lm_message[] = { |
149 { "node", llm_message_node }, |
149 { "node", node_lm_message }, |
150 { "type", llm_message_kind }, |
150 { "type", kind_lm_message }, |
151 // These methods are common for message and message node |
151 // These methods are common for message and message node |
152 { "next", llm_message_node_next }, |
152 { "next", next_lm_node }, |
153 { "prev", llm_message_node_prev }, |
153 { "prev", prev_lm_node }, |
154 { "children", llm_message_node_children }, |
154 { "children", children_lm_node }, |
155 { "parent", llm_message_node_parent }, |
155 { "parent", parent_lm_node }, |
156 { "value", llm_message_node_value }, |
156 { "value", value_lm_node }, |
157 { "child", llm_message_node_child }, |
157 { "child", child_lm_node }, |
158 { "find_child", llm_message_node_find_child }, |
158 { "find_child", find_child_lm_node }, |
159 { "attribute", llm_message_node_attribute }, |
159 { "attribute", attribute_lm_node }, |
160 { "raw", llm_message_node_raw }, |
160 { "raw", raw_lm_node }, |
161 { "xml", llm_message_node_xml }, |
161 { "xml", xml_lm_node }, |
162 { "path", llm_message_node_path }, |
162 { "path", path_lm_node }, |
163 // End common methods |
163 // End common methods |
164 { "pointer", llm_message_pointer }, |
164 { "pointer", pointer_lm_message }, |
165 { "__gc", llm_message_gc }, |
165 { "__gc", gc_lm_message }, |
166 { NULL, NULL }, |
166 { NULL, NULL }, |
167 }; |
167 }; |
168 |
168 |
169 int luaopen_lm_message (lua_State *L) |
169 int luaopen_lm_message (lua_State *L) |
170 { |
170 { |
171 luaL_newmetatable (L, "loudmouth.message"); |
171 luaL_newmetatable (L, "loudmouth.message"); |
172 lua_pushstring (L, "__index"); |
172 lua_pushstring (L, "__index"); |
173 lua_pushvalue (L, -2); |
173 lua_pushvalue (L, -2); |
174 lua_settable (L, -3); |
174 lua_settable (L, -3); |
175 luaL_register (L, NULL, llm_message_reg_m); |
175 luaL_register (L, NULL, reg_m_lm_message); |
176 lua_pop (L, 1); |
176 lua_pop (L, 1); |
177 luaL_register (L, "lm.message", llm_message_reg_f); |
177 luaL_register (L, "lm.message", reg_f_lm_message); |
178 return 1; |
178 return 1; |
179 } |
179 } |
180 |
180 |