// static bool LLURLDispatcherImpl::dispatchRegion(const LLSLURL& slurl, const std::string& nav_type, bool right_mouse) { if(slurl.getType() != LLSLURL::LOCATION) { return false; } // Before we're logged in, need to update the startup screen // to tell the user where they are going. if (LLStartUp::getStartupState() < STATE_LOGIN_CLEANUP) { // We're at the login screen, so make sure user can see // the login location box to know where they are going. LLPanelLogin::setLocation(slurl); return true; } // <FS:AW hypergrid support > // LLWorldMapMessage::getInstance()->sendNamedRegionRequest(slurl.getRegion(), // // LLURLDispatcherImpl::regionNameCallback, // slurl.getSLURLString(), LLSLURL hyper = slurl; #ifdef HAS_OPENSIM_SUPPORT // <FS:AW optional opensim support> std::string grid = slurl.getGrid(); std::string current_grid = LLGridManager::getInstance()->getGrid(); std::string gatekeeper = LLGridManager::getInstance()->getGatekeeper(grid); std::string current = LLGridManager::getInstance()->getGrid(); if((grid != current ) && (!LLGridManager::getInstance()->isInOpenSim() || (!slurl.getHypergrid() && gatekeeper.empty() ) ) ) { std::string dest = hyper.getSLURLString(); if (!dest.empty()) { LLSD args; args["SLURL"] = dest; args["GRID"] = slurl.getGrid(); args["CURRENT_GRID"] = current_grid; LLNotificationsUtil::add("CantTeleportToGrid", args); return true; } } else if(!gatekeeper.empty()) { hyper = LLSLURL(gatekeeper + ":" + slurl.getRegion(), slurl.getPosition(), true); } #endif //HAS_OPENSIM_SUPPORT // </FS:AW optional opensim support> // Request a region handle by name LLWorldMapMessage::getInstance()->sendNamedRegionRequest(hyper.getRegion(), LLURLDispatcherImpl::regionNameCallback, hyper.getSLURLString(), // </FS:AW hypergrid support > LLUI::sSettingGroups["config"]->getBOOL("SLURLTeleportDirectly")); // don't teleport return true; }
// This is called when user presses enter in the location input // or selects a location from the typed locations dropdown. void LLNavigationBar::onLocationSelection() { std::string typed_location = mCmbLocation->getSimple(); LLStringUtil::trim(typed_location); // Will not teleport to empty location. if (typed_location.empty()) return; //get selected item from combobox item LLSD value = mCmbLocation->getSelectedValue(); if(value.isUndefined() && !mCmbLocation->getTextEntry()->isDirty()) { // At this point we know that: there is no selected item in list and text field has NOT been changed // So there is no sense to try to change the location return; } /* since navbar list support autocompletion it contains several types of item: landmark, teleport hystory item, * typed by user slurl or region name. Let's find out which type of item the user has selected * to make decision about adding this location into typed history. see mSaveToLocationHistory * Note: * Only TYPED_REGION_SLURL item will be added into LLLocationHistory */ if(value.has("item_type")) { switch(value["item_type"].asInteger()) { case LANDMARK: if(value.has("AssetUUID")) { gAgent.teleportViaLandmark( LLUUID(value["AssetUUID"].asString())); return; } else { LLInventoryModel::item_array_t landmark_items = LLLandmarkActions::fetchLandmarksByName(typed_location, FALSE); if (!landmark_items.empty()) { gAgent.teleportViaLandmark( landmark_items[0]->getAssetUUID()); return; } } break; case TELEPORT_HISTORY: //in case of teleport item was selected, teleport by position too. case TYPED_REGION_SLURL: if(value.has("global_pos")) { gAgent.teleportViaLocation(LLVector3d(value["global_pos"])); return; } break; default: break; } } //Let's parse slurl or region name std::string region_name; LLVector3 local_coords(128, 128, 0); // Is the typed location a SLURL? LLSLURL slurl = LLSLURL(typed_location); if (slurl.getType() == LLSLURL::LOCATION) { LL_DEBUGS( "SLURL") << "LLSLURL::LOCATION" << LL_ENDL; region_name = slurl.getRegion(); local_coords = slurl.getPosition(); } else if(!slurl.isValid()) { LL_DEBUGS( "SLURL") << "!slurl.isValid()" << LL_ENDL; // we have to do this check after previous, because LLUrlRegistry contains handlers for slurl too // but we need to know whether typed_location is a simple http url. if (LLUrlRegistry::instance().isUrl(typed_location)) { LL_DEBUGS( "SLURL") << "isUrl" << LL_ENDL; // display http:// URLs in the media browser, or // anything else is sent to the search floater LLWeb::loadURL(typed_location); return; } else { LL_DEBUGS( "SLURL") << "assume user has typed region name" << LL_ENDL; // assume that an user has typed the {region name} or possible {region_name, parcel} region_name = typed_location.substr(0,typed_location.find(',')); } } else { LL_DEBUGS( "SLURL") << "was an app slurl, home, whatever. Bail" << LL_ENDL; // was an app slurl, home, whatever. Bail return; } std::string grid = slurl.getGrid(); if(!slurl.getHypergrid() && (grid != LLGridManager::getInstance()->getGrid())) { std::string dest = slurl.getSLURLString(); if (!dest.empty()) { FloaterHop::Params p; p.url(dest).target(LLStringUtil::null).id(LLStringUtil::null); LLFloaterReg::showInstance("grid_hop", p); return; } } // Resolve the region name to its global coordinates. // If resolution succeeds we'll teleport. LLWorldMapMessage::url_callback_t cb = boost::bind( &LLNavigationBar::onRegionNameResponse, this, typed_location, region_name, local_coords, _1, _2, _3, _4); mSaveToLocationHistory = true; LLWorldMapMessage::getInstance()->sendNamedRegionRequest(region_name, cb, std::string("unused"), false); }