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