diff options
-rw-r--r-- | Sluift/client.cpp | 69 | ||||
-rw-r--r-- | Swiften/Elements/Stanza.h | 5 |
2 files changed, 57 insertions, 17 deletions
diff --git a/Sluift/client.cpp b/Sluift/client.cpp index 914ab9c..06ce807 100644 --- a/Sluift/client.cpp +++ b/Sluift/client.cpp @@ -58,4 +58,44 @@ static inline bool getGlobalDebug(lua_State* L) { } +static void addPayloadsToTable(lua_State* L, const std::vector<boost::shared_ptr<Payload> >& payloads) { + if (!payloads.empty()) { + lua_createtable(L, boost::numeric_cast<int>(payloads.size()), 0); + for (size_t i = 0; i < payloads.size(); ++i) { + Sluift::globals.elementConvertor.convertToLua(L, payloads[i]); + lua_rawseti(L, -2, boost::numeric_cast<int>(i+1)); + } + Lua::registerGetByTypeIndex(L, -1); + lua_setfield(L, -2, "payloads"); + } +} + +static boost::shared_ptr<Payload> getPayload(lua_State* L, int index) { + if (lua_type(L, index) == LUA_TTABLE) { + return Sluift::globals.elementConvertor.convertFromLua(L, index); + } + else if (lua_type(L, index) == LUA_TSTRING) { + return boost::make_shared<RawXMLPayload>(Lua::checkString(L, index)); + } + else { + return boost::shared_ptr<Payload>(); + } +} + +static std::vector< boost::shared_ptr<Payload> > getPayloadsFromTable(lua_State* L, int index) { + index = Lua::absoluteOffset(L, index); + std::vector< boost::shared_ptr<Payload> > result; + lua_getfield(L, index, "payloads"); + if (lua_istable(L, -1)) { + for (lua_pushnil(L); lua_next(L, -2); lua_pop(L, 1)) { + boost::shared_ptr<Payload> payload = getPayload(L, -1); + if (payload) { + result.push_back(payload); + } + } + } + lua_pop(L, 1); + return result; +} + SLUIFT_LUA_FUNCTION(Client, async_connect) { SluiftClient* client = getClient(L); @@ -177,8 +217,10 @@ SLUIFT_LUA_FUNCTION_WITH_HELP( "body the body of the message\n" "type the type of message to send (`normal`, `chat`, `error`, `groupchat`, `headline`)\n" + "payloads payloads to add to the message\n" ) { Sluift::globals.eventLoop.runOnce(); JID to; std::string body; + std::vector<boost::shared_ptr<Payload> > payloads; int index = 2; Message::Type type = Message::Chat; @@ -217,4 +259,6 @@ SLUIFT_LUA_FUNCTION_WITH_HELP( } } + + payloads = getPayloadsFromTable(L, index); } @@ -230,4 +274,5 @@ SLUIFT_LUA_FUNCTION_WITH_HELP( message->setBody(body); message->setType(type); + message->addPayloads(payloads.begin(), payloads.end()); getClient(L)->getClient()->sendMessage(message); return 0; @@ -245,4 +290,5 @@ SLUIFT_LUA_FUNCTION_WITH_HELP( "priority the priority of the presence\n" "type the type of message to send (`available`, `error`, `probe`, `subscribe`, `subscribed`, `unavailable`, `unsubscribe`, `unsubscribed`)\n" + "payloads payloads to add to the presence\n" ) { Sluift::globals.eventLoop.runOnce(); @@ -290,4 +336,6 @@ SLUIFT_LUA_FUNCTION_WITH_HELP( } } + std::vector< boost::shared_ptr<Payload> > payloads = getPayloadsFromTable(L, index); + presence->addPayloads(payloads.begin(), payloads.end()); } @@ -312,10 +360,5 @@ static int sendQuery(lua_State* L, IQ::Type type) { boost::shared_ptr<Payload> payload; lua_getfield(L, 2, "query"); - if (lua_type(L, -1) == LUA_TTABLE) { - payload = Sluift::globals.elementConvertor.convertFromLua(L, -1); - } - else if (lua_type(L, -1) == LUA_TSTRING) { - payload = boost::make_shared<RawXMLPayload>(Lua::checkString(L, -1)); - } + payload = getPayload(L, -1); lua_pop(L, 1); @@ -362,5 +405,5 @@ SLUIFT_LUA_FUNCTION(Client, query_pubsub) { throw Lua::Exception("Missing/incorrect query"); } - boost::shared_ptr<Payload> payload = Sluift::globals.elementConvertor.convertFromLua(L, -1); + boost::shared_ptr<Payload> payload = getPayload(L, -1); if (false) { } @@ -487,4 +530,5 @@ static void pushEvent(lua_State* L, const SluiftClient::Event& event) { ("message_type", boost::make_shared<Lua::Value>(convertMessageTypeToString(message->getType()))); Lua::pushValue(L, result); + addPayloadsToTable(L, message->getPayloads()); Lua::registerTableToString(L, -1); break; @@ -498,14 +542,5 @@ static void pushEvent(lua_State* L, const SluiftClient::Event& event) { ("presence_type", boost::make_shared<Lua::Value>(convertPresenceTypeToString(presence->getType()))); Lua::pushValue(L, result); - if (!presence->getPayloads().empty()) { - const std::vector<boost::shared_ptr<Payload> > payloads = presence->getPayloads(); - lua_createtable(L, boost::numeric_cast<int>(payloads.size()), 0); - for (size_t i = 0; i < payloads.size(); ++i) { - Sluift::globals.elementConvertor.convertToLua(L, payloads[i]); - lua_rawseti(L, -2, boost::numeric_cast<int>(i+1)); - } - Lua::registerGetByTypeIndex(L, -1); - lua_setfield(L, -2, "payloads"); - } + addPayloadsToTable(L, presence->getPayloads()); Lua::registerTableToString(L, -1); break; diff --git a/Swiften/Elements/Stanza.h b/Swiften/Elements/Stanza.h index fbb0139..bd0d7e9 100644 --- a/Swiften/Elements/Stanza.h +++ b/Swiften/Elements/Stanza.h @@ -59,4 +59,9 @@ namespace Swift { } + template<typename InputIterator> + void addPayloads(InputIterator begin, InputIterator end) { + payloads_.insert(payloads_.end(), begin, end); + } + void updatePayload(boost::shared_ptr<Payload> payload); |