2011-02-13 18:51:43 +01:00
|
|
|
/**
|
|
|
|
* libtransport -- C++ library for easy XMPP Transports development
|
|
|
|
*
|
|
|
|
* Copyright (C) 2011, Jan Kaluza <hanzz.k@gmail.com>
|
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU General Public License as published by
|
|
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
|
|
* (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with this program; if not, write to the Free Software
|
|
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
|
|
|
|
*/
|
|
|
|
|
|
|
|
#pragma once
|
|
|
|
|
2016-09-12 18:20:58 +02:00
|
|
|
#include <boost/signal.hpp>
|
2011-02-13 18:51:43 +01:00
|
|
|
#include <string>
|
|
|
|
#include <map>
|
2013-01-23 11:29:43 +01:00
|
|
|
#include "Swiften/Elements/Message.h"
|
|
|
|
#include "Swiften/Elements/Presence.h"
|
2015-11-18 14:05:57 +01:00
|
|
|
#include "Swiften/JID/JID.h"
|
2013-01-23 11:29:43 +01:00
|
|
|
#include "Swiften/Disco/EntityCapsProvider.h"
|
|
|
|
#include "Swiften/Elements/DiscoInfo.h"
|
2015-11-16 10:49:10 +01:00
|
|
|
#include "Swiften/Elements/VCard.h"
|
2013-01-23 11:29:43 +01:00
|
|
|
#include "Swiften/Network/Timer.h"
|
2016-09-12 18:20:58 +02:00
|
|
|
#include "Swiften/SwiftenCompat.h"
|
2011-02-13 18:51:43 +01:00
|
|
|
|
|
|
|
namespace Transport {
|
|
|
|
|
|
|
|
class User;
|
|
|
|
class Component;
|
2011-03-17 20:31:00 +01:00
|
|
|
class StorageBackend;
|
2011-05-19 17:53:31 +02:00
|
|
|
class StorageResponder;
|
2011-05-28 16:38:56 +02:00
|
|
|
class RosterResponder;
|
2015-11-16 10:49:10 +01:00
|
|
|
class UserRegistration;
|
2015-11-18 14:05:57 +01:00
|
|
|
class UserRegistry;
|
2011-02-13 18:51:43 +01:00
|
|
|
|
2011-03-17 20:31:00 +01:00
|
|
|
/// Manages online XMPP Users.
|
|
|
|
|
|
|
|
/// This class handles presences and creates User classes when new user connects.
|
|
|
|
/// It also removes the User class once the last user's resource disconnected.
|
2011-08-22 21:41:09 +02:00
|
|
|
|
|
|
|
/// Basic user creation process:
|
|
|
|
/**
|
|
|
|
\msc
|
|
|
|
Component,UserManager,User,StorageBackend,Slot;
|
|
|
|
--- [ label = "Available presence received"];
|
|
|
|
Component->UserManager [label="handlePresence(...)", URL="\ref UserManager::handlePresence()"];
|
|
|
|
UserManager->StorageBackend [label="getUser(...)", URL="\ref StorageBackend::getUser()"];
|
|
|
|
UserManager->User [label="User::User(...)", URL="\ref User"];
|
|
|
|
UserManager->Slot [label="onUserCreated(...)", URL="\ref UserManager::onUserCreated()"];
|
|
|
|
UserManager->User [label="handlePresence(...)", URL="\ref User::handlePresence()"];
|
|
|
|
\endmsc
|
|
|
|
*/
|
2015-11-16 10:49:10 +01:00
|
|
|
class UserManager /*: public Swift::EntityCapsProvider*/ {
|
2011-02-13 18:51:43 +01:00
|
|
|
public:
|
2011-03-17 20:31:00 +01:00
|
|
|
/// Creates new UserManager.
|
|
|
|
/// \param component Component which's presence will be handled
|
|
|
|
/// \param storageBackend Storage backend used to fetch UserInfos
|
2015-11-16 10:49:10 +01:00
|
|
|
UserManager(Component *component, UserRegistry *userRegistry, StorageBackend *storageBackend = NULL);
|
2011-03-17 20:31:00 +01:00
|
|
|
|
|
|
|
/// Destroys UserManager.
|
2015-11-16 10:49:10 +01:00
|
|
|
virtual ~UserManager();
|
|
|
|
|
|
|
|
virtual void sendVCard(unsigned int id, Swift::VCard::ref vcard) = 0;
|
|
|
|
|
|
|
|
virtual UserRegistration *getUserRegistration() = 0;
|
2011-02-13 18:51:43 +01:00
|
|
|
|
2011-03-17 20:31:00 +01:00
|
|
|
/// Returns user according to his bare JID.
|
|
|
|
/// \param barejid bare JID of user
|
|
|
|
/// \return User class associated with this user
|
|
|
|
User *getUser(const std::string &barejid);
|
|
|
|
|
2011-08-22 17:26:57 +02:00
|
|
|
/// Returns map with all connected users.
|
|
|
|
/// \return All connected users.
|
2011-06-29 19:25:57 +02:00
|
|
|
const std::map<std::string, User *> &getUsers() {
|
|
|
|
return m_users;
|
|
|
|
}
|
|
|
|
|
2011-03-17 20:31:00 +01:00
|
|
|
/// Returns number of online users.
|
|
|
|
/// \return number of online users
|
|
|
|
int getUserCount();
|
|
|
|
|
|
|
|
/// Removes user. This function disconnects user and safely removes
|
2011-08-23 14:18:22 +02:00
|
|
|
/// User class. This does *not* remove user from StorageBackend.
|
2011-03-17 20:31:00 +01:00
|
|
|
/// \param user User class to remove
|
2011-12-07 10:30:39 +01:00
|
|
|
void removeUser(User *user, bool onUserBehalf = true);
|
2011-02-13 18:51:43 +01:00
|
|
|
|
2011-12-07 10:30:39 +01:00
|
|
|
void removeAllUsers(bool onUserBehalf = true);
|
2011-09-09 11:51:25 +02:00
|
|
|
|
2015-11-16 10:49:10 +01:00
|
|
|
// Swift::DiscoInfo::ref getCaps(const Swift::JID&) const;
|
2012-10-18 09:04:20 +02:00
|
|
|
|
2011-03-17 20:31:00 +01:00
|
|
|
/// Called when new User class is created.
|
|
|
|
/// \param user newly created User class
|
|
|
|
boost::signal<void (User *user)> onUserCreated;
|
2011-02-13 18:51:43 +01:00
|
|
|
|
2011-03-17 20:31:00 +01:00
|
|
|
/// Called when User class is going to be removed
|
|
|
|
/// \param user removed User class
|
|
|
|
boost::signal<void (User *user)> onUserDestroyed;
|
2011-02-13 18:51:43 +01:00
|
|
|
|
2011-08-23 14:18:22 +02:00
|
|
|
/// Returns true if user is connected.
|
|
|
|
/// \return True if user is connected.
|
2011-06-28 15:18:25 +02:00
|
|
|
bool isUserConnected(const std::string &barejid) const {
|
|
|
|
return m_users.find(barejid) != m_users.end();
|
|
|
|
}
|
|
|
|
|
2011-08-23 14:18:22 +02:00
|
|
|
/// Returns pointer to UserRegistry.
|
|
|
|
/// \return Pointer to UserRegistry.
|
2011-07-17 04:26:55 +02:00
|
|
|
UserRegistry *getUserRegistry() {
|
|
|
|
return m_userRegistry;
|
2012-02-26 14:03:48 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
Component *getComponent() {
|
|
|
|
return m_component;
|
2011-07-17 04:26:55 +02:00
|
|
|
}
|
|
|
|
|
2011-08-23 14:18:22 +02:00
|
|
|
/// Connects user manually.
|
|
|
|
/// \param user JID of user.
|
2011-06-28 21:57:49 +02:00
|
|
|
void connectUser(const Swift::JID &user);
|
2011-08-23 14:18:22 +02:00
|
|
|
|
|
|
|
/// Disconnects user manually.
|
|
|
|
/// \param user JID of user.
|
2011-08-18 13:37:43 +02:00
|
|
|
void disconnectUser(const Swift::JID &user);
|
2011-06-28 15:18:25 +02:00
|
|
|
|
2012-03-09 17:55:57 +01:00
|
|
|
void messageToXMPPSent() { m_sentToXMPP++; }
|
|
|
|
void messageToBackendSent() { m_sentToBackend++; }
|
|
|
|
|
|
|
|
unsigned long getMessagesToXMPP() { return m_sentToXMPP; }
|
|
|
|
unsigned long getMessagesToBackend() { return m_sentToBackend; }
|
|
|
|
|
|
|
|
|
2011-02-13 18:51:43 +01:00
|
|
|
private:
|
|
|
|
void handlePresence(Swift::Presence::ref presence);
|
2011-04-02 21:51:51 +02:00
|
|
|
void handleMessageReceived(Swift::Message::ref message);
|
2011-04-06 14:05:52 +02:00
|
|
|
void handleGeneralPresenceReceived(Swift::Presence::ref presence);
|
|
|
|
void handleProbePresence(Swift::Presence::ref presence);
|
2012-11-02 09:50:03 +01:00
|
|
|
void handleErrorPresence(Swift::Presence::ref presence);
|
2011-04-06 14:05:52 +02:00
|
|
|
void handleSubscription(Swift::Presence::ref presence);
|
2013-01-25 08:05:46 +01:00
|
|
|
void handleMUCPresence(Swift::Presence::ref presence);
|
2011-08-18 13:37:43 +02:00
|
|
|
void handleRemoveTimeout(const std::string jid, User *user, bool reconnect);
|
2016-09-12 18:20:58 +02:00
|
|
|
void handleDiscoInfo(const Swift::JID& jid, SWIFTEN_SHRPTR_NAMESPACE::shared_ptr<Swift::DiscoInfo> info);
|
2011-03-17 20:31:00 +01:00
|
|
|
void addUser(User *user);
|
2011-02-13 18:51:43 +01:00
|
|
|
|
|
|
|
long m_onlineBuddies;
|
|
|
|
User *m_cachedUser;
|
|
|
|
std::map<std::string, User *> m_users;
|
2011-03-17 20:31:00 +01:00
|
|
|
Component *m_component;
|
|
|
|
StorageBackend *m_storageBackend;
|
2011-05-19 17:53:31 +02:00
|
|
|
StorageResponder *m_storageResponder;
|
2011-06-28 15:18:25 +02:00
|
|
|
UserRegistry *m_userRegistry;
|
2011-07-20 03:02:50 +02:00
|
|
|
Swift::Timer::ref m_removeTimer;
|
2012-03-09 17:55:57 +01:00
|
|
|
unsigned long m_sentToXMPP;
|
|
|
|
unsigned long m_sentToBackend;
|
2011-05-31 16:01:17 +02:00
|
|
|
friend class RosterResponder;
|
2011-02-13 18:51:43 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
}
|