diff options
Diffstat (limited to 'indra/llmessage/llservicebuilder.cpp')
-rw-r--r-- | indra/llmessage/llservicebuilder.cpp | 358 |
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; } |