diff --git a/spectrum/src/main.cpp b/spectrum/src/main.cpp index 21f6a1c4..68389e80 100644 --- a/spectrum/src/main.cpp +++ b/spectrum/src/main.cpp @@ -47,12 +47,6 @@ Component *component_ = NULL; UserManager *userManager_ = NULL; Config *config_ = NULL; -void stop() { - userManager_->removeAllUsers(false); - component_->stop(); - eventLoop_->stop(); -} - static void stop_spectrum() { userManager_->removeAllUsers(false); component_->stop(); @@ -67,6 +61,16 @@ static void spectrum_sigterm_handler(int sig) { eventLoop_->postEvent(&stop_spectrum); } +#ifdef WIN32 +BOOL spectrum_control_handler( DWORD fdwCtrlType ) { + if (fdwCtrlType == CTRL_C_EVENT || fdwCtrlType == CTRL_CLOSE_EVENT) { + eventLoop_->postEvent(&stop_spectrum); + return TRUE; + } + return FALSE; +} +#endif + static void removeOldIcons(std::string iconDir) { std::vector dirs; dirs.push_back(iconDir); @@ -126,7 +130,6 @@ static void daemonize(const char *cwd, const char *lock_file) { exit(1); } } - #endif int mainloop() { @@ -291,6 +294,12 @@ int main(int argc, char **argv) std::cout << "SIGTERM handler can't be set\n"; return -1; } +#else + if( !SetConsoleCtrlHandler( (PHANDLER_ROUTINE) spectrum_control_handler, TRUE ) ) + { + std::cout << "control handler can't be set\n"; + return -1; + } #endif boost::program_options::options_description desc(std::string("Spectrum version: ") + SPECTRUM_VERSION + "\nUsage: spectrum [OPTIONS] \nAllowed options"); desc.add_options() diff --git a/spectrum/src/win32/ServiceWrapper.cpp b/spectrum/src/win32/ServiceWrapper.cpp index ad8c6a1a..fc5df08b 100644 --- a/spectrum/src/win32/ServiceWrapper.cpp +++ b/spectrum/src/win32/ServiceWrapper.cpp @@ -87,7 +87,7 @@ void WINAPI ServiceControlHandler(DWORD controlCode) { break; } SetServiceStatus(ServiceStatusHandle, &ServiceStatus); - stop(); + spectrum_control_handler(CTRL_CLOSE_EVENT); } void WINAPI ServiceMain(DWORD argc, LPSTR *argv) { diff --git a/spectrum/src/win32/ServiceWrapper.h b/spectrum/src/win32/ServiceWrapper.h index 9ee2fb0d..aa6bce41 100644 --- a/spectrum/src/win32/ServiceWrapper.h +++ b/spectrum/src/win32/ServiceWrapper.h @@ -15,5 +15,5 @@ public: }; int mainloop(); -void stop(); +BOOL spectrum_control_handler( DWORD fdwCtrlType ); diff --git a/src/sqlite3backend.cpp b/src/sqlite3backend.cpp index 1edc028e..c3ce5d31 100644 --- a/src/sqlite3backend.cpp +++ b/src/sqlite3backend.cpp @@ -283,11 +283,12 @@ bool SQLite3Backend::getOnlineUsers(std::vector &users) { long SQLite3Backend::addBuddy(long userId, const BuddyInfo &buddyInfo) { // "INSERT INTO " + m_prefix + "buddies (user_id, uin, subscription, groups, nickname, flags) VALUES (?, ?, ?, ?, ?, ?)" + std::string groups = StorageBackend::serializeGroups(buddyInfo.groups); BEGIN(m_addBuddy); BIND_INT(m_addBuddy, userId); BIND_STR(m_addBuddy, buddyInfo.legacyName); BIND_STR(m_addBuddy, buddyInfo.subscription); - BIND_STR(m_addBuddy, StorageBackend::serializeGroups(buddyInfo.groups)); + BIND_STR(m_addBuddy, groups); BIND_STR(m_addBuddy, buddyInfo.alias); BIND_INT(m_addBuddy, buddyInfo.flags); @@ -312,8 +313,9 @@ long SQLite3Backend::addBuddy(long userId, const BuddyInfo &buddyInfo) { void SQLite3Backend::updateBuddy(long userId, const BuddyInfo &buddyInfo) { // UPDATE " + m_prefix + "buddies SET groups=?, nickname=?, flags=?, subscription=? WHERE user_id=? AND uin=? + std::string groups = StorageBackend::serializeGroups(buddyInfo.groups); BEGIN(m_updateBuddy); - BIND_STR(m_updateBuddy, StorageBackend::serializeGroups(buddyInfo.groups)); + BIND_STR(m_updateBuddy, groups); BIND_STR(m_updateBuddy, buddyInfo.alias); BIND_INT(m_updateBuddy, buddyInfo.flags); BIND_STR(m_updateBuddy, buddyInfo.subscription); diff --git a/src/tests/util.cpp b/src/tests/util.cpp index c091f2ec..c590e81a 100644 --- a/src/tests/util.cpp +++ b/src/tests/util.cpp @@ -26,6 +26,7 @@ using namespace Transport; class UtilTest : public CPPUNIT_NS :: TestFixture{ CPPUNIT_TEST_SUITE(UtilTest); CPPUNIT_TEST(encryptDecryptPassword); + CPPUNIT_TEST(serializeGroups); CPPUNIT_TEST_SUITE_END(); public: @@ -41,6 +42,27 @@ class UtilTest : public CPPUNIT_NS :: TestFixture{ CPPUNIT_ASSERT_EQUAL(std::string("password"), StorageBackend::decryptPassword(encrypted, "key")); } + void serializeGroups() { + std::vector groups; + std::string g = ""; + + CPPUNIT_ASSERT_EQUAL(g, StorageBackend::serializeGroups(groups)); + CPPUNIT_ASSERT_EQUAL(0, (int) StorageBackend::deserializeGroups(g).size()); + + groups.push_back("Buddies"); + g = "Buddies"; + CPPUNIT_ASSERT_EQUAL(g, StorageBackend::serializeGroups(groups)); + CPPUNIT_ASSERT_EQUAL(1, (int) StorageBackend::deserializeGroups(g).size()); + CPPUNIT_ASSERT_EQUAL(g, StorageBackend::deserializeGroups(g)[0]); + + groups.push_back("Buddies2"); + g = "Buddies\nBuddies2"; + CPPUNIT_ASSERT_EQUAL(g, StorageBackend::serializeGroups(groups)); + CPPUNIT_ASSERT_EQUAL(2, (int) StorageBackend::deserializeGroups(g).size()); + CPPUNIT_ASSERT_EQUAL(std::string("Buddies"), StorageBackend::deserializeGroups(g)[0]); + CPPUNIT_ASSERT_EQUAL(std::string("Buddies2"), StorageBackend::deserializeGroups(g)[1]); + } + }; CPPUNIT_TEST_SUITE_REGISTRATION (UtilTest);