diff options
Diffstat (limited to 'Sluift')
-rw-r--r-- | Sluift/.gitignore | 1 | ||||
-rw-r--r-- | Sluift/Lua/Value.cpp | 9 | ||||
-rw-r--r-- | Sluift/SConscript | 14 | ||||
-rw-r--r-- | Sluift/sluift.cpp | 93 |
4 files changed, 82 insertions, 35 deletions
diff --git a/Sluift/.gitignore b/Sluift/.gitignore index e343aca..35a18c0 100644 --- a/Sluift/.gitignore +++ b/Sluift/.gitignore @@ -1,3 +1,4 @@ lua.c sluift_dll.cpp sluift +dll.c diff --git a/Sluift/Lua/Value.cpp b/Sluift/Lua/Value.cpp index b612bd9..8dd8fcc 100644 --- a/Sluift/Lua/Value.cpp +++ b/Sluift/Lua/Value.cpp @@ -36,11 +36,10 @@ namespace { lua_pushstring(state, s.c_str());
}
- void operator()(const std::vector<Value>& list) const {
- lua_newtable(state);
- int i = 0;
- foreach(const Value& value, list) {
- boost::apply_visitor(PushVisitor(state), value);
+ void operator()(const std::vector<Value>& values) const {
+ lua_createtable(state, values.size(), 0);
+ for(size_t i = 0; i < values.size(); ++i) {
+ boost::apply_visitor(PushVisitor(state), values[i]);
lua_rawseti(state, -2, i + 1);
}
}
diff --git a/Sluift/SConscript b/Sluift/SConscript index ec9f690..6f38693 100644 --- a/Sluift/SConscript +++ b/Sluift/SConscript @@ -1,3 +1,5 @@ +import Version + Import(["env", "conf_env"]) if env["SCONS_STAGE"] == "build" : @@ -21,17 +23,22 @@ if env["SCONS_STAGE"] == "build" : elif myenv["PLATFORM"] == "darwin" : myenv["SHLIBSUFFIX"] = ".so" + myenv["SLUIFT_VERSION"] = Version.getBuildVersion("sluift") def patchLua(env, target, source) : f = open(source[0].abspath, "r") contents = f.read() f.close() - contents = contents.replace("LUA_RELEASE", "\"== Sluift XMPP Console ==\"") + if env["PLATFORM"] == "windows" : + key = "Z" + else : + key = "D" + contents = contents.replace("LUA_RELEASE", "\"== Sluift XMPP Console (%(version)s) == \\nPress Ctrl-%(key)s to exit\"" % {"version": source[1].get_contents(), "key" : key}) contents = contents.replace("LUA_COPYRIGHT", "") f = open(target[0].abspath, "w") f.write(contents) f.close() - myenv.Command("lua.c", ["#/3rdParty/Lua/src/lua.c"], env.Action(patchLua, cmdstr = "$GENCOMSTR")) + myenv.Command("lua.c", ["#/3rdParty/Lua/src/lua.c", myenv.Value(myenv["SLUIFT_VERSION"])], env.Action(patchLua, cmdstr = "$GENCOMSTR")) if myenv.get("HAVE_READLINE", False) : myenv.Append(CPPDEFINES = ["LUA_USE_READLINE"]) myenv.MergeFlags(myenv["READLINE_FLAGS"]) @@ -40,4 +47,5 @@ if env["SCONS_STAGE"] == "build" : "linit.c", ]) - myenv.SharedLibrary("sluift", []); + myenv.WriteVal("dll.c", myenv.Value("")) + myenv.SharedLibrary("sluift", ["dll.c"]) diff --git a/Sluift/sluift.cpp b/Sluift/sluift.cpp index 5d24276..324c94e 100644 --- a/Sluift/sluift.cpp +++ b/Sluift/sluift.cpp @@ -320,35 +320,45 @@ static int sluift_client_send_presence(lua_State *L) { } static int sluift_client_get(lua_State *L) { - SluiftClient* client = getClient(L); - JID jid; - std::string data; - if (lua_type(L, 3) != LUA_TNONE) { - jid = JID(std::string(luaL_checkstring(L, 2))); - data = std::string(luaL_checkstring(L, 3)); + try { + SluiftClient* client = getClient(L); + JID jid; + std::string data; + if (lua_type(L, 3) != LUA_TNONE) { + jid = JID(std::string(luaL_checkstring(L, 2))); + data = std::string(luaL_checkstring(L, 3)); + } + else { + data = std::string(luaL_checkstring(L, 2)); + } + std::string result = client->sendQuery(jid, IQ::Get, data); + lua_pushstring(L, result.c_str()); + return 1; } - else { - data = std::string(luaL_checkstring(L, 2)); + catch (const SluiftException& e) { + return luaL_error(L, e.getReason().c_str()); } - std::string result = client->sendQuery(jid, IQ::Get, data); - lua_pushstring(L, result.c_str()); - return 1; } static int sluift_client_set(lua_State *L) { - SluiftClient* client = getClient(L); - JID jid; - std::string data; - if (lua_type(L, 3) != LUA_TNONE) { - jid = JID(std::string(luaL_checkstring(L, 2))); - data = std::string(luaL_checkstring(L, 3)); + try { + SluiftClient* client = getClient(L); + JID jid; + std::string data; + if (lua_type(L, 3) != LUA_TNONE) { + jid = JID(std::string(luaL_checkstring(L, 2))); + data = std::string(luaL_checkstring(L, 3)); + } + else { + data = std::string(luaL_checkstring(L, 2)); + } + std::string result = client->sendQuery(jid, IQ::Set, data); + lua_pushstring(L, result.c_str()); + return 1; } - else { - data = std::string(luaL_checkstring(L, 2)); + catch (const SluiftException& e) { + return luaL_error(L, e.getReason().c_str()); } - std::string result = client->sendQuery(jid, IQ::Set, data); - lua_pushstring(L, result.c_str()); - return 1; } static int sluift_client_send(lua_State *L) { @@ -452,12 +462,41 @@ static int sluift_client_add_contact(lua_State* L) { try { eventLoop.runOnce(); SluiftClient* client = getClient(L); - JID jid(luaL_checkstring(L, 2)); + RosterItemPayload item; + if (lua_type(L, 2) == LUA_TTABLE) { + lua_getfield(L, 2, "jid"); + const char* rawJID = lua_tostring(L, -1); + if (rawJID) { + item.setJID(std::string(rawJID)); + } + lua_getfield(L, 2, "name"); + const char* rawName = lua_tostring(L, -1); + if (rawName) { + item.setName(rawName); + } + lua_getfield(L, 2, "groups"); + if (!lua_isnil(L, -1)) { + if (lua_type(L, -1) == LUA_TTABLE) { + for (size_t i = 1; i <= lua_objlen(L, -1); ++i) { + lua_rawgeti(L, -1, i); + const char* rawGroup = lua_tostring(L, -1); + if (rawGroup) { + item.addGroup(rawGroup); + } + lua_pop(L, 1); + } + } + else { + return luaL_error(L, "Groups should be a table"); + } + } + } + else { + item.setJID(luaL_checkstring(L, 2)); + } client->getRoster(); - if (!client->getClient()->getRoster()->containsJID(jid)) { - RosterItemPayload item; - item.setJID(jid); + if (!client->getClient()->getRoster()->containsJID(item.getJID())) { RosterPayload::ref roster = boost::make_shared<RosterPayload>(); roster->addItem(item); @@ -473,7 +512,7 @@ static int sluift_client_add_contact(lua_State* L) { return 1; } } - client->getClient()->getSubscriptionManager()->requestSubscription(jid); + client->getClient()->getSubscriptionManager()->requestSubscription(item.getJID()); lua_pushboolean(L, true); return 1; } |