summaryrefslogtreecommitdiff
path: root/indra/llinventory/lluserrelations.h
blob: 3ca6f36145225c7853004a8f6a22d35209823aa9 (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
/**
 * @file lluserrelations.h
 * @author Phoenix
 * @date 2006-10-12
 * @brief Declaration of a class for handling granted rights.
 *
 * $LicenseInfo:firstyear=2006&license=viewerlgpl$
 * Second Life Viewer Source Code
 * Copyright (C) 2010, Linden Research, Inc.
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation;
 * version 2.1 of the License only.
 *
 * This library 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
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 *
 * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
 * $/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