JID Escaping and preparation for RIE
This commit is contained in:
parent
cedb604c60
commit
132dfb379d
8 changed files with 51 additions and 20 deletions
|
@ -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;
|
||||
};
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
||||
}
|
||||
|
|
|
@ -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; }
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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() {
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
Loading…
Add table
Reference in a new issue