From 5f2b3a10ff5771c3ff05a9ec5563154259006455 Mon Sep 17 00:00:00 2001 From: Lirusaito Date: Fri, 26 Jul 2019 20:44:17 -0400 Subject: [PATCH] X-Grid Protocol resolution support --- indra/llui/llurlentry.cpp | 48 +++++++++++++++++++++++++++++---------- 1 file changed, 36 insertions(+), 12 deletions(-) diff --git a/indra/llui/llurlentry.cpp b/indra/llui/llurlentry.cpp index 81be0e2de..a737c446f 100644 --- a/indra/llui/llurlentry.cpp +++ b/indra/llui/llurlentry.cpp @@ -1133,6 +1133,15 @@ std::string LLUrlEntryPlace::getLabel(const std::string &url, const LLUrlLabelCa std::string y = path_array[1]; return location + " (" + x + "," + y + ")"; } + else if (path_parts > 3) // xgrid, show as grid: place(x, y, z) + { + auto place = unescapeUrl(path_array[1].asStringRef()); + const auto& x = path_array[2].asStringRef(); + const auto& y = path_array[3].asStringRef(); + location += ": " + place + " (" + x + ',' + y; + if (path_parts == 5) location += ',' + path_array[4].asStringRef(); + return location + ')'; + } return url; } @@ -1140,6 +1149,12 @@ std::string LLUrlEntryPlace::getLabel(const std::string &url, const LLUrlLabelCa std::string LLUrlEntryPlace::getLocation(const std::string &url) const { // return the part of the Url after secondlife:// part + const auto uri = LLURI(url); + bool xgrid = boost::algorithm::starts_with(uri.scheme(), "x-grid"); + if (xgrid) + { + return ::getStringAfterToken(url, "region/"); + } return ::getStringAfterToken(url, "://"); } @@ -1149,7 +1164,7 @@ std::string LLUrlEntryPlace::getLocation(const std::string &url) const // LLUrlEntryRegion::LLUrlEntryRegion() { - mPattern = boost::regex("secondlife:///app/region/[^/\\s]+(/\\d+)?(/\\d+)?(/\\d+)?/?", + mPattern = boost::regex(X_GRID_OR_SECONDLIFE_HEADER_REGEX"//app/region/[^/\\s]+(/\\d+)?(/\\d+)?(/\\d+)?/?", boost::regex::perl|boost::regex::icase); mMenuName = "menu_url_slurl.xml"; mTooltip = LLTrans::getString("TooltipSLURL"); @@ -1165,30 +1180,37 @@ std::string LLUrlEntryRegion::getLabel(const std::string &url, const LLUrlLabelC // - secondlife:///app/region/Place // - LLSD path_array = LLURI(url).pathArray(); + const auto uri = LLURI(url); + LLSD path_array = uri.pathArray(); S32 path_parts = path_array.size(); - if (path_parts < 3) // no region name + bool xgrid = boost::algorithm::starts_with(uri.scheme(), "x-grid"); + auto i = xgrid ? 3 : 2; + + if (path_parts < i+1) // no region name { LL_WARNS() << "Failed to parse url [" << url << "]" << LL_ENDL; return url; } - std::string label = unescapeUrl(path_array[2]); // region name + std::string label = + xgrid ? unescapeUrl(path_array[0].asStringRef()) + ": " + unescapeUrl(path_array[i].asStringRef()) : // grid and region name + unescapeUrl(path_array[i].asStringRef()); // region name - if (path_parts > 3) // secondlife:///app/region/Place/X + ++i; + if (path_parts > i+1) // secondlife:///app/region/Place/X { - std::string x = path_array[3]; + std::string x = path_array[i++]; label += " (" + x; - if (path_parts > 4) // secondlife:///app/region/Place/X/Y + if (path_parts > i+1) // secondlife:///app/region/Place/X/Y { - std::string y = path_array[4]; + std::string y = path_array[i++]; label += "," + y; - if (path_parts > 5) // secondlife:///app/region/Place/X/Y/Z + if (path_parts > i+1) // secondlife:///app/region/Place/X/Y/Z { - std::string z = path_array[5]; + std::string z = path_array[i]; label = label + "," + z; } } @@ -1201,8 +1223,10 @@ std::string LLUrlEntryRegion::getLabel(const std::string &url, const LLUrlLabelC std::string LLUrlEntryRegion::getLocation(const std::string &url) const { - LLSD path_array = LLURI(url).pathArray(); - std::string region_name = unescapeUrl(path_array[2]); + const auto uri = LLURI(url); + LLSD path_array = uri.pathArray(); + bool xgrid = boost::algorithm::starts_with(uri.scheme(), "x-grid"); + std::string region_name = unescapeUrl(path_array[xgrid ? 3 : 2]); return region_name; }