2011-03-21 21:29:02 +01:00
|
|
|
/**
|
|
|
|
* XMPP - libpurple transport
|
|
|
|
*
|
|
|
|
* Copyright (C) 2009, Jan Kaluza <hanzz@soc.pidgin.im>
|
|
|
|
*
|
|
|
|
* 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 <algorithm>
|
|
|
|
#include <map>
|
2016-09-12 18:20:58 +02:00
|
|
|
#include <boost/signal.hpp>
|
2011-08-26 11:47:28 +02:00
|
|
|
#include <boost/pool/pool_alloc.hpp>
|
|
|
|
#include <boost/pool/object_pool.hpp>
|
2011-03-21 21:29:02 +01:00
|
|
|
// #include "rosterstorage.h"
|
2013-01-23 11:29:43 +01:00
|
|
|
#include "Swiften/Elements/RosterPayload.h"
|
|
|
|
#include "Swiften/Queries/GenericRequest.h"
|
|
|
|
#include "Swiften/Roster/SetRosterRequest.h"
|
|
|
|
#include "Swiften/Elements/Presence.h"
|
|
|
|
#include "Swiften/Network/Timer.h"
|
2011-03-21 21:29:02 +01:00
|
|
|
|
|
|
|
namespace Transport {
|
|
|
|
|
2011-04-03 11:39:06 +02:00
|
|
|
class Buddy;
|
2011-03-21 21:29:02 +01:00
|
|
|
class User;
|
|
|
|
class Component;
|
2011-04-07 09:53:33 +02:00
|
|
|
class StorageBackend;
|
|
|
|
class RosterStorage;
|
2011-03-21 21:29:02 +01:00
|
|
|
|
|
|
|
/// Manages roster of one XMPP user.
|
|
|
|
class RosterManager {
|
|
|
|
public:
|
2017-02-17 13:36:10 +01:00
|
|
|
typedef std::map<std::string, Buddy *, std::less<std::string>, boost::pool_allocator< std::pair<const std::string, Buddy *> > > BuddiesMap;
|
2011-03-21 21:29:02 +01:00
|
|
|
/// Creates new RosterManager.
|
|
|
|
/// \param user User associated with this RosterManager.
|
|
|
|
/// \param component Transport instance associated with this roster.
|
|
|
|
RosterManager(User *user, Component *component);
|
|
|
|
|
|
|
|
/// Destructor.
|
|
|
|
virtual ~RosterManager();
|
|
|
|
|
2015-11-16 10:49:10 +01:00
|
|
|
virtual void doRemoveBuddy(Buddy *buddy) = 0;
|
|
|
|
virtual void doAddBuddy(Buddy *buddy) = 0;
|
|
|
|
virtual void doUpdateBuddy(Buddy *buddy) = 0;
|
|
|
|
|
2011-03-21 21:29:02 +01:00
|
|
|
/// Associates the buddy with this roster,
|
|
|
|
/// and if the buddy is not already in XMPP user's server-side roster, the proper requests
|
|
|
|
/// are sent to XMPP user (subscribe presences, Roster Item Exchange stanza or
|
|
|
|
/// the buddy is added to server-side roster using remote-roster protoXEP).
|
2011-04-03 11:39:06 +02:00
|
|
|
/// \param buddy Buddy
|
|
|
|
void setBuddy(Buddy *buddy);
|
2011-03-21 21:29:02 +01:00
|
|
|
|
|
|
|
/// Deassociates the buddy with this roster.
|
2011-04-03 11:39:06 +02:00
|
|
|
/// \param buddy Buddy.
|
|
|
|
void unsetBuddy(Buddy *buddy);
|
2011-03-21 21:29:02 +01:00
|
|
|
|
2012-06-14 08:06:46 +02:00
|
|
|
/// Removes buddy from this roster, sends proper XML to XMPP side and deletes it.
|
|
|
|
/// \param name Buddy name.
|
|
|
|
void removeBuddy(const std::string &name);
|
|
|
|
|
2011-04-03 11:39:06 +02:00
|
|
|
Buddy *getBuddy(const std::string &name);
|
2011-04-01 23:54:29 +02:00
|
|
|
|
2011-04-07 09:53:33 +02:00
|
|
|
void setStorageBackend(StorageBackend *storageBackend);
|
|
|
|
|
2011-06-09 13:54:09 +02:00
|
|
|
void storeBuddy(Buddy *buddy);
|
|
|
|
|
2011-05-31 16:01:17 +02:00
|
|
|
Swift::RosterPayload::ref generateRosterPayload();
|
|
|
|
|
2011-03-21 21:29:02 +01:00
|
|
|
/// Returns user associated with this roster.
|
|
|
|
/// \return User
|
|
|
|
User *getUser() { return m_user; }
|
|
|
|
|
2011-11-09 12:47:43 +01:00
|
|
|
const BuddiesMap &getBuddies() {
|
|
|
|
return m_buddies;
|
|
|
|
}
|
|
|
|
|
2011-09-08 12:38:45 +02:00
|
|
|
bool isRemoteRosterSupported() {
|
|
|
|
return m_supportRemoteRoster;
|
|
|
|
}
|
|
|
|
|
2011-04-03 11:39:06 +02:00
|
|
|
/// Called when new Buddy is added to this roster.
|
|
|
|
/// \param buddy newly added Buddy
|
|
|
|
boost::signal<void (Buddy *buddy)> onBuddySet;
|
2011-03-21 21:29:02 +01:00
|
|
|
|
2011-04-03 11:39:06 +02:00
|
|
|
/// Called when Buddy has been removed from this roster.
|
|
|
|
/// \param buddy removed Buddy
|
|
|
|
boost::signal<void (Buddy *buddy)> onBuddyUnset;
|
2011-03-21 21:29:02 +01:00
|
|
|
|
2011-06-17 13:43:31 +02:00
|
|
|
boost::signal<void (Buddy *buddy)> onBuddyAdded;
|
|
|
|
|
|
|
|
boost::signal<void (Buddy *buddy)> onBuddyRemoved;
|
|
|
|
|
2011-08-23 08:02:41 +02:00
|
|
|
void handleBuddyChanged(Buddy *buddy);
|
|
|
|
|
2011-04-06 14:05:52 +02:00
|
|
|
void handleSubscription(Swift::Presence::ref presence);
|
|
|
|
|
2012-06-14 08:06:46 +02:00
|
|
|
void sendBuddyRosterRemove(Buddy *buddy);
|
|
|
|
|
2011-07-14 14:21:40 +02:00
|
|
|
void sendBuddySubscribePresence(Buddy *buddy);
|
2012-06-14 08:06:46 +02:00
|
|
|
|
|
|
|
void sendBuddyUnsubscribePresence(Buddy *buddy);
|
2011-07-14 14:21:40 +02:00
|
|
|
|
2011-06-28 21:57:49 +02:00
|
|
|
void sendCurrentPresences(const Swift::JID &to);
|
|
|
|
|
2011-08-05 09:30:24 +02:00
|
|
|
void sendCurrentPresence(const Swift::JID &from, const Swift::JID &to);
|
|
|
|
|
2011-07-12 22:02:02 +02:00
|
|
|
void sendUnavailablePresences(const Swift::JID &to);
|
|
|
|
|
2015-11-16 10:49:10 +01:00
|
|
|
protected:
|
2017-02-17 13:36:10 +01:00
|
|
|
std::map<std::string, Buddy *, std::less<std::string>, boost::pool_allocator< std::pair<const std::string, Buddy *> > > m_buddies;
|
2015-11-16 10:49:10 +01:00
|
|
|
|
|
|
|
private:
|
2011-03-21 21:29:02 +01:00
|
|
|
Component *m_component;
|
2011-04-07 09:53:33 +02:00
|
|
|
RosterStorage *m_rosterStorage;
|
2011-03-21 21:29:02 +01:00
|
|
|
User *m_user;
|
2011-03-24 11:42:31 +01:00
|
|
|
Swift::Timer::ref m_setBuddyTimer;
|
2011-04-04 23:26:05 +02:00
|
|
|
Swift::Timer::ref m_RIETimer;
|
2011-08-31 19:37:58 +02:00
|
|
|
std::list <Swift::SetRosterRequest::ref> m_requests;
|
2011-09-08 12:38:45 +02:00
|
|
|
bool m_supportRemoteRoster;
|
2011-03-21 21:29:02 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
}
|