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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llremoteparcelrequest.cpp
  3.  * @author Sam Kolb
  4.  * @brief Get information about a parcel you aren't standing in to display
  5.  * landmark/teleport information.
  6.  *
  7.  * $LicenseInfo:firstyear=2007&license=viewergpl$
  8.  * 
  9.  * Copyright (c) 2007-2010, Linden Research, Inc.
  10.  * 
  11.  * Second Life Viewer Source Code
  12.  * The source code in this file ("Source Code") is provided by Linden Lab
  13.  * to you under the terms of the GNU General Public License, version 2.0
  14.  * ("GPL"), unless you have obtained a separate licensing agreement
  15.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  16.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  17.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  18.  * 
  19.  * There are special exceptions to the terms and conditions of the GPL as
  20.  * it is applied to this Source Code. View the full text of the exception
  21.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  22.  * online at
  23.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  24.  * 
  25.  * By copying, modifying or distributing this software, you acknowledge
  26.  * that you have read and understood your obligations described above,
  27.  * and agree to abide by those obligations.
  28.  * 
  29.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  30.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  31.  * COMPLETENESS OR PERFORMANCE.
  32.  * $/LicenseInfo$
  33.  */
  34. #include "llviewerprecompiledheaders.h"
  35. #include "message.h"
  36. #include "llpanelplace.h"
  37. #include "llpanel.h"
  38. #include "llhttpclient.h"
  39. #include "llsdserialize.h"
  40. #include "llviewerregion.h"
  41. #include "llview.h"
  42. #include "llagent.h"
  43. #include "llremoteparcelrequest.h"
  44. LLRemoteParcelRequestResponder::LLRemoteParcelRequestResponder(LLHandle<LLRemoteParcelInfoObserver> observer_handle)
  45.  : mObserverHandle(observer_handle)
  46. {}
  47. //If we get back a normal response, handle it here
  48. //virtual
  49. void LLRemoteParcelRequestResponder::result(const LLSD& content)
  50. {
  51. LLUUID parcel_id = content["parcel_id"];
  52. // Panel inspecting the information may be closed and destroyed
  53. // before this response is received.
  54. LLRemoteParcelInfoObserver* observer = mObserverHandle.get();
  55. if (observer)
  56. {
  57. observer->setParcelID(parcel_id);
  58. }
  59. }
  60. //If we get back an error (not found, etc...), handle it here
  61. //virtual
  62. void LLRemoteParcelRequestResponder::error(U32 status, const std::string& reason)
  63. {
  64. llinfos << "LLRemoteParcelRequest::error("
  65. << status << ": " << reason << ")" << llendl;
  66. // Panel inspecting the information may be closed and destroyed
  67. // before this response is received.
  68. LLRemoteParcelInfoObserver* observer = mObserverHandle.get();
  69. if (observer)
  70. {
  71. observer->setErrorStatus(status, reason);
  72. }
  73. }
  74. void LLRemoteParcelInfoProcessor::addObserver(const LLUUID& parcel_id, LLRemoteParcelInfoObserver* observer)
  75. {
  76. // Check if the observer is already in observers list for this UUID
  77. observer_multimap_t::iterator it;
  78. it = mObservers.find(parcel_id);
  79. while (it != mObservers.end())
  80. {
  81. if (it->second == observer)
  82. {
  83. return;
  84. }
  85. else
  86. {
  87. ++it;
  88. }
  89. }
  90. mObservers.insert(std::pair<LLUUID, LLRemoteParcelInfoObserver*>(parcel_id, observer));
  91. }
  92. void LLRemoteParcelInfoProcessor::removeObserver(const LLUUID& parcel_id, LLRemoteParcelInfoObserver* observer)
  93. {
  94. if (!observer)
  95. {
  96. return;
  97. }
  98. observer_multimap_t::iterator it;
  99. it = mObservers.find(parcel_id);
  100. while (it != mObservers.end())
  101. {
  102. if (it->second == observer)
  103. {
  104. mObservers.erase(it);
  105. break;
  106. }
  107. else
  108. {
  109. ++it;
  110. }
  111. }
  112. }
  113. //static
  114. void LLRemoteParcelInfoProcessor::processParcelInfoReply(LLMessageSystem* msg, void**)
  115. {
  116. LLParcelData parcel_data;
  117. msg->getUUID ("Data", "ParcelID", parcel_data.parcel_id);
  118. msg->getUUID ("Data", "OwnerID", parcel_data.owner_id);
  119. msg->getString ("Data", "Name", parcel_data.name);
  120. msg->getString ("Data", "Desc", parcel_data.desc);
  121. msg->getS32 ("Data", "ActualArea", parcel_data.actual_area);
  122. msg->getS32 ("Data", "BillableArea", parcel_data.billable_area);
  123. msg->getU8 ("Data", "Flags", parcel_data.flags);
  124. msg->getF32 ("Data", "GlobalX", parcel_data.global_x);
  125. msg->getF32 ("Data", "GlobalY", parcel_data.global_y);
  126. msg->getF32 ("Data", "GlobalZ", parcel_data.global_z);
  127. msg->getString ("Data", "SimName", parcel_data.sim_name);
  128. msg->getUUID ("Data", "SnapshotID", parcel_data.snapshot_id);
  129. msg->getF32 ("Data", "Dwell", parcel_data.dwell);
  130. msg->getS32 ("Data", "SalePrice", parcel_data.sale_price);
  131. msg->getS32 ("Data", "AuctionID", parcel_data.auction_id);
  132. LLRemoteParcelInfoProcessor::observer_multimap_t observers = LLRemoteParcelInfoProcessor::getInstance()->mObservers;
  133. observer_multimap_t::iterator oi = observers.find(parcel_data.parcel_id);
  134. observer_multimap_t::iterator end = observers.upper_bound(parcel_data.parcel_id);
  135. for (; oi != end; ++oi)
  136. {
  137. oi->second->processParcelInfo(parcel_data);
  138. }
  139. }
  140. void LLRemoteParcelInfoProcessor::sendParcelInfoRequest(const LLUUID& parcel_id)
  141. {
  142. LLMessageSystem *msg = gMessageSystem;
  143. msg->newMessage("ParcelInfoRequest");
  144. msg->nextBlockFast(_PREHASH_AgentData);
  145. msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID() );
  146. msg->addUUID("SessionID", gAgent.getSessionID());
  147. msg->nextBlock("Data");
  148. msg->addUUID("ParcelID", parcel_id);
  149. gAgent.sendReliableMessage();
  150. }