/usr/include/gloox/simanager.h is in libgloox-dev 1.0.9-2.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
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 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 | /*
Copyright (c) 2007-2013 by Jakob Schroeter <js@camaya.net>
This file is part of the gloox library. http://camaya.net/gloox
This software is distributed under a license. The full license
agreement can be found in the file LICENSE in this distribution.
This software may not be copied, modified, sold or distributed
other than expressed in the named license agreement.
This software is distributed without any warranty.
*/
#ifndef SIMANAGER_H__
#define SIMANAGER_H__
#include "iqhandler.h"
namespace gloox
{
class ClientBase;
class SIProfileHandler;
class SIHandler;
/**
* @brief This class manages streams initiated using @xep{0095}.
*
* You need only one SIManager object per ClientBase instance.
*
* @author Jakob Schroeter <js@camaya.net>
* @since 0.9
*/
class GLOOX_API SIManager : public IqHandler
{
public:
/**
* SI error conditions.
*/
enum SIError
{
NoValidStreams, /**< None of the stream types are acceptable */
BadProfile, /**< Profile is not understood. */
RequestRejected /**< SI request was rejected. */
};
class SI : public StanzaExtension
{
public:
/**
* Constructs a new SI object from the given Tag.
* @param tag The Tag to parse.
*/
SI( const Tag* tag = 0 );
/**
* Constructs a new SI object, wrapping the given Tags.
* @param tag1 Tag 1.
* @param tag2 Tag 2.
*/
SI( Tag* tag1, Tag* tag2, const std::string& id = EmptyString,
const std::string& mimetype = EmptyString,
const std::string& profile = EmptyString );
/**
* Virtual destructor.
*/
virtual ~SI();
/**
* Returns the current profile namespace.
* @return The profile namespace.
*/
const std::string& profile() const { return m_profile; };
/**
* Returns the mime-type.
* @return The mime-type.
*/
const std::string& mimetype() const { return m_mimetype; };
/**
* Returns the SI's ID.
* @return The SI's id.
*/
const std::string& id() const { return m_id; };
/**
* Returns the first SI child tag.
* @return The first SI child tag.
* @todo Use real objects.
*/
const Tag* tag1() const { return m_tag1; };
/**
* Returns the second SI child tag.
* @return The second SI child tag.
* @todo Use real objects.
*/
const Tag* tag2() const { return m_tag2; };
// reimplemented from StanzaExtension
virtual const std::string& filterString() const;
// reimplemented from StanzaExtension
virtual StanzaExtension* newInstance( const Tag* tag ) const
{
return new SI( tag );
}
// reimplemented from StanzaExtension
virtual Tag* tag() const;
// reimplemented from StanzaExtension
virtual StanzaExtension* clone() const
{
SI* s = new SI();
s->m_tag1 = m_tag1 ? m_tag1->clone() : 0;
s->m_tag2 = m_tag2 ? m_tag2->clone() : 0;
s->m_id = m_id;
s->m_mimetype = m_mimetype;
s->m_profile = m_profile;
return s;
}
private:
Tag* m_tag1;
Tag* m_tag2;
std::string m_id;
std::string m_mimetype;
std::string m_profile;
};
/**
* Constructor.
* @param parent The ClientBase to use for communication.
* @param advertise Whether to advertise SI capabilities by disco. Defaults to true.
*/
SIManager( ClientBase* parent, bool advertise = true );
/**
* Virtual destructor.
*/
virtual ~SIManager();
/**
* Starts negotiating a stream with a remote entity.
* @param sih The SIHandler to handle the result of this request.
* @param to The entity to talk to.
* @param profile The SI profile to use. See @xep{0095} for more info.
* @param child1 The first of the two allowed children of the SI offer. See
* @xep{0095} for more info.
* @param child2 The second of the two allowed children of the SI offer. See
* @xep{0095} for more info. Defaults to 0.
* @param mimetype The stream's/file's mime-type. Defaults to 'binary/octet-stream'.
* @param from An optional 'from' address to stamp outgoing requests with.
* Used in component scenario only. Defaults to empty JID.
* @param sid Optionally specify a stream ID (SID). If empty, one will be generated.
* @return The requested stream's ID (SID). Empty if SIHandler or ClientBase are invalid.
* @note The SIManager claims ownership of the Tags supplied to this function, and will
* delete them after use.
*/
const std::string requestSI( SIHandler* sih, const JID& to, const std::string& profile, Tag* child1,
Tag* child2 = 0, const std::string& mimetype = "binary/octet-stream",
const JID& from = JID(), const std::string& sid = EmptyString );
/**
* Call this function to accept an SI request previously announced by means of
* SIProfileHandler::handleSIRequest().
* @param to The requestor.
* @param id The request's id, as passed to SIProfileHandler::handleSIRequest().
* @param child1 The <feature/> child of the SI request. See @xep{0095} for details.
* @param child2 The profile-specific child of the SI request. May be 0. See @xep{0095}
* for details.
* @param from An optional 'from' address to stamp outgoing stanzas with.
* Used in component scenario only. Defaults to empty JID.
* @note The SIManager claims ownership of the Tags supplied to this function, and will
* delete them after use.
*/
void acceptSI( const JID& to, const std::string& id, Tag* child1, Tag* child2 = 0, const JID& from = JID() );
/**
* Call this function to decline an SI request previously announced by means of
* SIProfileHandler::handleSIRequest().
* @param to The requestor.
* @param id The request's id, as passed to SIProfileHandler::handleSIRequest().
* @param reason The reason for the reject.
* @param text An optional human-readable text explaining the decline.
*/
void declineSI( const JID& to, const std::string& id, SIError reason,
const std::string& text = EmptyString );
/**
* Registers the given SIProfileHandler to handle requests for the
* given SI profile namespace. The profile will be advertised by disco (unless disabled in
* the ctor).
* @param profile The complete profile namespace, e.g.
* http://jabber.org/protocol/si/profile/file-transfer.
* @param sih The profile handler.
*/
void registerProfile( const std::string& profile, SIProfileHandler* sih );
/**
* Un-registers the given profile.
* @param profile The profile's namespace to un-register.
*/
void removeProfile( const std::string& profile );
// reimplemented from IqHandler.
virtual bool handleIq( const IQ& iq );
// reimplemented from IqHandler.
virtual void handleIqID( const IQ& iq, int context );
private:
#ifdef SIMANAGER_TEST
public:
#endif
enum TrackContext
{
OfferSI
};
struct TrackStruct
{
std::string sid;
std::string profile;
SIHandler* sih;
};
typedef std::map<std::string, TrackStruct> TrackMap;
TrackMap m_track;
ClientBase* m_parent;
typedef std::map<std::string, SIProfileHandler*> HandlerMap;
HandlerMap m_handlers;
bool m_advertise;
};
}
#endif // SIMANAGER_H__
|