summaryrefslogtreecommitdiff
path: root/indra/llmessage/llservicebuilder.cpp
diff options
context:
space:
mode:
authorNat Goodspeed <nat@lindenlab.com>2024-06-20 12:28:09 -0400
committerNat Goodspeed <nat@lindenlab.com>2024-06-20 12:28:09 -0400
commitd110358472b83f2f31d60ea0d76f1b426a087f56 (patch)
tree83617196e7d444c1063075e4a4c50fe19490a4ce /indra/llmessage/llservicebuilder.cpp
parentbb1f3f08cf93facbf926e57384674441be7e2884 (diff)
parente92689063bdbe34907348a12f1db39bc81132783 (diff)
Merge branch 'release/luau-scripting' into lua-speedometer-demo
Diffstat (limited to 'indra/llmessage/llservicebuilder.cpp')
-rw-r--r--indra/llmessage/llservicebuilder.cpp358
1 files changed, 179 insertions, 179 deletions
diff --git a/indra/llmessage/llservicebuilder.cpp b/indra/llmessage/llservicebuilder.cpp
index cf2e42f95c..7dc49d5455 100644
--- a/indra/llmessage/llservicebuilder.cpp
+++ b/indra/llmessage/llservicebuilder.cpp
@@ -1,25 +1,25 @@
-/**
+/**
* @file llservicebuilder.cpp
* @brief Implementation of the LLServiceBuilder class.
*
* $LicenseInfo:firstyear=2007&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$
*/
@@ -32,205 +32,205 @@
#include "llsdserialize.h"
void LLServiceBuilder::loadServiceDefinitionsFromFile(
- const std::string& service_filename)
+ const std::string& service_filename)
{
- llifstream service_file(service_filename.c_str(), std::ios::binary);
- if(service_file.is_open())
- {
- LLSD service_data;
- LLSDSerialize::fromXMLDocument(service_data, service_file);
- service_file.close();
- // Load service
- LLSD service_map = service_data["services"];
- for(LLSD::array_iterator array_itr = service_map.beginArray();
- array_itr != service_map.endArray();
- ++array_itr)
- {
- LLSD service_llsd = (*array_itr)["service-builder"];
- std::string service_name = (*array_itr)["name"].asString();
- createServiceDefinition(service_name, service_llsd);
- }
- LL_INFOS() << "loaded config file: " << service_filename << LL_ENDL;
- }
- else
- {
- LL_WARNS() << "unable to find config file: " << service_filename << LL_ENDL;
- }
+ llifstream service_file(service_filename.c_str(), std::ios::binary);
+ if(service_file.is_open())
+ {
+ LLSD service_data;
+ LLSDSerialize::fromXMLDocument(service_data, service_file);
+ service_file.close();
+ // Load service
+ LLSD service_map = service_data["services"];
+ for(LLSD::array_iterator array_itr = service_map.beginArray();
+ array_itr != service_map.endArray();
+ ++array_itr)
+ {
+ LLSD service_llsd = (*array_itr)["service-builder"];
+ std::string service_name = (*array_itr)["name"].asString();
+ createServiceDefinition(service_name, service_llsd);
+ }
+ LL_INFOS() << "loaded config file: " << service_filename << LL_ENDL;
+ }
+ else
+ {
+ LL_WARNS() << "unable to find config file: " << service_filename << LL_ENDL;
+ }
}
void LLServiceBuilder::createServiceDefinition(
- const std::string& service_name,
- LLSD& service_llsd)
+ const std::string& service_name,
+ LLSD& service_llsd)
{
- if(service_llsd.isString())
- {
- mServiceMap[ service_name ] = service_llsd.asString();
- }
- else if(service_llsd.isMap())
- {
- for(LLSD::map_iterator map_itr = service_llsd.beginMap();
- map_itr != service_llsd.endMap();
- ++map_itr)
- {
- std::string compound_builder_name = service_name;
- compound_builder_name.append("-");
- compound_builder_name.append((*map_itr).first);
- mServiceMap[ compound_builder_name ] = (*map_itr).second.asString();
- }
- }
+ if(service_llsd.isString())
+ {
+ mServiceMap[ service_name ] = service_llsd.asString();
+ }
+ else if(service_llsd.isMap())
+ {
+ for(LLSD::map_iterator map_itr = service_llsd.beginMap();
+ map_itr != service_llsd.endMap();
+ ++map_itr)
+ {
+ std::string compound_builder_name = service_name;
+ compound_builder_name.append("-");
+ compound_builder_name.append((*map_itr).first);
+ mServiceMap[ compound_builder_name ] = (*map_itr).second.asString();
+ }
+ }
}
static
bool starts_with(const std::string& text, const char* prefix)
{
- return text.substr(0, strlen(prefix)) == prefix;
+ return text.substr(0, strlen(prefix)) == prefix;
}
// TODO: Build a real services.xml for windows development.
// and remove the base_url logic below.
std::string LLServiceBuilder::buildServiceURI(const std::string& service_name) const
{
- std::ostringstream service_url;
- // Find the service builder
- std::map<std::string, std::string>::const_iterator it =
- mServiceMap.find(service_name);
- if(it != mServiceMap.end())
- {
- // construct the service builder url
- LLApp* app = LLApp::instance();
- if(app)
- {
- // We define a base-url for some development configurations
- // In production neither of these are defined and all services have full urls
- LLSD base_url;
+ std::ostringstream service_url;
+ // Find the service builder
+ std::map<std::string, std::string>::const_iterator it =
+ mServiceMap.find(service_name);
+ if(it != mServiceMap.end())
+ {
+ // construct the service builder url
+ LLApp* app = LLApp::instance();
+ if(app)
+ {
+ // We define a base-url for some development configurations
+ // In production neither of these are defined and all services have full urls
+ LLSD base_url;
- if (starts_with(service_name,"cap"))
- {
- base_url = app->getOption("cap-base-url");
- }
+ if (starts_with(service_name,"cap"))
+ {
+ base_url = app->getOption("cap-base-url");
+ }
- if (base_url.asString().empty())
- {
- base_url = app->getOption("services-base-url");
- }
- service_url << base_url.asString();
- }
- service_url << it->second;
- }
- else
- {
- LL_WARNS() << "Cannot find service " << service_name << LL_ENDL;
- }
- return service_url.str();
+ if (base_url.asString().empty())
+ {
+ base_url = app->getOption("services-base-url");
+ }
+ service_url << base_url.asString();
+ }
+ service_url << it->second;
+ }
+ else
+ {
+ LL_WARNS() << "Cannot find service " << service_name << LL_ENDL;
+ }
+ return service_url.str();
}
std::string LLServiceBuilder::buildServiceURI(
- const std::string& service_name,
- const LLSD& option_map) const
+ const std::string& service_name,
+ const LLSD& option_map) const
{
- return russ_format(buildServiceURI(service_name), option_map);
+ return russ_format(buildServiceURI(service_name), option_map);
}
std::string russ_format(const std::string& format_str, const LLSD& context)
{
- std::string service_url(format_str);
- if(!service_url.empty() && context.isMap())
- {
- // throw in a ridiculously large limiter to make sure we don't
- // loop forever with bad input.
- int iterations = 100;
- bool keep_looping = true;
- while(keep_looping)
- {
- if(0 == --iterations)
- {
- keep_looping = false;
- }
+ std::string service_url(format_str);
+ if(!service_url.empty() && context.isMap())
+ {
+ // throw in a ridiculously large limiter to make sure we don't
+ // loop forever with bad input.
+ int iterations = 100;
+ bool keep_looping = true;
+ while(keep_looping)
+ {
+ if(0 == --iterations)
+ {
+ keep_looping = false;
+ }
- int depth = 0;
- int deepest = 0;
- bool find_match = false;
- std::string::iterator iter(service_url.begin());
- std::string::iterator end(service_url.end());
- std::string::iterator deepest_node(service_url.end());
- std::string::iterator deepest_node_end(service_url.end());
- // parse out the variables to replace by going through {}s
- // one at a time, starting with the "deepest" in series
- // {{}}, and otherwise replacing right-to-left
- for(; iter != end; ++iter)
- {
- switch(*iter)
- {
- case '{':
- ++depth;
- if(depth > deepest)
- {
- deepest = depth;
- deepest_node = iter;
- find_match = true;
- }
- break;
- case '}':
- --depth;
- if(find_match)
- {
- deepest_node_end = iter;
- find_match = false;
- }
- break;
- default:
- break;
- }
- }
- if((deepest_node == end) || (deepest_node_end == end))
- {
- break;
- }
- //replace the variable we found in the {} above.
- // *NOTE: since the c++ implementation only understands
- // params and straight string substitution, so it's a
- // known distance of 2 to skip the directive.
- std::string key(deepest_node + 2, deepest_node_end);
- LLSD value = context[key];
- switch(*(deepest_node + 1))
- {
- case '$':
- if(value.isDefined())
- {
- service_url.replace(
- deepest_node,
- deepest_node_end + 1,
- value.asString());
- }
- else
- {
- LL_WARNS() << "Unknown key: " << key << " in option map: "
- << LLSDOStreamer<LLSDNotationFormatter>(context)
- << LL_ENDL;
- keep_looping = false;
- }
- break;
- case '%':
- {
- std::string query_str = LLURI::mapToQueryString(value);
- service_url.replace(
- deepest_node,
- deepest_node_end + 1,
- query_str);
- }
- break;
- default:
- LL_INFOS() << "Unknown directive: " << *(deepest_node + 1)
- << LL_ENDL;
- keep_looping = false;
- break;
- }
- }
- }
- if (service_url.find('{') != std::string::npos)
- {
- LL_WARNS() << "Constructed a likely bogus service URL: " << service_url
- << LL_ENDL;
- }
- return service_url;
+ int depth = 0;
+ int deepest = 0;
+ bool find_match = false;
+ std::string::iterator iter(service_url.begin());
+ std::string::iterator end(service_url.end());
+ std::string::iterator deepest_node(service_url.end());
+ std::string::iterator deepest_node_end(service_url.end());
+ // parse out the variables to replace by going through {}s
+ // one at a time, starting with the "deepest" in series
+ // {{}}, and otherwise replacing right-to-left
+ for(; iter != end; ++iter)
+ {
+ switch(*iter)
+ {
+ case '{':
+ ++depth;
+ if(depth > deepest)
+ {
+ deepest = depth;
+ deepest_node = iter;
+ find_match = true;
+ }
+ break;
+ case '}':
+ --depth;
+ if(find_match)
+ {
+ deepest_node_end = iter;
+ find_match = false;
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ if((deepest_node == end) || (deepest_node_end == end))
+ {
+ break;
+ }
+ //replace the variable we found in the {} above.
+ // *NOTE: since the c++ implementation only understands
+ // params and straight string substitution, so it's a
+ // known distance of 2 to skip the directive.
+ std::string key(deepest_node + 2, deepest_node_end);
+ LLSD value = context[key];
+ switch(*(deepest_node + 1))
+ {
+ case '$':
+ if(value.isDefined())
+ {
+ service_url.replace(
+ deepest_node,
+ deepest_node_end + 1,
+ value.asString());
+ }
+ else
+ {
+ LL_WARNS() << "Unknown key: " << key << " in option map: "
+ << LLSDOStreamer<LLSDNotationFormatter>(context)
+ << LL_ENDL;
+ keep_looping = false;
+ }
+ break;
+ case '%':
+ {
+ std::string query_str = LLURI::mapToQueryString(value);
+ service_url.replace(
+ deepest_node,
+ deepest_node_end + 1,
+ query_str);
+ }
+ break;
+ default:
+ LL_INFOS() << "Unknown directive: " << *(deepest_node + 1)
+ << LL_ENDL;
+ keep_looping = false;
+ break;
+ }
+ }
+ }
+ if (service_url.find('{') != std::string::npos)
+ {
+ LL_WARNS() << "Constructed a likely bogus service URL: " << service_url
+ << LL_ENDL;
+ }
+ return service_url;
}