summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Sluift/client.cpp69
-rw-r--r--Swiften/Elements/Stanza.h5
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);