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 llfloatersearch.cpp
* @brief Floater for Search (update 2025, preload)
*
* $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$
*/
#include "llviewerprecompiledheaders.h"
#include "llfloatersearch.h"
#include "llagent.h"
#include "llcommandhandler.h"
#include "llfloaterreg.h"
#include "llmediactrl.h"
#include "lluictrlfactory.h"
#include "llviewercontrol.h"
#include "llweb.h"
// support secondlife:///app/search/{CATEGORY}/{QUERY} SLapps
class LLSearchHandler : public LLCommandHandler {
public:
// requires trusted browser to trigger
LLSearchHandler() : LLCommandHandler("search", UNTRUSTED_CLICK_ONLY) { }
bool handle(const LLSD& tokens, const LLSD& query_map, const std::string& grid, LLMediaCtrl* web) {
const size_t parts = tokens.size();
// open the search floater and perform the requested search
LLFloaterReg::showInstance("search", tokens);
return true;
}
};
LLSearchHandler gSearchHandler;
LLFloaterSearch::LLFloaterSearch(const LLSD& key)
: LLFloater(key)
{
mSearchType.insert("standard");
mSearchType.insert("land");
mSearchType.insert("classified");
mCollectionType.insert("events");
mCollectionType.insert("destinations");
mCollectionType.insert("places");
mCollectionType.insert("groups");
mCollectionType.insert("people");
}
LLFloaterSearch::~LLFloaterSearch()
{
}
void LLFloaterSearch::onOpen(const LLSD& tokens)
{
initiateSearch(tokens);
}
void LLFloaterSearch::initiateSearch(const LLSD& tokens)
{
std::string url = gSavedSettings.getString("SearchURL");
LLSD subs;
// Setting this substitution here results in a full set of collections being
// substituted into the final URL using the logic from the original search.
subs["TYPE"] = "standard";
const size_t parts = tokens.size();
// get the (optional) category for the search
std::string collection;
if (parts > 0)
{
collection = tokens[0].asString();
}
// get the (optional) search string
std::string search_text;
if (parts > 1)
{
search_text = tokens[1].asString();
}
// TODO: where does category get set? I cannot find a reference to
// it in internal docs - might be conflated with values in mSearchType
std::string category;
if (mSearchType.find(category) != mSearchType.end())
{
subs["TYPE"] = category;
}
else
{
subs["TYPE"] = "standard";
}
subs["QUERY"] = LLURI::escape(search_text);
subs["COLLECTION"] = "";
if (subs["TYPE"] == "standard")
{
if (mCollectionType.find(collection) != mCollectionType.end())
{
subs["COLLECTION"] = "&collection_chosen=" + std::string(collection);
}
else
{
std::string collection_args("");
for (std::set<std::string>::iterator it = mCollectionType.begin(); it != mCollectionType.end(); ++it)
{
collection_args += "&collection_chosen=" + std::string(*it);
}
subs["COLLECTION"] = collection_args;
}
}
// Default to PG
std::string maturity = "g";
if (gAgent.prefersAdult())
{
// PG,Mature,Adult
maturity = "gma";
}
else if (gAgent.prefersMature())
{
// PG,Mature
maturity = "gm";
}
subs["MATURITY"] = maturity;
// God status
subs["GODLIKE"] = gAgent.isGodlike() ? "1" : "0";
// This call expands a set of generic substitutions like language, viewer version
// etc. and then also does the same with the list of subs passed in.
url = LLWeb::expandURLSubstitutions(url, subs);
// Naviation to the calculated URL - we know it's HTML so we can
// tell the media system not to bother with the MIME type check.
LLMediaCtrl* search_browser = findChild<LLMediaCtrl>("search_contents");
search_browser->navigateTo(url, HTTP_CONTENT_TEXT_HTML);
}
bool LLFloaterSearch::postBuild()
{
enableResizeCtrls(true, true, false);
// This call is actioned by the preload code in llViewerWindow
// that creates the search floater during the login process
// using a generic search with no query
initiateSearch(LLSD());
return true;
}
|