/** * @file llfloaterbuycurrencyhtml.cpp * @brief buy currency implemented in HTML floater - uses embedded media browser control * * $LicenseInfo:firstyear=2010&license=viewerlgpl$ * Second Life Viewer Source Code * Copyright (C) 2026, 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 "llfloaterbuycurrencyhtml.h" #include "llfloaterbuycurrency.h" #include "llmediactrl.h" #include "llstatusbar.h" #include "llviewercontrol.h" #include "llweb.h" LLFloaterBuyCurrencyHTML::LLFloaterBuyCurrencyHTML(const LLSD& key) : LLFloater(key), mBrowser(nullptr) { } LLFloaterBuyCurrencyHTML::~LLFloaterBuyCurrencyHTML() { } void LLFloaterBuyCurrencyHTML::onClose(bool app_quitting) { if (!app_quitting) LLStatusBar::sendMoneyBalanceRequest(); LLFloater::onClose(app_quitting); } bool LLFloaterBuyCurrencyHTML::postBuild() { mBrowser = getChild("browser"); mBrowser->addObserver(this); mBrowser->setErrorPageURL(gSavedSettings.getString("GenericErrorPageURL")); LLViewerMedia::getInstance()->getOpenIDCookie(mBrowser); return true; } // static std::string LLFloaterBuyCurrencyHTML::buildURL(S32 shortfall) { std::string url = gSavedSettings.getString("BuyCurrencyPacksURL"); LLStringUtil::format_map_t replace; replace["[LANGUAGE]"] = LLUI::getLanguage(); if (shortfall > 0) { replace["[SHORTFALL]"] = std::to_string(shortfall); } LLStringUtil::format(url, replace); if (shortfall <= 0) { LLStringUtil::replaceString(url, "&shortfall=[SHORTFALL]", ""); } return url; } void LLFloaterBuyCurrencyHTML::navigateToFinalURL() { mBrowser->navigateTo(buildURL(mShortfall), HTTP_CONTENT_TEXT_HTML); } void LLFloaterBuyCurrencyHTML::setFallbackContext(const std::string& message, S32 sum) { mFallbackMessage = message; mFallbackSum = sum; mHasFallbackTarget = true; } void LLFloaterBuyCurrencyHTML::fallbackToLegacy() { LL_WARNS() << "Buy Currency HTML page failed to load, falling back to legacy floater" << LL_ENDL; closeFloater(); if (mHasFallbackTarget) { LLFloaterBuyCurrency::buyCurrency(mFallbackMessage, mFallbackSum); } else { LLFloaterBuyCurrency::buyCurrency(); } } void LLFloaterBuyCurrencyHTML::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event) { if (LLPluginClassMediaOwner::MEDIA_EVENT_NAVIGATE_COMPLETE == event) { if (self->getNavigateURI().find("done=success") != std::string::npos) { LLStatusBar::sendMoneyBalanceRequest(); } else { // HTTP 4xx/5xx: fall back to legacy floater if (self->getNavigateResultCode() >= 400) { fallbackToLegacy(); } } } else if (event == LLPluginClassMediaOwner::MEDIA_EVENT_NAVIGATE_ERROR_PAGE || event == LLPluginClassMediaOwner::MEDIA_EVENT_PLUGIN_FAILED_LAUNCH || event == LLPluginClassMediaOwner::MEDIA_EVENT_PLUGIN_FAILED) { fallbackToLegacy(); } }