diff options
Diffstat (limited to 'indra/newview/llfloatertos.cpp')
-rw-r--r-- | indra/newview/llfloatertos.cpp | 562 |
1 files changed, 281 insertions, 281 deletions
diff --git a/indra/newview/llfloatertos.cpp b/indra/newview/llfloatertos.cpp index 3fa4c8aefd..8eec5b753a 100644 --- a/indra/newview/llfloatertos.cpp +++ b/indra/newview/llfloatertos.cpp @@ -1,281 +1,281 @@ -/**
- * @file llfloatertos.cpp
- * @brief Terms of Service Agreement dialog
- *
- * $LicenseInfo:firstyear=2003&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$
- */
-
-#include "llviewerprecompiledheaders.h"
-
-#include "llfloatertos.h"
-
-// viewer includes
-#include "llviewerstats.h"
-#include "llviewerwindow.h"
-
-// linden library includes
-#include "llbutton.h"
-#include "llevents.h"
-#include "llnotificationsutil.h"
-#include "llradiogroup.h"
-#include "lltextbox.h"
-#include "llui.h"
-#include "lluictrlfactory.h"
-#include "llfilesystem.h"
-#include "message.h"
-#include "llstartup.h" // login_alert_done
-#include "llcorehttputil.h"
-#include "llfloaterreg.h"
-
-LLFloaterTOS::LLFloaterTOS(const LLSD& data)
-: LLModalDialog( data["message"].asString() ),
- mMessage(data["message"].asString()),
- mLoadingScreenLoaded(false),
- mSiteAlive(false),
- mRealNavigateBegun(false),
- mReplyPumpName(data["reply_pump"].asString())
-{
-}
-
-bool LLFloaterTOS::postBuild()
-{
- childSetAction("Continue", onContinue, this);
- childSetAction("Cancel", onCancel, this);
- childSetCommitCallback("agree_chk", updateAgree, this);
-
- if (hasChild("tos_text"))
- {
- // this displays the critical message
- LLUICtrl *tos_text = getChild<LLUICtrl>("tos_text");
- tos_text->setEnabled(false);
- tos_text->setFocus(true);
- tos_text->setValue(LLSD(mMessage));
-
- return true;
- }
-
- // disable Agree to TOS radio button until the page has fully loaded
- updateAgreeEnabled(false);
-
- // hide the SL text widget if we're displaying TOS with using a browser widget.
- LLUICtrl *editor = getChild<LLUICtrl>("tos_text");
- editor->setVisible(false);
-
- LLMediaCtrl* web_browser = getChild<LLMediaCtrl>("tos_html");
- if ( web_browser )
- {
-// if we are forced to send users to an external site in their system browser
-// (e.g.) Linux users because of lack of media support for HTML ToS page
-// remove exisiting UI and replace with a link to external page where users can accept ToS
-#ifdef EXTERNAL_TOS
- LLTextBox* header = getChild<LLTextBox>("tos_heading");
- if (header)
- header->setVisible(false);
-
- LLTextBox* external_prompt = getChild<LLTextBox>("external_tos_required");
- if (external_prompt)
- external_prompt->setVisible(true);
-
- web_browser->setVisible(false);
-#else
- web_browser->addObserver(this);
-
- // Don't use the start_url parameter for this browser instance -- it may finish loading before we get to add our observer.
- // Store the URL separately and navigate here instead.
- web_browser->navigateTo( getString( "loading_url" ) );
- LLPluginClassMedia* media_plugin = web_browser->getMediaPlugin();
- if (media_plugin)
- {
- // All links from tos_html should be opened in external browser
- media_plugin->setOverrideClickTarget("_external");
- }
-#endif
- }
-
- return true;
-}
-
-void LLFloaterTOS::setSiteIsAlive( bool alive )
-{
-// if we are forced to send users to an external site in their system browser
-// (e.g.) Linux users because of lack of media support for HTML ToS page
-// force the regular HTML UI to deactivate so alternative is rendered instead.
-#ifdef EXTERNAL_TOS
- mSiteAlive = false;
-#else
-
- mSiteAlive = alive;
-
- // only do this for TOS pages
- if (hasChild("tos_html"))
- {
- // if the contents of the site was retrieved
- if ( alive )
- {
- // navigate to the "real" page
- if(!mRealNavigateBegun && mSiteAlive)
- {
- LLMediaCtrl* web_browser = getChild<LLMediaCtrl>("tos_html");
- if(web_browser)
- {
- mRealNavigateBegun = true;
- web_browser->navigateTo( getString( "real_url" ) );
- }
- }
- }
- else
- {
- LL_INFOS("TOS") << "ToS page: ToS page unavailable!" << LL_ENDL;
- // normally this is set when navigation to TOS page navigation completes (so you can't accept before TOS loads)
- // but if the page is unavailable, we need to do this now
- updateAgreeEnabled(true);
- LLTextBox* tos_list = getChild<LLTextBox>("agree_list");
- tos_list->setEnabled(true);
- }
- }
-#endif
-}
-
-LLFloaterTOS::~LLFloaterTOS()
-{
-}
-
-// virtual
-void LLFloaterTOS::draw()
-{
- // draw children
- LLModalDialog::draw();
-}
-
-
-// update status of "Agree" checkbox and text
-void LLFloaterTOS::updateAgreeEnabled(bool enabled)
-{
- LLCheckBoxCtrl* tos_agreement_agree_cb = getChild<LLCheckBoxCtrl>("agree_chk");
- tos_agreement_agree_cb->setEnabled(enabled);
-
- LLTextBox* tos_agreement_agree_text = getChild<LLTextBox>("agree_list");
- tos_agreement_agree_text->setEnabled(enabled);
-}
-
-// static
-void LLFloaterTOS::updateAgree(LLUICtrl*, void* userdata )
-{
- LLFloaterTOS* self = (LLFloaterTOS*) userdata;
- bool agree = self->getChild<LLUICtrl>("agree_chk")->getValue().asBoolean();
- self->getChildView("Continue")->setEnabled(agree);
-}
-
-// static
-void LLFloaterTOS::onContinue( void* userdata )
-{
- LLFloaterTOS* self = (LLFloaterTOS*) userdata;
- LL_INFOS("TOS") << "User agrees with TOS." << LL_ENDL;
-
- if(self->mReplyPumpName != "")
- {
- LLEventPumps::instance().obtain(self->mReplyPumpName).post(LLSD(true));
- }
-
- self->closeFloater(); // destroys this object
-}
-
-// static
-void LLFloaterTOS::onCancel( void* userdata )
-{
- LLFloaterTOS* self = (LLFloaterTOS*) userdata;
- LL_INFOS("TOS") << "User disagrees with TOS." << LL_ENDL;
- LLNotificationsUtil::add("MustAgreeToLogIn", LLSD(), LLSD(), login_alert_done);
-
- if(self->mReplyPumpName != "")
- {
- LLEventPumps::instance().obtain(self->mReplyPumpName).post(LLSD(false));
- }
-
- // reset state for next time we come to TOS
- self->mLoadingScreenLoaded = false;
- self->mSiteAlive = false;
- self->mRealNavigateBegun = false;
-
- // destroys this object
- self->closeFloater();
-}
-
-//virtual
-void LLFloaterTOS::handleMediaEvent(LLPluginClassMedia* /*self*/, EMediaEvent event)
-{
- if(event == MEDIA_EVENT_NAVIGATE_COMPLETE)
- {
- if(!mLoadingScreenLoaded)
- {
- mLoadingScreenLoaded = true;
- std::string url(getString("real_url"));
-
- LLHandle<LLFloater> handle = getHandle();
-
- LLCoros::instance().launch("LLFloaterTOS::testSiteIsAliveCoro",
- boost::bind(&LLFloaterTOS::testSiteIsAliveCoro, handle, url));
- }
- else if(mRealNavigateBegun)
- {
- LL_INFOS("TOS") << "TOS: NAVIGATE COMPLETE" << LL_ENDL;
- // enable Agree to TOS check box now that page has loaded
- updateAgreeEnabled(true);
- }
- }
-}
-
-void LLFloaterTOS::testSiteIsAliveCoro(LLHandle<LLFloater> handle, std::string url)
-{
- LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID);
- LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t
- httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("genericPostCoro", httpPolicy));
- LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest);
- LLCore::HttpOptions::ptr_t httpOpts = LLCore::HttpOptions::ptr_t(new LLCore::HttpOptions);
-
- httpOpts->setWantHeaders(true);
- httpOpts->setHeadersOnly(true);
-
- LL_INFOS("testSiteIsAliveCoro") << "Generic POST for " << url << LL_ENDL;
-
- LLSD result = httpAdapter->getAndSuspend(httpRequest, url);
-
- LLSD httpResults = result[LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS];
- LLCore::HttpStatus status = LLCoreHttpUtil::HttpCoroutineAdapter::getStatusFromLLSD(httpResults);
-
- if (handle.isDead())
- {
- LL_WARNS("testSiteIsAliveCoro") << "Dialog canceled before response." << LL_ENDL;
- return;
- }
-
- LLFloaterTOS *that = dynamic_cast<LLFloaterTOS *>(handle.get());
-
- if (that)
- that->setSiteIsAlive(static_cast<bool>(status));
- else
- {
- LL_WARNS("testSiteIsAliveCoro") << "Handle was not a TOS floater." << LL_ENDL;
- }
-}
-
-
+/** + * @file llfloatertos.cpp + * @brief Terms of Service Agreement dialog + * + * $LicenseInfo:firstyear=2003&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$ + */ + +#include "llviewerprecompiledheaders.h" + +#include "llfloatertos.h" + +// viewer includes +#include "llviewerstats.h" +#include "llviewerwindow.h" + +// linden library includes +#include "llbutton.h" +#include "llevents.h" +#include "llnotificationsutil.h" +#include "llradiogroup.h" +#include "lltextbox.h" +#include "llui.h" +#include "lluictrlfactory.h" +#include "llfilesystem.h" +#include "message.h" +#include "llstartup.h" // login_alert_done +#include "llcorehttputil.h" +#include "llfloaterreg.h" + +LLFloaterTOS::LLFloaterTOS(const LLSD& data) +: LLModalDialog( data["message"].asString() ), + mMessage(data["message"].asString()), + mLoadingScreenLoaded(false), + mSiteAlive(false), + mRealNavigateBegun(false), + mReplyPumpName(data["reply_pump"].asString()) +{ +} + +bool LLFloaterTOS::postBuild() +{ + childSetAction("Continue", onContinue, this); + childSetAction("Cancel", onCancel, this); + childSetCommitCallback("agree_chk", updateAgree, this); + + if (hasChild("tos_text")) + { + // this displays the critical message + LLUICtrl *tos_text = getChild<LLUICtrl>("tos_text"); + tos_text->setEnabled(false); + tos_text->setFocus(true); + tos_text->setValue(LLSD(mMessage)); + + return true; + } + + // disable Agree to TOS radio button until the page has fully loaded + updateAgreeEnabled(false); + + // hide the SL text widget if we're displaying TOS with using a browser widget. + LLUICtrl *editor = getChild<LLUICtrl>("tos_text"); + editor->setVisible(false); + + LLMediaCtrl* web_browser = getChild<LLMediaCtrl>("tos_html"); + if ( web_browser ) + { +// if we are forced to send users to an external site in their system browser +// (e.g.) Linux users because of lack of media support for HTML ToS page +// remove exisiting UI and replace with a link to external page where users can accept ToS +#ifdef EXTERNAL_TOS + LLTextBox* header = getChild<LLTextBox>("tos_heading"); + if (header) + header->setVisible(false); + + LLTextBox* external_prompt = getChild<LLTextBox>("external_tos_required"); + if (external_prompt) + external_prompt->setVisible(true); + + web_browser->setVisible(false); +#else + web_browser->addObserver(this); + + // Don't use the start_url parameter for this browser instance -- it may finish loading before we get to add our observer. + // Store the URL separately and navigate here instead. + web_browser->navigateTo( getString( "loading_url" ) ); + LLPluginClassMedia* media_plugin = web_browser->getMediaPlugin(); + if (media_plugin) + { + // All links from tos_html should be opened in external browser + media_plugin->setOverrideClickTarget("_external"); + } +#endif + } + + return true; +} + +void LLFloaterTOS::setSiteIsAlive( bool alive ) +{ +// if we are forced to send users to an external site in their system browser +// (e.g.) Linux users because of lack of media support for HTML ToS page +// force the regular HTML UI to deactivate so alternative is rendered instead. +#ifdef EXTERNAL_TOS + mSiteAlive = false; +#else + + mSiteAlive = alive; + + // only do this for TOS pages + if (hasChild("tos_html")) + { + // if the contents of the site was retrieved + if ( alive ) + { + // navigate to the "real" page + if(!mRealNavigateBegun && mSiteAlive) + { + LLMediaCtrl* web_browser = getChild<LLMediaCtrl>("tos_html"); + if(web_browser) + { + mRealNavigateBegun = true; + web_browser->navigateTo( getString( "real_url" ) ); + } + } + } + else + { + LL_INFOS("TOS") << "ToS page: ToS page unavailable!" << LL_ENDL; + // normally this is set when navigation to TOS page navigation completes (so you can't accept before TOS loads) + // but if the page is unavailable, we need to do this now + updateAgreeEnabled(true); + LLTextBox* tos_list = getChild<LLTextBox>("agree_list"); + tos_list->setEnabled(true); + } + } +#endif +} + +LLFloaterTOS::~LLFloaterTOS() +{ +} + +// virtual +void LLFloaterTOS::draw() +{ + // draw children + LLModalDialog::draw(); +} + + +// update status of "Agree" checkbox and text +void LLFloaterTOS::updateAgreeEnabled(bool enabled) +{ + LLCheckBoxCtrl* tos_agreement_agree_cb = getChild<LLCheckBoxCtrl>("agree_chk"); + tos_agreement_agree_cb->setEnabled(enabled); + + LLTextBox* tos_agreement_agree_text = getChild<LLTextBox>("agree_list"); + tos_agreement_agree_text->setEnabled(enabled); +} + +// static +void LLFloaterTOS::updateAgree(LLUICtrl*, void* userdata ) +{ + LLFloaterTOS* self = (LLFloaterTOS*) userdata; + bool agree = self->getChild<LLUICtrl>("agree_chk")->getValue().asBoolean(); + self->getChildView("Continue")->setEnabled(agree); +} + +// static +void LLFloaterTOS::onContinue( void* userdata ) +{ + LLFloaterTOS* self = (LLFloaterTOS*) userdata; + LL_INFOS("TOS") << "User agrees with TOS." << LL_ENDL; + + if(self->mReplyPumpName != "") + { + LLEventPumps::instance().obtain(self->mReplyPumpName).post(LLSD(true)); + } + + self->closeFloater(); // destroys this object +} + +// static +void LLFloaterTOS::onCancel( void* userdata ) +{ + LLFloaterTOS* self = (LLFloaterTOS*) userdata; + LL_INFOS("TOS") << "User disagrees with TOS." << LL_ENDL; + LLNotificationsUtil::add("MustAgreeToLogIn", LLSD(), LLSD(), login_alert_done); + + if(self->mReplyPumpName != "") + { + LLEventPumps::instance().obtain(self->mReplyPumpName).post(LLSD(false)); + } + + // reset state for next time we come to TOS + self->mLoadingScreenLoaded = false; + self->mSiteAlive = false; + self->mRealNavigateBegun = false; + + // destroys this object + self->closeFloater(); +} + +//virtual +void LLFloaterTOS::handleMediaEvent(LLPluginClassMedia* /*self*/, EMediaEvent event) +{ + if(event == MEDIA_EVENT_NAVIGATE_COMPLETE) + { + if(!mLoadingScreenLoaded) + { + mLoadingScreenLoaded = true; + std::string url(getString("real_url")); + + LLHandle<LLFloater> handle = getHandle(); + + LLCoros::instance().launch("LLFloaterTOS::testSiteIsAliveCoro", + boost::bind(&LLFloaterTOS::testSiteIsAliveCoro, handle, url)); + } + else if(mRealNavigateBegun) + { + LL_INFOS("TOS") << "TOS: NAVIGATE COMPLETE" << LL_ENDL; + // enable Agree to TOS check box now that page has loaded + updateAgreeEnabled(true); + } + } +} + +void LLFloaterTOS::testSiteIsAliveCoro(LLHandle<LLFloater> handle, std::string url) +{ + LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); + LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t + httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("genericPostCoro", httpPolicy)); + LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); + LLCore::HttpOptions::ptr_t httpOpts = LLCore::HttpOptions::ptr_t(new LLCore::HttpOptions); + + httpOpts->setWantHeaders(true); + httpOpts->setHeadersOnly(true); + + LL_INFOS("testSiteIsAliveCoro") << "Generic POST for " << url << LL_ENDL; + + LLSD result = httpAdapter->getAndSuspend(httpRequest, url); + + LLSD httpResults = result[LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS]; + LLCore::HttpStatus status = LLCoreHttpUtil::HttpCoroutineAdapter::getStatusFromLLSD(httpResults); + + if (handle.isDead()) + { + LL_WARNS("testSiteIsAliveCoro") << "Dialog canceled before response." << LL_ENDL; + return; + } + + LLFloaterTOS *that = dynamic_cast<LLFloaterTOS *>(handle.get()); + + if (that) + that->setSiteIsAlive(static_cast<bool>(status)); + else + { + LL_WARNS("testSiteIsAliveCoro") << "Handle was not a TOS floater." << LL_ENDL; + } +} + + |