summaryrefslogtreecommitdiff
path: root/indra/llmessage/llavatarname.h
blob: 192f43f07c7b24aa0576961d9a81024330a1a620 (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
/** 
 * @file llavatarname.h
 * @brief Represents name-related data for an avatar, such as the
 * username/SLID ("bobsmith123" or "james.linden") and the display
 * name ("James Cook")
 *
 * $LicenseInfo:firstyear=2010&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 LLAVATARNAME_H
#define LLAVATARNAME_H

#include <string>

class LLSD;

class LL_COMMON_API LLAvatarName
{
public:
	LLAvatarName();
	
	bool operator<(const LLAvatarName& rhs) const;

	// Conversion to and from LLSD (cache file or server response)
	LLSD asLLSD() const;
	void fromLLSD(const LLSD& sd);

	// Used only in legacy mode when the display name capability is not provided server side
	// or to otherwise create a temporary valid item.
	void fromString(const std::string& full_name);
	
	// Set the name object to become invalid in "expires" seconds from now
	void setExpires(F64 expires);

	// Set and get the display name flag set by the user in preferences.
	static void setUseDisplayNames(bool use);
	static bool useDisplayNames();
	
	static void setUseUsernames(bool use);
	static bool useUsernames();

	// A name object is valid if not temporary and not yet expired (default is expiration not checked)
	bool isValidName(F64 max_unrefreshed = 0.0f) const { return !mIsTemporaryName && (mExpires >= max_unrefreshed); }
	
	// Return true if the name is made up from legacy or temporary data
	bool isDisplayNameDefault() const { return mIsDisplayNameDefault; }
	
	// For normal names, returns "James Linden (james.linden)"
	// When display names are disabled returns just "James Linden"
	std::string getCompleteName(bool use_parentheses = true) const;
	
	// Returns "James Linden" or "bobsmith123 Resident" for backwards
	// compatibility with systems like voice and muting
	// *TODO: Eliminate this in favor of username only
	std::string getLegacyName() const;
	
	// "José Sanchez" or "James Linden", UTF-8 encoded Unicode
	// Takes the display name preference into account. This is truly the name that should 
	// be used for all UI where an avatar name has to be used unless we truly want something else (rare)
	std::string getDisplayName() const;
	
	// Returns "James Linden" or "bobsmith123 Resident"
	// Used where we explicitely prefer or need a non UTF-8 legacy (ASCII) name
	// Also used for backwards compatibility with systems like voice and muting
	std::string getUserName(bool lowercase = false) const;
	
	// Returns "james.linden" or the legacy name for very old names
	std::string getAccountName() const { return mUsername; }

	// Debug print of the object
	void dump() const;
	
	// Names can change, so need to keep track of when name was
	// last checked.
	// Unix time-from-epoch seconds for efficiency
	F64 mExpires;
	
	// You can only change your name every N hours, so record
	// when the next update is allowed
	// Unix time-from-epoch seconds
	F64 mNextUpdate;
	
private:
	// "bobsmith123" or "james.linden", US-ASCII only
	std::string mUsername;

	// "José Sanchez" or "James Linden", UTF-8 encoded Unicode
	// Contains data whether or not user has explicitly set
	// a display name; may duplicate their username.
	std::string mDisplayName;

	// For "James Linden", "James"
	// For "bobsmith123", "bobsmith123"
	// Used to communicate with legacy systems like voice and muting which
	// rely on old-style names.
	// *TODO: Eliminate this in favor of username only
	std::string mLegacyFirstName;

	// For "James Linden", "Linden"
	// For "bobsmith123", "Resident"
	// see above for rationale
	std::string mLegacyLastName;

	// If true, both display name and SLID were generated from
	// a legacy first and last name, like "James Linden (james.linden)"
	bool mIsDisplayNameDefault;

	// Under error conditions, we may insert "dummy" records with
	// names like "???" into caches as placeholders.  These can be
	// shown in UI, but are not serialized.
	bool mIsTemporaryName;

	// Global flag indicating if display name should be used or not
	// This will affect the output of the high level "get" methods
	static bool sUseDisplayNames;

	// Flag indicating if username should be shown after display name or not
	static bool sUseUsernames;
};

#endif