From 132dfb379d421db7ec01567a0c3068aa2b21725b Mon Sep 17 00:00:00 2001 From: Jan Kaluza Date: Thu, 24 Mar 2011 11:42:31 +0100 Subject: [PATCH] JID Escaping and preparation for RIE --- include/transport/abstractbuddy.h | 11 +++++------ include/transport/rostermanager.h | 3 +++ include/transport/user.h | 3 +++ spectrum/src/main.cpp | 5 +---- spectrum/src/spectrumbuddy.cpp | 2 +- spectrum/src/spectrumbuddy.h | 3 ++- src/abstractbuddy.cpp | 30 ++++++++++++++++++++++++------ src/rostermanager.cpp | 14 ++++++++++++-- 8 files changed, 51 insertions(+), 20 deletions(-) diff --git a/include/transport/abstractbuddy.h b/include/transport/abstractbuddy.h index c5db5e04..9f051e5b 100644 --- a/include/transport/abstractbuddy.h +++ b/include/transport/abstractbuddy.h @@ -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; }; diff --git a/include/transport/rostermanager.h b/include/transport/rostermanager.h index 7965152f..d8d099be 100644 --- a/include/transport/rostermanager.h +++ b/include/transport/rostermanager.h @@ -67,9 +67,12 @@ class RosterManager { boost::signal onBuddyUnset; private: + void setBuddyCallback(AbstractBuddy *buddy); + std::map m_buddies; Component *m_component; User *m_user; + Swift::Timer::ref m_setBuddyTimer; }; } diff --git a/include/transport/user.h b/include/transport/user.h index bae37871..2df8525f 100644 --- a/include/transport/user.h +++ b/include/transport/user.h @@ -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; } diff --git a/spectrum/src/main.cpp b/spectrum/src/main.cpp index 8f24b697..1fef2ff0 100644 --- a/spectrum/src/main.cpp +++ b/spectrum/src/main.cpp @@ -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; } } diff --git a/spectrum/src/spectrumbuddy.cpp b/spectrum/src/spectrumbuddy.cpp index f7ee0d78..0caa5811 100644 --- a/spectrum/src/spectrumbuddy.cpp +++ b/spectrum/src/spectrumbuddy.cpp @@ -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() { diff --git a/spectrum/src/spectrumbuddy.h b/spectrum/src/spectrumbuddy.h index bda3f2f0..607c16d8 100644 --- a/spectrum/src/spectrumbuddy.h +++ b/spectrum/src/spectrumbuddy.h @@ -27,13 +27,14 @@ #include "glib.h" #include #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(); diff --git a/src/abstractbuddy.cpp b/src/abstractbuddy.cpp index 11c2e735..49e541c8 100644 --- a/src/abstractbuddy.cpp +++ b/src/abstractbuddy.cpp @@ -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; } diff --git a/src/rostermanager.cpp b/src/rostermanager.cpp index 1faeadde..9a9a8453 100644 --- a/src/rostermanager.cpp +++ b/src/rostermanager.cpp @@ -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); } } \ No newline at end of file