From 23457aedcfa77ae0e22cde112eadc3d086c677e4 Mon Sep 17 00:00:00 2001 From: Jan Kaluza Date: Thu, 15 Mar 2012 08:09:41 +0100 Subject: [PATCH] GET_PROPERTY in Skype --- backends/skype/main.cpp | 93 ++++++++++++++++------------------------- spectrum/src/sample.cfg | 2 +- 2 files changed, 38 insertions(+), 57 deletions(-) diff --git a/backends/skype/main.cpp b/backends/skype/main.cpp index 40118f67..6731b96b 100644 --- a/backends/skype/main.cpp +++ b/backends/skype/main.cpp @@ -36,6 +36,10 @@ using namespace Transport; class SpectrumNetworkPlugin; +#define GET_RESPONSE_DATA(RESP, DATA) (RESP.find(DATA) != std::string::npos ? RESP.substr(RESP.find(DATA) + strlen(DATA) + 1) : ""); +#define GET_PROPERTY(VAR, OBJ, WHICH, PROP) std::string VAR = sk->send_command(std::string("GET ") + OBJ + " " + WHICH + " " + PROP); \ + VAR = GET_RESPONSE_DATA(VAR, PROP); + SpectrumNetworkPlugin *np; @@ -292,7 +296,7 @@ class SpectrumNetworkPlugin : public NetworkPlugin { std::cout << skype->getUsername() << " " << name << "\n"; if (skype->getUsername() == name) { alias = skype->send_command("GET PROFILE FULLNAME"); - alias = alias.substr(17); + alias = GET_RESPONSE_DATA(alias, "FULLNAME") } handleVCard(user, id, legacyName, "", alias, photo); } @@ -504,7 +508,7 @@ bool Skype::loadSkypeBuddies() { std::string re = send_command("NAME Spectrum"); if (m_counter++ > 15) { LOG4CXX_ERROR(logger, "Logging out, because we tried to connect the Skype over DBUS 15 times without success"); - np->handleDisconnected(m_user, pbnetwork::CONNECTION_ERROR_AUTHENTICATION_IMPOSSIBLE, "Skype is not read."); + np->handleDisconnected(m_user, pbnetwork::CONNECTION_ERROR_AUTHENTICATION_IMPOSSIBLE, "Skype is not ready. This issue have been logged and admins will check it and try to fix it soon."); close(fd_output); logout(); return FALSE; @@ -518,7 +522,7 @@ bool Skype::loadSkypeBuddies() { if (send_command("PROTOCOL 7") != "PROTOCOL 7") { LOG4CXX_ERROR(logger, "PROTOCOL 7 failed, logging out"); - np->handleDisconnected(m_user, pbnetwork::CONNECTION_ERROR_AUTHENTICATION_IMPOSSIBLE, "Skype is not ready"); + np->handleDisconnected(m_user, pbnetwork::CONNECTION_ERROR_AUTHENTICATION_IMPOSSIBLE, "Skype is not ready. This issue have been logged and admins will check it and try to fix it soon."); logout(); return FALSE; } @@ -527,20 +531,22 @@ bool Skype::loadSkypeBuddies() { std::map group_map; std::string groups = send_command("SEARCH GROUPS CUSTOM"); - groups = groups.substr(groups.find(' ') + 1); - std::vector grps; - boost::split(grps, groups, boost::is_any_of(",")); - BOOST_FOREACH(std::string grp, grps) { - std::vector data; - std::string name = send_command("GET GROUP " + grp + " DISPLAYNAME"); - boost::split(data, name, boost::is_any_of(" ")); - name = name.substr(name.find("DISPLAYNAME") + 12); + if (groups.find(' ') != std::string::npos) { + groups = groups.substr(groups.find(' ') + 1); + std::vector grps; + boost::split(grps, groups, boost::is_any_of(",")); + BOOST_FOREACH(std::string grp, grps) { + std::vector data; + std::string name = send_command("GET GROUP " + grp + " DISPLAYNAME"); + boost::split(data, name, boost::is_any_of(" ")); + name = GET_RESPONSE_DATA(name, "DISPLAYNAME"); - std::string users = send_command("GET GROUP " + data[1] + " USERS"); - users = name.substr(name.find("USERS") + 6); - boost::split(data, users, boost::is_any_of(",")); - BOOST_FOREACH(std::string u, data) { - group_map[u] = grp; + std::string users = send_command("GET GROUP " + data[1] + " USERS"); + users = GET_RESPONSE_DATA(users, "USERS"); + boost::split(data, users, boost::is_any_of(",")); + BOOST_FOREACH(std::string u, data) { + group_map[u] = grp; + } } } @@ -650,70 +656,49 @@ static void handle_skype_message(std::string &message, Skype *sk) { } else { pbnetwork::StatusType status = getStatus(cmd[3]); - std::string mood_text = sk->send_command("GET USER " + cmd[1] + " MOOD_TEXT"); - mood_text = mood_text.substr(mood_text.find("MOOD_TEXT") + 10); - - std::string alias = sk->send_command("GET USER " + cmd[1] + " FULLNAME"); - alias = alias.substr(alias.find("FULLNAME") + 9); + GET_PROPERTY(mood_text, "USER", cmd[1], "MOOD_TEXT"); + GET_PROPERTY(alias, "USER", cmd[1], "FULLNAME"); std::vector groups; np->handleBuddyChanged(sk->getUser(), cmd[1], alias, groups, status, mood_text); } } else if (cmd[2] == "MOOD_TEXT") { - std::string st = sk->send_command("GET USER " + cmd[1] + " ONLINESTATUS"); - st = st.substr(st.find("ONLINESTATUS") + 13); + GET_PROPERTY(st, "USER", cmd[1], "ONLINESTATUS"); pbnetwork::StatusType status = getStatus(st); - std::string mood_text = message.substr(message.find("MOOD_TEXT") + 10); + std::string mood_text = GET_RESPONSE_DATA(message, "MOOD_TEXT"); std::vector groups; np->handleBuddyChanged(sk->getUser(), cmd[1], "", groups, status, mood_text); } else if (cmd[2] == "BUDDYSTATUS" && cmd[3] == "3") { - std::string st = sk->send_command("GET USER " + cmd[1] + " ONLINESTATUS"); - st = st.substr(st.find("ONLINESTATUS") + 13); + GET_PROPERTY(mood_text, "USER", cmd[1], "MOOD_TEXT"); + GET_PROPERTY(st, "USER", cmd[1], "ONLINESTATUS"); pbnetwork::StatusType status = getStatus(st); - std::string mood_text = message.substr(message.find("MOOD_TEXT") + 10); - std::vector groups; np->handleBuddyChanged(sk->getUser(), cmd[1], "", groups, status, mood_text); } else if (cmd[2] == "FULLNAME") { - std::string st = sk->send_command("GET USER " + cmd[1] + " ONLINESTATUS"); - st = st.substr(st.find("ONLINESTATUS") + 13); + GET_PROPERTY(alias, "USER", cmd[1], "FULLNAME"); + GET_PROPERTY(mood_text, "USER", cmd[1], "MOOD_TEXT"); + GET_PROPERTY(st, "USER", cmd[1], "ONLINESTATUS"); pbnetwork::StatusType status = getStatus(st); - std::string mood_text = sk->send_command("GET USER " + cmd[1] + " MOOD_TEXT"); - mood_text = mood_text.substr(mood_text.find("MOOD_TEXT") + 10); - - std::string alias = message.substr(message.find("FULLNAME") + 9); - std::vector groups; np->handleBuddyChanged(sk->getUser(), cmd[1], alias, groups, status, mood_text); } } else if (cmd[0] == "CHATMESSAGE") { if (cmd[3] == "RECEIVED") { - std::string body = sk->send_command("GET CHATMESSAGE " + cmd[1] + " BODY"); - body = body.substr(body.find("BODY") + 5); + GET_PROPERTY(body, "CHATMESSAGE", cmd[1], "BODY"); + GET_PROPERTY(from_handle, "CHATMESSAGE", cmd[1], "FROM_HANDLE"); - std::string chatname = sk->send_command("GET CHATMESSAGE " + cmd[1] + " CHATNAME"); - size_t start = chatname.find("$") + 1; - size_t len = chatname.find(";") - start; - std::string from = chatname.substr(start, len); - - std::string from_handle = sk->send_command("GET CHATMESSAGE " + cmd[1] + " FROM_HANDLE"); - from_handle = from_handle.substr(from_handle.find("FROM_HANDLE") + 12); - -// if (from_handle != sk->getUsername()) { - from = from_handle; -// } if (from_handle == sk->getUsername()) return; - np->handleMessage(sk->getUser(), from, body); + np->handleMessage(sk->getUser(), from_handle, body); } } else if (cmd[0] == "CALL") { @@ -721,17 +706,13 @@ static void handle_skype_message(std::string &message, Skype *sk) { if (cmd[2] == "STATUS") { if (cmd[3] == "RINGING" || cmd[3] == "MISSED") { // handle only incoming calls - std::string type = sk->send_command("GET CALL " + cmd[1] + " TYPE"); - type = type.substr(type.find("TYPE") + 5); + GET_PROPERTY(type, "CALL", cmd[1], "TYPE"); if (type.find("INCOMING") != 0) { return; } - std::string from = sk->send_command("GET CALL " + cmd[1] + " PARTNER_HANDLE"); - from = from.substr(from.find("PARTNER_HANDLE") + 15); - - std::string dispname = sk->send_command("GET CALL " + cmd[1] + " PARTNER_DISPNAME"); - dispname = dispname.substr(dispname.find("PARTNER_DISPNAME") + 17); + GET_PROPERTY(from, "CALL", cmd[1], "PARTNER_HANDLE"); + GET_PROPERTY(dispname, "CALL", cmd[1], "PARTNER_DISPNAME"); if (cmd[3] == "RINGING") { np->handleMessage(sk->getUser(), from, "User " + dispname + " is calling you."); diff --git a/spectrum/src/sample.cfg b/spectrum/src/sample.cfg index 57e601eb..78c22a80 100644 --- a/spectrum/src/sample.cfg +++ b/spectrum/src/sample.cfg @@ -7,7 +7,7 @@ server_mode = 1 backend_host=localhost pidfile=./test.pid # < this option doesn't work yet -backend_port=10001 +#backend_port=10001 admin_username=admin admin_password=test #cert=server.pfx #patch to PKCS#12 certificate