Handle non-valid names from legacy network. Wait for instance to stop before stopping another one

This commit is contained in:
HanzZ 2012-08-02 07:47:18 +02:00
parent 47e44a081a
commit 4ea0afca8c
6 changed files with 45 additions and 6 deletions

View file

@ -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;

View file

@ -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;

View file

@ -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";

View file

@ -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;

View file

@ -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);

View file

@ -303,7 +303,9 @@ void RosterManager::handleRemoteRosterResponse(boost::shared_ptr<Swift::RosterPa
buddyInfo.groups = item.getGroups();
Buddy *buddy = m_component->getFactory()->createBuddy(this, buddyInfo);
setBuddy(buddy);
if (buddy) {
setBuddy(buddy);
}
}
}