diff --git a/include/transport/usermanager.h b/include/transport/usermanager.h index daea9f9a..839c612f 100644 --- a/include/transport/usermanager.h +++ b/include/transport/usermanager.h @@ -80,6 +80,8 @@ class UserManager { /// \param user User class to remove void removeUser(User *user); + void removeAllUsers(); + /// Called when new User class is created. /// \param user newly created User class boost::signal onUserCreated; diff --git a/spectrum/src/main.cpp b/spectrum/src/main.cpp index 0102256e..b27d6db8 100644 --- a/spectrum/src/main.cpp +++ b/spectrum/src/main.cpp @@ -30,13 +30,21 @@ using namespace Transport; static LoggerPtr logger = log4cxx::Logger::getLogger("Spectrum"); Swift::SimpleEventLoop *eventLoop_ = NULL; +Component *component_ = NULL; +UserManager *userManager_ = NULL; -static void spectrum_sigint_handler(int sig) { +static void stop_spectrum() { + userManager_->removeAllUsers(); + component_->stop(); eventLoop_->stop(); } +static void spectrum_sigint_handler(int sig) { + eventLoop_->postEvent(&stop_spectrum); +} + static void spectrum_sigterm_handler(int sig) { - eventLoop_->stop(); + eventLoop_->postEvent(&stop_spectrum); } #ifndef WIN32 @@ -236,6 +244,7 @@ int main(int argc, char **argv) UserRegistry userRegistry(&config, factories); Component transport(&eventLoop, factories, &config, NULL, &userRegistry); + component_ = &transport; // Logger logger(&transport); StorageBackend *storageBackend = NULL; @@ -260,6 +269,7 @@ int main(int argc, char **argv) #endif UserManager userManager(&transport, &userRegistry, storageBackend); + userManager_ = &userManager; UserRegistration *userRegistration = NULL; if (storageBackend) { userRegistration = new UserRegistration(&transport, &userManager, storageBackend); @@ -275,6 +285,7 @@ int main(int argc, char **argv) eventLoop_ = &eventLoop; eventLoop.run(); + if (userRegistration) { userRegistration->stop(); delete userRegistration; diff --git a/src/transport.cpp b/src/transport.cpp index 765e501d..8d0e0122 100644 --- a/src/transport.cpp +++ b/src/transport.cpp @@ -177,7 +177,8 @@ void Component::start() { void Component::stop() { if (m_component) { m_reconnectCount = 0; - m_component->disconnect(); + // TODO: Call this once swiften will fix assert(!session_); +// m_component->disconnect(); m_reconnectTimer->stop(); } else if (m_server) { diff --git a/src/usermanager.cpp b/src/usermanager.cpp index e8a03712..9e16691f 100644 --- a/src/usermanager.cpp +++ b/src/usermanager.cpp @@ -105,6 +105,12 @@ void UserManager::removeUser(User *user) { // VALGRIND_DO_LEAK_CHECK; } +void UserManager::removeAllUsers() { + while(m_users.begin() != m_users.end()) { + removeUser((*m_users.begin()).second); + } +} + int UserManager::getUserCount() { return m_users.size(); }