/**
* @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();
}
}