summaryrefslogtreecommitdiff
path: root/indra/newview/llfloatertos.cpp
diff options
context:
space:
mode:
authorJames Cook <james@lindenlab.com>2007-01-02 08:33:20 +0000
committerJames Cook <james@lindenlab.com>2007-01-02 08:33:20 +0000
commit420b91db29485df39fd6e724e782c449158811cb (patch)
treeb471a94563af914d3ed3edd3e856d21cb1b69945 /indra/newview/llfloatertos.cpp
Print done when done.
Diffstat (limited to 'indra/newview/llfloatertos.cpp')
-rw-r--r--indra/newview/llfloatertos.cpp269
1 files changed, 269 insertions, 0 deletions
diff --git a/indra/newview/llfloatertos.cpp b/indra/newview/llfloatertos.cpp
new file mode 100644
index 0000000000..149a585822
--- /dev/null
+++ b/indra/newview/llfloatertos.cpp
@@ -0,0 +1,269 @@
+/**
+ * @file llfloatertos.cpp
+ * @brief Terms of Service Agreement dialog
+ *
+ * Copyright (c) 2003-$CurrentYear$, Linden Research, Inc.
+ * $License$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llfloatertos.h"
+
+#include "llbutton.h"
+#include "llradiogroup.h"
+#include "llvfile.h"
+#include "lltextbox.h"
+#include "llviewertexteditor.h"
+#include "viewer.h"
+#include "llstartup.h"
+#include "message.h"
+#include "llagent.h"
+#include "llvieweruictrlfactory.h"
+#include "llviewerwindow.h"
+#include "llviewerstats.h"
+#include "llui.h"
+#include "llhttpclient.h"
+#include "llradiogroup.h"
+#include "llwebbrowserctrl.h"
+
+// static
+LLFloaterTOS* LLFloaterTOS::sInstance = NULL;
+
+// static
+LLFloaterTOS* LLFloaterTOS::show(ETOSType type, const std::string & message)
+{
+ if( !LLFloaterTOS::sInstance )
+ {
+ LLFloaterTOS::sInstance = new LLFloaterTOS(type, message);
+ }
+
+ if (type == TOS_TOS)
+ {
+ gUICtrlFactory->buildFloater(LLFloaterTOS::sInstance, "floater_tos.xml");
+ }
+ else
+ {
+ gUICtrlFactory->buildFloater(LLFloaterTOS::sInstance, "floater_critical.xml");
+ }
+
+ return LLFloaterTOS::sInstance;
+}
+
+
+LLFloaterTOS::LLFloaterTOS(ETOSType type, const std::string & message)
+: LLModalDialog( " ", 100, 100 ),
+ mType(type),
+ mMessage(message),
+ mWebBrowserWindowId( 0 ),
+ mLoadCompleteCount( 0 )
+{
+}
+
+// helper class that trys to download a URL from a web site and calls a method
+// on parent class indicating if the web server is working or not
+class LLIamHere : public LLHTTPClient::Responder
+{
+ private:
+ LLIamHere( LLFloaterTOS* parent ) :
+ mParent( parent )
+ {}
+
+ LLFloaterTOS* mParent;
+
+ public:
+
+ static boost::intrusive_ptr< LLIamHere > build( LLFloaterTOS* parent )
+ {
+ return boost::intrusive_ptr< LLIamHere >( new LLIamHere( parent ) );
+ };
+
+ virtual void setParent( LLFloaterTOS* parentIn )
+ {
+ mParent = parentIn;
+ };
+
+ virtual void result( const LLSD& content )
+ {
+ if ( mParent )
+ mParent->setSiteIsAlive( true );
+ };
+
+ virtual void error( U32 status, const std::string& reason )
+ {
+ if ( mParent )
+ mParent->setSiteIsAlive( false );
+ };
+};
+
+// this is global and not a class member to keep crud out of the header file
+namespace {
+ boost::intrusive_ptr< LLIamHere > gResponsePtr = 0;
+};
+
+BOOL LLFloaterTOS::postBuild()
+{
+ childSetAction("Continue", onContinue, this);
+ childSetAction("Cancel", onCancel, this);
+ childSetCommitCallback("tos_agreement", updateAgree, this);
+
+ // this displays the critical message
+ if ( mType != TOS_TOS )
+ {
+ LLTextEditor *Editor = LLUICtrlFactory::getTextEditorByName(this, "tos_text");
+ if (Editor)
+ {
+ Editor->setHandleEditKeysDirectly( TRUE );
+ Editor->setEnabled( FALSE );
+ Editor->setReadOnlyFgColor(LLColor4::white);
+ Editor->setWordWrap(TRUE);
+ Editor->setFocus(TRUE);
+ }
+ childSetValue("tos_text", LLSD(mMessage));
+ };
+
+ #if LL_LIBXUL_ENABLED
+ // disable Agree to TOS radio button until the page has fully loaded
+ LLRadioGroup* tos_agreement = LLUICtrlFactory::getRadioGroupByName(this, "tos_agreement");
+ if ( tos_agreement )
+ {
+ tos_agreement->setEnabled( false );
+ };
+
+ LLWebBrowserCtrl* web_browser = LLUICtrlFactory::getWebBrowserCtrlByName(this, "tos_html");
+ if ( web_browser )
+ {
+ // save the window id for this web browser widget
+ mWebBrowserWindowId = web_browser->getEmbeddedBrowserWindowId();
+
+ // start to observe it so we see navigate complete events
+ if ( mWebBrowserWindowId )
+ LLMozLib::getInstance()->addObserver( mWebBrowserWindowId, this );
+
+ gResponsePtr = LLIamHere::build( this );
+ LLHTTPClient::get( childGetValue( "real_url" ).asString(), gResponsePtr );
+ };
+ #else
+ LLTextEditor *Editor = LLUICtrlFactory::getTextEditorByName(this, "tos_text");
+ if (Editor)
+ {
+ Editor->setHandleEditKeysDirectly( TRUE );
+ Editor->setEnabled( FALSE );
+ Editor->setReadOnlyFgColor(LLColor4::white);
+ Editor->setWordWrap(TRUE);
+ Editor->setFocus(TRUE);
+ }
+ childSetValue("tos_text", LLSD(mMessage));
+ #endif
+ return TRUE;
+}
+
+void LLFloaterTOS::setSiteIsAlive( bool alive )
+{
+ // only do this for TOS pages
+ if ( mType == TOS_TOS )
+ {
+#if LL_LIBXUL_ENABLED
+ LLWebBrowserCtrl* web_browser = LLUICtrlFactory::getWebBrowserCtrlByName(this, "tos_html");
+ // if the contents of the site was retrieved
+ if ( alive )
+ {
+ if ( web_browser )
+ {
+ // navigate to the "real" page
+ web_browser->navigateTo( childGetValue( "real_url" ).asString() );
+ };
+ }
+ else
+ {
+ // 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
+ LLRadioGroup* tos_agreement = LLUICtrlFactory::getRadioGroupByName(this, "tos_agreement");
+ if ( tos_agreement )
+ {
+ tos_agreement->setEnabled( true );
+ };
+
+ if ( web_browser )
+ {
+ // hide browser control (revealing default text message)
+ web_browser->setVisible( FALSE );
+ };
+ };
+#endif // LL_LIBXUL_ENABLED
+ };
+}
+
+LLFloaterTOS::~LLFloaterTOS()
+{
+#if LL_LIBXUL_ENABLED
+ // stop obsaerving events
+ if ( mWebBrowserWindowId )
+ LLMozLib::getInstance()->addObserver( mWebBrowserWindowId, this );
+#endif // LL_LIBXUL_ENABLED
+
+ // tell the responder we're not here anymore
+ if ( gResponsePtr )
+ gResponsePtr->setParent( 0 );
+
+ LLFloaterTOS::sInstance = NULL;
+}
+
+// virtual
+void LLFloaterTOS::draw()
+{
+ // draw children
+ LLModalDialog::draw();
+}
+
+// static
+void LLFloaterTOS::updateAgree(LLUICtrl*, void* userdata )
+{
+ LLFloaterTOS* self = (LLFloaterTOS*) userdata;
+ std::string agree = self->childGetValue("tos_agreement").asString();
+ self->childSetEnabled("Continue", (agree == "radio_agree") );
+}
+
+// static
+void LLFloaterTOS::onContinue( void* userdata )
+{
+ LLFloaterTOS* self = (LLFloaterTOS*) userdata;
+ llinfos << "User agrees with TOS." << llendl;
+ if (self->mType == TOS_TOS)
+ {
+ gAcceptTOS = TRUE;
+ }
+ else
+ {
+ gAcceptCriticalMessage = TRUE;
+ }
+ gStartupState++;
+ self->close(); // destroys this object
+}
+
+// static
+void LLFloaterTOS::onCancel( void* userdata )
+{
+ LLFloaterTOS* self = (LLFloaterTOS*) userdata;
+ llinfos << "User disagrees with TOS." << llendl;
+ gViewerWindow->alertXml("MustAgreeToLogIn", login_alert_done);
+ gStartupState = STATE_LOGIN_SHOW;
+ self->mLoadCompleteCount = 0; // reset counter for next time we come to TOS
+ self->close(); // destroys this object
+}
+
+//virtual
+void LLFloaterTOS::onNavigateComplete( const EventType& eventIn )
+{
+ // skip past the loading screen navigate complete
+ if ( ++mLoadCompleteCount == 2 )
+ {
+ llinfos << "NAVIGATE COMPLETE" << llendl;
+ // enable Agree to TOS radio button now that page has loaded
+ LLRadioGroup* tos_agreement = LLUICtrlFactory::getRadioGroupByName(this, "tos_agreement");
+ if ( tos_agreement )
+ {
+ tos_agreement->setEnabled( true );
+ };
+ };
+}