lm_message.c
changeset 0 84fdfb0344c9
child 4 5770be2d5f3f
equal deleted inserted replaced
-1:000000000000 0:84fdfb0344c9
       
     1 
       
     2 #include <lua.h>
       
     3 #include <lauxlib.h>
       
     4 #include <loudmouth/loudmouth.h>
       
     5 
       
     6 #include "util.h"
       
     7 #include "lm_types.h"
       
     8 
       
     9 /// lm.message
       
    10 /// Module, representing individual message.
       
    11 /// Message have a type and optionally a sub type.
       
    12 
       
    13 /// message type
       
    14 /// Message type (root tag type).
       
    15 /// V: message, presence, iq, stream, stream error, stream features, auth, challenge, response, success, failure, proceed, starttls, unknown, stream:stream, stream:error, stream:feature
       
    16 const string2enum_t llm_message_type[] = {
       
    17 	{ "message",         LM_MESSAGE_TYPE_MESSAGE         },
       
    18 	{ "presence",        LM_MESSAGE_TYPE_PRESENCE        },
       
    19 	{ "iq",              LM_MESSAGE_TYPE_IQ              },
       
    20 	{ "stream",          LM_MESSAGE_TYPE_STREAM          },
       
    21 	{ "stream error",    LM_MESSAGE_TYPE_STREAM_ERROR    },
       
    22 	{ "stream features", LM_MESSAGE_TYPE_STREAM_FEATURES },
       
    23 	{ "auth",            LM_MESSAGE_TYPE_AUTH            },
       
    24 	{ "challenge",       LM_MESSAGE_TYPE_CHALLENGE       },
       
    25 	{ "response",        LM_MESSAGE_TYPE_RESPONSE        },
       
    26 	{ "success",         LM_MESSAGE_TYPE_SUCCESS         },
       
    27 	{ "failure",         LM_MESSAGE_TYPE_FAILURE         },
       
    28 	{ "proceed",         LM_MESSAGE_TYPE_PROCEED         },
       
    29 	{ "starttls",        LM_MESSAGE_TYPE_STARTTLS        },
       
    30 	{ "unknown",         LM_MESSAGE_TYPE_UNKNOWN         },
       
    31 	{ "stream:stream",   LM_MESSAGE_TYPE_STREAM          },
       
    32 	{ "stream:error",    LM_MESSAGE_TYPE_STREAM_ERROR    },
       
    33 	{ "stream:features", LM_MESSAGE_TYPE_STREAM_FEATURES },
       
    34 	{ NULL,              0                               },
       
    35 };
       
    36 
       
    37 /// message sub type
       
    38 /// Message subtype, not all combinations of type and subtype are possible.
       
    39 /// V: not set, available, normal, chat, groupchat, headline, unavailable, probe, subscribe, unsubscribe, subscribed, unsubscribed, get, set, result, error, not_set
       
    40 const string2enum_t llm_message_sub_type[] = {
       
    41 	{ "not set",       LM_MESSAGE_SUB_TYPE_NOT_SET      },
       
    42 	{ "available",     LM_MESSAGE_SUB_TYPE_AVAILABLE    },
       
    43 	{ "normal",        LM_MESSAGE_SUB_TYPE_NORMAL       },
       
    44 	{ "chat",          LM_MESSAGE_SUB_TYPE_CHAT         },
       
    45 	{ "groupchat",     LM_MESSAGE_SUB_TYPE_GROUPCHAT    },
       
    46 	{ "headline",      LM_MESSAGE_SUB_TYPE_HEADLINE     },
       
    47 	{ "unavailable",   LM_MESSAGE_SUB_TYPE_UNAVAILABLE  },
       
    48 	{ "probe",         LM_MESSAGE_SUB_TYPE_PROBE        },
       
    49 	{ "subscribe",     LM_MESSAGE_SUB_TYPE_SUBSCRIBE    },
       
    50 	{ "unsubscribe",   LM_MESSAGE_SUB_TYPE_UNSUBSCRIBE  },
       
    51 	{ "subscribed",    LM_MESSAGE_SUB_TYPE_SUBSCRIBED   },
       
    52 	{ "unsubscribed",  LM_MESSAGE_SUB_TYPE_UNSUBSCRIBED },
       
    53 	{ "get",           LM_MESSAGE_SUB_TYPE_GET          },
       
    54 	{ "set",           LM_MESSAGE_SUB_TYPE_SET          },
       
    55 	{ "result",        LM_MESSAGE_SUB_TYPE_RESULT       },
       
    56 	{ "error",         LM_MESSAGE_SUB_TYPE_ERROR        },
       
    57 	{ "not_set",       LM_MESSAGE_SUB_TYPE_NOT_SET      },
       
    58 	{ NULL,            0                                },
       
    59 };
       
    60 
       
    61 /// lm.message.new
       
    62 /// Creates new message object.
       
    63 /// A: string (to), message type, message sub type (optional)
       
    64 /// R: lm message object
       
    65 static int llm_message_new (lua_State *L)
       
    66 {
       
    67 	const char *to   = luaL_checkstring (L, 1);
       
    68 	int         type = luaL_checkenum (L, 2, llm_message_type);
       
    69 	LmMessage *message;
       
    70 	if (lua_gettop (L) > 2) {
       
    71 		message = lm_message_new_with_sub_type (to, type,
       
    72 						luaL_checkenum (L, 3, llm_message_sub_type));
       
    73 		lua_pop (L, 1);
       
    74 	} else
       
    75 		message = lm_message_new (to, type);
       
    76 	lua_pop (L, 2);
       
    77 	llm_message_bless (L, message);
       
    78 	lm_message_unref (message);
       
    79 	return 1;
       
    80 }
       
    81 
       
    82 /// lm.message.bless
       
    83 /// Blesses given pointer to lm message object.
       
    84 /// A: lightuserdata (C lm message object)
       
    85 /// R: lm message object
       
    86 static int llm_message_bless_lua (lua_State *L)
       
    87 {
       
    88 	luaL_argcheck (L, lua_islightuserdata (L, 1), 1, "lm message lightuserdata expected");
       
    89 	llm_message_bless (L, lua_touserdata (L, 1));
       
    90 	lua_remove (L, -2);
       
    91 	return 1;
       
    92 }
       
    93 
       
    94 /// message:node
       
    95 /// Returns root node object of message.
       
    96 /// R: lm message node object
       
    97 static int llm_message_node (lua_State *L)
       
    98 {
       
    99 	llm_message_t *object = luaL_checklm_message (L, 1);
       
   100 	LmMessageNode *node = lm_message_get_node (object->message);
       
   101 	llm_message_node_bless (L, node);
       
   102 	// XXX lm_message_node_unref (node);
       
   103 	lua_remove (L, -2);
       
   104 	return 1;
       
   105 }
       
   106 
       
   107 /// message:type
       
   108 /// Returns two strings: message type and message sub type.
       
   109 /// R: message type, message sub type
       
   110 static int llm_message_kind (lua_State *L)
       
   111 {
       
   112 	llm_message_t *object = luaL_checklm_message (L, 1);
       
   113 	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);
       
   115 	lua_remove (L, -3);
       
   116 	return 2;
       
   117 }
       
   118 
       
   119 /// message:pointer
       
   120 /// Returns pointer to underlying C loudmouth structure.
       
   121 /// R: lightuserdata
       
   122 static int llm_message_pointer (lua_State *L)
       
   123 {
       
   124 	llm_message_t *object = luaL_checklm_message (L, 1);
       
   125 	lua_pushlightuserdata (L, object->message);
       
   126 	lua_remove (L, -2);
       
   127 	return 1;
       
   128 }
       
   129 
       
   130 static int llm_message_gc (lua_State *L)
       
   131 {
       
   132 	llm_message_t *object = luaL_checklm_message (L, 1);
       
   133 	lm_message_unref (object->message);
       
   134 	lua_pop (L, 1);
       
   135 	return 0;
       
   136 }
       
   137 
       
   138 static const luaL_Reg llm_message_reg_f[] = {
       
   139 	{ "new",   llm_message_new       },
       
   140 	{ "bless", llm_message_bless_lua },
       
   141 	{ NULL,    NULL                  },
       
   142 };
       
   143 
       
   144 static const luaL_Reg llm_message_reg_m[] = {
       
   145 	{ "node",    llm_message_node    },
       
   146 	{ "type",    llm_message_kind    },
       
   147 	{ "pointer", llm_message_pointer },
       
   148 	{ "__gc",    llm_message_gc      },
       
   149 	{ NULL,      NULL                },
       
   150 };
       
   151 
       
   152 int luaopen_lm_message (lua_State *L)
       
   153 {
       
   154 	luaL_newmetatable (L, "loudmouth.message");
       
   155 	lua_pushstring (L, "__index");
       
   156 	lua_pushvalue (L, -2);
       
   157 	lua_settable (L, -3);
       
   158 	luaL_register (L, NULL, llm_message_reg_m);
       
   159 	lua_pop (L, 1);
       
   160 	luaL_register (L, "lm.message", llm_message_reg_f);
       
   161 	return 1;
       
   162 }
       
   163