Files
@ 285502c6ef00
Branch filter:
Location: libtransport.git/include/transport/usermanager.h
285502c6ef00
4.6 KiB
text/plain
Merge branch 'master' of https://github.com/hanzz/libtransport
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 | /**
* 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
#include <string>
#include <map>
#include "Swiften/Swiften.h"
#include "transport/userregistry.h"
namespace Transport {
class User;
class Component;
class StorageBackend;
class StorageResponder;
class RosterResponder;
/// 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.
/// 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
*/
class UserManager : public Swift::EntityCapsProvider {
public:
/// Creates new UserManager.
/// \param component Component which's presence will be handled
/// \param storageBackend Storage backend used to fetch UserInfos
UserManager(Component *component, UserRegistry *userRegistry, StorageBackend *storageBackend = NULL);
/// Destroys UserManager.
~UserManager();
/// 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);
/// Returns map with all connected users.
/// \return All connected users.
const std::map<std::string, User *> &getUsers() {
return m_users;
}
/// Returns number of online users.
/// \return number of online users
int getUserCount();
/// Removes user. This function disconnects user and safely removes
/// User class. This does *not* remove user from StorageBackend.
/// \param user User class to remove
void removeUser(User *user, bool onUserBehalf = true);
void removeAllUsers(bool onUserBehalf = true);
Swift::DiscoInfo::ref getCaps(const Swift::JID&) const;
/// Called when new User class is created.
/// \param user newly created User class
boost::signal<void (User *user)> onUserCreated;
/// Called when User class is going to be removed
/// \param user removed User class
boost::signal<void (User *user)> onUserDestroyed;
/// Returns true if user is connected.
/// \return True if user is connected.
bool isUserConnected(const std::string &barejid) const {
return m_users.find(barejid) != m_users.end();
}
/// Returns pointer to UserRegistry.
/// \return Pointer to UserRegistry.
UserRegistry *getUserRegistry() {
return m_userRegistry;
}
Component *getComponent() {
return m_component;
}
/// Connects user manually.
/// \param user JID of user.
void connectUser(const Swift::JID &user);
/// Disconnects user manually.
/// \param user JID of user.
void disconnectUser(const Swift::JID &user);
private:
void handlePresence(Swift::Presence::ref presence);
void handleMessageReceived(Swift::Message::ref message);
void handleGeneralPresenceReceived(Swift::Presence::ref presence);
void handleProbePresence(Swift::Presence::ref presence);
void handleSubscription(Swift::Presence::ref presence);
void handleRemoveTimeout(const std::string jid, User *user, bool reconnect);
void handleDiscoInfo(const Swift::JID& jid, boost::shared_ptr<Swift::DiscoInfo> info);
void addUser(User *user);
long m_onlineBuddies;
User *m_cachedUser;
std::map<std::string, User *> m_users;
Component *m_component;
StorageBackend *m_storageBackend;
StorageResponder *m_storageResponder;
UserRegistry *m_userRegistry;
Swift::Timer::ref m_removeTimer;
friend class RosterResponder;
};
}
|