Switch part of libtransport and libpurple backend into log4cxx
This commit is contained in:
parent
f9d40b961a
commit
b5c2a6e001
5 changed files with 75 additions and 41 deletions
|
@ -15,15 +15,20 @@
|
|||
#include "transport/networkplugin.h"
|
||||
#include "spectrumeventloop.h"
|
||||
#include "geventloop.h"
|
||||
#include "log4cxx/logger.h"
|
||||
#include "log4cxx/consoleappender.h"
|
||||
#include "log4cxx/patternlayout.h"
|
||||
|
||||
#define Log(X, STRING) std::cout << "[SPECTRUM] " << X << " " << STRING << "\n";
|
||||
using namespace log4cxx;
|
||||
|
||||
static LoggerPtr logger_libpurple = Logger::getLogger("backend.libpurple");
|
||||
static LoggerPtr logger = Logger::getLogger("backend");
|
||||
|
||||
using namespace Transport;
|
||||
|
||||
class SpectrumNetworkPlugin;
|
||||
|
||||
Logger *_logger;
|
||||
|
||||
SpectrumNetworkPlugin *np;
|
||||
|
||||
static gboolean nodaemon = FALSE;
|
||||
|
@ -107,14 +112,14 @@ static void * requestInput(const char *title, const char *primary,const char *se
|
|||
static void *requestAction(const char *title, const char *primary, const char *secondary, int default_action, PurpleAccount *account, const char *who,PurpleConversation *conv, void *user_data, size_t action_count, va_list actions){
|
||||
std::string t(title ? title : "NULL");
|
||||
if (t == "SSL Certificate Verification") {
|
||||
Log("purple", "accepting SSL certificate");
|
||||
LOG4CXX_INFO(logger, "accepting SSL certificate");
|
||||
va_arg(actions, char *);
|
||||
((PurpleRequestActionCb) va_arg(actions, GCallback)) (user_data, 2);
|
||||
}
|
||||
else {
|
||||
if (title) {
|
||||
std::string headerString(title);
|
||||
Log("purple", "header string: " << headerString);
|
||||
LOG4CXX_INFO(logger, "header string: " << headerString);
|
||||
if (headerString == "SSL Certificate Verification") {
|
||||
va_arg(actions, char *);
|
||||
((PurpleRequestActionCb) va_arg(actions, GCallback)) (user_data, 2);
|
||||
|
@ -149,7 +154,7 @@ class SpectrumNetworkPlugin : public NetworkPlugin {
|
|||
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");
|
||||
// Log(user, "this account already exists");
|
||||
account = purple_accounts_find(legacyName.c_str(), protocol);
|
||||
// User *u = (User *) account->ui_data;
|
||||
// if (u && u != user) {
|
||||
|
@ -158,7 +163,7 @@ class SpectrumNetworkPlugin : public NetworkPlugin {
|
|||
// }
|
||||
}
|
||||
else {
|
||||
Log(user, "creating new account");
|
||||
// Log(user, "creating new account");
|
||||
account = purple_account_new(legacyName.c_str(), protocol);
|
||||
|
||||
purple_accounts_add(account);
|
||||
|
@ -848,16 +853,17 @@ static void signed_on(PurpleConnection *gc, gpointer unused) {
|
|||
}
|
||||
|
||||
static void printDebug(PurpleDebugLevel level, const char *category, const char *arg_s) {
|
||||
std::string c("[LIBPURPLE");
|
||||
std::string c("");
|
||||
std::string args(arg_s);
|
||||
args.erase(args.size() - 1);
|
||||
|
||||
if (category) {
|
||||
c.push_back('/');
|
||||
c.append(category);
|
||||
}
|
||||
|
||||
c.push_back(']');
|
||||
c.push_back(':');
|
||||
|
||||
std::cout << c << " " << arg_s;
|
||||
LOG4CXX_INFO(logger_libpurple, c << args);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -1025,6 +1031,9 @@ int main(int argc, char **argv) {
|
|||
return 1;
|
||||
}
|
||||
|
||||
LoggerPtr root = log4cxx::Logger::getRootLogger();
|
||||
root->addAppender(new ConsoleAppender(new PatternLayout("%d %-5p %c: %m%n")));
|
||||
|
||||
initPurple(config);
|
||||
|
||||
SpectrumEventLoop eventLoop;
|
||||
|
|
|
@ -29,6 +29,12 @@
|
|||
#include "Swiften/Server/ServerStanzaChannel.h"
|
||||
#include "Swiften/Elements/StreamError.h"
|
||||
#include "pbnetwork.pb.h"
|
||||
#include "log4cxx/logger.h"
|
||||
#include "log4cxx/basicconfigurator.h"
|
||||
|
||||
using namespace log4cxx;
|
||||
|
||||
static LoggerPtr logger = Logger::getLogger("NetworkPlugin");
|
||||
|
||||
namespace Transport {
|
||||
|
||||
|
@ -238,24 +244,24 @@ void NetworkPlugin::handleRoomChanged(const std::string &user, const std::string
|
|||
|
||||
void NetworkPlugin::_handleConnected(bool error) {
|
||||
if (error) {
|
||||
std::cerr << "Connecting error\n";
|
||||
LOG4CXX_ERROR(logger, "Connecting error. Exiting");
|
||||
m_pingTimer->stop();
|
||||
exit(1);
|
||||
}
|
||||
else {
|
||||
std::cout << "Connected\n";
|
||||
LOG4CXX_INFO(logger, "Connected to NetworkPluginServer");
|
||||
m_pingTimer->start();
|
||||
}
|
||||
}
|
||||
|
||||
void NetworkPlugin::handleDisconnected() {
|
||||
std::cerr << "Disconnected\n";
|
||||
LOG4CXX_INFO(logger, "Disconnected from NetworkPluginServer. Exiting.");
|
||||
m_pingTimer->stop();
|
||||
exit(1);
|
||||
}
|
||||
|
||||
void NetworkPlugin::connect() {
|
||||
std::cout << "Trying to connect the server\n";
|
||||
LOG4CXX_INFO(logger, "Connecting NetworkPluginServer host " << m_host << " port " << m_port);
|
||||
m_conn->connect(Swift::HostAddressPort(Swift::HostAddress(m_host), m_port));
|
||||
}
|
||||
|
||||
|
@ -457,12 +463,12 @@ void NetworkPlugin::sendPong() {
|
|||
wrap.SerializeToString(&message);
|
||||
|
||||
send(message);
|
||||
std::cout << "SENDING PONG\n";
|
||||
LOG4CXX_INFO(logger, "PONG");
|
||||
}
|
||||
|
||||
void NetworkPlugin::pingTimeout() {
|
||||
std::cout << "PINGTIMEOUT " << m_pingReceived << " " << this << "\n";
|
||||
if (m_pingReceived == false) {
|
||||
LOG4CXX_ERROR(logger, "No PING received for long time (NetworkPluginServer crashed?). Exiting");
|
||||
exit(1);
|
||||
}
|
||||
m_pingReceived = false;
|
||||
|
|
|
@ -37,9 +37,14 @@
|
|||
#include "pbnetwork.pb.h"
|
||||
#include "sys/wait.h"
|
||||
#include "sys/signal.h"
|
||||
#include "log4cxx/logger.h"
|
||||
|
||||
using namespace log4cxx;
|
||||
|
||||
namespace Transport {
|
||||
|
||||
static LoggerPtr logger = Logger::getLogger("NetworkPluginServer");
|
||||
|
||||
class NetworkConversation : public Conversation {
|
||||
public:
|
||||
NetworkConversation(ConversationManager *conversationManager, const std::string &legacyName, bool muc = false) : Conversation(conversationManager, legacyName, muc) {
|
||||
|
@ -85,6 +90,7 @@ class NetworkFactory : public Factory {
|
|||
wrap.SerializeToString(&MESSAGE);
|
||||
|
||||
static int exec_(const char *path, const char *host, const char *port, const char *config) {
|
||||
LOG4CXX_INFO(logger, "Starting new backend " << path);
|
||||
// char *argv[] = {(char*)script_name, '\0'};
|
||||
int status = 0;
|
||||
pid_t pid = fork();
|
||||
|
@ -139,6 +145,8 @@ NetworkPluginServer::NetworkPluginServer(Component *component, Config *config, U
|
|||
m_server->onNewConnection.connect(boost::bind(&NetworkPluginServer::handleNewClientConnection, this, _1));
|
||||
m_server->start();
|
||||
|
||||
LOG4CXX_INFO(logger, "Listening on host " << CONFIG_STRING(m_config, "service.backend_host") << " port " << CONFIG_STRING(m_config, "service.backend_port"));
|
||||
|
||||
signal(SIGCHLD, SigCatcher);
|
||||
|
||||
exec_(CONFIG_STRING(m_config, "service.backend").c_str(), CONFIG_STRING(m_config, "service.backend_host").c_str(), CONFIG_STRING(m_config, "service.backend_port").c_str(), m_config->getConfigFile().c_str());
|
||||
|
@ -155,6 +163,8 @@ void NetworkPluginServer::handleNewClientConnection(boost::shared_ptr<Swift::Con
|
|||
client->pongReceived = true;
|
||||
client->connection = c;
|
||||
|
||||
LOG4CXX_INFO(logger, "New backend " << client << " connected. Current backend count=" << (m_clients.size() + 1));
|
||||
|
||||
if (m_clients.size() == 0) {
|
||||
// first backend connected, start the server, we're ready.
|
||||
m_component->start();
|
||||
|
@ -169,7 +179,9 @@ void NetworkPluginServer::handleNewClientConnection(boost::shared_ptr<Swift::Con
|
|||
}
|
||||
|
||||
void NetworkPluginServer::handleSessionFinished(Client *c) {
|
||||
LOG4CXX_INFO(logger, "Backend " << c << " disconnected. Current backend count=" << (m_clients.size() - 1));
|
||||
for (std::list<User *>::const_iterator it = c->users.begin(); it != c->users.end(); it++) {
|
||||
LOG4CXX_ERROR(logger, "Backend " << c << " disconnected (probably crashed) with active user " << (*it)->getJID().toString());
|
||||
(*it)->setData(NULL);
|
||||
(*it)->handleDisconnected("Internal Server Error, please reconnect.");
|
||||
}
|
||||
|
@ -188,14 +200,11 @@ void NetworkPluginServer::handleSessionFinished(Client *c) {
|
|||
|
||||
void NetworkPluginServer::handleConnectedPayload(const std::string &data) {
|
||||
pbnetwork::Connected payload;
|
||||
std::cout << "CONNECTED LOGIN 2 " << payload.user() << "\n";
|
||||
if (payload.ParseFromString(data) == false) {
|
||||
// TODO: ERROR
|
||||
return;
|
||||
}
|
||||
std::cout << "CONNECTED LOGIN 3 " << payload.user() << "\n";
|
||||
m_component->m_userRegistry->onPasswordValid(payload.user());
|
||||
// std::cout << payload.name() << "\n";
|
||||
}
|
||||
|
||||
void NetworkPluginServer::handleDisconnectedPayload(const std::string &data) {
|
||||
|
@ -269,7 +278,6 @@ void NetworkPluginServer::handleChatStatePayload(const std::string &data, Swift:
|
|||
|
||||
NetworkConversation *conv = (NetworkConversation *) user->getConversationManager()->getConversation(payload.buddyname());
|
||||
if (!conv) {
|
||||
std::cout << "handling chatstate: NO conv with buddyname=" << payload.buddyname() << "\n";
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -456,7 +464,6 @@ void NetworkPluginServer::send(boost::shared_ptr<Swift::Connection> &c, const st
|
|||
}
|
||||
|
||||
void NetworkPluginServer::pingTimeout() {
|
||||
std::cout << "pingtimeout\n";
|
||||
for (std::list<Client *>::const_iterator it = m_clients.begin(); it != m_clients.end(); it++) {
|
||||
if ((*it)->pongReceived) {
|
||||
sendPing((*it));
|
||||
|
@ -471,6 +478,7 @@ void NetworkPluginServer::pingTimeout() {
|
|||
void NetworkPluginServer::handleUserCreated(User *user) {
|
||||
Client *c = getFreeClient();
|
||||
if (!c) {
|
||||
LOG4CXX_ERROR(logger, "There is no backend to handle user " << user->getJID().toString());
|
||||
user->handleDisconnected("Internal Server Error, please reconnect.");
|
||||
return;
|
||||
}
|
||||
|
@ -589,7 +597,7 @@ void NetworkPluginServer::handleUserDestroyed(User *user) {
|
|||
send(c->connection, message);
|
||||
c->users.remove(user);
|
||||
if (c->users.size() == 0) {
|
||||
std::cout << "DISCONNECTING\n";
|
||||
LOG4CXX_INFO(logger, "Disconnecting backend " << c << ". There are no users.");
|
||||
c->connection->disconnect();
|
||||
c->connection.reset();
|
||||
// m_clients.erase(user->connection);
|
||||
|
@ -731,7 +739,7 @@ void NetworkPluginServer::sendPing(Client *c) {
|
|||
|
||||
send(c->connection, message);
|
||||
c->pongReceived = false;
|
||||
std::cout << "SENDING PING\n";
|
||||
LOG4CXX_INFO(logger, "PING to " << c);
|
||||
}
|
||||
|
||||
NetworkPluginServer::Client *NetworkPluginServer::getFreeClient() {
|
||||
|
|
|
@ -20,6 +20,9 @@
|
|||
|
||||
#include "transport/sqlite3backend.h"
|
||||
#include <boost/bind.hpp>
|
||||
#include "log4cxx/logger.h"
|
||||
|
||||
using namespace log4cxx;
|
||||
|
||||
#define SQLITE_DB_VERSION 3
|
||||
#define CHECK_DB_RESPONSE(stmt) \
|
||||
|
@ -31,7 +34,7 @@
|
|||
// Prepare the SQL statement
|
||||
#define PREP_STMT(sql, str) \
|
||||
if(sqlite3_prepare_v2(m_db, std::string(str).c_str(), -1, &sql, NULL)) { \
|
||||
onStorageError(str, (sqlite3_errmsg(m_db) == NULL ? "" : sqlite3_errmsg(m_db))); \
|
||||
LOG4CXX_ERROR(logger, str<< (sqlite3_errmsg(m_db) == NULL ? "" : sqlite3_errmsg(m_db))); \
|
||||
return false; \
|
||||
}
|
||||
|
||||
|
@ -52,18 +55,19 @@
|
|||
#define GET_INT(STATEMENT) sqlite3_column_int(STATEMENT, STATEMENT##_id_get++)
|
||||
#define GET_STR(STATEMENT) (const char *) sqlite3_column_text(STATEMENT, STATEMENT##_id_get++)
|
||||
#define EXECUTE_STATEMENT(STATEMENT, NAME) if(sqlite3_step(STATEMENT) != SQLITE_DONE) {\
|
||||
onStorageError(NAME, (sqlite3_errmsg(m_db) == NULL ? "" : sqlite3_errmsg(m_db)));\
|
||||
LOG4CXX_ERROR(logger, NAME<< (sqlite3_errmsg(m_db) == NULL ? "" : sqlite3_errmsg(m_db)));\
|
||||
}
|
||||
|
||||
using namespace boost;
|
||||
|
||||
namespace Transport {
|
||||
|
||||
static LoggerPtr logger = Logger::getLogger("SQLite3Backend");
|
||||
|
||||
SQLite3Backend::SQLite3Backend(Config *config) {
|
||||
m_config = config;
|
||||
m_db = NULL;
|
||||
m_prefix = CONFIG_STRING(m_config, "database.prefix");
|
||||
std::cout << "SQLITE3 " << this << "\n";
|
||||
}
|
||||
|
||||
SQLite3Backend::~SQLite3Backend(){
|
||||
|
@ -96,6 +100,7 @@ SQLite3Backend::~SQLite3Backend(){
|
|||
}
|
||||
|
||||
bool SQLite3Backend::connect() {
|
||||
LOG4CXX_INFO(logger, "Opening database " << CONFIG_STRING(m_config, "database.database"));
|
||||
if (sqlite3_open(CONFIG_STRING(m_config, "database.database").c_str(), &m_db)) {
|
||||
sqlite3_close(m_db);
|
||||
return false;
|
||||
|
@ -186,7 +191,7 @@ bool SQLite3Backend::exec(const std::string &query) {
|
|||
char *errMsg = 0;
|
||||
int rc = sqlite3_exec(m_db, query.c_str(), NULL, 0, &errMsg);
|
||||
if (rc != SQLITE_OK) {
|
||||
onStorageError(query, errMsg);
|
||||
LOG4CXX_ERROR(logger, errMsg << " during statement " << query);
|
||||
sqlite3_free(errMsg);
|
||||
return false;
|
||||
}
|
||||
|
@ -203,7 +208,7 @@ void SQLite3Backend::setUser(const UserInfo &user) {
|
|||
sqlite3_bind_int (m_setUser, 6, user.vip);
|
||||
|
||||
if(sqlite3_step(m_setUser) != SQLITE_DONE) {
|
||||
onStorageError("setUser query", (sqlite3_errmsg(m_db) == NULL ? "" : sqlite3_errmsg(m_db)));
|
||||
LOG4CXX_ERROR(logger, "setUser query"<< (sqlite3_errmsg(m_db) == NULL ? "" : sqlite3_errmsg(m_db)));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -225,7 +230,7 @@ bool SQLite3Backend::getUser(const std::string &barejid, UserInfo &user) {
|
|||
}
|
||||
|
||||
if (ret != SQLITE_DONE) {
|
||||
onStorageError("getUser query", (sqlite3_errmsg(m_db) == NULL ? "" : sqlite3_errmsg(m_db)));
|
||||
LOG4CXX_ERROR(logger, "getUser query"<< (sqlite3_errmsg(m_db) == NULL ? "" : sqlite3_errmsg(m_db)));
|
||||
}
|
||||
|
||||
return false;
|
||||
|
@ -246,7 +251,7 @@ long SQLite3Backend::addBuddy(long userId, const BuddyInfo &buddyInfo) {
|
|||
BIND_INT(m_addBuddy, buddyInfo.flags);
|
||||
|
||||
if(sqlite3_step(m_addBuddy) != SQLITE_DONE) {
|
||||
onStorageError("addBuddy query", (sqlite3_errmsg(m_db) == NULL ? "" : sqlite3_errmsg(m_db)));
|
||||
LOG4CXX_ERROR(logger, "addBuddy query"<< (sqlite3_errmsg(m_db) == NULL ? "" : sqlite3_errmsg(m_db)));
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
@ -347,7 +352,7 @@ bool SQLite3Backend::getBuddies(long id, std::list<BuddyInfo> &roster) {
|
|||
}
|
||||
|
||||
// if (ret != SQLITE_DONE) {
|
||||
// onStorageError("getBuddiesSettings query", (sqlite3_errmsg(m_db) == NULL ? "" : sqlite3_errmsg(m_db)));
|
||||
// LOG4CXX_ERROR(logger, "getBuddiesSettings query"<< (sqlite3_errmsg(m_db) == NULL ? "" : sqlite3_errmsg(m_db)));
|
||||
// return false;
|
||||
// }
|
||||
|
||||
|
@ -355,7 +360,7 @@ bool SQLite3Backend::getBuddies(long id, std::list<BuddyInfo> &roster) {
|
|||
}
|
||||
|
||||
if (ret != SQLITE_DONE) {
|
||||
onStorageError("getBuddies query", (sqlite3_errmsg(m_db) == NULL ? "" : sqlite3_errmsg(m_db)));
|
||||
LOG4CXX_ERROR(logger, "getBuddies query"<< (sqlite3_errmsg(m_db) == NULL ? "" : sqlite3_errmsg(m_db)));
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -366,28 +371,28 @@ bool SQLite3Backend::removeUser(long id) {
|
|||
sqlite3_reset(m_removeUser);
|
||||
sqlite3_bind_int(m_removeUser, 1, id);
|
||||
if(sqlite3_step(m_removeUser) != SQLITE_DONE) {
|
||||
onStorageError("removeUser query", (sqlite3_errmsg(m_db) == NULL ? "" : sqlite3_errmsg(m_db)));
|
||||
LOG4CXX_ERROR(logger, "removeUser query"<< (sqlite3_errmsg(m_db) == NULL ? "" : sqlite3_errmsg(m_db)));
|
||||
return false;
|
||||
}
|
||||
|
||||
sqlite3_reset(m_removeUserSettings);
|
||||
sqlite3_bind_int(m_removeUserSettings, 1, id);
|
||||
if(sqlite3_step(m_removeUserSettings) != SQLITE_DONE) {
|
||||
onStorageError("removeUserSettings query", (sqlite3_errmsg(m_db) == NULL ? "" : sqlite3_errmsg(m_db)));
|
||||
LOG4CXX_ERROR(logger, "removeUserSettings query"<< (sqlite3_errmsg(m_db) == NULL ? "" : sqlite3_errmsg(m_db)));
|
||||
return false;
|
||||
}
|
||||
|
||||
sqlite3_reset(m_removeUserBuddies);
|
||||
sqlite3_bind_int(m_removeUserBuddies, 1, id);
|
||||
if(sqlite3_step(m_removeUserBuddies) != SQLITE_DONE) {
|
||||
onStorageError("removeUserBuddies query", (sqlite3_errmsg(m_db) == NULL ? "" : sqlite3_errmsg(m_db)));
|
||||
LOG4CXX_ERROR(logger, "removeUserBuddies query"<< (sqlite3_errmsg(m_db) == NULL ? "" : sqlite3_errmsg(m_db)));
|
||||
return false;
|
||||
}
|
||||
|
||||
sqlite3_reset(m_removeUserBuddiesSettings);
|
||||
sqlite3_bind_int(m_removeUserBuddiesSettings, 1, id);
|
||||
if(sqlite3_step(m_removeUserBuddiesSettings) != SQLITE_DONE) {
|
||||
onStorageError("removeUserBuddiesSettings query", (sqlite3_errmsg(m_db) == NULL ? "" : sqlite3_errmsg(m_db)));
|
||||
LOG4CXX_ERROR(logger, "removeUserBuddiesSettings query"<< (sqlite3_errmsg(m_db) == NULL ? "" : sqlite3_errmsg(m_db)));
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
|
@ -28,8 +28,9 @@
|
|||
#include "Swiften/TLS/OpenSSL/OpenSSLServerContext.h"
|
||||
#include "Swiften/TLS/PKCS12Certificate.h"
|
||||
#include "Swiften/TLS/OpenSSL/OpenSSLServerContextFactory.h"
|
||||
#include <log4cxx/logger.h>
|
||||
#include "log4cxx/basicconfigurator.h"
|
||||
#include "log4cxx/logger.h"
|
||||
#include "log4cxx/consoleappender.h"
|
||||
#include "log4cxx/patternlayout.h"
|
||||
|
||||
using namespace Swift;
|
||||
using namespace boost;
|
||||
|
@ -38,6 +39,7 @@ using namespace log4cxx;
|
|||
namespace Transport {
|
||||
|
||||
static LoggerPtr logger = Logger::getLogger("Component");
|
||||
static LoggerPtr logger_xml = Logger::getLogger("Component.XML");
|
||||
|
||||
class MyUserRegistry : public Swift::UserRegistry {
|
||||
public:
|
||||
|
@ -66,7 +68,11 @@ Component::Component(Swift::EventLoop *loop, Config *config, Factory *factory) {
|
|||
m_factory = factory;
|
||||
m_loop = loop;
|
||||
|
||||
BasicConfigurator::configure();
|
||||
// BasicConfigurator::configure();
|
||||
|
||||
LoggerPtr root = Logger::getRootLogger();
|
||||
root->addAppender(new ConsoleAppender(new PatternLayout("%d %-5p %c: %m%n")));
|
||||
|
||||
|
||||
m_jid = Swift::JID(CONFIG_STRING(m_config, "service.jid"));
|
||||
|
||||
|
@ -201,11 +207,11 @@ void Component::handleConnectionError(const ComponentError &error) {
|
|||
}
|
||||
|
||||
void Component::handleDataRead(const Swift::SafeByteArray &data) {
|
||||
onXMLIn(safeByteArrayToString(data));
|
||||
LOG4CXX_INFO(logger_xml, "XML IN " << safeByteArrayToString(data));
|
||||
}
|
||||
|
||||
void Component::handleDataWritten(const Swift::SafeByteArray &data) {
|
||||
onXMLOut(safeByteArrayToString(data));
|
||||
LOG4CXX_INFO(logger_xml, "XML OUT " << safeByteArrayToString(data));
|
||||
}
|
||||
|
||||
void Component::handlePresence(Swift::Presence::ref presence) {
|
||||
|
|
Loading…
Add table
Reference in a new issue