JID Escaping and preparation for RIE

This commit is contained in:
Jan Kaluza 2011-03-24 11:42:31 +01:00
parent cedb604c60
commit 132dfb379d
8 changed files with 51 additions and 20 deletions

View file

@ -39,7 +39,7 @@ typedef enum { BUDDY_NO_FLAG = 0,
class AbstractBuddy {
public:
/// Constructor.
AbstractBuddy(long id);
AbstractBuddy(RosterManager *rosterManager, long id);
/// Destructor
virtual ~AbstractBuddy();
@ -59,7 +59,7 @@ class AbstractBuddy {
/// Returns full JID of this buddy.
/// \param hostname hostname used as domain in returned JID
/// \return full JID of this buddy
Swift::JID getJID(const std::string &hostname);
const Swift::JID &getJID(const std::string &hostname);
/// Generates whole Presennce stanza with current status/show for this buddy.
/// Presence stanza does not containt "to" attribute, it has to be added manually.
@ -95,10 +95,6 @@ class AbstractBuddy {
/// \param flags flags
BuddyFlag getFlags();
/// Sets RosterManager associated with this buddy.
/// \param rosterManager RosterManager
void setRosterManager(RosterManager *rosterManager) { m_rosterManager = rosterManager; }
/// Returns RosterManager associated with this buddy
/// \return rosterManager
RosterManager *getRosterManager() { return m_rosterManager; }
@ -132,10 +128,13 @@ class AbstractBuddy {
virtual std::string getIconHash() = 0;
private:
void generateJID();
long m_id;
bool m_online;
std::string m_subscription;
Swift::Presence::ref m_lastPresence;
Swift::JID m_jid;
BuddyFlag m_flags;
RosterManager *m_rosterManager;
};

View file

@ -67,9 +67,12 @@ class RosterManager {
boost::signal<void (AbstractBuddy *buddy)> onBuddyUnset;
private:
void setBuddyCallback(AbstractBuddy *buddy);
std::map<std::string, AbstractBuddy *> m_buddies;
Component *m_component;
User *m_user;
Swift::Timer::ref m_setBuddyTimer;
};
}

View file

@ -55,6 +55,9 @@ class User {
RosterManager *getRosterManager() { return m_rosterManager; }
Component *getComponent() { return m_component; }
void setData(void *data) { m_data = data; }
void *getData() { return m_data; }

View file

@ -65,11 +65,9 @@ static void buddyListNewNode(PurpleBlistNode *node) {
s_buddy->addBuddy(buddy);
}
else {
buddy->node.ui_data = (void *) new SpectrumBuddy(-1, buddy);
buddy->node.ui_data = (void *) new SpectrumBuddy(user->getRosterManager(), -1, buddy);
SpectrumBuddy *s_buddy = (SpectrumBuddy *) buddy->node.ui_data;
s_buddy->setFlags(BUDDY_JID_ESCAPING);
user->getRosterManager()->setBuddy(s_buddy);
}
}
@ -85,7 +83,6 @@ static void NodeRemoved(PurpleBlistNode *node, void *data) {
s_buddy->removeBuddy(buddy);
buddy->node.ui_data = NULL;
if (s_buddy->getBuddiesCount() == 0) {
user->getRosterManager()->unsetBuddy(s_buddy);
delete s_buddy;
}
}

View file

@ -23,7 +23,7 @@
#define Log(X, STRING) std::cout << "[SPECTRUM] " << X << " " << STRING << "\n";
SpectrumBuddy::SpectrumBuddy(long id, PurpleBuddy *buddy) : AbstractBuddy(id), m_buddy(buddy) {
SpectrumBuddy::SpectrumBuddy(RosterManager *rosterManager, long id, PurpleBuddy *buddy) : AbstractBuddy(rosterManager, id), m_buddy(buddy) {
}
SpectrumBuddy::~SpectrumBuddy() {

View file

@ -27,13 +27,14 @@
#include "glib.h"
#include <algorithm>
#include "transport/abstractbuddy.h"
#include "transport/rostermanager.h"
using namespace Transport;
// Wrapper for PurpleBuddy
class SpectrumBuddy : public AbstractBuddy {
public:
SpectrumBuddy(long id, PurpleBuddy *buddy);
SpectrumBuddy(RosterManager *rosterManager, long id, PurpleBuddy *buddy);
virtual ~SpectrumBuddy();
std::string getAlias();

View file

@ -19,13 +19,23 @@
*/
#include "transport/abstractbuddy.h"
#include "transport/rostermanager.h"
#include "transport/user.h"
#include "transport/transport.h"
namespace Transport {
AbstractBuddy::AbstractBuddy(long id) : m_id(id), m_online(false), m_subscription("ask"), m_flags(BUDDY_NO_FLAG) {
AbstractBuddy::AbstractBuddy(RosterManager *rosterManager, long id) : m_id(id), m_online(false), m_subscription("ask"), m_flags(BUDDY_NO_FLAG), m_rosterManager(rosterManager){
m_rosterManager->setBuddy(this);
}
AbstractBuddy::~AbstractBuddy() {
m_rosterManager->unsetBuddy(this);
}
void AbstractBuddy::generateJID() {
m_jid = Swift::JID();
m_jid = Swift::JID(getSafeName(), m_rosterManager->getUser()->getComponent()->getJID().toString(), "bot");
}
void AbstractBuddy::setID(long id) {
@ -38,14 +48,19 @@ long AbstractBuddy::getID() {
void AbstractBuddy::setFlags(BuddyFlag flags) {
m_flags = flags;
generateJID();
}
BuddyFlag AbstractBuddy::getFlags() {
return m_flags;
}
Swift::JID AbstractBuddy::getJID(const std::string &hostname) {
return Swift::JID(getSafeName(), hostname, "bot");
const Swift::JID &AbstractBuddy::getJID(const std::string &hostname) {
if (!m_jid.isValid()) {
generateJID();
}
return m_jid;
}
void AbstractBuddy::setOnline() {
@ -111,19 +126,22 @@ Swift::Presence::ref AbstractBuddy::generatePresenceStanza(int features, bool on
}
std::string AbstractBuddy::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 = JID::escapeNode(name);
name = Swift::JID::getEscapedNode(name);
}
else {
if (name.find_last_of("@") != std::string::npos) {
name.replace(name.find_last_of("@"), 1, "%");
}
}
if (name.empty()) {
// if (name.empty()) {
// Log("SpectrumBuddy::getSafeName", "Name is EMPTY! Previous was " << getName() << ".");
}
// }
return name;
}

View file

@ -29,21 +29,31 @@ namespace Transport {
RosterManager::RosterManager(User *user, Component *component){
m_user = user;
m_component = component;
m_setBuddyTimer = m_component->getFactories()->getTimerFactory()->createTimer(10);
}
RosterManager::~RosterManager() {
}
void RosterManager::setBuddy(AbstractBuddy *buddy) {
m_setBuddyTimer->onTick.connect(boost::bind(&RosterManager::setBuddyCallback, this, buddy));
m_setBuddyTimer->start();
}
void RosterManager::setBuddyCallback(AbstractBuddy *buddy) {
m_setBuddyTimer->onTick.disconnect(boost::bind(&RosterManager::setBuddyCallback, this, buddy));
m_buddies[buddy->getSafeName()] = buddy;
buddy->setRosterManager(this);
onBuddySet(buddy);
if (m_setBuddyTimer->onTick.empty()) {
m_setBuddyTimer->stop();
}
}
void RosterManager::unsetBuddy(AbstractBuddy *buddy) {
m_buddies.erase(buddy->getSafeName());
onBuddyUnset(buddy);
buddy->setRosterManager(NULL);
}
}