diff --git a/include/transport/buddy.h b/include/transport/buddy.h index 929ba337..ea1a4090 100644 --- a/include/transport/buddy.h +++ b/include/transport/buddy.h @@ -167,9 +167,10 @@ class Buddy { static std::string JIDToLegacyName(const Swift::JID &jid); static BuddyFlag buddFlagsFromJID(const Swift::JID &jid); - private: + protected: void generateJID(); + private: long m_id; // Swift::Presence::ref m_lastPresence; Swift::JID m_jid; diff --git a/include/transport/localbuddy.h b/include/transport/localbuddy.h index 492a3c70..aca073aa 100644 --- a/include/transport/localbuddy.h +++ b/include/transport/localbuddy.h @@ -37,7 +37,7 @@ class LocalBuddy : public Buddy { void setAlias(const std::string &alias); std::string getName() { return m_name; } - void setName(const std::string &name) { m_name = name; } + bool setName(const std::string &name); bool getStatus(Swift::StatusShow &status, std::string &statusMessage) { status = m_status; diff --git a/spectrum_manager/src/main.cpp b/spectrum_manager/src/main.cpp index 75ba57af..07618793 100644 --- a/spectrum_manager/src/main.cpp +++ b/spectrum_manager/src/main.cpp @@ -222,8 +222,22 @@ static void stop_instances(ManagerConfig *config, const std::string &_jid = "") int pid = isRunning(CONFIG_STRING(&vhostCfg, "service.pidfile")); if (pid) { - std::cout << "Stopping " << itr->path() << ": OK\n"; + std::cout << "Stopping " << itr->path() << ": "; kill(pid, SIGTERM); + + sleep(1); + int count = 20; + while (kill(pid, 0) == 0 && count != 0) { + std::cout << "."; + sleep(1); + count--; + } + if (count == 0) { + std::cout << " ERROR (timeout)\n"; + } + else { + std::cout << " OK\n"; + } } else { std::cout << "Stopping " << itr->path() << ": Not running\n"; diff --git a/src/localbuddy.cpp b/src/localbuddy.cpp index 6d8d7530..8e19f7fb 100644 --- a/src/localbuddy.cpp +++ b/src/localbuddy.cpp @@ -31,6 +31,22 @@ LocalBuddy::LocalBuddy(RosterManager *rosterManager, long id) : Buddy(rosterMana LocalBuddy::~LocalBuddy() { } +bool LocalBuddy::setName(const std::string &name) { + if (name == m_name) { + return true; + } + std::string oldName = name; + m_name = name; + try { + generateJID(); + return true; + } catch (...) { + m_name = oldName; + return false; + } + +} + void LocalBuddy::setAlias(const std::string &alias) { // if (m_firstSet) { // m_firstSet = false; diff --git a/src/networkpluginserver.cpp b/src/networkpluginserver.cpp index 709eab00..c2b7c1ee 100644 --- a/src/networkpluginserver.cpp +++ b/src/networkpluginserver.cpp @@ -95,7 +95,10 @@ class NetworkFactory : public Factory { Buddy *createBuddy(RosterManager *rosterManager, const BuddyInfo &buddyInfo) { LocalBuddy *buddy = new LocalBuddy(rosterManager, buddyInfo.id); buddy->setAlias(buddyInfo.alias); - buddy->setName(buddyInfo.legacyName); + if (!buddy->setName(buddyInfo.legacyName)) { + delete buddy; + return NULL; + } if (buddyInfo.subscription == "both") { buddy->setSubscription(Buddy::Both); } @@ -203,7 +206,6 @@ static void SigCatcher(int n) { #endif static void handleBuddyPayload(LocalBuddy *buddy, const pbnetwork::Buddy &payload) { - buddy->setName(payload.buddyname()); // Set alias only if it's not empty. Backends are allowed to send empty alias if it has // not changed. if (!payload.alias().empty()) { @@ -503,6 +505,10 @@ void NetworkPluginServer::handleBuddyChangedPayload(const std::string &data) { } else { buddy = new LocalBuddy(user->getRosterManager(), -1); + if (!buddy->setName(payload.buddyname())) { + delete buddy; + return; + } buddy->setFlags(BUDDY_JID_ESCAPING); handleBuddyPayload(buddy, payload); user->getRosterManager()->setBuddy(buddy); diff --git a/src/rostermanager.cpp b/src/rostermanager.cpp index 3d7534ab..c965c621 100644 --- a/src/rostermanager.cpp +++ b/src/rostermanager.cpp @@ -303,7 +303,9 @@ void RosterManager::handleRemoteRosterResponse(boost::shared_ptrgetFactory()->createBuddy(this, buddyInfo); - setBuddy(buddy); + if (buddy) { + setBuddy(buddy); + } } }