summaryrefslogtreecommitdiff
path: root/indra/llmessage/llcachename.h
blob: 609387b6deeacc3bc90b8e13f9661cc51e4bbf43 (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
/**
 * @file llcachename.h
 * @brief A cache of names from UUIDs.
 *
 * $LicenseInfo:firstyear=2002&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_LLCACHENAME_H
#define LL_LLCACHENAME_H

#include <boost/bind.hpp>
#include <boost/signals2.hpp>

class LLMessageSystem;
class LLHost;
class LLUUID;


typedef boost::signals2::signal<void (const LLUUID& id,
                                      const std::string& name,
                                      bool is_group)> LLCacheNameSignal;
typedef LLCacheNameSignal::slot_type LLCacheNameCallback;

// Old callback with user data for compatibility
typedef void (*old_callback_t)(const LLUUID&, const std::string&, bool, void*);

// Here's the theory:
// If you request a name that isn't in the cache, it returns "waiting"
// and requests the data.  After the data arrives, you get that on
// subsequent calls.
// If the data hasn't been updated in an hour, it requests it again,
// but keeps giving you the old value until new data arrives.
// If you haven't requested the data in an hour, it releases it.
class LLCacheName
{
public:
    LLCacheName(LLMessageSystem* msg);
    LLCacheName(LLMessageSystem* msg, const LLHost& upstream_host);
    ~LLCacheName();

    // registers the upstream host
    // for viewers, this is the currently connected simulator
    // for simulators, this is the data server
    void setUpstream(const LLHost& upstream_host);

    boost::signals2::connection addObserver(const LLCacheNameCallback& callback);

    // storing cache on disk; for viewer, in name.cache
    bool importFile(std::istream& istr);
    void exportFile(std::ostream& ostr);

    // If available, copies name ("bobsmith123" or "James Linden") into string
    // If not available, copies the string "waiting".
    // Returns true if available.
    bool getFullName(const LLUUID& id, std::string& full_name);

    // Reverse lookup of UUID from name
    bool getUUID(const std::string& first, const std::string& last, LLUUID& id);
    bool getUUID(const std::string& fullname, LLUUID& id);

    // IDEVO Temporary code
    // Clean up new-style "bobsmith123 Resident" names to "bobsmith123" for display
    static std::string buildFullName(const std::string& first, const std::string& last);

    // Clean up legacy "bobsmith123 Resident" to "bobsmith123"
    // If name does not contain "Resident" returns it unchanged.
    static std::string cleanFullName(const std::string& full_name);

    // Converts a standard legacy name to a username
    // "bobsmith123 Resident" -> "bobsmith"
    // "Random Linden" -> "random.linden"
    static std::string buildUsername(const std::string& name);

    // Converts a complete display name to a legacy name
    // if possible, otherwise returns the input
    // "Alias (random.linden)" -> "Random Linden"
    // "Something random" -> "Something random"
    static std::string buildLegacyName(const std::string& name);

    // If available, this method copies the group name into the string
    // provided. The caller must allocate at least
    // DB_GROUP_NAME_BUF_SIZE characters. If not available, this
    // method copies the string "waiting". Returns true if available.
    bool getGroupName(const LLUUID& id, std::string& group);

    // Call the callback with the group or avatar name.
    // If the data is currently available, may call the callback immediatly
    // otherwise, will request the data, and will call the callback when
    // available.  There is no garuntee the callback will ever be called.
    boost::signals2::connection get(const LLUUID& id, bool is_group, const LLCacheNameCallback& callback);

    // Convenience method for looking up a group name, so you can
    // tell the difference between avatar lookup and group lookup
    // in global searches
    boost::signals2::connection getGroup(const LLUUID& group_id, const LLCacheNameCallback& callback);

    // LEGACY
    boost::signals2::connection get(const LLUUID& id, bool is_group, old_callback_t callback, void* user_data);
    // This method needs to be called from time to time to send out
    // requests.
    void processPending();

    // Expire entries created more than "secs" seconds ago.
    void deleteEntriesOlderThan(S32 secs);

    // Debugging
    void dump();        // Dumps the contents of the cache
    void dumpStats();   // Dumps the sizes of the cache and associated queues.
    void clear();       // Deletes all entries from the cache

    std::string getDefaultName();

    // Returns "Resident", the default last name for SLID-based accounts
    // that have no last name.
    static std::string getDefaultLastName();

    void localizeCacheName(std::string key, std::string value);

private:
    std::map<std::string, std::string> mCacheName;

    class Impl;
    Impl& impl;
};



extern LLCacheName* gCacheName;

#endif