llfloatertos.cpp
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:7k
源码类别:

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llfloatertos.cpp
  3.  * @brief Terms of Service Agreement dialog
  4.  *
  5.  * $LicenseInfo:firstyear=2003&license=viewergpl$
  6.  * 
  7.  * Copyright (c) 2003-2010, Linden Research, Inc.
  8.  * 
  9.  * Second Life Viewer Source Code
  10.  * The source code in this file ("Source Code") is provided by Linden Lab
  11.  * to you under the terms of the GNU General Public License, version 2.0
  12.  * ("GPL"), unless you have obtained a separate licensing agreement
  13.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  14.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  15.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  16.  * 
  17.  * There are special exceptions to the terms and conditions of the GPL as
  18.  * it is applied to this Source Code. View the full text of the exception
  19.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  20.  * online at
  21.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  22.  * 
  23.  * By copying, modifying or distributing this software, you acknowledge
  24.  * that you have read and understood your obligations described above,
  25.  * and agree to abide by those obligations.
  26.  * 
  27.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  28.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  29.  * COMPLETENESS OR PERFORMANCE.
  30.  * $/LicenseInfo$
  31.  */
  32. #include "llviewerprecompiledheaders.h"
  33. #include "llfloatertos.h"
  34. // viewer includes
  35. #include "llviewerstats.h"
  36. #include "llviewerwindow.h"
  37. // linden library includes
  38. #include "llbutton.h"
  39. #include "llevents.h"
  40. #include "llhttpclient.h"
  41. #include "llhttpstatuscodes.h" // for HTTP_FOUND
  42. #include "llnotificationsutil.h"
  43. #include "llradiogroup.h"
  44. #include "lltextbox.h"
  45. #include "llui.h"
  46. #include "lluictrlfactory.h"
  47. #include "llvfile.h"
  48. #include "message.h"
  49. #include "llstartup.h"              // login_alert_done
  50. LLFloaterTOS::LLFloaterTOS(const LLSD& data)
  51. : LLModalDialog( data["message"].asString() ),
  52. mMessage(data["message"].asString()),
  53. mWebBrowserWindowId( 0 ),
  54. mLoadCompleteCount( 0 ),
  55. mReplyPumpName(data["reply_pump"].asString())
  56. {
  57. }
  58. // helper class that trys to download a URL from a web site and calls a method 
  59. // on parent class indicating if the web server is working or not
  60. class LLIamHere : public LLHTTPClient::Responder
  61. {
  62. private:
  63. LLIamHere( LLFloaterTOS* parent ) :
  64.    mParent( parent )
  65. {}
  66. LLFloaterTOS* mParent;
  67. public:
  68. static boost::intrusive_ptr< LLIamHere > build( LLFloaterTOS* parent )
  69. {
  70. return boost::intrusive_ptr< LLIamHere >( new LLIamHere( parent ) );
  71. };
  72. virtual void  setParent( LLFloaterTOS* parentIn )
  73. {
  74. mParent = parentIn;
  75. };
  76. virtual void result( const LLSD& content )
  77. {
  78. if ( mParent )
  79. mParent->setSiteIsAlive( true );
  80. };
  81. virtual void error( U32 status, const std::string& reason )
  82. {
  83. if ( mParent )
  84. {
  85. // *HACK: For purposes of this alive check, 302 Found
  86. // (aka Moved Temporarily) is considered alive.  The web site
  87. // redirects this link to a "cache busting" temporary URL. JC
  88. bool alive = (status == HTTP_FOUND);
  89. mParent->setSiteIsAlive( alive );
  90. }
  91. };
  92. };
  93. // this is global and not a class member to keep crud out of the header file
  94. namespace {
  95. boost::intrusive_ptr< LLIamHere > gResponsePtr = 0;
  96. };
  97. BOOL LLFloaterTOS::postBuild()
  98. {
  99. childSetAction("Continue", onContinue, this);
  100. childSetAction("Cancel", onCancel, this);
  101. childSetCommitCallback("agree_chk", updateAgree, this);
  102. if (hasChild("tos_text"))
  103. {
  104. // this displays the critical message
  105. LLUICtrl *tos_text = getChild<LLUICtrl>("tos_text");
  106. tos_text->setEnabled( FALSE );
  107. tos_text->setFocus(TRUE);
  108. tos_text->setValue(LLSD(mMessage));
  109. return TRUE;
  110. }
  111. // disable Agree to TOS radio button until the page has fully loaded
  112. LLCheckBoxCtrl* tos_agreement = getChild<LLCheckBoxCtrl>("agree_chk");
  113. tos_agreement->setEnabled( false );
  114. // hide the SL text widget if we're displaying TOS with using a browser widget.
  115. LLUICtrl *editor = getChild<LLUICtrl>("tos_text");
  116. editor->setVisible( FALSE );
  117. LLMediaCtrl* web_browser = getChild<LLMediaCtrl>("tos_html");
  118. if ( web_browser )
  119. {
  120. web_browser->addObserver(this);
  121. gResponsePtr = LLIamHere::build( this );
  122. LLHTTPClient::get( getString( "real_url" ), gResponsePtr );
  123. }
  124. return TRUE;
  125. }
  126. void LLFloaterTOS::setSiteIsAlive( bool alive )
  127. {
  128. // only do this for TOS pages
  129. if (hasChild("tos_html"))
  130. {
  131. LLMediaCtrl* web_browser = getChild<LLMediaCtrl>("tos_html");
  132. // if the contents of the site was retrieved
  133. if ( alive )
  134. {
  135. // navigate to the "real" page 
  136. web_browser->navigateTo( getString( "real_url" ) );
  137. }
  138. else
  139. {
  140. // normally this is set when navigation to TOS page navigation completes (so you can't accept before TOS loads)
  141. // but if the page is unavailable, we need to do this now
  142. LLCheckBoxCtrl* tos_agreement = getChild<LLCheckBoxCtrl>("agree_chk");
  143. tos_agreement->setEnabled( true );
  144. }
  145. }
  146. }
  147. LLFloaterTOS::~LLFloaterTOS()
  148. {
  149. // tell the responder we're not here anymore
  150. if ( gResponsePtr )
  151. gResponsePtr->setParent( 0 );
  152. }
  153. // virtual
  154. void LLFloaterTOS::draw()
  155. {
  156. // draw children
  157. LLModalDialog::draw();
  158. }
  159. // static
  160. void LLFloaterTOS::updateAgree(LLUICtrl*, void* userdata )
  161. {
  162. LLFloaterTOS* self = (LLFloaterTOS*) userdata;
  163. bool agree = self->childGetValue("agree_chk").asBoolean(); 
  164. self->childSetEnabled("Continue", agree);
  165. }
  166. // static
  167. void LLFloaterTOS::onContinue( void* userdata )
  168. {
  169. LLFloaterTOS* self = (LLFloaterTOS*) userdata;
  170. llinfos << "User agrees with TOS." << llendl;
  171. if(self->mReplyPumpName != "")
  172. {
  173. LLEventPumps::instance().obtain(self->mReplyPumpName).post(LLSD(true));
  174. }
  175. self->closeFloater(); // destroys this object
  176. }
  177. // static
  178. void LLFloaterTOS::onCancel( void* userdata )
  179. {
  180. LLFloaterTOS* self = (LLFloaterTOS*) userdata;
  181. llinfos << "User disagrees with TOS." << llendl;
  182. LLNotificationsUtil::add("MustAgreeToLogIn", LLSD(), LLSD(), login_alert_done);
  183. if(self->mReplyPumpName != "")
  184. {
  185. LLEventPumps::instance().obtain(self->mReplyPumpName).post(LLSD(false));
  186. }
  187. self->mLoadCompleteCount = 0;  // reset counter for next time we come to TOS
  188. self->closeFloater(); // destroys this object
  189. }
  190. //virtual 
  191. void LLFloaterTOS::handleMediaEvent(LLPluginClassMedia* /*self*/, EMediaEvent event)
  192. {
  193. if(event == MEDIA_EVENT_NAVIGATE_COMPLETE)
  194. {
  195. // skip past the loading screen navigate complete
  196. if ( ++mLoadCompleteCount == 2 )
  197. {
  198. llinfos << "NAVIGATE COMPLETE" << llendl;
  199. // enable Agree to TOS radio button now that page has loaded
  200. LLCheckBoxCtrl * tos_agreement = getChild<LLCheckBoxCtrl>("agree_chk");
  201. tos_agreement->setEnabled( true );
  202. }
  203. }
  204. }