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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llregionpresenceverifier.cpp
  3.  * @brief 
  4.  *
  5.  * $LicenseInfo:firstyear=2008&license=viewergpl$
  6.  * 
  7.  * Copyright (c) 2008-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 "linden_common.h"
  33. #include "llregionpresenceverifier.h"
  34. #include "llhttpclientinterface.h"
  35. #include <sstream>
  36. #include "net.h"
  37. #include "message.h"
  38. namespace boost
  39. {
  40. void intrusive_ptr_add_ref(LLRegionPresenceVerifier::Response* p)
  41. {
  42. ++p->mReferenceCount;
  43. }
  44. void intrusive_ptr_release(LLRegionPresenceVerifier::Response* p)
  45. {
  46. if(p && 0 == --p->mReferenceCount)
  47. {
  48. delete p;
  49. }
  50. }
  51. };
  52. LLRegionPresenceVerifier::Response::~Response()
  53. {
  54. }
  55. LLRegionPresenceVerifier::RegionResponder::RegionResponder(const std::string&
  56.    uri,
  57.    ResponsePtr data,
  58.    S32 retry_count) :
  59. mUri(uri),
  60. mSharedData(data),
  61. mRetryCount(retry_count)
  62. {
  63. }
  64. //virtual
  65. LLRegionPresenceVerifier::RegionResponder::~RegionResponder()
  66. {
  67. }
  68. void LLRegionPresenceVerifier::RegionResponder::result(const LLSD& content)
  69. {
  70. std::string host = content["private_host"].asString();
  71. U32 port = content["private_port"].asInteger();
  72. LLHost destination(host, port);
  73. LLUUID id = content["region_id"];
  74. lldebugs << "Verifying " << destination.getString() << " is region " << id << llendl;
  75. std::stringstream uri;
  76. uri << "http://" << destination.getString() << "/state/basic/";
  77. mSharedData->getHttpClient().get(
  78. uri.str(),
  79. new VerifiedDestinationResponder(mUri, mSharedData, content, mRetryCount));
  80. }
  81. void LLRegionPresenceVerifier::RegionResponder::error(U32 status,
  82.  const std::string& reason)
  83. {
  84. // TODO: babbage: distinguish between region presence service and
  85. // region verification errors?
  86. mSharedData->onRegionVerificationFailed();
  87. }
  88. LLRegionPresenceVerifier::VerifiedDestinationResponder::VerifiedDestinationResponder(const std::string& uri, ResponsePtr data, const LLSD& content,
  89. S32 retry_count):
  90. mUri(uri),
  91. mSharedData(data),
  92. mContent(content),
  93. mRetryCount(retry_count) 
  94. {
  95. }
  96. //virtual
  97. LLRegionPresenceVerifier::VerifiedDestinationResponder::~VerifiedDestinationResponder()
  98. {
  99. }
  100. void LLRegionPresenceVerifier::VerifiedDestinationResponder::result(const LLSD& content)
  101. {
  102. LLUUID actual_region_id = content["region_id"];
  103. LLUUID expected_region_id = mContent["region_id"];
  104. lldebugs << "Actual region: " << content << llendl;
  105. lldebugs << "Expected region: " << mContent << llendl;
  106. if (mSharedData->checkValidity(content) &&
  107. (actual_region_id == expected_region_id))
  108. {
  109. mSharedData->onRegionVerified(mContent);
  110. }
  111. else if (mRetryCount > 0)
  112. {
  113. retry();
  114. }
  115. else
  116. {
  117. llwarns << "Simulator verification failed. Region: " << mUri << llendl;
  118. mSharedData->onRegionVerificationFailed();
  119. }
  120. }
  121. void LLRegionPresenceVerifier::VerifiedDestinationResponder::retry()
  122. {
  123. LLSD headers;
  124. headers["Cache-Control"] = "no-cache, max-age=0";
  125. llinfos << "Requesting region information, get uncached for region "
  126. << mUri << llendl;
  127. --mRetryCount;
  128. mSharedData->getHttpClient().get(mUri, new RegionResponder(mUri, mSharedData, mRetryCount), headers);
  129. }
  130. void LLRegionPresenceVerifier::VerifiedDestinationResponder::error(U32 status, const std::string& reason)
  131. {
  132. if(mRetryCount > 0)
  133. {
  134. retry();
  135. }
  136. else
  137. {
  138. llwarns << "Failed to contact simulator for verification. Region: " << mUri << llendl;
  139. mSharedData->onRegionVerificationFailed();
  140. }
  141. }