aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/linden/indra/llinventory/lluserrelations.h
blob: 1682f506ea92af6be77a1e9ba8408b1c6da62151 (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
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
/** 
 * @file lluserrelations.h
 * @author Phoenix
 * @date 2006-10-12
 * @brief Declaration of a class for handling granted rights.
 *
 * $LicenseInfo:firstyear=2006&license=viewergpl$
 * 
 * Copyright (c) 2006-2009, Linden Research, Inc.
 * 
 * Second Life Viewer Source Code
 * The source code in this file ("Source Code") is provided by Linden Lab
 * to you under the terms of the GNU General Public License, version 2.0
 * ("GPL"), unless you have obtained a separate licensing agreement
 * ("Other License"), formally executed by you and Linden Lab.  Terms of
 * the GPL can be found in doc/GPL-license.txt in this distribution, or
 * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
 * 
 * There are special exceptions to the terms and conditions of the GPL as
 * it is applied to this Source Code. View the full text of the exception
 * in the file doc/FLOSS-exception.txt in this software distribution, or
 * online at
 * http://secondlifegrid.net/programs/open_source/licensing/flossexception
 * 
 * By copying, modifying or distributing this software, you acknowledge
 * that you have read and understood your obligations described above,
 * and agree to abide by those obligations.
 * 
 * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
 * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
 * COMPLETENESS OR PERFORMANCE.
 * $/LicenseInfo$
 */

#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; mChangeSerialNum++; }
	void setRightsFrom(S32 from_agent) { mGrantFromAgent = from_agent; mChangeSerialNum++;}

	/**
	 * @brief Get the change count for this agent
	 *
	 * Every change to rights will increment the serial number
	 * allowing listeners to determine when a relationship value is actually new
	 *
	 * @return change serial number for relationship
	 */
	S32 getChangeSerialNum() const { return mChangeSerialNum; }

	/**
	 * @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;
	S32 mChangeSerialNum;
	bool mIsOnline;
};

#endif // LL_LLUSERRELAIONS_H