Files @ 78e71f9345c7
Branch filter:

Location: libtransport.git/src/Buddy.cpp - annotation

Jan Kaluza
Cleanup the includes, rename source code files to match the class name exactly
eaa9d7f3bd43
eaa9d7f3bd43
eaa9d7f3bd43
eaa9d7f3bd43
eaa9d7f3bd43
eaa9d7f3bd43
eaa9d7f3bd43
eaa9d7f3bd43
eaa9d7f3bd43
eaa9d7f3bd43
eaa9d7f3bd43
eaa9d7f3bd43
eaa9d7f3bd43
eaa9d7f3bd43
eaa9d7f3bd43
eaa9d7f3bd43
eaa9d7f3bd43
eaa9d7f3bd43
eaa9d7f3bd43
eaa9d7f3bd43
78e71f9345c7
78e71f9345c7
78e71f9345c7
78e71f9345c7
78e71f9345c7
78e71f9345c7
eaa9d7f3bd43
cc64a76c8be5
78e71f9345c7
78e71f9345c7
78e71f9345c7
78e71f9345c7
cc64a76c8be5
88865c1234e3
88865c1234e3
bb4ac38e5089
3949b84ed027
eaa9d7f3bd43
eaa9d7f3bd43
b5c026470f07
132dfb379d42
132dfb379d42
eeda35442237
e5aab1415d9e
e5aab1415d9e
fe47e0979be9
eeda35442237
eeda35442237
eeda35442237
b5c026470f07
132dfb379d42
132dfb379d42
eaa9d7f3bd43
eaa9d7f3bd43
b5c026470f07
eaa9d7f3bd43
eaa9d7f3bd43
eaa9d7f3bd43
b5c026470f07
eaa9d7f3bd43
eaa9d7f3bd43
eaa9d7f3bd43
b5c026470f07
eaa9d7f3bd43
132dfb379d42
83f5f36c94a2
83f5f36c94a2
83f5f36c94a2
83f5f36c94a2
83f5f36c94a2
7a2884c63e7b
eaa9d7f3bd43
eaa9d7f3bd43
b5c026470f07
eaa9d7f3bd43
eaa9d7f3bd43
eaa9d7f3bd43
b5c026470f07
ab6a0ecf307b
132dfb379d42
132dfb379d42
132dfb379d42
eaa9d7f3bd43
eaa9d7f3bd43
3949b84ed027
3949b84ed027
eaa9d7f3bd43
eaa9d7f3bd43
3949b84ed027
3949b84ed027
eaa9d7f3bd43
eaa9d7f3bd43
e5aab1415d9e
e5aab1415d9e
e5aab1415d9e
e5aab1415d9e
e5aab1415d9e
e5aab1415d9e
e5aab1415d9e
eaa9d7f3bd43
e5aab1415d9e
fe47e0979be9
e5aab1415d9e
eaa9d7f3bd43
e5aab1415d9e
ab6a0ecf307b
ab6a0ecf307b
ab6a0ecf307b
ab6a0ecf307b
e5aab1415d9e
e5aab1415d9e
e5aab1415d9e
e5aab1415d9e
e5aab1415d9e
e5aab1415d9e
e5aab1415d9e
e5aab1415d9e
e5aab1415d9e
e5aab1415d9e
e5aab1415d9e
e5aab1415d9e
eaa9d7f3bd43
18a72df6850b
5521c4094411
eaa9d7f3bd43
eaa9d7f3bd43
eaa9d7f3bd43
eaa9d7f3bd43
eaa9d7f3bd43
5521c4094411
eaa9d7f3bd43
5521c4094411
eaa9d7f3bd43
eaa9d7f3bd43
eaa9d7f3bd43
eaa9d7f3bd43
fe47e0979be9
eaa9d7f3bd43
96fb9b61e85a
eaa9d7f3bd43
96fb9b61e85a
fe47e0979be9
fe47e0979be9
fe47e0979be9
eaa9d7f3bd43
eaa9d7f3bd43
e5aab1415d9e
e5aab1415d9e
e5aab1415d9e
e5aab1415d9e
e5aab1415d9e
e5aab1415d9e
e5aab1415d9e
e5aab1415d9e
e5aab1415d9e
a59f6be32190
a59f6be32190
a59f6be32190
a59f6be32190
a59f6be32190
a59f6be32190
a59f6be32190
a59f6be32190
eaa9d7f3bd43
e5aab1415d9e
eaa9d7f3bd43
88865c1234e3
b5c026470f07
132dfb379d42
132dfb379d42
132dfb379d42
49e5cd3ac405
49e5cd3ac405
49e5cd3ac405
132dfb379d42
49e5cd3ac405
49e5cd3ac405
49e5cd3ac405
90aacd41d9df
49e5cd3ac405
49e5cd3ac405
132dfb379d42
49e5cd3ac405
132dfb379d42
49e5cd3ac405
49e5cd3ac405
49e5cd3ac405
d39705842a2a
fe47e0979be9
35e56d515d97
35e56d515d97
62f3fbf99c88
62f3fbf99c88
62f3fbf99c88
62f3fbf99c88
62f3fbf99c88
90aacd41d9df
62f3fbf99c88
62f3fbf99c88
62f3fbf99c88
62f3fbf99c88
b0bcade44c94
ab6a0ecf307b
ab6a0ecf307b
ab6a0ecf307b
62f3fbf99c88
62f3fbf99c88
62f3fbf99c88
62f3fbf99c88
7b287fdc66eb
90aacd41d9df
90aacd41d9df
90aacd41d9df
90aacd41d9df
90aacd41d9df
90aacd41d9df
88865c1234e3
/**
 * XMPP - libpurple transport
 *
 * Copyright (C) 2009, Jan Kaluza <hanzz@soc.pidgin.im>
 *
 * 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
 */

#include "transport/Buddy.h"
#include "transport/RosterManager.h"
#include "transport/User.h"
#include "transport/Transport.h"
#include "transport/UserManager.h"
#include "transport/Frontend.h"

#include "Swiften/Elements/VCardUpdate.h"
#include "Swiften/Elements/Presence.h"

#include <boost/foreach.hpp>
#include <boost/make_shared.hpp>

namespace Transport {

Buddy::Buddy(RosterManager *rosterManager, long id, BuddyFlag flags) : m_id(id), m_flags(flags), m_rosterManager(rosterManager),
	m_subscription(Ask) {
}

Buddy::~Buddy() {
}

void Buddy::sendPresence() {
	std::vector<Swift::Presence::ref> &presences = generatePresenceStanzas(255);
	BOOST_FOREACH(Swift::Presence::ref presence, presences) {
		m_rosterManager->getUser()->getComponent()->getFrontend()->sendPresence(presence);
	}
}

void Buddy::generateJID() {
	m_jid = Swift::JID();
	m_jid = Swift::JID(getSafeName(), m_rosterManager->getUser()->getComponent()->getJID().toString(), "bot");
}

void Buddy::setID(long id) {
	m_id = id;
}

long Buddy::getID() {
	return m_id;
}

void Buddy::setFlags(BuddyFlag flags) {
	m_flags = flags;

	if (!getSafeName().empty()) {
		try {
			generateJID();
		} catch (...) {
		}
	}
}

BuddyFlag Buddy::getFlags() {
	return m_flags;
}

const Swift::JID &Buddy::getJID() {
	if (!m_jid.isValid() || m_jid.getNode().empty()) {
		generateJID();
	}
	return m_jid;
}

void Buddy::setSubscription(Subscription subscription) {
	m_subscription = subscription;
}

Buddy::Subscription Buddy::getSubscription() {
	return m_subscription;
}

void Buddy::handleRawPresence(Swift::Presence::ref presence) {
	for (std::vector<Swift::Presence::ref>::iterator it = m_presences.begin(); it != m_presences.end(); it++) {
		if ((*it)->getFrom() == presence->getFrom()) {
			m_presences.erase(it);
			break;
		}
	}

	m_presences.push_back(presence);
	m_rosterManager->getUser()->getComponent()->getFrontend()->sendPresence(presence);
}

std::vector<Swift::Presence::ref> &Buddy::generatePresenceStanzas(int features, bool only_new) {
	if (m_jid.getNode().empty()) {
		generateJID();
	}

	Swift::StatusShow s;
	std::string statusMessage;
	if (!getStatus(s, statusMessage)) {
		for (std::vector<Swift::Presence::ref>::iterator it = m_presences.begin(); it != m_presences.end(); it++) {
			if ((*it)->getFrom() == m_jid) {
				m_presences.erase(it);
				break;
			}
		}
		return m_presences;
	}

	Swift::Presence::ref presence = Swift::Presence::create();
	presence->setTo(m_rosterManager->getUser()->getJID().toBare());
	presence->setFrom(m_jid);
	presence->setType(Swift::Presence::Available);

	if (!statusMessage.empty())
		presence->setStatus(statusMessage);

	if (s.getType() == Swift::StatusShow::None)
		presence->setType(Swift::Presence::Unavailable);

	presence->setShow(s.getType());

	if (presence->getType() != Swift::Presence::Unavailable) {
		// caps
	

// 		if (features & 0/*TRANSPORT_FEATURE_AVATARS*/) {
			presence->addPayload(boost::shared_ptr<Swift::Payload>(new Swift::VCardUpdate (getIconHash())));
// 		}
// 		if (isBlocked()) {
// 			presence->addPayload(boost::shared_ptr<Swift::Payload>(new Transport::BlockPayload ()));
// 		}
	}

	BOOST_FOREACH(Swift::Presence::ref &p, m_presences) {
		if (p->getFrom() == presence->getFrom()) {
			p = presence;
			return m_presences;
		}
	}

	m_presences.push_back(presence);

// 	if (only_new) {
// 		if (m_lastPresence)
// 			m_lastPresence->setTo(Swift::JID(""));
// 		if (m_lastPresence == presence) {
// 			return Swift::Presence::ref();
// 		}
// 		m_lastPresence = presence;
// 	}

	return m_presences;
}

std::string Buddy::getSafeName() {
	if (m_jid.isValid()) {
		return m_jid.getNode();
	}
	std::string name = getName();
// 	Transport::instance()->protocol()->prepareUsername(name, purple_buddy_get_account(m_buddy));
	if (getFlags() & BUDDY_JID_ESCAPING) {
		name = Swift::JID::getEscapedNode(name);
	}
	else {
		if (name.find_last_of("@") != std::string::npos) {
			name.replace(name.find_last_of("@"), 1, "%"); // OK
		}
	}
// 	if (name.empty()) {
// 		Log("SpectrumBuddy::getSafeName", "Name is EMPTY! Previous was " << getName() << ".");
// 	}
	return name;
}

void Buddy::handleVCardReceived(const std::string &id, Swift::VCard::ref vcard) {
	m_rosterManager->getUser()->getComponent()->getFrontend()->sendVCard(vcard, m_rosterManager->getUser()->getJID());
}

std::string Buddy::JIDToLegacyName(const Swift::JID &jid) {
	std::string name;
	if (jid.getUnescapedNode() == jid.getNode()) {
		name = jid.getNode();
		if (name.find_last_of("%") != std::string::npos) {
			name.replace(name.find_last_of("%"), 1, "@"); // OK
		}
	}
	else {
		name = jid.getUnescapedNode();
		// Psi sucks...
// 		if (name.find_last_of("\\40") != std::string::npos) {
// 			name.replace(name.find_last_of("\\40"), 1, "@"); // OK
// 		}
	}
	return name;
}

BuddyFlag Buddy::buddyFlagsFromJID(const Swift::JID &jid) {
	if (jid.getUnescapedNode() == jid.getNode()) {
		return BUDDY_NO_FLAG;
	}
	return BUDDY_JID_ESCAPING;
}

}