diff --git a/include/transport/user.h b/include/transport/user.h index fa6f19a1..766dc9f0 100644 --- a/include/transport/user.h +++ b/include/transport/user.h @@ -31,6 +31,7 @@ namespace Transport { class Component; class RosterManager; class ConversationManager; +class UserManager; struct UserInfo; /// Represents online XMPP user. @@ -41,7 +42,7 @@ class User { /// \param userInfo UserInfo struct with informations needed to connect /// this user to legacy network /// \param component Component associated with this user - User(const Swift::JID &jid, UserInfo &userInfo, Component * component); + User(const Swift::JID &jid, UserInfo &userInfo, Component * component, UserManager *userManager); /// Destroyes User. virtual ~User(); @@ -72,7 +73,10 @@ class User { /// \return language const char *getLang() { return "en"; } + void handleDisconnected(const std::string &error); + boost::signal onReadyToConnect; + boost::signal onDisconnected; private: void onConnectingTimeout(); @@ -80,6 +84,7 @@ class User { Swift::JID m_jid; Component *m_component; RosterManager *m_rosterManager; + UserManager *m_userManager; ConversationManager *m_conversationManager; Swift::EntityCapsManager *m_entityCapsManager; Swift::PresenceOracle *m_presenceOracle; diff --git a/spectrum/src/main.cpp b/spectrum/src/main.cpp index 26940e75..4af18c35 100644 --- a/spectrum/src/main.cpp +++ b/spectrum/src/main.cpp @@ -204,6 +204,30 @@ static PurpleConversationUiOps conversation_ui_ops = NULL }; +static void connection_report_disconnect(PurpleConnection *gc, PurpleConnectionError reason, const char *text){ + PurpleAccount *account = purple_connection_get_account(gc); + User *user = (User *) account->ui_data; + + if (!user) + return; + user->handleDisconnected(text); +} + +static PurpleConnectionUiOps conn_ui_ops = +{ + NULL, + NULL, + NULL,//connection_disconnected, + NULL, + NULL, + NULL, + NULL, + connection_report_disconnect, + NULL, + NULL, + NULL +}; + static void transport_core_ui_init(void) { purple_blist_set_ui_ops(&blistUiOps); @@ -211,7 +235,7 @@ static void transport_core_ui_init(void) // purple_notify_set_ui_ops(¬ifyUiOps); // purple_request_set_ui_ops(&requestUiOps); // purple_xfers_set_ui_ops(getXferUiOps()); -// purple_connections_set_ui_ops(&conn_ui_ops); + purple_connections_set_ui_ops(&conn_ui_ops); purple_conversations_set_ui_ops(&conversation_ui_ops); // #ifndef WIN32 // purple_dnsquery_set_ui_ops(getDNSUiOps()); diff --git a/src/user.cpp b/src/user.cpp index 7b29fa82..a8c0d00f 100644 --- a/src/user.cpp +++ b/src/user.cpp @@ -22,17 +22,19 @@ #include "transport/transport.h" #include "transport/storagebackend.h" #include "transport/rostermanager.h" +#include "transport/usermanager.h" #include "transport/conversationmanager.h" #include "Swiften/Swiften.h" namespace Transport { -User::User(const Swift::JID &jid, UserInfo &userInfo, Component *component) { +User::User(const Swift::JID &jid, UserInfo &userInfo, Component *component, UserManager *userManager) { m_jid = jid; m_component = component; m_presenceOracle = component->m_presenceOracle; m_entityCapsManager = component->m_entityCapsManager; + m_userManager = userManager; m_userInfo = userInfo; m_connected = false; m_readyForConnect = false; @@ -45,6 +47,7 @@ User::User(const Swift::JID &jid, UserInfo &userInfo, Component *component) { } User::~User(){ + m_reconnectTimer->stop(); delete m_rosterManager; delete m_conversationManager; } @@ -100,4 +103,9 @@ void User::onConnectingTimeout() { onReadyToConnect(); } +void User::handleDisconnected(const std::string &error) { + onDisconnected(); + m_userManager->removeUser(this); +} + } diff --git a/src/usermanager.cpp b/src/usermanager.cpp index 9511f3df..f4660d4b 100644 --- a/src/usermanager.cpp +++ b/src/usermanager.cpp @@ -102,8 +102,9 @@ void UserManager::handlePresence(Swift::Presence::ref presence) { if (res.uin.find_last_of("%") != std::string::npos) { res.uin.replace(res.uin.find_last_of("%"), 1, "@"); } - m_storageBackend->setUser(res); - registered = m_storageBackend->getUser(userkey, res); +// m_storageBackend->setUser(res); +// registered = m_storageBackend->getUser(userkey, res); + registered = true; } if (!registered) { @@ -120,7 +121,7 @@ void UserManager::handlePresence(Swift::Presence::ref presence) { // // } // // // // - user = new User(presence->getFrom(), res, m_component); + user = new User(presence->getFrom(), res, m_component, this); // TODO: handle features somehow // // user->setFeatures(isVip ? CONFIG().VIPFeatures : CONFIG().transportFeatures); // // // if (c != NULL)