Changeset - 762d04e9c140
[Not reviewed]
0 2 0
root root@spectrum2.(none) - 11 years ago 2014-09-02 18:31:10

Skype: check for new messages every 10 seconds
2 files changed with 25 insertions and 2 deletions:
0 comments (0 inline, 0 general)
backends/skype/main.cpp
Show inline comments
 
@@ -17,25 +17,24 @@
 
#include "transport/networkplugin.h"
 
#include <boost/filesystem.hpp>
 
#include "sys/wait.h"
 
#include "sys/signal.h"
 
// #include "valgrind/memcheck.h"
 
#ifndef __FreeBSD__
 
#include "malloc.h"
 
#endif
 

	
 
#include "skype.h"
 
#include "skypeplugin.h"
 

	
 

	
 
DEFINE_LOGGER(logger, "backend");
 

	
 
using namespace Transport;
 

	
 
static void spectrum_sigchld_handler(int sig)
 
{
 
	int status;
 
	pid_t pid;
 

	
 
	do {
 
		pid = waitpid(-1, &status, WNOHANG);
 
	} while (pid != 0 && pid != (pid_t)-1);
backends/skype/skype.cpp
Show inline comments
 
@@ -48,24 +48,32 @@ DEFINE_LOGGER(logger, "Skype");
 
Skype::Skype(SkypePlugin *np, const std::string &user, const std::string &username, const std::string &password) {
 
	m_username = username;
 
	m_user = user;
 
	m_password = password;
 
	m_pid = 0;
 
	m_connection = 0;
 
	m_proxy = 0;
 
	m_timer = -1;
 
	m_counter = 0;
 
	m_np = np;
 
}
 

	
 
static gboolean skype_check_missedmessages(gpointer data) {
 
	Skype *skype = (Skype *) data;
 

	
 
	skype->send_command("SEARCH MISSEDCHATMESSAGES");
 

	
 
	return TRUE;
 
}
 

	
 
static gboolean load_skype_buddies(gpointer data) {
 
	Skype *skype = (Skype *) data;
 
	return skype->loadSkypeBuddies();
 
}
 

	
 
static gboolean create_dbus_proxy(gpointer data) {
 
	Skype *skype = (Skype *) data;
 
	return skype->createDBusProxy();
 
}
 

	
 
static pbnetwork::StatusType getStatus(const std::string &st) {
 
	pbnetwork::StatusType status = pbnetwork::STATUS_ONLINE;
 
@@ -140,24 +148,25 @@ bool Skype::createDBusProxy() {
 
			}
 
			g_error_free(error);
 
		}
 

	
 
		if (m_proxy) {
 
			LOG4CXX_INFO(logger, "Proxy created.");
 
			DBusObjectPathVTable vtable;
 
			vtable.message_function = &skype_notify_handler;
 
			dbus_connection_register_object_path(dbus_g_connection_get_connection(m_connection), "/com/Skype/Client", &vtable, this);
 

	
 
			m_counter = 0;
 
			m_timer = g_timeout_add_seconds(1, load_skype_buddies, this);
 
			g_timeout_add_seconds(10, skype_check_missedmessages, this);
 
			return FALSE;
 
		}
 
		return TRUE;
 
	}
 
	return FALSE;
 
}
 

	
 
bool Skype::loadSkypeBuddies() {
 
//	std::string re = "CONNSTATUS OFFLINE";
 
//	while (re == "CONNSTATUS OFFLINE" || re.empty()) {
 
//		sleep(1);
 

	
 
@@ -274,24 +283,25 @@ bool Skype::loadSkypeBuddies() {
 
				std::vector<std::string> groups;
 
				if (group_map.find(buddy) != group_map.end()) {
 
					groups.push_back(group_map[buddy]);
 
				}
 
				m_np->handleBuddyChanged(m_user, buddy, alias, groups, status, mood_text);
 
			}
 
		}
 
		g_strfreev(full_friends_list);
 
	}
 

	
 
	send_command("SET AUTOAWAY OFF");
 
	send_command("SET USERSTATUS ONLINE");
 

	
 
	return FALSE;
 
}
 

	
 
void Skype::logout() {
 
	if (m_pid != 0) {
 
		if (m_proxy) {
 
			send_command("SET USERSTATUS INVISIBLE");
 
			send_command("SET USERSTATUS OFFLINE");
 
			sleep(2);
 
			g_object_unref(m_proxy);
 
		}
 
		LOG4CXX_INFO(logger,  m_username << ": Terminating Skype instance (SIGTERM)");
 
@@ -424,31 +434,45 @@ void Skype::handleSkypeMessage(std::string &message) {
 
			BOOST_FOREACH(std::string u, data) {
 
				GET_PROPERTY(alias, "USER", u, "FULLNAME");
 
				GET_PROPERTY(mood_text, "USER", u, "MOOD_TEXT");
 
				GET_PROPERTY(st, "USER", u, "ONLINESTATUS");
 
				pbnetwork::StatusType status = getStatus(st);
 

	
 
				std::vector<std::string> groups;
 
				groups.push_back(grp);
 
				m_np->handleBuddyChanged(getUser(), u, alias, groups, status, mood_text);
 
			}
 
		}
 
	}
 
	else if ((cmd[0] == "MESSAGES") || (cmd[0] == "CHATMESSAGES")) {
 
		std::string msgs = GET_RESPONSE_DATA(message, "CHATMESSAGES");
 
		std::vector<std::string> data;
 
		boost::split(data, msgs, boost::is_any_of(","));
 
		BOOST_FOREACH(std::string str, data) {
 
			boost::trim(str);
 
			if (!str.empty()) {
 
			    std::string re = send_command("GET CHATMESSAGE " + str + " STATUS");
 
			    handleSkypeMessage(re);
 
			}
 
		}
 
	}
 
	else if (cmd[0] == "CHATMESSAGE") {
 
		if (cmd[3] == "RECEIVED") {
 
			GET_PROPERTY(body, "CHATMESSAGE", cmd[1], "BODY");
 
			GET_PROPERTY(from_handle, "CHATMESSAGE", cmd[1], "FROM_HANDLE");
 

	
 
			if (from_handle == getUsername())
 
			if (from_handle == getUsername()) {
 
				send_command("SET CHATMESSAGE " + cmd[1] + " SEEN");
 
				return;
 
			}
 

	
 
			m_np->handleMessage(getUser(), from_handle, body);
 

	
 
			send_command("SET CHATMESSAGE " + cmd[1] + " SEEN");
 
		}
 
	}
 
	else if (cmd[0] == "CALL") {
 
		// CALL 884 STATUS RINGING
 
		if (cmd[2] == "STATUS") {
 
			if (cmd[3] == "RINGING" || cmd[3] == "MISSED") {
 
				// handle only incoming calls
 
				GET_PROPERTY(type, "CALL", cmd[1], "TYPE");
0 comments (0 inline, 0 general)