summaryrefslogtreecommitdiff
path: root/indra/newview/llviewerregion.cpp
diff options
context:
space:
mode:
authorSteven Bennetts <steve@lindenlab.com>2008-06-06 22:43:38 +0000
committerSteven Bennetts <steve@lindenlab.com>2008-06-06 22:43:38 +0000
commitad332810078a0bbb8fa08fcbfdf3d756de6914f6 (patch)
tree1608b2db5d620d323673607ea7ddadfba9d58bda /indra/newview/llviewerregion.cpp
parenta7d9a543e587ffe84b355db7a2e8193bfe6c68b6 (diff)
QAR-650 - Viewer RC 9 merge -> release (post cmake)
merge release@88802 Branch_1-20-Viewer-2-merge-1@89178 -> release
Diffstat (limited to 'indra/newview/llviewerregion.cpp')
-rw-r--r--indra/newview/llviewerregion.cpp160
1 files changed, 74 insertions, 86 deletions
diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp
index f5ea73f1fc..b847f4d04c 100644
--- a/indra/newview/llviewerregion.cpp
+++ b/indra/newview/llviewerregion.cpp
@@ -76,7 +76,74 @@ extern BOOL gNoRender;
const F32 WATER_TEXTURE_SCALE = 8.f; // Number of times to repeat the water texture across a region
const S16 MAX_MAP_DIST = 10;
+class BaseCapabilitiesComplete : public LLHTTPClient::Responder
+{
+ LOG_CLASS(BaseCapabilitiesComplete);
+public:
+ BaseCapabilitiesComplete(LLViewerRegion* region)
+ : mRegion(region)
+ { }
+ virtual ~BaseCapabilitiesComplete()
+ {
+ if(mRegion)
+ {
+ mRegion->setHttpResponderPtrNULL() ;
+ }
+ }
+ void setRegion(LLViewerRegion* region)
+ {
+ mRegion = region ;
+ }
+
+ void error(U32 statusNum, const std::string& reason)
+ {
+ LL_WARNS2("AppInit", "Capabilities") << statusNum << ": " << reason << LL_ENDL;
+
+ if (STATE_SEED_GRANTED_WAIT == LLStartUp::getStartupState())
+ {
+ LLStartUp::setStartupState( STATE_SEED_CAP_GRANTED );
+ }
+ }
+
+ void result(const LLSD& content)
+ {
+ if(!mRegion || this != mRegion->getHttpResponderPtr())//region is removed or responder is not created.
+ {
+ return ;
+ }
+
+ LLSD::map_const_iterator iter;
+ for(iter = content.beginMap(); iter != content.endMap(); ++iter)
+ {
+ mRegion->setCapability(iter->first, iter->second);
+ LL_DEBUGS2("AppInit", "Capabilities") << "got capability for "
+ << iter->first << LL_ENDL;
+
+ /* HACK we're waiting for the ServerReleaseNotes */
+ if ((iter->first == "ServerReleaseNotes") && (LLFloaterReleaseMsg::sDisplayMessage))
+ {
+ LLFloaterReleaseMsg::show();
+ LLFloaterReleaseMsg::sDisplayMessage = false;
+ }
+ }
+
+ if (STATE_SEED_GRANTED_WAIT == LLStartUp::getStartupState())
+ {
+ LLStartUp::setStartupState( STATE_SEED_CAP_GRANTED );
+ }
+ }
+
+ static boost::intrusive_ptr<BaseCapabilitiesComplete> build(
+ LLViewerRegion* region)
+ {
+ return boost::intrusive_ptr<BaseCapabilitiesComplete>(
+ new BaseCapabilitiesComplete(region));
+ }
+
+private:
+ LLViewerRegion* mRegion;
+};
LLViewerRegion::LLViewerRegion(const U64 &handle,
@@ -103,7 +170,6 @@ LLViewerRegion::LLViewerRegion(const U64 &handle,
mEventPoll(NULL)
{
mWidth = region_width_meters;
-
mOriginGlobal = from_region_handle(handle);
updateRenderMatrix();
@@ -170,10 +236,13 @@ void LLViewerRegion::initStats()
mAlive = FALSE; // can become false if circuit disconnects
}
-
-
LLViewerRegion::~LLViewerRegion()
{
+ if(mHttpResponderPtr)
+ {
+ (static_cast<BaseCapabilitiesComplete*>(mHttpResponderPtr.get()))->setRegion(NULL) ;
+ }
+
gVLManager.cleanupData(this);
// Can't do this on destruction, because the neighbor pointers might be invalid.
// This should be reference counted...
@@ -1303,87 +1372,6 @@ void LLViewerRegion::unpackRegionHandshake()
msg->sendReliable(host);
}
-
-
-class BaseCapabilitiesComplete : public LLHTTPClient::Responder
-{
- LOG_CLASS(BaseCapabilitiesComplete);
-public:
- BaseCapabilitiesComplete(LLViewerRegion* region, LLSD requestedCaps)
- : mRegion(region),
- mRequestedCaps(requestedCaps)
- { }
-
- void error(U32 statusNum, const std::string& reason)
- {
- LL_WARNS2("AppInit", "Capabilities") << statusNum << ": " << reason << LL_ENDL;
-
- if (STATE_SEED_GRANTED_WAIT == LLStartUp::getStartupState())
- {
- LLStartUp::setStartupState( STATE_SEED_CAP_GRANTED );
- }
- }
-
- void result(const LLSD& content)
- {
- LLSD::map_const_iterator iter;
-
- for(iter = content.beginMap(); iter != content.endMap(); ++iter)
- {
- if (iter->second.asString().empty())
- {
- llwarns << "BaseCapabilitiesComplete::result EMPTY capability "
- << iter->first << llendl;
- continue;
- }
-
- mRegion->setCapability(iter->first, iter->second);
- LL_DEBUGS2("AppInit", "Capabilities") << "got capability for "
- << iter->first << LL_ENDL;
-
- /* HACK we're waiting for the ServerReleaseNotes */
- if ((iter->first == "ServerReleaseNotes") && (LLFloaterReleaseMsg::sDisplayMessage))
- {
- LLFloaterReleaseMsg::show();
- LLFloaterReleaseMsg::sDisplayMessage = false;
- }
- }
-
- LLSD::array_const_iterator fail;
- for (fail = mRequestedCaps.beginArray();
- fail != mRequestedCaps.endArray();
- ++fail)
- {
- std::string cap = fail->asString();
-
- if (mRegion->getCapability(cap).empty() &&
- !LLViewerRegion::isSpecialCapabilityName(cap))
- {
- llwarns << "BaseCapabilitiesComplete::result FAILED to get "
- << "capability " << cap << llendl;
- }
- }
-
- if (STATE_SEED_GRANTED_WAIT == LLStartUp::getStartupState())
- {
- LLStartUp::setStartupState( STATE_SEED_CAP_GRANTED );
- }
- }
-
- static boost::intrusive_ptr<BaseCapabilitiesComplete> build(
- LLViewerRegion* region,
- LLSD requestedCaps)
- {
- return boost::intrusive_ptr<BaseCapabilitiesComplete>(
- new BaseCapabilitiesComplete(region, requestedCaps));
- }
-
-private:
- LLViewerRegion* mRegion;
- LLSD mRequestedCaps;
-};
-
-
void LLViewerRegion::setSeedCapability(const std::string& url)
{
if (getCapability("Seed") == url)
@@ -1435,8 +1423,8 @@ void LLViewerRegion::setSeedCapability(const std::string& url)
llinfos << "posting to seed " << url << llendl;
- LLHTTPClient::post(url, capabilityNames,
- BaseCapabilitiesComplete::build(this, capabilityNames));
+ mHttpResponderPtr = BaseCapabilitiesComplete::build(this) ;
+ LLHTTPClient::post(url, capabilityNames, mHttpResponderPtr);
}
void LLViewerRegion::setCapability(const std::string& name, const std::string& url)