summaryrefslogtreecommitdiff
path: root/indra/newview/llestateinfomodel.h
blob: 2c89a85500829cd9b485a9dc20933abeddf44734 (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
/** 
 * @file llestateinfomodel.h
 * @brief Estate info model
 *
 * $LicenseInfo:firstyear=2011&license=viewerlgpl$
 * Second Life Viewer Source Code
 * Copyright (C) 2011, 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_LLESTATEINFOMODEL_H
#define LL_LLESTATEINFOMODEL_H

class LLMessageSystem;

#include "llsingleton.h"
#include "llcoros.h"
#include "lleventcoro.h"
#include "lldispatcher.h"
#include "llregionflags.h"

class LLViewerRegion;
/**
 * Contains estate info, notifies interested parties of its changes.
 */
class LLEstateInfoModel : public LLSingleton<LLEstateInfoModel>
{
    LLSINGLETON_C11(LLEstateInfoModel);
	LOG_CLASS(LLEstateInfoModel);

public:
    typedef std::vector<std::string>            strings_t;
	typedef boost::signals2::signal<void()>     update_signal_t;
    typedef boost::signals2::signal<void(U32)>  update_flaged_signal_t;
    typedef boost::signals2::connection         connection_t;

    connection_t            setUpdateCallback(const update_signal_t::slot_type& cb); /// the model has been externally updated
    connection_t            setUpdateAccessCallback(const update_flaged_signal_t::slot_type& cb);
    connection_t            setUpdateExperienceCallback(const update_signal_t::slot_type& cb);
    connection_t            setCommitCallback(const update_signal_t::slot_type& cb); /// our changes have been applied

    void                    setRegion(LLViewerRegion* region);
    void                    clearRegion();
	void                    sendEstateInfo(); /// send estate info to the simulator

	// getters
    bool                    getUseFixedSun() const              { return getFlag(REGION_FLAGS_SUN_FIXED); }
    bool                    getIsExternallyVisible() const      { return getFlag(REGION_FLAGS_EXTERNALLY_VISIBLE); }
    bool                    getAllowDirectTeleport() const      { return getFlag(REGION_FLAGS_ALLOW_DIRECT_TELEPORT); }
    bool                    getDenyAnonymous() const            { return getFlag(REGION_FLAGS_DENY_ANONYMOUS); }
    bool                    getDenyAgeUnverified() const        { return getFlag(REGION_FLAGS_DENY_AGEUNVERIFIED); }
    bool                    getAllowVoiceChat() const           { return getFlag(REGION_FLAGS_ALLOW_VOICE); }
    bool                    getAllowAccessOverride() const      { return getFlag(REGION_FLAGS_ALLOW_ACCESS_OVERRIDE); }
    bool                    getAllowEnvironmentOverride() const { return getFlag(REGION_FLAGS_ALLOW_ENVIRONMENT_OVERRIDE); }

	const std::string&	    getName()					const { return mName; }
	const LLUUID&		    getOwnerID()				const { return mOwnerID; }
	U32					    getID()						const { return mID; }
	F32					    getSunHour()				const { return getUseFixedSun() ? mSunHour : 0.f; }

	// setters
    void                    setUseFixedSun(bool val)                { setFlag(REGION_FLAGS_SUN_FIXED, val); }
    void                    setIsExternallyVisible(bool val)        { setFlag(REGION_FLAGS_EXTERNALLY_VISIBLE, val); }
    void                    setAllowDirectTeleport(bool val)        { setFlag(REGION_FLAGS_ALLOW_DIRECT_TELEPORT, val); }
    void                    setDenyAnonymous(bool val)              { setFlag(REGION_FLAGS_DENY_ANONYMOUS, val); }
    void                    setDenyAgeUnverified(bool val)          { setFlag(REGION_FLAGS_DENY_AGEUNVERIFIED, val); }
    void                    setAllowVoiceChat(bool val)             { setFlag(REGION_FLAGS_ALLOW_VOICE, val); }
    void                    setAllowAccessOverride(bool val)        { setFlag(REGION_FLAGS_ALLOW_ACCESS_OVERRIDE, val); }
    void                    setAllowEnvironmentOverride(bool val)   { setFlag(REGION_FLAGS_ALLOW_ENVIRONMENT_OVERRIDE, val); }

	void                    setSunHour(F32 sun_hour) { mSunHour = sun_hour; }

    const uuid_set_t &      getAllowedAgents() const                { return mAllowedAgents; }
    const uuid_set_t &      getAllowedGroups() const                { return mAllowedGroups; }
    const uuid_set_t &      getBannedAgents() const                 { return mBannedAgents; }
    const uuid_set_t &      getEstateManagers() const               { return mEstateManagers; }

    const uuid_set_t &      getAllowedExperiences() const           { return mExperienceAllowed; }
    const uuid_set_t &      getTrustedExperiences() const           { return mExperienceTrusted; }
    const uuid_set_t &      getBlockedExperiences() const           { return mExperienceBlocked; }

    void                    sendEstateOwnerMessage(const std::string& request, const strings_t& strings);

    //---------------------------------------------------------------------
    /// refresh model with data from the incoming server message
    void                    updateEstateInfo(const strings_t& strings);
    void                    updateAccessInfo(const strings_t& strings);
    void                    updateExperienceInfo(const strings_t& strings);

    const LLUUID &          getLastInvoice()    { return mRequestInvoice; }
    const LLUUID &          nextInvoice()       { mRequestInvoice.generate(); return mRequestInvoice; }

protected:

	void                    notifyCommit();

    virtual void            initSingleton() override;

private:
	bool                    commitEstateInfoCaps();
	void                    commitEstateInfoDataserver();
	inline bool             getFlag(U64 flag) const;
	inline void             setFlag(U64 flag, bool val);
	U64                     getFlags() const { return mFlags; }
	std::string             getInfoDump();

	// estate info
	std::string	            mName;			/// estate name
	LLUUID		            mOwnerID;		/// estate owner id
	U32			            mID;			/// estate id
	U64			            mFlags;			/// estate flags
	F32			            mSunHour;		/// estate sun hour

    uuid_set_t              mAllowedAgents;
    uuid_set_t              mAllowedGroups;
    uuid_set_t              mBannedAgents;
    uuid_set_t              mEstateManagers;

    uuid_set_t              mExperienceAllowed;
    uuid_set_t              mExperienceTrusted;
    uuid_set_t              mExperienceBlocked;

	update_signal_t         mUpdateSignal; /// emitted when we receive update from sim
    update_flaged_signal_t  mUpdateAccess;
    update_signal_t         mUpdateExperience;
	update_signal_t         mCommitSignal; /// emitted when our update gets applied to sim

    LLDispatcher            mDispatch;
    LLUUID                  mRequestInvoice;
    LLViewerRegion*         mRegion;

    void                    commitEstateInfoCapsCoro(std::string url);

    static void             processEstateOwnerRequest(LLMessageSystem* msg, void**);

};

inline bool LLEstateInfoModel::getFlag(U64 flag) const
{
	return ((mFlags & flag) != 0);
}

inline void LLEstateInfoModel::setFlag(U64 flag, bool val)
{
	if (val)
	{
		mFlags |= flag;
	}
	else
	{
		mFlags &= ~flag;
	}
}


#endif // LL_LLESTATEINFOMODEL_H