lm_message.c
changeset 11 a8c6460d612b
parent 8 951f92c66821
child 12 63f06a23c235
equal deleted inserted replaced
10:aed141accdd9 11:a8c6460d612b
    18 /// one node object.
    18 /// one node object.
    19 
    19 
    20 /// message type
    20 /// message type
    21 /// Message type (root tag type).
    21 /// Message type (root tag type).
    22 /// G:
    22 /// G:
    23 const string2enum_t llm_message_type[] = {
    23 const string2enum_t type_lm_message[] = {
    24 	{ "message",         LM_MESSAGE_TYPE_MESSAGE         },
    24 	{ "message",         LM_MESSAGE_TYPE_MESSAGE         },
    25 	{ "presence",        LM_MESSAGE_TYPE_PRESENCE        },
    25 	{ "presence",        LM_MESSAGE_TYPE_PRESENCE        },
    26 	{ "iq",              LM_MESSAGE_TYPE_IQ              },
    26 	{ "iq",              LM_MESSAGE_TYPE_IQ              },
    27 	{ "stream",          LM_MESSAGE_TYPE_STREAM          },
    27 	{ "stream",          LM_MESSAGE_TYPE_STREAM          },
    28 	{ "stream error",    LM_MESSAGE_TYPE_STREAM_ERROR    },
    28 	{ "stream error",    LM_MESSAGE_TYPE_STREAM_ERROR    },
    44 };
    44 };
    45 
    45 
    46 /// message sub type
    46 /// message sub type
    47 /// Message subtype, not all combinations of type and subtype are possible.
    47 /// Message subtype, not all combinations of type and subtype are possible.
    48 /// G:
    48 /// G:
    49 const string2enum_t llm_message_sub_type[] = {
    49 const string2enum_t sub_type_lm_message[] = {
    50 	{ "not set",       LM_MESSAGE_SUB_TYPE_NOT_SET      },
    50 	{ "not set",       LM_MESSAGE_SUB_TYPE_NOT_SET      },
    51 	{ "available",     LM_MESSAGE_SUB_TYPE_AVAILABLE    },
    51 	{ "available",     LM_MESSAGE_SUB_TYPE_AVAILABLE    },
    52 	{ "normal",        LM_MESSAGE_SUB_TYPE_NORMAL       },
    52 	{ "normal",        LM_MESSAGE_SUB_TYPE_NORMAL       },
    53 	{ "chat",          LM_MESSAGE_SUB_TYPE_CHAT         },
    53 	{ "chat",          LM_MESSAGE_SUB_TYPE_CHAT         },
    54 	{ "groupchat",     LM_MESSAGE_SUB_TYPE_GROUPCHAT    },
    54 	{ "groupchat",     LM_MESSAGE_SUB_TYPE_GROUPCHAT    },
    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