# HG changeset patch # User Myhailo Danylenko # Date 1235225428 -7200 # Node ID 951f92c66821b6a3e27dd3131f6faa21d81a19ab # Parent 5db1448eb857f96b8abad4d489aa1cd91219e728 Path method diff -r 5db1448eb857 -r 951f92c66821 TODO --- a/TODO Sat Feb 21 12:43:51 2009 +0200 +++ b/TODO Sat Feb 21 16:10:28 2009 +0200 @@ -1,5 +1,4 @@ Verify refcounts of lm objects. Need a decent test script for that. Some additional lua functions? -Path node/message method to traverse path and return nil or node diff -r 5db1448eb857 -r 951f92c66821 lm.c --- a/lm.c Sat Feb 21 12:43:51 2009 +0200 +++ b/lm.c Sat Feb 21 16:10:28 2009 +0200 @@ -9,6 +9,15 @@ #include "lm_ssl.h" #include "lm_connection.h" +/// Some common principles: +/// Most methods can be used in two way: +/// * to get value they are invoked without their last argument. Returned value is either a value or pair of nil and error message. +/// * to set value they are invoked with last arg (value) specified. Returned value in most cases is an object, on which operation is performed (to allow chain-initialization). +/// Every object have pointer method to return pointer (lightuserdata) to underlying C loudmouth structure. +/// Every module have a bless method to convert given pointer (lightuserdata) to corresponding lua object. +/// Every unique C loudmouth object have only one corresponding lua object. Thus, result of "lm.message.bless ( message1:pointer () )" will be exactly message1 object (not its copy). +/// Where message handler object is expected, message handler function can be specified. However, you can unregister handler only if you have message handler object. + int luaopen_loudmouth (lua_State *L) { lua_pushstring (L, LLM_OBJREGISTRY); // 1 registry key diff -r 5db1448eb857 -r 951f92c66821 lm_message.c --- a/lm_message.c Sat Feb 21 12:43:51 2009 +0200 +++ b/lm_message.c Sat Feb 21 16:10:28 2009 +0200 @@ -11,6 +11,11 @@ /// lm.message /// Module, representing individual message. /// Message have a type and optionally a sub type. +/// Message have a set common methods with message node, +/// these are next, prev, children, parent, value, child, +/// find_child, attribute, raw, xml and path. They just save +/// you typing :node() each time and save memory for +/// one node object. /// message type /// Message type (root tag type). @@ -154,6 +159,7 @@ { "attribute", llm_message_node_attribute }, { "raw", llm_message_node_raw }, { "xml", llm_message_node_xml }, + { "path", llm_message_node_path }, // End common methods { "pointer", llm_message_pointer }, { "__gc", llm_message_gc }, diff -r 5db1448eb857 -r 951f92c66821 lm_message_node.c --- a/lm_message_node.c Sat Feb 21 12:43:51 2009 +0200 +++ b/lm_message_node.c Sat Feb 21 16:10:28 2009 +0200 @@ -191,6 +191,27 @@ return 1; } +/// message_node:path +/// Returns node with specified path to it. +/// If any element in a path cannot be found, it returns nil. +/// A: string (node name), ... +/// R: lm message node object or nil +int llm_message_node_path (lua_State *L) +{ + LmMessageNode *node = luaL_checkLmMessageNode (L, 1); + int i = 1; + while (i++ < lua_gettop (L)) { + node = lm_message_node_get_child (node, luaL_checkstring (L, i)); + if (node == NULL) { + lua_pushnil (L); + return 1; + } + } + llm_message_node_bless (L, node); + // XXX lm_message_node_unref (child); + return 1; +} + /// message_node:pointer /// Returns pointer to underlying C structure. /// R: lightuserdata @@ -226,6 +247,7 @@ { "attribute", llm_message_node_attribute }, { "raw", llm_message_node_raw }, { "xml", llm_message_node_xml }, + { "path", llm_message_node_path }, { "pointer", llm_message_node_pointer }, { "__gc", llm_message_node_gc }, { NULL, NULL }, diff -r 5db1448eb857 -r 951f92c66821 lm_message_node.h --- a/lm_message_node.h Sat Feb 21 12:43:51 2009 +0200 +++ b/lm_message_node.h Sat Feb 21 16:10:28 2009 +0200 @@ -15,6 +15,7 @@ int llm_message_node_raw (lua_State *L); int llm_message_node_attribute (lua_State *L); int llm_message_node_xml (lua_State *L); +int llm_message_node_path (lua_State *L); int luaopen_lm_message_node (lua_State *L);