summaryrefslogtreecommitdiff
path: root/indra/llinventory/lluserrelations.h
blob: 036f039105c76a1b80c96154d42b50f82055a58a (plain)
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
/** 
 * @file lluserrelations.h
 * @author Phoenix
 * @date 2006-10-12
 * @brief Declaration of a class for handling granted rights.
 *
 * Copyright (c) 2006-$CurrentYear$, Linden Research, Inc.
 * $License$
 */

#ifndef LL_LLUSERRELAIONS_H
#define LL_LLUSERRELAIONS_H

#include <map>
#include "lluuid.h"

/** 
 * @class LLRelationship
 *
 * This class represents a relationship between two agents, where the
 * related agent is stored and the other agent is the relationship is
 * implicit by container ownership.
 * This is merely a cache of this information used by the sim 
 * and viewer.
 *
 * You are expected to use this in a map or similar structure, eg:
 * typedef std::map<LLUUID, LLRelationship> agent_relationship_map;
 */
class LLRelationship
{
public:
	/**
	 * @brief Constructors.
	 */
	LLRelationship();
	LLRelationship(S32 grant_to, S32 grant_from, bool is_online);
	
	static const LLRelationship DEFAULT_RELATIONSHIP;

    /** 
	 * @name Status functionality
	 *
	 * I thought it would be keen to have a generic status interface,
	 * but the only thing we currently cache is online status. As this
	 * assumption changes, this API may evolve.
	 */
	//@{
	/**
	 * @brief Does this instance believe the related agent is currently
	 * online or available.
	 *
	 * NOTE: This API may be deprecated if there is any transient status
	 * other than online status, for example, away/busy/etc.
	 *
	 * This call does not check any kind of central store or make any
	 * deep information calls - it simply checks a cache of online
	 * status.
	 * @return Returns true if this relationship believes the agent is
	 * online.
	 */
	bool isOnline() const;

	/**
	 * @brief Set the online status.
	 *
	 * NOTE: This API may be deprecated if there is any transient status
	 * other than online status.
	 * @param is_online Se the online status
	 */
	void online(bool is_online);
	//@}

	/* @name Granted rights
	 */
	//@{
	/** 
	 * @brief Anonymous enumeration for specifying rights.
	 */
	enum
	{
		GRANT_NONE = 0x0,
		GRANT_ONLINE_STATUS = 0x1,
		GRANT_MAP_LOCATION = 0x2,
		GRANT_MODIFY_OBJECTS = 0x4,
	};

	/**
	 * ???
	 */
	static const U8 GRANTED_VISIBLE_MASK;

	/**
	 * @brief Check for a set of rights granted to agent.
	 *
	 * @param rights A bitfield to check for rights.
	 * @return Returns true if all rights have been granted.
	 */
	bool isRightGrantedTo(S32 rights) const;

	/**
	 * @brief Check for a set of rights granted from an agent.
	 *
	 * @param rights A bitfield to check for rights.
	 * @return Returns true if all rights have been granted.
	 */
	bool isRightGrantedFrom(S32 rights) const;

	/**
	 * @brief Get the rights granted to the other agent.
	 *
	 * @return Returns the bitmask of granted rights.
	 */
	S32 getRightsGrantedTo() const;

	/**
	 * @brief Get the rights granted from the other agent.
	 *
	 * @return Returns the bitmask of granted rights.
	 */
	S32 getRightsGrantedFrom() const;

	void setRightsTo(S32 to_agent) { mGrantToAgent = to_agent; }
	void setRightsFrom(S32 from_agent) { mGrantFromAgent = from_agent; }

	/**
	 * @brief Grant a set of rights.
	 *
	 * Any bit which is set will grant that right if it is set in the
	 * instance. You can pass in LLGrantedRights::NONE to not change
	 * that field.
	 * @param to_agent The rights to grant to agent_id.
	 * @param from_agent The rights granted from agent_id.
	 */
	void grantRights(S32 to_agent, S32 from_agent);
	
	/** 
	 * @brief Revoke a set of rights.
	 *
	 * Any bit which is set will revoke that right if it is set in the
	 * instance. You can pass in LLGrantedRights::NONE to not change
	 * that field.
	 * @param to_agent The rights to grant to agent_id.
	 * @param from_agent The rights granted from agent_id.
	 */
	void revokeRights(S32 to_agent, S32 from_agent);
	//@}

protected:
	S32 mGrantToAgent;
	S32 mGrantFromAgent;
	bool mIsOnline;
};

#endif // LL_LLUSERRELAIONS_H