Changeset - 1bf1343ac5e3
[Not reviewed]
0 4 0
Jan Kaluza - 14 years ago 2011-07-25 18:22:11
hanzz.k@gmail.com
Stop loop instead of exit()
4 files changed with 18 insertions and 7 deletions:
0 comments (0 inline, 0 general)
backends/libpurple/main.cpp
Show inline comments
 
@@ -146,26 +146,32 @@ static std::string getAlias(PurpleBuddy *m_buddy) {
 
	}
 
	else if (purple_buddy_get_alias(m_buddy)) {
 
		alias = (std::string) purple_buddy_get_alias(m_buddy);
 
	}
 
	else {
 
		alias = (std::string) purple_buddy_get_server_alias(m_buddy);
 
	}
 
	return alias;
 
}
 

	
 
class SpectrumNetworkPlugin : public NetworkPlugin {
 
	public:
 
		SpectrumEventLoop *m_loop;
 
		SpectrumNetworkPlugin(Config *config, SpectrumEventLoop *loop, const std::string &host, int port) : NetworkPlugin(loop, host, port) {
 
			this->config = config;
 
			m_loop = loop;
 
		}
 

	
 
		void handleExit() {
 
			m_loop->stop();
 
		}
 

	
 
		void handleLoginRequest(const std::string &user, const std::string &legacyName, const std::string &password) {
 
			PurpleAccount *account = NULL;
 
			const char *protocol = CONFIG_STRING(config, "service.protocol").c_str();
 
			if (purple_accounts_find(legacyName.c_str(), protocol) != NULL){
 
// 				Log(user, "this account already exists");
 
				account = purple_accounts_find(legacyName.c_str(), protocol);
 
// 				User *u = (User *) account->ui_data;
 
// 				if (u && u != user) {
 
// 					Log(userInfo.jid, "This account is already connected by another jid " << user->getJID());
 
// 					return;
backends/libpurple/spectrumeventloop.cpp
Show inline comments
 
@@ -59,24 +59,25 @@ void SpectrumEventLoop::run() {
 
	m_isRunning = true;
 
	if (m_loop) {
 
		g_main_loop_run(m_loop);
 
	}
 
#ifdef WITH_LIBEVENT
 
	else {
 
		event_loop(0);
 
	}
 
#endif
 
}
 

	
 
void SpectrumEventLoop::stop() {
 
	std::cout << "stopped loop\n";
 
	if (!m_isRunning)
 
		return;
 
	if (m_loop) {
 
		g_main_loop_quit(m_loop);
 
		g_main_loop_unref(m_loop);
 
		m_loop = NULL;
 
	}
 
#ifdef WITH_LIBEVENT
 
	else {
 
		event_loopexit(NULL);
 
	}
 
#endif
include/transport/networkplugin.h
Show inline comments
 
@@ -75,24 +75,26 @@ class NetworkPlugin {
 
		virtual void handleVCardUpdatedRequest(const std::string &/*user*/, const std::string &/*photo*/) {}
 
		virtual void handleJoinRoomRequest(const std::string &/*user*/, const std::string &/*room*/, const std::string &/*nickname*/, const std::string &/*pasword*/) {}
 
		virtual void handleLeaveRoomRequest(const std::string &/*user*/, const std::string &/*room*/) {}
 
		virtual void handleStatusChangeRequest(const std::string &/*user*/, int status, const std::string &statusMessage) {}
 
		virtual void handleBuddyUpdatedRequest(const std::string &/*user*/, const std::string &/*buddyName*/, const std::string &/*alias*/, const std::string &/*groups*/) {}
 
		virtual void handleBuddyRemovedRequest(const std::string &/*user*/, const std::string &/*buddyName*/, const std::string &/*groups*/) {}
 

	
 
		virtual void handleTypingRequest(const std::string &/*user*/, const std::string &/*buddyName*/) {}
 
		virtual void handleTypedRequest(const std::string &/*user*/, const std::string &/*buddyName*/) {}
 
		virtual void handleStoppedTypingRequest(const std::string &/*user*/, const std::string &/*buddyName*/) {}
 
		virtual void handleAttentionRequest(const std::string &/*user*/, const std::string &/*buddyName*/, const std::string &/*message*/) {}
 

	
 
		virtual void handleExit() { std::cout << "EXITING\n"; exit(1); }
 
		
 

	
 
	private:
 
		void connect();
 
		void handleLoginPayload(const std::string &payload);
 
		void handleLogoutPayload(const std::string &payload);
 
		void handleStatusChangedPayload(const std::string &payload);
 
		void handleConvMessagePayload(const std::string &payload);
 
		void handleJoinRoomPayload(const std::string &payload);
 
		void handleLeaveRoomPayload(const std::string &payload);
 
		void handleVCardPayload(const std::string &payload);
 
		void handleBuddyChangedPayload(const std::string &payload);
 
		void handleBuddyRemovedPayload(const std::string &payload);
 
@@ -104,19 +106,20 @@ class NetworkPlugin {
 

	
 
		void send(const std::string &data);
 
		void sendPong();
 
		void sendMemoryUsage();
 
		void pingTimeout();
 

	
 
		Swift::SafeByteArray m_data;
 
		std::string m_host;
 
		int m_port;
 
		Swift::BoostNetworkFactories *m_factories;
 
		Swift::BoostIOServiceThread m_boostIOServiceThread;
 
		boost::shared_ptr<Swift::Connection> m_conn;
 
		Swift::EventLoop *m_loop;
 
		Swift::Timer::ref m_pingTimer;
 
		bool m_pingReceived;
 
		double m_init_res;
 

	
 
};
 

	
 
}
src/networkplugin.cpp
Show inline comments
 
@@ -40,24 +40,25 @@ static LoggerPtr logger = Logger::getLogger("NetworkPlugin");
 
namespace Transport {
 

	
 
#define WRAP(MESSAGE, TYPE) 	pbnetwork::WrapperMessage wrap; \
 
	wrap.set_type(TYPE); \
 
	wrap.set_payload(MESSAGE); \
 
	wrap.SerializeToString(&MESSAGE);
 

	
 
NetworkPlugin::NetworkPlugin(Swift::EventLoop *loop, const std::string &host, int port) {
 
	m_factories = new Swift::BoostNetworkFactories(loop);
 
	m_host = host;
 
	m_port = port;
 
	m_pingReceived = false;
 
	m_loop = loop;
 
	m_conn = m_factories->getConnectionFactory()->createConnection();
 
	m_conn->onDataRead.connect(boost::bind(&NetworkPlugin::handleDataRead, this, _1));
 
	m_conn->onConnectFinished.connect(boost::bind(&NetworkPlugin::_handleConnected, this, _1));
 
	m_conn->onDisconnected.connect(boost::bind(&NetworkPlugin::handleDisconnected, this));
 

	
 
	m_pingTimer = m_factories->getTimerFactory()->createTimer(30000);
 
	m_pingTimer->onTick.connect(boost::bind(&NetworkPlugin::pingTimeout, this)); 
 
	connect();
 

	
 
	double shared;
 
	process_mem_usage(shared, m_init_res);
 
}
 
@@ -253,38 +254,38 @@ void NetworkPlugin::handleRoomChanged(const std::string &user, const std::string
 
	room.set_password("");
 

	
 
	std::string message;
 
	room.SerializeToString(&message);
 

	
 
	WRAP(message, pbnetwork::WrapperMessage_Type_TYPE_ROOM_NICKNAME_CHANGED);
 
 
 
	send(message);
 
}
 

	
 
void NetworkPlugin::_handleConnected(bool error) {
 
	if (error) {
 
		LOG4CXX_ERROR(logger, "Connecting error. Exiting");
 
// 		LOG4CXX_ERROR(logger, "Connecting error. Exiting");
 
		m_pingTimer->stop();
 
		exit(1);
 
		handleExit();
 
	}
 
	else {
 
		LOG4CXX_INFO(logger, "Connected to NetworkPluginServer");
 
// 		LOG4CXX_INFO(logger, "Connected to NetworkPluginServer");
 
		m_pingTimer->start();
 
	}
 
}
 

	
 
void NetworkPlugin::handleDisconnected() {
 
	LOG4CXX_INFO(logger, "Disconnected from NetworkPluginServer. Exiting.");
 
// 	LOG4CXX_INFO(logger, "Disconnected from NetworkPluginServer. Exiting.");
 
	m_pingTimer->stop();
 
	exit(1);
 
	handleExit();
 
}
 

	
 
void NetworkPlugin::connect() {
 
	LOG4CXX_INFO(logger, "Connecting NetworkPluginServer host " << m_host << " port " << m_port);
 
	m_conn->connect(Swift::HostAddressPort(Swift::HostAddress(m_host), m_port));
 
}
 

	
 
void NetworkPlugin::handleLoginPayload(const std::string &data) {
 
	pbnetwork::Login payload;
 
	if (payload.ParseFromString(data) == false) {
 
		// TODO: ERROR
 
		return;
 
@@ -509,20 +510,20 @@ void NetworkPlugin::sendMemoryUsage() {
 
	stats.set_shared(shared);
 

	
 
	std::string message;
 
	stats.SerializeToString(&message);
 

	
 
	WRAP(message, pbnetwork::WrapperMessage_Type_TYPE_STATS);
 

	
 
	send(message);
 
}
 

	
 
void NetworkPlugin::pingTimeout() {
 
	if (m_pingReceived == false) {
 
		LOG4CXX_ERROR(logger, "No PING received for long time (NetworkPluginServer crashed?). Exiting");
 
		exit(1);
 
// 		LOG4CXX_ERROR(logger, "No PING received for long time. Exiting");
 
		handleExit();
 
	}
 
	m_pingReceived = false;
 
	m_pingTimer->start();
 
}
 

	
 
}
0 comments (0 inline, 0 general)