2011-05-11 09:20:35 +02:00
|
|
|
/**
|
|
|
|
* libtransport -- C++ library for easy XMPP Transports development
|
|
|
|
*
|
|
|
|
* Copyright (C) 2011, Jan Kaluza <hanzz.k@gmail.com>
|
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU General Public License as published by
|
|
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
|
|
* (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with this program; if not, write to the Free Software
|
|
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
|
|
|
|
*/
|
|
|
|
|
2015-11-19 07:53:35 +00:00
|
|
|
#include "transport/NetworkPlugin.h"
|
|
|
|
#include "transport/MemoryUsage.h"
|
|
|
|
#include "transport/Logging.h"
|
2012-03-21 16:31:51 +01:00
|
|
|
|
|
|
|
#include <sstream>
|
2011-10-17 17:24:44 +02:00
|
|
|
|
2011-10-20 15:42:48 +02:00
|
|
|
#ifndef WIN32
|
2011-10-17 17:24:44 +02:00
|
|
|
#include <arpa/inet.h>
|
2012-05-21 09:24:41 +02:00
|
|
|
#include <sys/types.h>
|
|
|
|
#include <unistd.h>
|
2011-10-20 15:42:48 +02:00
|
|
|
#else
|
|
|
|
#include <winsock2.h>
|
2012-03-06 11:23:11 +01:00
|
|
|
#include <stdint.h>
|
2012-03-20 22:45:13 +01:00
|
|
|
#include <process.h>
|
|
|
|
#define getpid _getpid
|
2011-10-20 15:42:48 +02:00
|
|
|
#endif
|
2011-06-20 21:45:05 +02:00
|
|
|
|
2012-03-21 16:31:51 +01:00
|
|
|
DEFINE_LOGGER(logger, "NetworkPlugin");
|
2011-05-11 09:20:35 +02:00
|
|
|
|
|
|
|
namespace Transport {
|
|
|
|
|
|
|
|
#define WRAP(MESSAGE, TYPE) pbnetwork::WrapperMessage wrap; \
|
|
|
|
wrap.set_type(TYPE); \
|
|
|
|
wrap.set_payload(MESSAGE); \
|
|
|
|
wrap.SerializeToString(&MESSAGE);
|
|
|
|
|
2012-03-09 17:13:32 +01:00
|
|
|
template <class T> std::string stringOf(T object) {
|
|
|
|
std::ostringstream os;
|
|
|
|
os << object;
|
|
|
|
return (os.str());
|
|
|
|
}
|
|
|
|
|
2011-10-17 17:24:44 +02:00
|
|
|
NetworkPlugin::NetworkPlugin() {
|
2011-05-26 08:53:05 +02:00
|
|
|
m_pingReceived = false;
|
2011-07-18 14:45:30 +02:00
|
|
|
|
|
|
|
double shared;
|
2011-09-07 14:03:27 +02:00
|
|
|
#ifndef WIN32
|
2011-07-18 14:45:30 +02:00
|
|
|
process_mem_usage(shared, m_init_res);
|
2011-09-07 14:03:27 +02:00
|
|
|
#endif
|
2011-05-11 09:20:35 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
NetworkPlugin::~NetworkPlugin() {
|
|
|
|
}
|
|
|
|
|
2012-04-09 09:16:23 +02:00
|
|
|
void NetworkPlugin::sendConfig(const PluginConfig &cfg) {
|
2012-11-27 12:51:19 +01:00
|
|
|
std::string data = "[registration]\n";
|
2012-04-11 09:16:56 +02:00
|
|
|
data += std::string("needPassword=") + (cfg.m_needPassword ? "1" : "0") + "\n";
|
2012-09-13 10:13:44 +02:00
|
|
|
data += std::string("needRegistration=") + (cfg.m_needRegistration ? "1" : "0") + "\n";
|
2012-04-11 09:16:56 +02:00
|
|
|
|
|
|
|
for (std::vector<std::string>::const_iterator it = cfg.m_extraFields.begin(); it != cfg.m_extraFields.end(); it++) {
|
|
|
|
data += std::string("extraField=") + (*it) + "\n";
|
|
|
|
}
|
|
|
|
|
2013-01-26 15:22:25 +01:00
|
|
|
data += "[features]\n";
|
|
|
|
data += std::string("muc=") + (cfg.m_supportMUC ? "1" : "0") + "\n";
|
2013-02-09 11:09:38 +01:00
|
|
|
data += std::string("rawxml=") + (cfg.m_rawXML ? "1" : "0") + "\n";
|
2013-02-11 21:24:19 +01:00
|
|
|
data += std::string("disable_jid_escaping=") + (cfg.m_disableJIDEscaping ? "1" : "0") + "\n";
|
|
|
|
|
2013-01-26 15:22:25 +01:00
|
|
|
|
2012-04-11 09:16:56 +02:00
|
|
|
pbnetwork::BackendConfig m;
|
|
|
|
m.set_config(data);
|
|
|
|
|
|
|
|
std::string message;
|
|
|
|
m.SerializeToString(&message);
|
|
|
|
|
|
|
|
WRAP(message, pbnetwork::WrapperMessage_Type_TYPE_BACKEND_CONFIG);
|
|
|
|
|
|
|
|
send(message);
|
2012-04-09 09:16:23 +02:00
|
|
|
}
|
|
|
|
|
2013-02-09 11:09:38 +01:00
|
|
|
void NetworkPlugin::sendRawXML(std::string &xml) {
|
|
|
|
WRAP(xml, pbnetwork::WrapperMessage_Type_TYPE_RAW_XML);
|
|
|
|
|
|
|
|
send(xml);
|
|
|
|
}
|
|
|
|
|
2013-01-27 18:13:25 +01:00
|
|
|
void NetworkPlugin::handleMessage(const std::string &user, const std::string &legacyName, const std::string &msg, const std::string &nickname, const std::string &xhtml, const std::string ×tamp, bool headline, bool pm) {
|
2011-05-13 23:37:48 +02:00
|
|
|
pbnetwork::ConversationMessage m;
|
|
|
|
m.set_username(user);
|
|
|
|
m.set_buddyname(legacyName);
|
|
|
|
m.set_message(msg);
|
2011-05-18 16:25:52 +02:00
|
|
|
m.set_nickname(nickname);
|
2011-06-22 23:23:52 +02:00
|
|
|
m.set_xhtml(xhtml);
|
2012-10-18 09:33:44 +02:00
|
|
|
m.set_timestamp(timestamp);
|
2012-12-18 12:56:38 +01:00
|
|
|
m.set_headline(headline);
|
2013-01-27 18:13:25 +01:00
|
|
|
m.set_pm(pm);
|
2011-05-13 23:37:48 +02:00
|
|
|
|
|
|
|
std::string message;
|
|
|
|
m.SerializeToString(&message);
|
|
|
|
|
|
|
|
WRAP(message, pbnetwork::WrapperMessage_Type_TYPE_CONV_MESSAGE);
|
2011-06-22 14:25:05 +02:00
|
|
|
|
|
|
|
send(message);
|
|
|
|
}
|
|
|
|
|
2012-12-22 21:07:29 +01:00
|
|
|
void NetworkPlugin::handleMessageAck(const std::string &user, const std::string &legacyName, const std::string &id) {
|
|
|
|
pbnetwork::ConversationMessage m;
|
|
|
|
m.set_username(user);
|
|
|
|
m.set_buddyname(legacyName);
|
|
|
|
m.set_message("");
|
|
|
|
m.set_id(id);
|
|
|
|
|
|
|
|
std::string message;
|
|
|
|
m.SerializeToString(&message);
|
|
|
|
|
|
|
|
WRAP(message, pbnetwork::WrapperMessage_Type_TYPE_CONV_MESSAGE_ACK);
|
|
|
|
|
|
|
|
send(message);
|
|
|
|
}
|
|
|
|
|
2011-06-22 14:25:05 +02:00
|
|
|
void NetworkPlugin::handleAttention(const std::string &user, const std::string &buddyName, const std::string &msg) {
|
|
|
|
pbnetwork::ConversationMessage m;
|
|
|
|
m.set_username(user);
|
|
|
|
m.set_buddyname(buddyName);
|
|
|
|
m.set_message(msg);
|
|
|
|
|
|
|
|
std::string message;
|
|
|
|
m.SerializeToString(&message);
|
|
|
|
|
|
|
|
WRAP(message, pbnetwork::WrapperMessage_Type_TYPE_ATTENTION);
|
2011-05-13 23:37:48 +02:00
|
|
|
|
|
|
|
send(message);
|
|
|
|
}
|
|
|
|
|
2011-06-02 09:54:57 +02:00
|
|
|
void NetworkPlugin::handleVCard(const std::string &user, unsigned int id, const std::string &legacyName, const std::string &fullName, const std::string &nickname, const std::string &photo) {
|
|
|
|
pbnetwork::VCard vcard;
|
|
|
|
vcard.set_username(user);
|
|
|
|
vcard.set_buddyname(legacyName);
|
|
|
|
vcard.set_id(id);
|
|
|
|
vcard.set_fullname(fullName);
|
|
|
|
vcard.set_nickname(nickname);
|
|
|
|
vcard.set_photo(photo);
|
|
|
|
|
|
|
|
std::string message;
|
|
|
|
vcard.SerializeToString(&message);
|
|
|
|
|
|
|
|
WRAP(message, pbnetwork::WrapperMessage_Type_TYPE_VCARD);
|
|
|
|
send(message);
|
|
|
|
}
|
|
|
|
|
2011-05-19 12:46:20 +02:00
|
|
|
void NetworkPlugin::handleSubject(const std::string &user, const std::string &legacyName, const std::string &msg, const std::string &nickname) {
|
|
|
|
pbnetwork::ConversationMessage m;
|
|
|
|
m.set_username(user);
|
|
|
|
m.set_buddyname(legacyName);
|
|
|
|
m.set_message(msg);
|
|
|
|
m.set_nickname(nickname);
|
|
|
|
|
|
|
|
std::string message;
|
|
|
|
m.SerializeToString(&message);
|
|
|
|
|
|
|
|
WRAP(message, pbnetwork::WrapperMessage_Type_TYPE_ROOM_SUBJECT_CHANGED);
|
|
|
|
// std::cout << "SENDING MESSAGE\n";
|
|
|
|
|
|
|
|
send(message);
|
|
|
|
}
|
|
|
|
|
2011-05-11 09:20:35 +02:00
|
|
|
void NetworkPlugin::handleBuddyChanged(const std::string &user, const std::string &buddyName, const std::string &alias,
|
2011-11-30 21:43:12 +01:00
|
|
|
const std::vector<std::string> &groups, pbnetwork::StatusType status, const std::string &statusMessage, const std::string &iconHash, bool blocked) {
|
2011-05-11 09:20:35 +02:00
|
|
|
pbnetwork::Buddy buddy;
|
|
|
|
buddy.set_username(user);
|
|
|
|
buddy.set_buddyname(buddyName);
|
|
|
|
buddy.set_alias(alias);
|
2011-11-30 21:43:12 +01:00
|
|
|
for (std::vector<std::string>::const_iterator it = groups.begin(); it != groups.end(); it++) {
|
|
|
|
buddy.add_group(*it);
|
|
|
|
}
|
2011-09-27 20:46:48 +02:00
|
|
|
buddy.set_status((pbnetwork::StatusType) status);
|
2011-05-11 09:20:35 +02:00
|
|
|
buddy.set_statusmessage(statusMessage);
|
|
|
|
buddy.set_iconhash(iconHash);
|
2011-07-27 10:33:34 +02:00
|
|
|
buddy.set_blocked(blocked);
|
2011-05-11 09:20:35 +02:00
|
|
|
|
|
|
|
std::string message;
|
|
|
|
buddy.SerializeToString(&message);
|
|
|
|
|
|
|
|
WRAP(message, pbnetwork::WrapperMessage_Type_TYPE_BUDDY_CHANGED);
|
|
|
|
|
|
|
|
send(message);
|
|
|
|
}
|
|
|
|
|
2012-06-14 08:06:46 +02:00
|
|
|
void NetworkPlugin::handleBuddyRemoved(const std::string &user, const std::string &buddyName) {
|
|
|
|
pbnetwork::Buddy buddy;
|
|
|
|
buddy.set_username(user);
|
|
|
|
buddy.set_buddyname(buddyName);
|
|
|
|
|
|
|
|
std::string message;
|
|
|
|
buddy.SerializeToString(&message);
|
|
|
|
|
|
|
|
WRAP(message, pbnetwork::WrapperMessage_Type_TYPE_BUDDY_REMOVED);
|
|
|
|
|
|
|
|
send(message);
|
|
|
|
}
|
|
|
|
|
2011-06-12 13:13:22 +02:00
|
|
|
void NetworkPlugin::handleBuddyTyping(const std::string &user, const std::string &buddyName) {
|
|
|
|
pbnetwork::Buddy buddy;
|
|
|
|
buddy.set_username(user);
|
|
|
|
buddy.set_buddyname(buddyName);
|
|
|
|
|
|
|
|
std::string message;
|
|
|
|
buddy.SerializeToString(&message);
|
|
|
|
|
|
|
|
WRAP(message, pbnetwork::WrapperMessage_Type_TYPE_BUDDY_TYPING);
|
|
|
|
|
|
|
|
send(message);
|
|
|
|
}
|
|
|
|
|
|
|
|
void NetworkPlugin::handleBuddyTyped(const std::string &user, const std::string &buddyName) {
|
|
|
|
pbnetwork::Buddy buddy;
|
|
|
|
buddy.set_username(user);
|
|
|
|
buddy.set_buddyname(buddyName);
|
|
|
|
|
|
|
|
std::string message;
|
|
|
|
buddy.SerializeToString(&message);
|
|
|
|
|
|
|
|
WRAP(message, pbnetwork::WrapperMessage_Type_TYPE_BUDDY_TYPED);
|
|
|
|
|
|
|
|
send(message);
|
|
|
|
}
|
|
|
|
|
|
|
|
void NetworkPlugin::handleBuddyStoppedTyping(const std::string &user, const std::string &buddyName) {
|
|
|
|
pbnetwork::Buddy buddy;
|
|
|
|
buddy.set_username(user);
|
|
|
|
buddy.set_buddyname(buddyName);
|
|
|
|
|
|
|
|
std::string message;
|
|
|
|
buddy.SerializeToString(&message);
|
|
|
|
|
|
|
|
WRAP(message, pbnetwork::WrapperMessage_Type_TYPE_BUDDY_STOPPED_TYPING);
|
|
|
|
|
|
|
|
send(message);
|
|
|
|
}
|
|
|
|
|
2011-06-17 13:43:31 +02:00
|
|
|
void NetworkPlugin::handleAuthorization(const std::string &user, const std::string &buddyName) {
|
|
|
|
pbnetwork::Buddy buddy;
|
|
|
|
buddy.set_username(user);
|
|
|
|
buddy.set_buddyname(buddyName);
|
|
|
|
|
|
|
|
std::string message;
|
|
|
|
buddy.SerializeToString(&message);
|
|
|
|
|
|
|
|
WRAP(message, pbnetwork::WrapperMessage_Type_TYPE_AUTH_REQUEST);
|
|
|
|
|
|
|
|
send(message);
|
|
|
|
}
|
|
|
|
|
2011-06-02 13:52:19 +02:00
|
|
|
void NetworkPlugin::handleConnected(const std::string &user) {
|
|
|
|
pbnetwork::Connected d;
|
|
|
|
d.set_user(user);
|
|
|
|
|
|
|
|
std::string message;
|
|
|
|
d.SerializeToString(&message);
|
|
|
|
|
|
|
|
WRAP(message, pbnetwork::WrapperMessage_Type_TYPE_CONNECTED);
|
|
|
|
|
|
|
|
send(message);
|
|
|
|
}
|
|
|
|
|
2011-08-23 14:18:22 +02:00
|
|
|
void NetworkPlugin::handleDisconnected(const std::string &user, int error, const std::string &msg) {
|
2011-05-11 09:20:35 +02:00
|
|
|
pbnetwork::Disconnected d;
|
|
|
|
d.set_user(user);
|
|
|
|
d.set_error(error);
|
|
|
|
d.set_message(msg);
|
|
|
|
|
|
|
|
std::string message;
|
|
|
|
d.SerializeToString(&message);
|
|
|
|
|
|
|
|
WRAP(message, pbnetwork::WrapperMessage_Type_TYPE_DISCONNECTED);
|
|
|
|
|
|
|
|
send(message);
|
|
|
|
}
|
|
|
|
|
2016-02-08 09:26:34 +01:00
|
|
|
void NetworkPlugin::handleParticipantChanged(const std::string &user, const std::string &nickname, const std::string &room, int flags, pbnetwork::StatusType status, const std::string &statusMessage, const std::string &newname, const std::string &alias) {
|
2011-05-17 09:44:29 +02:00
|
|
|
pbnetwork::Participant d;
|
|
|
|
d.set_username(user);
|
|
|
|
d.set_nickname(nickname);
|
|
|
|
d.set_room(room);
|
|
|
|
d.set_flag(flags);
|
2011-05-19 00:33:38 +02:00
|
|
|
d.set_newname(newname);
|
2011-09-27 20:46:48 +02:00
|
|
|
d.set_status((pbnetwork::StatusType) status);
|
2011-05-19 08:26:09 +02:00
|
|
|
d.set_statusmessage(statusMessage);
|
2016-02-08 09:26:34 +01:00
|
|
|
d.set_alias(alias);
|
2011-05-17 09:44:29 +02:00
|
|
|
|
|
|
|
std::string message;
|
|
|
|
d.SerializeToString(&message);
|
|
|
|
|
|
|
|
WRAP(message, pbnetwork::WrapperMessage_Type_TYPE_PARTICIPANT_CHANGED);
|
|
|
|
|
|
|
|
send(message);
|
|
|
|
}
|
|
|
|
|
2011-08-23 15:13:49 +02:00
|
|
|
void NetworkPlugin::handleRoomNicknameChanged(const std::string &user, const std::string &r, const std::string &nickname) {
|
2011-05-18 15:19:56 +02:00
|
|
|
pbnetwork::Room room;
|
|
|
|
room.set_username(user);
|
|
|
|
room.set_nickname(nickname);
|
|
|
|
room.set_room(r);
|
|
|
|
room.set_password("");
|
|
|
|
|
|
|
|
std::string message;
|
|
|
|
room.SerializeToString(&message);
|
|
|
|
|
|
|
|
WRAP(message, pbnetwork::WrapperMessage_Type_TYPE_ROOM_NICKNAME_CHANGED);
|
|
|
|
|
|
|
|
send(message);
|
|
|
|
}
|
|
|
|
|
2011-09-28 14:32:57 +02:00
|
|
|
void NetworkPlugin::handleFTStart(const std::string &user, const std::string &buddyName, const std::string fileName, unsigned long size) {
|
|
|
|
pbnetwork::File room;
|
|
|
|
room.set_username(user);
|
|
|
|
room.set_buddyname(buddyName);
|
|
|
|
room.set_filename(fileName);
|
|
|
|
room.set_size(size);
|
|
|
|
|
|
|
|
std::string message;
|
|
|
|
room.SerializeToString(&message);
|
|
|
|
|
|
|
|
WRAP(message, pbnetwork::WrapperMessage_Type_TYPE_FT_START);
|
|
|
|
|
|
|
|
send(message);
|
|
|
|
}
|
|
|
|
|
2011-10-03 11:35:32 +02:00
|
|
|
void NetworkPlugin::handleFTFinish(const std::string &user, const std::string &buddyName, const std::string fileName, unsigned long size, unsigned long ftid) {
|
|
|
|
pbnetwork::File room;
|
|
|
|
room.set_username(user);
|
|
|
|
room.set_buddyname(buddyName);
|
|
|
|
room.set_filename(fileName);
|
|
|
|
room.set_size(size);
|
|
|
|
if (ftid) {
|
|
|
|
room.set_ftid(ftid);
|
|
|
|
}
|
|
|
|
|
|
|
|
std::string message;
|
|
|
|
room.SerializeToString(&message);
|
|
|
|
|
|
|
|
WRAP(message, pbnetwork::WrapperMessage_Type_TYPE_FT_FINISH);
|
|
|
|
|
|
|
|
send(message);
|
|
|
|
}
|
|
|
|
|
2011-09-28 19:59:58 +02:00
|
|
|
void NetworkPlugin::handleFTData(unsigned long ftID, const std::string &data) {
|
|
|
|
pbnetwork::FileTransferData d;
|
|
|
|
d.set_ftid(ftID);
|
|
|
|
d.set_data(data);
|
|
|
|
|
|
|
|
std::string message;
|
|
|
|
d.SerializeToString(&message);
|
|
|
|
|
|
|
|
WRAP(message, pbnetwork::WrapperMessage_Type_TYPE_FT_DATA);
|
|
|
|
|
|
|
|
send(message);
|
|
|
|
}
|
|
|
|
|
2012-10-15 16:25:36 +02:00
|
|
|
void NetworkPlugin::handleRoomList(const std::string &user, const std::list<std::string> &rooms, const std::list<std::string> &names) {
|
|
|
|
pbnetwork::RoomList d;
|
|
|
|
for (std::list<std::string>::const_iterator it = rooms.begin(); it != rooms.end(); it++) {
|
|
|
|
d.add_room(*it);
|
|
|
|
}
|
|
|
|
|
|
|
|
for (std::list<std::string>::const_iterator it = names.begin(); it != names.end(); it++) {
|
|
|
|
d.add_name(*it);
|
|
|
|
}
|
|
|
|
|
2016-02-07 20:53:35 +01:00
|
|
|
d.set_user(user);
|
|
|
|
|
2012-10-15 16:25:36 +02:00
|
|
|
std::string message;
|
|
|
|
d.SerializeToString(&message);
|
|
|
|
|
|
|
|
WRAP(message, pbnetwork::WrapperMessage_Type_TYPE_ROOM_LIST);
|
|
|
|
|
|
|
|
send(message);
|
|
|
|
}
|
|
|
|
|
2011-05-11 09:20:35 +02:00
|
|
|
void NetworkPlugin::handleLoginPayload(const std::string &data) {
|
|
|
|
pbnetwork::Login payload;
|
|
|
|
if (payload.ParseFromString(data) == false) {
|
|
|
|
// TODO: ERROR
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
handleLoginRequest(payload.user(), payload.legacyname(), payload.password());
|
|
|
|
}
|
|
|
|
|
|
|
|
void NetworkPlugin::handleLogoutPayload(const std::string &data) {
|
|
|
|
pbnetwork::Logout payload;
|
|
|
|
if (payload.ParseFromString(data) == false) {
|
|
|
|
// TODO: ERROR
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
handleLogoutRequest(payload.user(), payload.legacyname());
|
|
|
|
}
|
|
|
|
|
2011-06-12 12:27:57 +02:00
|
|
|
void NetworkPlugin::handleStatusChangedPayload(const std::string &data) {
|
|
|
|
pbnetwork::Status payload;
|
|
|
|
if (payload.ParseFromString(data) == false) {
|
|
|
|
// TODO: ERROR
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
handleStatusChangeRequest(payload.username(), payload.status(), payload.statusmessage());
|
|
|
|
}
|
|
|
|
|
2011-05-14 15:31:29 +02:00
|
|
|
void NetworkPlugin::handleConvMessagePayload(const std::string &data) {
|
|
|
|
pbnetwork::ConversationMessage payload;
|
|
|
|
if (payload.ParseFromString(data) == false) {
|
|
|
|
// TODO: ERROR
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2012-12-22 21:07:29 +01:00
|
|
|
handleMessageSendRequest(payload.username(), payload.buddyname(), payload.message(), payload.xhtml(), payload.id());
|
2011-05-14 15:31:29 +02:00
|
|
|
}
|
|
|
|
|
2012-09-24 15:40:41 +02:00
|
|
|
void NetworkPlugin::handleRoomSubjectChangedPayload(const std::string &data) {
|
|
|
|
pbnetwork::ConversationMessage payload;
|
|
|
|
if (payload.ParseFromString(data) == false) {
|
|
|
|
// TODO: ERROR
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
handleRoomSubjectChangedRequest(payload.username(), payload.buddyname(), payload.message());
|
|
|
|
}
|
|
|
|
|
2011-06-22 12:11:24 +02:00
|
|
|
void NetworkPlugin::handleAttentionPayload(const std::string &data) {
|
|
|
|
pbnetwork::ConversationMessage payload;
|
|
|
|
if (payload.ParseFromString(data) == false) {
|
|
|
|
// TODO: ERROR
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
handleAttentionRequest(payload.username(), payload.buddyname(), payload.message());
|
|
|
|
}
|
|
|
|
|
2011-09-28 14:32:57 +02:00
|
|
|
void NetworkPlugin::handleFTStartPayload(const std::string &data) {
|
|
|
|
pbnetwork::File payload;
|
|
|
|
if (payload.ParseFromString(data) == false) {
|
|
|
|
// TODO: ERROR
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
handleFTStartRequest(payload.username(), payload.buddyname(), payload.filename(), payload.size(), payload.ftid());
|
|
|
|
}
|
|
|
|
|
2011-10-02 11:11:08 +02:00
|
|
|
void NetworkPlugin::handleFTFinishPayload(const std::string &data) {
|
|
|
|
pbnetwork::File payload;
|
|
|
|
if (payload.ParseFromString(data) == false) {
|
|
|
|
// TODO: ERROR
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
handleFTFinishRequest(payload.username(), payload.buddyname(), payload.filename(), payload.size(), payload.ftid());
|
|
|
|
}
|
|
|
|
|
2011-10-01 21:12:18 +02:00
|
|
|
void NetworkPlugin::handleFTPausePayload(const std::string &data) {
|
|
|
|
pbnetwork::FileTransferData payload;
|
|
|
|
if (payload.ParseFromString(data) == false) {
|
|
|
|
// TODO: ERROR
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
handleFTPauseRequest(payload.ftid());
|
|
|
|
}
|
|
|
|
|
|
|
|
void NetworkPlugin::handleFTContinuePayload(const std::string &data) {
|
|
|
|
pbnetwork::FileTransferData payload;
|
|
|
|
if (payload.ParseFromString(data) == false) {
|
|
|
|
// TODO: ERROR
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
handleFTContinueRequest(payload.ftid());
|
|
|
|
}
|
|
|
|
|
2011-05-15 15:18:31 +02:00
|
|
|
void NetworkPlugin::handleJoinRoomPayload(const std::string &data) {
|
|
|
|
pbnetwork::Room payload;
|
|
|
|
if (payload.ParseFromString(data) == false) {
|
|
|
|
// TODO: ERROR
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
handleJoinRoomRequest(payload.username(), payload.room(), payload.nickname(), payload.password());
|
|
|
|
}
|
|
|
|
|
2011-05-18 15:32:54 +02:00
|
|
|
void NetworkPlugin::handleLeaveRoomPayload(const std::string &data) {
|
|
|
|
pbnetwork::Room payload;
|
|
|
|
if (payload.ParseFromString(data) == false) {
|
|
|
|
// TODO: ERROR
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
handleLeaveRoomRequest(payload.username(), payload.room());
|
|
|
|
}
|
|
|
|
|
2011-06-02 09:54:57 +02:00
|
|
|
void NetworkPlugin::handleVCardPayload(const std::string &data) {
|
|
|
|
pbnetwork::VCard payload;
|
|
|
|
if (payload.ParseFromString(data) == false) {
|
|
|
|
// TODO: ERROR
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2011-06-14 15:45:32 +02:00
|
|
|
if (payload.has_photo()) {
|
2011-10-03 23:09:14 +02:00
|
|
|
handleVCardUpdatedRequest(payload.username(), payload.photo(), payload.nickname());
|
2011-06-14 15:45:32 +02:00
|
|
|
}
|
|
|
|
else if (!payload.buddyname().empty()) {
|
|
|
|
handleVCardRequest(payload.username(), payload.buddyname(), payload.id());
|
|
|
|
}
|
2011-06-02 09:54:57 +02:00
|
|
|
}
|
|
|
|
|
2011-06-09 13:54:09 +02:00
|
|
|
void NetworkPlugin::handleBuddyChangedPayload(const std::string &data) {
|
|
|
|
pbnetwork::Buddy payload;
|
|
|
|
if (payload.ParseFromString(data) == false) {
|
|
|
|
// TODO: ERROR
|
|
|
|
return;
|
|
|
|
}
|
2011-07-27 10:33:34 +02:00
|
|
|
if (payload.has_blocked()) {
|
|
|
|
handleBuddyBlockToggled(payload.username(), payload.buddyname(), payload.blocked());
|
|
|
|
}
|
|
|
|
else {
|
2011-11-30 21:43:12 +01:00
|
|
|
std::vector<std::string> groups;
|
|
|
|
for (int i = 0; i < payload.group_size(); i++) {
|
|
|
|
groups.push_back(payload.group(i));
|
|
|
|
}
|
|
|
|
handleBuddyUpdatedRequest(payload.username(), payload.buddyname(), payload.alias(), groups);
|
2011-07-27 10:33:34 +02:00
|
|
|
}
|
2011-06-09 13:54:09 +02:00
|
|
|
}
|
|
|
|
|
2011-06-10 10:24:09 +02:00
|
|
|
void NetworkPlugin::handleBuddyRemovedPayload(const std::string &data) {
|
|
|
|
pbnetwork::Buddy payload;
|
|
|
|
if (payload.ParseFromString(data) == false) {
|
|
|
|
// TODO: ERROR
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2011-11-30 21:43:12 +01:00
|
|
|
std::vector<std::string> groups;
|
|
|
|
for (int i = 0; i < payload.group_size(); i++) {
|
|
|
|
groups.push_back(payload.group(i));
|
|
|
|
}
|
|
|
|
|
|
|
|
handleBuddyRemovedRequest(payload.username(), payload.buddyname(), groups);
|
2011-06-10 10:24:09 +02:00
|
|
|
}
|
|
|
|
|
2011-10-17 17:24:44 +02:00
|
|
|
void NetworkPlugin::handleChatStatePayload(const std::string &data, int type) {
|
2011-06-12 13:51:35 +02:00
|
|
|
pbnetwork::Buddy payload;
|
|
|
|
if (payload.ParseFromString(data) == false) {
|
|
|
|
// TODO: ERROR
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
switch(type) {
|
2011-10-17 17:24:44 +02:00
|
|
|
case pbnetwork::WrapperMessage_Type_TYPE_BUDDY_TYPING:
|
2011-06-12 13:51:35 +02:00
|
|
|
handleTypingRequest(payload.username(), payload.buddyname());
|
|
|
|
break;
|
2011-10-17 17:24:44 +02:00
|
|
|
case pbnetwork::WrapperMessage_Type_TYPE_BUDDY_TYPED:
|
2011-06-12 13:51:35 +02:00
|
|
|
handleTypedRequest(payload.username(), payload.buddyname());
|
|
|
|
break;
|
2011-10-17 17:24:44 +02:00
|
|
|
case pbnetwork::WrapperMessage_Type_TYPE_BUDDY_STOPPED_TYPING:
|
2011-06-12 13:51:35 +02:00
|
|
|
handleStoppedTypingRequest(payload.username(), payload.buddyname());
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-10-17 17:24:44 +02:00
|
|
|
void NetworkPlugin::handleDataRead(std::string &data) {
|
2011-10-13 21:46:11 +02:00
|
|
|
m_data.insert(m_data.end(), data.begin(), data.end());
|
2011-06-03 19:40:30 +02:00
|
|
|
|
2011-05-11 09:20:35 +02:00
|
|
|
while (m_data.size() != 0) {
|
2011-06-03 19:40:30 +02:00
|
|
|
unsigned int expected_size;
|
|
|
|
|
2011-05-11 09:20:35 +02:00
|
|
|
if (m_data.size() >= 4) {
|
2011-06-03 19:40:30 +02:00
|
|
|
expected_size = *((unsigned int*) &m_data[0]);
|
|
|
|
expected_size = ntohl(expected_size);
|
2011-05-11 09:20:35 +02:00
|
|
|
if (m_data.size() - 4 < expected_size)
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
pbnetwork::WrapperMessage wrapper;
|
2011-06-03 19:40:30 +02:00
|
|
|
if (wrapper.ParseFromArray(&m_data[4], expected_size) == false) {
|
|
|
|
m_data.erase(m_data.begin(), m_data.begin() + 4 + expected_size);
|
2011-05-11 09:20:35 +02:00
|
|
|
return;
|
|
|
|
}
|
2011-06-03 19:40:30 +02:00
|
|
|
m_data.erase(m_data.begin(), m_data.begin() + 4 + expected_size);
|
2011-05-11 09:20:35 +02:00
|
|
|
|
|
|
|
switch(wrapper.type()) {
|
|
|
|
case pbnetwork::WrapperMessage_Type_TYPE_LOGIN:
|
|
|
|
handleLoginPayload(wrapper.payload());
|
|
|
|
break;
|
|
|
|
case pbnetwork::WrapperMessage_Type_TYPE_LOGOUT:
|
|
|
|
handleLogoutPayload(wrapper.payload());
|
|
|
|
break;
|
2011-05-13 10:54:03 +02:00
|
|
|
case pbnetwork::WrapperMessage_Type_TYPE_PING:
|
|
|
|
sendPong();
|
|
|
|
break;
|
2011-05-14 15:31:29 +02:00
|
|
|
case pbnetwork::WrapperMessage_Type_TYPE_CONV_MESSAGE:
|
|
|
|
handleConvMessagePayload(wrapper.payload());
|
|
|
|
break;
|
2012-09-24 15:40:41 +02:00
|
|
|
case pbnetwork::WrapperMessage_Type_TYPE_ROOM_SUBJECT_CHANGED:
|
|
|
|
handleRoomSubjectChangedPayload(wrapper.payload());
|
|
|
|
break;
|
2011-05-15 15:18:31 +02:00
|
|
|
case pbnetwork::WrapperMessage_Type_TYPE_JOIN_ROOM:
|
|
|
|
handleJoinRoomPayload(wrapper.payload());
|
|
|
|
break;
|
2011-05-18 15:32:54 +02:00
|
|
|
case pbnetwork::WrapperMessage_Type_TYPE_LEAVE_ROOM:
|
|
|
|
handleLeaveRoomPayload(wrapper.payload());
|
|
|
|
break;
|
2011-06-02 09:54:57 +02:00
|
|
|
case pbnetwork::WrapperMessage_Type_TYPE_VCARD:
|
|
|
|
handleVCardPayload(wrapper.payload());
|
|
|
|
break;
|
2011-06-09 13:54:09 +02:00
|
|
|
case pbnetwork::WrapperMessage_Type_TYPE_BUDDY_CHANGED:
|
|
|
|
handleBuddyChangedPayload(wrapper.payload());
|
|
|
|
break;
|
2011-06-10 13:03:19 +02:00
|
|
|
case pbnetwork::WrapperMessage_Type_TYPE_BUDDY_REMOVED:
|
|
|
|
handleBuddyRemovedPayload(wrapper.payload());
|
|
|
|
break;
|
2011-06-12 12:27:57 +02:00
|
|
|
case pbnetwork::WrapperMessage_Type_TYPE_STATUS_CHANGED:
|
|
|
|
handleStatusChangedPayload(wrapper.payload());
|
|
|
|
break;
|
2011-06-12 13:51:35 +02:00
|
|
|
case pbnetwork::WrapperMessage_Type_TYPE_BUDDY_TYPING:
|
2011-10-17 17:24:44 +02:00
|
|
|
handleChatStatePayload(wrapper.payload(), pbnetwork::WrapperMessage_Type_TYPE_BUDDY_TYPING);
|
2011-06-12 13:51:35 +02:00
|
|
|
break;
|
|
|
|
case pbnetwork::WrapperMessage_Type_TYPE_BUDDY_TYPED:
|
2011-10-17 17:24:44 +02:00
|
|
|
handleChatStatePayload(wrapper.payload(), pbnetwork::WrapperMessage_Type_TYPE_BUDDY_TYPED);
|
2011-06-12 13:51:35 +02:00
|
|
|
break;
|
|
|
|
case pbnetwork::WrapperMessage_Type_TYPE_BUDDY_STOPPED_TYPING:
|
2011-10-17 17:24:44 +02:00
|
|
|
handleChatStatePayload(wrapper.payload(), pbnetwork::WrapperMessage_Type_TYPE_BUDDY_STOPPED_TYPING);
|
2011-06-12 13:51:35 +02:00
|
|
|
break;
|
2011-06-22 12:11:24 +02:00
|
|
|
case pbnetwork::WrapperMessage_Type_TYPE_ATTENTION:
|
|
|
|
handleAttentionPayload(wrapper.payload());
|
|
|
|
break;
|
2011-09-28 14:32:57 +02:00
|
|
|
case pbnetwork::WrapperMessage_Type_TYPE_FT_START:
|
|
|
|
handleFTStartPayload(wrapper.payload());
|
|
|
|
break;
|
2011-10-02 11:11:08 +02:00
|
|
|
case pbnetwork::WrapperMessage_Type_TYPE_FT_FINISH:
|
|
|
|
handleFTFinishPayload(wrapper.payload());
|
|
|
|
break;
|
2011-10-01 21:12:18 +02:00
|
|
|
case pbnetwork::WrapperMessage_Type_TYPE_FT_PAUSE:
|
|
|
|
handleFTPausePayload(wrapper.payload());
|
|
|
|
break;
|
|
|
|
case pbnetwork::WrapperMessage_Type_TYPE_FT_CONTINUE:
|
|
|
|
handleFTContinuePayload(wrapper.payload());
|
|
|
|
break;
|
2011-10-17 17:24:44 +02:00
|
|
|
case pbnetwork::WrapperMessage_Type_TYPE_EXIT:
|
|
|
|
handleExitRequest();
|
|
|
|
break;
|
2013-02-09 11:09:38 +01:00
|
|
|
case pbnetwork::WrapperMessage_Type_TYPE_RAW_XML:
|
|
|
|
handleRawXML(wrapper.payload());
|
|
|
|
break;
|
2011-05-11 09:20:35 +02:00
|
|
|
default:
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void NetworkPlugin::send(const std::string &data) {
|
2012-03-06 11:00:57 +01:00
|
|
|
uint32_t size = htonl(data.size());
|
|
|
|
char *header = (char *) &size;
|
2011-10-13 21:46:11 +02:00
|
|
|
sendData(std::string(header, 4) + data);
|
2011-05-11 09:20:35 +02:00
|
|
|
}
|
|
|
|
|
2011-11-14 20:29:57 +01:00
|
|
|
void NetworkPlugin::checkPing() {
|
|
|
|
if (m_pingReceived == false) {
|
2016-02-11 14:42:17 +01:00
|
|
|
LOG4CXX_ERROR(logger, "PING request not received - exiting...");
|
2011-11-14 20:29:57 +01:00
|
|
|
handleExitRequest();
|
|
|
|
}
|
|
|
|
m_pingReceived = false;
|
|
|
|
}
|
|
|
|
|
2011-05-13 10:54:03 +02:00
|
|
|
void NetworkPlugin::sendPong() {
|
2011-05-26 08:53:05 +02:00
|
|
|
m_pingReceived = true;
|
2011-05-13 10:54:03 +02:00
|
|
|
std::string message;
|
|
|
|
pbnetwork::WrapperMessage wrap;
|
|
|
|
wrap.set_type(pbnetwork::WrapperMessage_Type_TYPE_PONG);
|
|
|
|
wrap.SerializeToString(&message);
|
|
|
|
|
|
|
|
send(message);
|
2011-07-18 14:45:30 +02:00
|
|
|
sendMemoryUsage();
|
|
|
|
}
|
|
|
|
|
|
|
|
void NetworkPlugin::sendMemoryUsage() {
|
|
|
|
pbnetwork::Stats stats;
|
|
|
|
|
|
|
|
stats.set_init_res(m_init_res);
|
2012-03-08 11:56:36 +01:00
|
|
|
double res = 0;
|
|
|
|
double shared = 0;
|
2011-09-07 14:03:27 +02:00
|
|
|
#ifndef WIN32
|
2011-07-18 14:45:30 +02:00
|
|
|
process_mem_usage(shared, res);
|
2011-09-07 14:03:27 +02:00
|
|
|
#endif
|
2012-03-08 11:56:36 +01:00
|
|
|
|
|
|
|
double e_res;
|
|
|
|
double e_shared;
|
|
|
|
handleMemoryUsage(e_res, e_shared);
|
|
|
|
|
|
|
|
stats.set_res(res + e_res);
|
|
|
|
stats.set_shared(shared + e_shared);
|
2012-03-09 18:41:58 +01:00
|
|
|
stats.set_id(stringOf(getpid()));
|
2011-07-18 14:45:30 +02:00
|
|
|
|
|
|
|
std::string message;
|
|
|
|
stats.SerializeToString(&message);
|
|
|
|
|
|
|
|
WRAP(message, pbnetwork::WrapperMessage_Type_TYPE_STATS);
|
|
|
|
|
|
|
|
send(message);
|
2011-05-13 10:54:03 +02:00
|
|
|
}
|
|
|
|
|
2011-05-11 09:20:35 +02:00
|
|
|
}
|