From c7fcaa8e5b84b7bef8d30c6d0a9e0fbfecd16cf0 Mon Sep 17 00:00:00 2001 From: Lirusaito Date: Wed, 13 Feb 2013 03:04:29 -0500 Subject: [PATCH] Add setFeaturesReceivedCallback for when SimulatorFeatures cap is received --- indra/newview/llviewerregion.cpp | 22 ++++++++++++++++++++++ indra/newview/llviewerregion.h | 6 ++++++ 2 files changed, 28 insertions(+) diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp index 0bd16dcdf..4638a1522 100644 --- a/indra/newview/llviewerregion.cpp +++ b/indra/newview/llviewerregion.cpp @@ -308,6 +308,7 @@ LLViewerRegion::LLViewerRegion(const U64 &handle, mCacheDirty(FALSE), mReleaseNotesRequested(FALSE), mCapabilitiesReceived(false), + mFeaturesReceived(false), mGamingFlags(0) { mWidth = region_width_meters; @@ -1250,6 +1251,10 @@ void LLViewerRegion::setSimulatorFeatures(const LLSD& sim_features) LLSDSerialize::toPrettyXML(sim_features, str); llinfos << str.str() << llendl; mSimulatorFeatures = sim_features; + + mFeaturesReceived = true; + mFeaturesReceivedSignal(getRegionID()); + mFeaturesReceivedSignal.disconnect_all_slots(); } void LLViewerRegion::setGamingData(const LLSD& gaming_data) @@ -1872,6 +1877,9 @@ void LLViewerRegion::setCapability(const std::string& name, const std::string& u } else if (name == "SimulatorFeatures") { + // although this is not needed later, add it so we can check if the sim supports it at all later + mImpl->mCapabilities[name] = url; + // kick off a request for simulator features LLHTTPClient::get(url, new SimulatorFeaturesReceived(url, getHandle())); } @@ -1929,6 +1937,15 @@ void LLViewerRegion::setCapabilitiesReceived(bool received) // This is a single-shot signal. Forget callbacks to save resources. mCapabilitiesReceivedSignal.disconnect_all_slots(); + + // If we don't have this cap, send the changed signal to simplify code + // in consumers by allowing them to expect this signal, regardless. + if (getCapability("SimulatorFeatures").empty()) + { + mFeaturesReceived = true; + mFeaturesReceivedSignal(getRegionID()); + mFeaturesReceivedSignal.disconnect_all_slots(); + } } } @@ -2046,3 +2063,8 @@ bool LLViewerRegion::dynamicPathfindingEnabled() const mSimulatorFeatures["DynamicPathfindingEnabled"].asBoolean()); } +boost::signals2::connection LLViewerRegion::setFeaturesReceivedCallback(const features_received_signal_t::slot_type& cb) +{ + return mFeaturesReceivedSignal.connect(cb); +} + diff --git a/indra/newview/llviewerregion.h b/indra/newview/llviewerregion.h index b3526560f..821b87a5d 100644 --- a/indra/newview/llviewerregion.h +++ b/indra/newview/llviewerregion.h @@ -100,6 +100,7 @@ public: } eObjectPartitions; typedef boost::signals2::signal caps_received_signal_t; + typedef boost::signals2::signal features_received_signal_t; LLViewerRegion(const U64 &handle, const LLHost &host, @@ -262,6 +263,9 @@ public: static bool isSpecialCapabilityName(const std::string &name); void logActiveCapabilities() const; + boost::signals2::connection setFeaturesReceivedCallback(const features_received_signal_t::slot_type& cb); + bool getFeaturesReceived() const { return mFeaturesReceived; } + /// Get LLEventPump on which we listen for capability requests /// (https://wiki.lindenlab.com/wiki/Viewer:Messaging/Messaging_Notes#Capabilities) LLEventPump& getCapAPI() const; @@ -442,7 +446,9 @@ private: bool mAlive; // can become false if circuit disconnects bool mCapabilitiesReceived; + bool mFeaturesReceived; caps_received_signal_t mCapabilitiesReceivedSignal; + features_received_signal_t mFeaturesReceivedSignal; BOOL mReleaseNotesRequested;