diff options
Diffstat (limited to 'indra')
181 files changed, 2792 insertions, 1985 deletions
| diff --git a/indra/llaudio/llaudioengine.cpp b/indra/llaudio/llaudioengine.cpp index e0ebbb76bd..9e897a7ce8 100644 --- a/indra/llaudio/llaudioengine.cpp +++ b/indra/llaudio/llaudioengine.cpp @@ -276,7 +276,7 @@ void LLAudioEngine::idle(F32 max_decode_time)  		{  			// The source is done playing, clean it up.  			delete sourcep; -			mAllSources.erase(iter++); +            iter = mAllSources.erase(iter);  			continue;  		} @@ -827,7 +827,8 @@ void LLAudioEngine::triggerSound(const LLUUID &audio_uuid, const LLUUID& owner_i  	addAudioSource(asp);  	if (pos_global.isExactlyZero())  	{ -		asp->setAmbient(true); +		// For sound preview and UI +		asp->setForcedPriority(true);  	}  	else  	{ @@ -1273,7 +1274,7 @@ LLAudioSource::LLAudioSource(const LLUUID& id, const LLUUID& owner_id, const F32  	mPriority(0.f),  	mGain(gain),  	mSourceMuted(false), -	mAmbient(false), +	mForcedPriority(false),  	mLoop(false),  	mSyncMaster(false),  	mSyncSlave(false), @@ -1339,7 +1340,7 @@ void LLAudioSource::update()  void LLAudioSource::updatePriority()  { -	if (isAmbient()) +	if (isForcedPriority())  	{  		mPriority = 1.f;  	} diff --git a/indra/llaudio/llaudioengine.h b/indra/llaudio/llaudioengine.h index b5fd4c27a1..e12fb970ca 100644 --- a/indra/llaudio/llaudioengine.h +++ b/indra/llaudio/llaudioengine.h @@ -266,8 +266,8 @@ public:  	void addAudioData(LLAudioData *adp, bool set_current = TRUE); -	void setAmbient(const bool ambient)						{ mAmbient = ambient; } -	bool isAmbient() const									{ return mAmbient; } +	void setForcedPriority(const bool ambient)						{ mForcedPriority = ambient; } +	bool isForcedPriority() const									{ return mForcedPriority; }  	void setLoop(const bool loop)							{ mLoop = loop; }  	bool isLoop() const										{ return mLoop; } @@ -326,7 +326,7 @@ protected:  	F32				mPriority;  	F32				mGain;  	bool			mSourceMuted; -	bool			mAmbient; +	bool			mForcedPriority; // ignore mute, set high priority, researved for sound preview and UI  	bool			mLoop;  	bool			mSyncMaster;  	bool			mSyncSlave; diff --git a/indra/llaudio/llaudioengine_fmodstudio.cpp b/indra/llaudio/llaudioengine_fmodstudio.cpp index b0c87b0208..e5752d3dad 100644 --- a/indra/llaudio/llaudioengine_fmodstudio.cpp +++ b/indra/llaudio/llaudioengine_fmodstudio.cpp @@ -519,9 +519,9 @@ void LLAudioChannelFMODSTUDIO::update3DPosition()          return;      } -    if (mCurrentSourcep->isAmbient()) +    if (mCurrentSourcep->isForcedPriority())      { -        // Ambient sound, don't need to do any positional updates. +        // Prioritized UI and preview sounds don't need to do any positional updates.          set3DMode(false);      }      else diff --git a/indra/llaudio/llaudioengine_openal.cpp b/indra/llaudio/llaudioengine_openal.cpp index 3bdd0302ee..305aa1ecb5 100644 --- a/indra/llaudio/llaudioengine_openal.cpp +++ b/indra/llaudio/llaudioengine_openal.cpp @@ -297,7 +297,7 @@ void LLAudioChannelOpenAL::update3DPosition()  	{  		return;  	} -	if (mCurrentSourcep->isAmbient()) +	if (mCurrentSourcep->isForcedPriority())  	{  		alSource3f(mALSource, AL_POSITION, 0.0, 0.0, 0.0);  		alSource3f(mALSource, AL_VELOCITY, 0.0, 0.0, 0.0); diff --git a/indra/llaudio/llstreamingaudio_fmodstudio.cpp b/indra/llaudio/llstreamingaudio_fmodstudio.cpp index 1ad29a3f59..85577992a6 100644 --- a/indra/llaudio/llstreamingaudio_fmodstudio.cpp +++ b/indra/llaudio/llstreamingaudio_fmodstudio.cpp @@ -70,7 +70,11 @@ mRetryCount(0)      // Must be larger than the usual Second Life frame stutter time.      const U32 buffer_seconds = 10;		//sec      const U32 estimated_bitrate = 128;	//kbit/sec -    mSystem->setStreamBufferSize(estimated_bitrate * buffer_seconds * 128/*bytes/kbit*/, FMOD_TIMEUNIT_RAWBYTES); +    FMOD_RESULT result = mSystem->setStreamBufferSize(estimated_bitrate * buffer_seconds * 128/*bytes/kbit*/, FMOD_TIMEUNIT_RAWBYTES); +    if (result != FMOD_OK) +    { +        LL_WARNS("FMOD") << "setStreamBufferSize error: " << FMOD_ErrorString(result) << LL_ENDL; +    }      // Here's where we set the size of the network buffer and some buffering       // parameters.  In this case we want a network buffer of 16k, we want it  @@ -134,7 +138,7 @@ void LLStreamingAudio_FMODSTUDIO::killDeadStreams()          {              LL_INFOS("FMOD") << "Closed dead stream" << LL_ENDL;              delete streamp; -            mDeadStreams.erase(iter++); +            iter = mDeadStreams.erase(iter);          }          else          { @@ -404,7 +408,11 @@ FMOD::Channel *LLAudioStreamManagerFMODSTUDIO::startStream()      if (mStreamChannel)          return mStreamChannel;	//Already have a channel for this stream. -    mSystem->playSound(mInternetStream, NULL, true, &mStreamChannel); +    FMOD_RESULT result = mSystem->playSound(mInternetStream, NULL, true, &mStreamChannel); +    if (result != FMOD_OK) +    { +        LL_WARNS("FMOD") << FMOD_ErrorString(result) << LL_ENDL; +    }      return mStreamChannel;  } @@ -445,16 +453,29 @@ bool LLAudioStreamManagerFMODSTUDIO::stopStream()  FMOD_OPENSTATE LLAudioStreamManagerFMODSTUDIO::getOpenState(unsigned int* percentbuffered, bool* starving, bool* diskbusy)  {      FMOD_OPENSTATE state; -    mInternetStream->getOpenState(&state, percentbuffered, starving, diskbusy); +    FMOD_RESULT result = mInternetStream->getOpenState(&state, percentbuffered, starving, diskbusy); +    if (result != FMOD_OK) +    { +        LL_WARNS("FMOD") << FMOD_ErrorString(result) << LL_ENDL; +    }      return state;  }  void LLStreamingAudio_FMODSTUDIO::setBufferSizes(U32 streambuffertime, U32 decodebuffertime)  { -    mSystem->setStreamBufferSize(streambuffertime / 1000 * 128 * 128, FMOD_TIMEUNIT_RAWBYTES); +    FMOD_RESULT result = mSystem->setStreamBufferSize(streambuffertime / 1000 * 128 * 128, FMOD_TIMEUNIT_RAWBYTES); +    if (result != FMOD_OK) +    { +        LL_WARNS("FMOD") << "setStreamBufferSize error: " << FMOD_ErrorString(result) << LL_ENDL; +        return; +    }      FMOD_ADVANCEDSETTINGS settings;      memset(&settings, 0, sizeof(settings));      settings.cbSize = sizeof(settings);      settings.defaultDecodeBufferSize = decodebuffertime;//ms -    mSystem->setAdvancedSettings(&settings); +    result = mSystem->setAdvancedSettings(&settings); +    if (result != FMOD_OK) +    { +        LL_WARNS("FMOD") << "setAdvancedSettings error: " << FMOD_ErrorString(result) << LL_ENDL; +    }  } diff --git a/indra/llcharacter/llbvhloader.cpp b/indra/llcharacter/llbvhloader.cpp index e906d81ce1..c38614b0b4 100644 --- a/indra/llcharacter/llbvhloader.cpp +++ b/indra/llcharacter/llbvhloader.cpp @@ -44,6 +44,14 @@ using namespace std;  #define INCHES_TO_METERS 0.02540005f +/// The .bvh does not have a formal spec, and different readers interpret things in their own way. +/// In OUR usage, frame 0 is used in optimization and is not considered to be part of the animation. +const S32 NUMBER_OF_IGNORED_FRAMES_AT_START = 1; +/// In our usage, the last frame is used only to indicate what the penultimate frame should be interpolated towards. +///  I.e., the animation only plays up to the start of the last frame. There is no hold or exptrapolation past that point.. +/// Thus there are two frame of the total that do not contribute to the total running time of the animation. +const S32 NUMBER_OF_UNPLAYED_FRAMES = NUMBER_OF_IGNORED_FRAMES_AT_START + 1; +  const F32 POSITION_KEYFRAME_THRESHOLD_SQUARED = 0.03f * 0.03f;  const F32 ROTATION_KEYFRAME_THRESHOLD = 0.01f; @@ -865,7 +873,10 @@ ELoadStatus LLBVHLoader::loadBVHFile(const char *buffer, char* error_text, S32 &  		return E_ST_NO_FRAME_TIME;  	} -	mDuration = (F32)mNumFrames * mFrameTime; +	// If the user only supplies one animation frame (after the ignored reference frame 0), hold for mFrameTime. +	// If the user supples exactly one total frame, it isn't clear if that is a pose or reference frame, and the +	// behavior is not defined. In this case, retain historical undefined behavior. +	mDuration = llmax((F32)(mNumFrames - NUMBER_OF_UNPLAYED_FRAMES), 1.0f) * mFrameTime;  	if (!mLoop)  	{  		mLoopOutPoint = mDuration; @@ -1355,12 +1366,13 @@ BOOL LLBVHLoader::serialize(LLDataPacker& dp)  		LLQuaternion::Order order = bvhStringToOrder( joint->mOrder );  		S32 outcount = 0; -		S32 frame = 1; +		S32 frame = 0;  		for (	ki = joint->mKeys.begin();  				ki != joint->mKeys.end();  				++ki )  		{ -			if ((frame == 1) && joint->mRelativeRotationKey) + +			if ((frame == 0) && joint->mRelativeRotationKey)  			{  				first_frame_rot = mayaQ( ki->mRot[0], ki->mRot[1], ki->mRot[2], order); @@ -1373,7 +1385,7 @@ BOOL LLBVHLoader::serialize(LLDataPacker& dp)  				continue;  			} -			time = (F32)frame * mFrameTime; +			time = llmax((F32)(frame - NUMBER_OF_IGNORED_FRAMES_AT_START), 0.0f) * mFrameTime; // Time elapsed before this frame starts.  			if (mergeParent)  			{ @@ -1433,12 +1445,12 @@ BOOL LLBVHLoader::serialize(LLDataPacker& dp)  			LLVector3 relPos = joint->mRelativePosition;  			LLVector3 relKey; -			frame = 1; +			frame = 0;  			for (	ki = joint->mKeys.begin();  					ki != joint->mKeys.end();  					++ki )  			{ -				if ((frame == 1) && joint->mRelativePositionKey) +				if ((frame == 0) && joint->mRelativePositionKey)  				{  					relKey.setVec(ki->mPos);  				} @@ -1449,7 +1461,7 @@ BOOL LLBVHLoader::serialize(LLDataPacker& dp)  					continue;  				} -				time = (F32)frame * mFrameTime; +				time = llmax((F32)(frame - NUMBER_OF_IGNORED_FRAMES_AT_START), 0.0f) * mFrameTime; // Time elapsed before this frame starts.  				LLVector3 inPos = (LLVector3(ki->mPos) - relKey) * ~first_frame_rot;// * fixup_rot;  				LLVector3 outPos = inPos * frameRot * offsetRot; diff --git a/indra/llcommon/llalignedarray.h b/indra/llcommon/llalignedarray.h index b68e9e0f82..da9d98c16c 100644 --- a/indra/llcommon/llalignedarray.h +++ b/indra/llcommon/llalignedarray.h @@ -116,14 +116,20 @@ void LLAlignedArray<T, alignment>::resize(U32 size)  template <class T, U32 alignment>  T& LLAlignedArray<T, alignment>::operator[](int idx)  { -	llassert(idx < mElementCount); +	if(idx >= mElementCount || idx < 0) +    { +        LL_ERRS() << "Out of bounds LLAlignedArray, requested: " << (S32)idx << " size: " << mElementCount << LL_ENDL; +    }  	return mArray[idx];  }  template <class T, U32 alignment>  const T& LLAlignedArray<T, alignment>::operator[](int idx) const  { -	llassert(idx < mElementCount); +    if (idx >= mElementCount || idx < 0) +    { +        LL_ERRS() << "Out of bounds LLAlignedArray, requested: " << (S32)idx << " size: " << mElementCount << LL_ENDL; +    }  	return mArray[idx];  } diff --git a/indra/llcommon/llcoros.cpp b/indra/llcommon/llcoros.cpp index c2d353b0fc..14bfb98629 100644 --- a/indra/llcommon/llcoros.cpp +++ b/indra/llcommon/llcoros.cpp @@ -35,6 +35,7 @@  // STL headers  // std headers  #include <atomic> +#include <stdexcept>  // external library headers  #include <boost/bind.hpp>  #include <boost/fiber/fiber.hpp> @@ -214,6 +215,22 @@ std::string LLCoros::logname()      return data.mName.empty()? data.getKey() : data.mName;  } +void LLCoros::saveException(const std::string& name, std::exception_ptr exc) +{ +    mExceptionQueue.emplace(name, exc); +} + +void LLCoros::rethrow() +{ +    if (! mExceptionQueue.empty()) +    { +        ExceptionData front = mExceptionQueue.front(); +        mExceptionQueue.pop(); +        LL_WARNS("LLCoros") << "Rethrowing exception from coroutine " << front.name << LL_ENDL; +        std::rethrow_exception(front.exception); +    } +} +  void LLCoros::setStackSize(S32 stacksize)  {      LL_DEBUGS("LLCoros") << "Setting coroutine stack size to " << stacksize << LL_ENDL; @@ -302,11 +319,11 @@ U32 cpp_exception_filter(U32 code, struct _EXCEPTION_POINTERS *exception_infop,      }  } -void LLCoros::winlevel(const std::string& name, const callable_t& callable) +void LLCoros::sehHandle(const std::string& name, const LLCoros::callable_t& callable)  {      __try      { -        toplevelTryWrapper(name, callable); +        LLCoros::toplevelTryWrapper(name, callable);      }      __except (cpp_exception_filter(GetExceptionCode(), GetExceptionInformation(), name))      { @@ -321,7 +338,6 @@ void LLCoros::winlevel(const std::string& name, const callable_t& callable)          throw std::exception(integer_string);      }  } -  #endif  void LLCoros::toplevelTryWrapper(const std::string& name, const callable_t& callable) @@ -350,11 +366,19 @@ void LLCoros::toplevelTryWrapper(const std::string& name, const callable_t& call      }      catch (...)      { +#if LL_WINDOWS          // Any OTHER kind of uncaught exception will cause the viewer to -        // crash, hopefully informatively. +        // crash, SEH handling should catch it and report to bugsplat.          LOG_UNHANDLED_EXCEPTION(STRINGIZE("coroutine " << name));          // to not modify callstack          throw; +#else +        // Stash any OTHER kind of uncaught exception in the rethrow() queue +        // to be rethrown by the main fiber. +        LL_WARNS("LLCoros") << "Capturing uncaught exception in coroutine " +                            << name << LL_ENDL; +        LLCoros::instance().saveException(name, std::current_exception()); +#endif      }  } @@ -364,8 +388,9 @@ void LLCoros::toplevelTryWrapper(const std::string& name, const callable_t& call  void LLCoros::toplevel(std::string name, callable_t callable)  {  #if LL_WINDOWS -    // Can not use __try in functions that require unwinding, so use one more wrapper -    winlevel(name, callable); +    // Because SEH can's have unwinding, need to call a wrapper +    // 'try' is inside SEH handling to not catch LLContinue +    sehHandle(name, callable);  #else      toplevelTryWrapper(name, callable);  #endif diff --git a/indra/llcommon/llcoros.h b/indra/llcommon/llcoros.h index a94cfca19f..dbff921f16 100644 --- a/indra/llcommon/llcoros.h +++ b/indra/llcommon/llcoros.h @@ -38,6 +38,8 @@  #include "llinstancetracker.h"  #include <boost/function.hpp>  #include <string> +#include <exception> +#include <queue>  // e.g. #include LLCOROS_MUTEX_HEADER  #define LLCOROS_MUTEX_HEADER   <boost/fiber/mutex.hpp> @@ -156,6 +158,19 @@ public:       * LLCoros::launch()).       */      static std::string getName(); +     +    /** +     * rethrow() is called by the thread's main fiber to propagate an +     * exception from any coroutine into the main fiber, where it can engage +     * the normal unhandled-exception machinery, up to and including crash +     * reporting. +     * +     * LLCoros maintains a queue of otherwise-uncaught exceptions from +     * terminated coroutines. Each call to rethrow() pops the first of those +     * and rethrows it. When the queue is empty (normal case), rethrow() is a +     * no-op. +     */ +    void rethrow();      /**       * This variation returns a name suitable for log messages: the explicit @@ -292,13 +307,27 @@ public:  private:      std::string generateDistinctName(const std::string& prefix) const; +    void toplevelTryWrapper(const std::string& name, const callable_t& callable);  #if LL_WINDOWS -    void winlevel(const std::string& name, const callable_t& callable); +    void sehHandle(const std::string& name, const callable_t& callable); // calls toplevelTryWrapper  #endif -    void toplevelTryWrapper(const std::string& name, const callable_t& callable); -    void toplevel(std::string name, callable_t callable); +    void toplevel(std::string name, callable_t callable); // calls sehHandle or toplevelTryWrapper      struct CoroData;      static CoroData& get_CoroData(const std::string& caller); +    void saveException(const std::string& name, std::exception_ptr exc); + +    struct ExceptionData +    { +        ExceptionData(const std::string& nm, std::exception_ptr exc): +            name(nm), +            exception(exc) +        {} +        // name of coroutine that originally threw this exception +        std::string name; +        // the thrown exception +        std::exception_ptr exception; +    }; +    std::queue<ExceptionData> mExceptionQueue;      S32 mStackSize; diff --git a/indra/llcommon/llprocessor.cpp b/indra/llcommon/llprocessor.cpp index 818df07bb2..4a1a81f083 100644 --- a/indra/llcommon/llprocessor.cpp +++ b/indra/llcommon/llprocessor.cpp @@ -118,7 +118,11 @@ namespace  		eMONTIOR_MWAIT=33,  		eCPLDebugStore=34,  		eThermalMonitor2=35, -		eAltivec=36 +		eAltivec=36, +        eSSE3S_Features = 37, +        eSSE4_1_Features = 38, +        eSSE4_2_Features = 39, +        eSSE4a_Features = 40,  	};  	const char* cpu_feature_names[] = @@ -161,7 +165,11 @@ namespace  		"CPL Qualified Debug Store",  		"Thermal Monitor 2", -		"Altivec" +		"Altivec", +        "SSE3S Instructions", +        "SSE4.1 Instructions", +        "SSE4.2 Instructions", +        "SSE4a Instructions",  	};  	std::string intel_CPUFamilyName(int composed_family)  @@ -250,6 +258,31 @@ public:  		return hasExtension(cpu_feature_names[eSSE2_Ext]);  	} +    bool hasSSE3() const +    { +        return hasExtension(cpu_feature_names[eSSE3_Features]); +    } + +    bool hasSSE3S() const +    { +        return hasExtension(cpu_feature_names[eSSE3S_Features]); +    } + +    bool hasSSE41() const +    { +        return hasExtension(cpu_feature_names[eSSE4_1_Features]); +    } + +    bool hasSSE42() const +    { +        return hasExtension(cpu_feature_names[eSSE4_2_Features]); +    } + +    bool hasSSE4a() const +    { +        return hasExtension(cpu_feature_names[eSSE4a_Features]); +    } +  	bool hasAltivec() const   	{  		return hasExtension("Altivec");  @@ -473,6 +506,12 @@ private:  		*((int*)(cpu_vendor+4)) = cpu_info[3];  		*((int*)(cpu_vendor+8)) = cpu_info[2];  		setInfo(eVendor, cpu_vendor); +        std::string cmp_vendor(cpu_vendor); +        bool is_amd = false; +        if (cmp_vendor == "AuthenticAMD") +        { +            is_amd = true; +        }  		// Get the information associated with each valid Id  		for(unsigned int i=0; i<=ids; ++i) @@ -504,6 +543,7 @@ private:  				if(cpu_info[2] & 0x8)  				{ +                    // intel specific SSE3 suplements  					setExtension(cpu_feature_names[eMONTIOR_MWAIT]);  				} @@ -516,7 +556,22 @@ private:  				{  					setExtension(cpu_feature_names[eThermalMonitor2]);  				} -						 + +                if (cpu_info[2] & 0x200) +                { +                    setExtension(cpu_feature_names[eSSE3S_Features]); +                } + +                if (cpu_info[2] & 0x80000) +                { +                    setExtension(cpu_feature_names[eSSE4_1_Features]); +                } + +                if (cpu_info[2] & 0x100000) +                { +                    setExtension(cpu_feature_names[eSSE4_2_Features]); +                } +  				unsigned int feature_info = (unsigned int) cpu_info[3];  				for(unsigned int index = 0, bit = 1; index < eSSE3_Features; ++index, bit <<= 1)  				{ @@ -543,8 +598,17 @@ private:  			__cpuid(cpu_info, i);  			// Interpret CPU brand string and cache information. -			if  (i == 0x80000002) -				memcpy(cpu_brand_string, cpu_info, sizeof(cpu_info)); +            if (i == 0x80000001) +            { +                if (is_amd) +                { +                    setExtension(cpu_feature_names[eSSE4a_Features]); +                } +            } +            else if (i == 0x80000002) +            { +                memcpy(cpu_brand_string, cpu_info, sizeof(cpu_info)); +            }  			else if  (i == 0x80000003)  				memcpy(cpu_brand_string + 16, cpu_info, sizeof(cpu_info));  			else if  (i == 0x80000004) @@ -690,6 +754,41 @@ private:  		uint64_t ext_feature_info = getSysctlInt64("machdep.cpu.extfeature_bits");  		S32 *ext_feature_infos = (S32*)(&ext_feature_info);  		setConfig(eExtFeatureBits, ext_feature_infos[0]); + + +        char cpu_features[1024]; +        len = sizeof(cpu_features); +        memset(cpu_features, 0, len); +        sysctlbyname("machdep.cpu.features", (void*)cpu_features, &len, NULL, 0); + +        std::string cpu_features_str(cpu_features); +        cpu_features_str = " " + cpu_features_str + " "; + +        if (cpu_features_str.find(" SSE3 ") != std::string::npos) +        { +            setExtension(cpu_feature_names[eSSE3_Features]); +        } + +        if (cpu_features_str.find(" SSSE3 ") != std::string::npos) +        { +            setExtension(cpu_feature_names[eSSE3S_Features]); +        } + +        if (cpu_features_str.find(" SSE4.1 ") != std::string::npos) +        { +            setExtension(cpu_feature_names[eSSE4_1_Features]); +        } + +        if (cpu_features_str.find(" SSE4.2 ") != std::string::npos) +        { +            setExtension(cpu_feature_names[eSSE4_2_Features]); +        } + +        if (cpu_features_str.find(" SSE4A ") != std::string::npos) +        { +            // Not supposed to happen? +            setExtension(cpu_feature_names[eSSE4a_Features]); +        }  	}  }; @@ -800,6 +899,31 @@ private:  		{  			setExtension(cpu_feature_names[eSSE2_Ext]);  		} + +        if (flags.find(" pni ") != std::string::npos) +        { +            setExtension(cpu_feature_names[eSSE3_Features]); +        } + +        if (flags.find(" ssse3 ") != std::string::npos) +        { +            setExtension(cpu_feature_names[eSSE3S_Features]); +        } + +        if (flags.find(" sse4_1 ") != std::string::npos) +        { +            setExtension(cpu_feature_names[eSSE4_1_Features]); +        } + +        if (flags.find(" sse4_2 ") != std::string::npos) +        { +            setExtension(cpu_feature_names[eSSE4_2_Features]); +        } + +        if (flags.find(" sse4a ") != std::string::npos) +        { +            setExtension(cpu_feature_names[eSSE4a_Features]); +        }  # endif // LL_X86  	} @@ -860,6 +984,11 @@ LLProcessorInfo::~LLProcessorInfo() {}  F64MegahertzImplicit LLProcessorInfo::getCPUFrequency() const { return mImpl->getCPUFrequency(); }  bool LLProcessorInfo::hasSSE() const { return mImpl->hasSSE(); }  bool LLProcessorInfo::hasSSE2() const { return mImpl->hasSSE2(); } +bool LLProcessorInfo::hasSSE3() const { return mImpl->hasSSE3(); } +bool LLProcessorInfo::hasSSE3S() const { return mImpl->hasSSE3S(); } +bool LLProcessorInfo::hasSSE41() const { return mImpl->hasSSE41(); } +bool LLProcessorInfo::hasSSE42() const { return mImpl->hasSSE42(); } +bool LLProcessorInfo::hasSSE4a() const { return mImpl->hasSSE4a(); }  bool LLProcessorInfo::hasAltivec() const { return mImpl->hasAltivec(); }  std::string LLProcessorInfo::getCPUFamilyName() const { return mImpl->getCPUFamilyName(); }  std::string LLProcessorInfo::getCPUBrandName() const { return mImpl->getCPUBrandName(); } diff --git a/indra/llcommon/llprocessor.h b/indra/llcommon/llprocessor.h index b77eb22c3a..1a473ddc97 100644 --- a/indra/llcommon/llprocessor.h +++ b/indra/llcommon/llprocessor.h @@ -54,6 +54,11 @@ public:  	F64MegahertzImplicit getCPUFrequency() const;  	bool hasSSE() const;  	bool hasSSE2() const; +    bool hasSSE3() const; +    bool hasSSE3S() const; +    bool hasSSE41() const; +    bool hasSSE42() const; +    bool hasSSE4a() const;  	bool hasAltivec() const;  	std::string getCPUFamilyName() const;  	std::string getCPUBrandName() const; diff --git a/indra/llcommon/llsys.cpp b/indra/llcommon/llsys.cpp index 9b6bb3826c..26a0fa1b1c 100644 --- a/indra/llcommon/llsys.cpp +++ b/indra/llcommon/llsys.cpp @@ -597,6 +597,11 @@ LLCPUInfo::LLCPUInfo()  	// proc.WriteInfoTextFile("procInfo.txt");  	mHasSSE = proc.hasSSE();  	mHasSSE2 = proc.hasSSE2(); +    mHasSSE3 = proc.hasSSE3(); +    mHasSSE3S = proc.hasSSE3S(); +    mHasSSE41 = proc.hasSSE41(); +    mHasSSE42 = proc.hasSSE42(); +    mHasSSE4a = proc.hasSSE4a();  	mHasAltivec = proc.hasAltivec();  	mCPUMHz = (F64)proc.getCPUFrequency();  	mFamily = proc.getCPUFamilyName(); @@ -609,6 +614,35 @@ LLCPUInfo::LLCPUInfo()  	}  	mCPUString = out.str();  	LLStringUtil::trim(mCPUString); + +    if (mHasSSE) +    { +        mSSEVersions.append("1"); +    } +    if (mHasSSE2) +    { +        mSSEVersions.append("2"); +    } +    if (mHasSSE3) +    { +        mSSEVersions.append("3"); +    } +    if (mHasSSE3S) +    { +        mSSEVersions.append("3S"); +    } +    if (mHasSSE41) +    { +        mSSEVersions.append("4.1"); +    } +    if (mHasSSE42) +    { +        mSSEVersions.append("4.2"); +    } +    if (mHasSSE4a) +    { +        mSSEVersions.append("4a"); +    }  }  bool LLCPUInfo::hasAltivec() const @@ -626,6 +660,31 @@ bool LLCPUInfo::hasSSE2() const  	return mHasSSE2;  } +bool LLCPUInfo::hasSSE3() const +{ +    return mHasSSE3; +} + +bool LLCPUInfo::hasSSE3S() const +{ +    return mHasSSE3S; +} + +bool LLCPUInfo::hasSSE41() const +{ +    return mHasSSE41; +} + +bool LLCPUInfo::hasSSE42() const +{ +    return mHasSSE42; +} + +bool LLCPUInfo::hasSSE4a() const +{ +    return mHasSSE4a; +} +  F64 LLCPUInfo::getMHz() const  {  	return mCPUMHz; @@ -636,6 +695,11 @@ std::string LLCPUInfo::getCPUString() const  	return mCPUString;  } +const LLSD& LLCPUInfo::getSSEVersions() const +{ +    return mSSEVersions; +} +  void LLCPUInfo::stream(std::ostream& s) const  {  	// gather machine information. @@ -645,6 +709,11 @@ void LLCPUInfo::stream(std::ostream& s) const  	// CPU's attributes regardless of platform  	s << "->mHasSSE:     " << (U32)mHasSSE << std::endl;  	s << "->mHasSSE2:    " << (U32)mHasSSE2 << std::endl; +    s << "->mHasSSE3:    " << (U32)mHasSSE3 << std::endl; +    s << "->mHasSSE3S:    " << (U32)mHasSSE3S << std::endl; +    s << "->mHasSSE41:    " << (U32)mHasSSE41 << std::endl; +    s << "->mHasSSE42:    " << (U32)mHasSSE42 << std::endl; +    s << "->mHasSSE4a:    " << (U32)mHasSSE4a << std::endl;  	s << "->mHasAltivec: " << (U32)mHasAltivec << std::endl;  	s << "->mCPUMHz:     " << mCPUMHz << std::endl;  	s << "->mCPUString:  " << mCPUString << std::endl; diff --git a/indra/llcommon/llsys.h b/indra/llcommon/llsys.h index cb92cb0ac6..5ffbf5a732 100644 --- a/indra/llcommon/llsys.h +++ b/indra/llcommon/llsys.h @@ -80,10 +80,16 @@ public:  	void stream(std::ostream& s) const;  	std::string getCPUString() const; +	const LLSD& getSSEVersions() const;  	bool hasAltivec() const;  	bool hasSSE() const;  	bool hasSSE2() const; +    bool hasSSE3() const; +    bool hasSSE3S() const; +    bool hasSSE41() const; +    bool hasSSE42() const; +    bool hasSSE4a() const;  	F64 getMHz() const;  	// Family is "AMD Duron" or "Intel Pentium Pro" @@ -92,10 +98,16 @@ public:  private:  	bool mHasSSE;  	bool mHasSSE2; +    bool mHasSSE3; +    bool mHasSSE3S; +    bool mHasSSE41; +    bool mHasSSE42; +    bool mHasSSE4a;  	bool mHasAltivec;  	F64 mCPUMHz;  	std::string mFamily;  	std::string mCPUString; +    LLSD mSSEVersions;  };  //============================================================================= diff --git a/indra/llfilesystem/lldiskcache.cpp b/indra/llfilesystem/lldiskcache.cpp index ee43a599f7..01144d8b0d 100644 --- a/indra/llfilesystem/lldiskcache.cpp +++ b/indra/llfilesystem/lldiskcache.cpp @@ -354,6 +354,38 @@ void LLDiskCache::clearCache()      }  } +void LLDiskCache::removeOldVFSFiles() +{ +    //VFS files won't be created, so consider removing this code later +    static const char CACHE_FORMAT[] = "inv.llsd"; +    static const char DB_FORMAT[] = "db2.x"; + +    boost::system::error_code ec; +#if LL_WINDOWS +    std::wstring cache_path(utf8str_to_utf16str(gDirUtilp->getExpandedFilename(LL_PATH_CACHE, ""))); +#else +    std::string cache_path(gDirUtilp->getExpandedFilename(LL_PATH_CACHE, "")); +#endif +    if (boost::filesystem::is_directory(cache_path, ec) && !ec.failed()) +    { +        for (auto& entry : boost::make_iterator_range(boost::filesystem::directory_iterator(cache_path, ec), {})) +        { +            if (boost::filesystem::is_regular_file(entry, ec) && !ec.failed()) +            { +                if ((entry.path().string().find(CACHE_FORMAT) != std::string::npos) || +                    (entry.path().string().find(DB_FORMAT) != std::string::npos)) +                { +                    boost::filesystem::remove(entry, ec); +                    if (ec.failed()) +                    { +                        LL_WARNS() << "Failed to delete cache file " << entry << ": " << ec.message() << LL_ENDL; +                    } +                } +            } +        } +    } +} +  uintmax_t LLDiskCache::dirFileSize(const std::string dir)  {      uintmax_t total_file_size = 0; diff --git a/indra/llfilesystem/lldiskcache.h b/indra/llfilesystem/lldiskcache.h index 1cbd2c58aa..b60e74f8c9 100644 --- a/indra/llfilesystem/lldiskcache.h +++ b/indra/llfilesystem/lldiskcache.h @@ -140,6 +140,8 @@ class LLDiskCache :           */          const std::string getCacheInfo(); +        void removeOldVFSFiles(); +      private:          /**           * Utility function to gather the total size the files in a given diff --git a/indra/llinventory/llparcel.cpp b/indra/llinventory/llparcel.cpp index 8db926fddf..bba2e2505d 100644 --- a/indra/llinventory/llparcel.cpp +++ b/indra/llinventory/llparcel.cpp @@ -234,6 +234,8 @@ void LLParcel::init(const LLUUID &owner_id,      setRegionAllowEnvironmentOverride(FALSE);      setParcelEnvironmentVersion(INVALID_PARCEL_ENVIRONMENT_VERSION); + +    setObscureMOAP(false);  }  void LLParcel::overrideOwner(const LLUUID& owner_id, BOOL is_group_owned) @@ -540,6 +542,7 @@ void LLParcel::packMessage(LLSD& msg)  	msg["see_avs"] = (LLSD::Boolean) getSeeAVs();  	msg["group_av_sounds"] = (LLSD::Boolean) getAllowGroupAVSounds();  	msg["any_av_sounds"] = (LLSD::Boolean) getAllowAnyAVSounds(); +    msg["obscure_moap"] = (LLSD::Boolean) getObscureMOAP();  } diff --git a/indra/llinventory/llparcel.h b/indra/llinventory/llparcel.h index 5d08c1f4c6..f5ee1241ab 100644 --- a/indra/llinventory/llparcel.h +++ b/indra/llinventory/llparcel.h @@ -306,6 +306,7 @@ public:  	void	setRestrictPushObject(BOOL b) { setParcelFlag(PF_RESTRICT_PUSHOBJECT, b); }  	void	setAllowGroupAVSounds(BOOL b)	{ mAllowGroupAVSounds = b;		}  	void	setAllowAnyAVSounds(BOOL b)		{ mAllowAnyAVSounds = b;		} +    void    setObscureMOAP(bool b)  { mObscureMOAP = b; }  	void	setDrawDistance(F32 dist)	{ mDrawDistance = dist; }  	void	setSalePrice(S32 price)		{ mSalePrice = price; } @@ -517,6 +518,8 @@ public:  	BOOL	getAllowGroupAVSounds()	const	{ return mAllowGroupAVSounds;	}   	BOOL	getAllowAnyAVSounds()	const	{ return mAllowAnyAVSounds;		} +  +    bool    getObscureMOAP() const { return mObscureMOAP; }  	F32		getDrawDistance() const			{ return mDrawDistance; }  	S32		getSalePrice() const			{ return mSalePrice; } @@ -670,6 +673,7 @@ protected:      BOOL                mRegionAllowEnvironmentOverride;  	BOOL				mAllowGroupAVSounds;  	BOOL				mAllowAnyAVSounds; +    bool                mObscureMOAP;      S32                 mCurrentEnvironmentVersion;      bool                mIsDefaultDayCycle; diff --git a/indra/llmath/llvolume.cpp b/indra/llmath/llvolume.cpp index ac6fb9acb3..762c0f74f3 100644 --- a/indra/llmath/llvolume.cpp +++ b/indra/llmath/llvolume.cpp @@ -684,7 +684,7 @@ LLProfile::Face* LLProfile::addHole(const LLProfileParams& params, BOOL flat, F3  	Face *face = addFace(mTotalOut, mTotal-mTotalOut,0,LL_FACE_INNER_SIDE, flat); -	static LLAlignedArray<LLVector4a,64> pt; +	static thread_local LLAlignedArray<LLVector4a,64> pt;  	pt.resize(mTotal) ;  	for (S32 i=mTotalOut;i<mTotal;i++) @@ -6670,13 +6670,19 @@ BOOL LLVolumeFace::createSide(LLVolume* volume, BOOL partial_build)  			else  			{  				// Get s value for tex-coord. -				if (!flat) +                S32 index = mBeginS + s; +                if (index >= profile.size()) +                { +                    // edge? +                    ss = flat ? 1.f - begin_stex : 1.f; +                } +				else if (!flat)  				{ -					ss = profile[mBeginS + s][2]; +					ss = profile[index][2];  				}  				else  				{ -					ss = profile[mBeginS + s][2] - begin_stex; +					ss = profile[index][2] - begin_stex;  				}  			} @@ -6862,7 +6868,7 @@ BOOL LLVolumeFace::createSide(LLVolume* volume, BOOL partial_build)  	LLVector4a* norm = mNormals; -	static LLAlignedArray<LLVector4a, 64> triangle_normals; +    static thread_local LLAlignedArray<LLVector4a, 64> triangle_normals;      try      {          triangle_normals.resize(count); diff --git a/indra/llmessage/llavatarnamecache.cpp b/indra/llmessage/llavatarnamecache.cpp index c67f59bc0c..846549b368 100644 --- a/indra/llmessage/llavatarnamecache.cpp +++ b/indra/llmessage/llavatarnamecache.cpp @@ -196,6 +196,10 @@ void LLAvatarNameCache::requestAvatarNameCache_(std::string url, std::vector<LLU              LLAvatarNameCache::getInstance()->handleAvNameCacheSuccess(results, httpResults);          }      } +    catch (const LLCoros::Stop&) +    { +        LL_DEBUGS("AvNameCache") << "Received a shutdown exception" << LL_ENDL; +    }      catch (...)      {          LOG_UNHANDLED_EXCEPTION(STRINGIZE("coroutine " << LLCoros::getName() diff --git a/indra/llmessage/llcoproceduremanager.h b/indra/llmessage/llcoproceduremanager.h index 2d460826ff..c5bc37dd0e 100644 --- a/indra/llmessage/llcoproceduremanager.h +++ b/indra/llmessage/llcoproceduremanager.h @@ -32,7 +32,6 @@  #include "llcoros.h"  #include "llcorehttputil.h"  #include "lluuid.h" -#include <boost/smart_ptr/shared_ptr.hpp>  class LLCoprocedurePool; @@ -84,7 +83,7 @@ public:  private: -    typedef boost::shared_ptr<LLCoprocedurePool> poolPtr_t; +    typedef std::shared_ptr<LLCoprocedurePool> poolPtr_t;      typedef std::map<std::string, poolPtr_t> poolMap_t;      poolMap_t mPoolMap; diff --git a/indra/llmessage/message_prehash.cpp b/indra/llmessage/message_prehash.cpp index 219b1855d2..35dcbe3836 100644 --- a/indra/llmessage/message_prehash.cpp +++ b/indra/llmessage/message_prehash.cpp @@ -1386,6 +1386,7 @@ char const* const _PREHASH_RegionAllowAccessBlock = LLMessageStringTable::getIns  char const* const _PREHASH_RegionAllowAccessOverride = LLMessageStringTable::getInstance()->getString("RegionAllowAccessOverride");  char const* const _PREHASH_ParcelEnvironmentBlock = LLMessageStringTable::getInstance()->getString("ParcelEnvironmentBlock");  char const* const _PREHASH_ParcelEnvironmentVersion = LLMessageStringTable::getInstance()->getString("ParcelEnvironmentVersion"); +char const* const _PREHASH_ParcelExtendedFlags = LLMessageStringTable::getInstance()->getString("ParcelExtendedFlags");  char const* const _PREHASH_RegionAllowEnvironmentOverride = LLMessageStringTable::getInstance()->getString("RegionAllowEnvironmentOverride");  char const* const _PREHASH_UCoord = LLMessageStringTable::getInstance()->getString("UCoord");  char const* const _PREHASH_VCoord = LLMessageStringTable::getInstance()->getString("VCoord"); diff --git a/indra/llmessage/message_prehash.h b/indra/llmessage/message_prehash.h index 8f6ee5a327..3015f438b5 100644 --- a/indra/llmessage/message_prehash.h +++ b/indra/llmessage/message_prehash.h @@ -1386,6 +1386,7 @@ extern char const* const _PREHASH_RegionAllowAccessBlock;  extern char const* const _PREHASH_RegionAllowAccessOverride;  extern char const* const _PREHASH_ParcelEnvironmentBlock;  extern char const* const _PREHASH_ParcelEnvironmentVersion; +extern char const* const _PREHASH_ParcelExtendedFlags;  extern char const* const _PREHASH_RegionAllowEnvironmentOverride;  extern char const* const _PREHASH_UCoord;  extern char const* const _PREHASH_VCoord; diff --git a/indra/llplugin/llpluginclassmedia.cpp b/indra/llplugin/llpluginclassmedia.cpp index 6f88232c1d..3e72710366 100644 --- a/indra/llplugin/llpluginclassmedia.cpp +++ b/indra/llplugin/llpluginclassmedia.cpp @@ -1549,6 +1549,7 @@ void LLPluginClassMedia::seek(float time)  	LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_TIME, "seek");  	message.setValueReal("time", time); +    mCurrentTime = time; // assume that it worked and we will receive an update later  	sendMessage(message);  } diff --git a/indra/llplugin/llpluginprocessparent.cpp b/indra/llplugin/llpluginprocessparent.cpp index eef22156bc..1fbbad06d4 100644 --- a/indra/llplugin/llpluginprocessparent.cpp +++ b/indra/llplugin/llpluginprocessparent.cpp @@ -999,7 +999,7 @@ void LLPluginProcessParent::poll(F64 timeout)      while (itClean != sInstances.end())      {          if ((*itClean).second->isDone()) -            sInstances.erase(itClean++); +            itClean = sInstances.erase(itClean);          else              ++itClean;      } diff --git a/indra/llprimitive/llmodel.cpp b/indra/llprimitive/llmodel.cpp index 4b505a79c4..d53064dde0 100644 --- a/indra/llprimitive/llmodel.cpp +++ b/indra/llprimitive/llmodel.cpp @@ -843,7 +843,7 @@ LLSD LLModel::writeModel(  					{  						LLVector3 pos(face.mPositions[j].getF32ptr()); -						weight_list& weights = high->getJointInfluences(pos); +						weight_list& weights = model[idx]->getJointInfluences(pos);  						S32 count = 0;  						for (weight_list::iterator iter = weights.begin(); iter != weights.end(); ++iter) @@ -1549,6 +1549,25 @@ void LLMeshSkinInfo::updateHash()      mHash = digest[0];  } +U32 LLMeshSkinInfo::sizeBytes() const +{ +    U32 res = sizeof(LLUUID); // mMeshID + +    res += sizeof(std::vector<std::string>) + sizeof(std::string) * mJointNames.size(); +    for (U32 i = 0; i < mJointNames.size(); ++i) +    { +        res += mJointNames[i].size(); // actual size, not capacity +    } + +    res += sizeof(std::vector<S32>) + sizeof(S32) * mJointNums.size(); +    res += sizeof(std::vector<LLMatrix4>) + 16 * sizeof(float) * mInvBindMatrix.size(); +    res += sizeof(std::vector<LLMatrix4>) + 16 * sizeof(float) * mAlternateBindMatrix.size(); +    res += 16 * sizeof(float); //mBindShapeMatrix +    res += sizeof(float) + 3 * sizeof(bool); + +    return res; +} +  LLModel::Decomposition::Decomposition(LLSD& data)  {  	fromLLSD(data); @@ -1655,6 +1674,30 @@ void LLModel::Decomposition::fromLLSD(LLSD& decomp)  	}  } +U32 LLModel::Decomposition::sizeBytes() const +{ +    U32 res = sizeof(LLUUID); // mMeshID + +    res += sizeof(LLModel::convex_hull_decomposition) + sizeof(std::vector<LLVector3>) * mHull.size(); +    for (U32 i = 0; i < mHull.size(); ++i) +    { +        res += mHull[i].size() * sizeof(LLVector3); +    } + +    res += sizeof(LLModel::hull) + sizeof(LLVector3) * mBaseHull.size(); + +    res += sizeof(std::vector<LLModel::PhysicsMesh>) + sizeof(std::vector<LLModel::PhysicsMesh>) * mMesh.size(); +    for (U32 i = 0; i < mMesh.size(); ++i) +    { +        res += mMesh[i].sizeBytes(); +    } + +    res += sizeof(std::vector<LLModel::PhysicsMesh>) * 2; +    res += mBaseHullMesh.sizeBytes() + mPhysicsShapeMesh.sizeBytes(); + +    return res; +} +  bool LLModel::Decomposition::hasHullList() const  {  	return !mHull.empty() ; diff --git a/indra/llprimitive/llmodel.h b/indra/llprimitive/llmodel.h index 354ceb26b7..a6ab96ab18 100644 --- a/indra/llprimitive/llmodel.h +++ b/indra/llprimitive/llmodel.h @@ -50,6 +50,7 @@ public:  	void fromLLSD(LLSD& data);  	LLSD asLLSD(bool include_joints, bool lock_scale_if_joint_position) const;      void updateHash(); +    U32 sizeBytes() const;  	LLUUID mMeshID;  	std::vector<std::string> mJointNames; @@ -112,6 +113,14 @@ public:  		{  			return mPositions.empty();  		} + +        U32 sizeBytes() const +        { +            U32 res = sizeof(std::vector<LLVector3>) * 2; +            res += sizeof(LLVector3) * mPositions.size(); +            res += sizeof(LLVector3) * mNormals.size(); +            return res; +        }  	};  	class Decomposition @@ -122,6 +131,7 @@ public:  		void fromLLSD(LLSD& data);  		LLSD asLLSD() const;  		bool hasHullList() const; +        U32 sizeBytes() const;  		void merge(const Decomposition* rhs); diff --git a/indra/llrender/llimagegl.cpp b/indra/llrender/llimagegl.cpp index 9bd3a0a6b0..b9dc689d1a 100644 --- a/indra/llrender/llimagegl.cpp +++ b/indra/llrender/llimagegl.cpp @@ -1248,7 +1248,12 @@ void LLImageGL::setManualImage(U32 target, S32 miplevel, S32 intformat, S32 widt              if (pixels != nullptr)              {                  use_scratch = true; -                scratch = new U32[width * height]; +                scratch = new(std::nothrow) U32[width * height]; +                if (!scratch) +                { +                    LL_ERRS() << "Failed to allocate " << (U32)(width * height * sizeof(U32)) +                              << " bytes for a manual image W" << width << " H" << height << LL_ENDL; +                }                  U32 pixel_count = (U32)(width * height);                  for (U32 i = 0; i < pixel_count; i++) @@ -1268,7 +1273,12 @@ void LLImageGL::setManualImage(U32 target, S32 miplevel, S32 intformat, S32 widt              if (pixels != nullptr)              {                  use_scratch = true; -                scratch = new U32[width * height]; +                scratch = new(std::nothrow) U32[width * height]; +                if (!scratch) +                { +                    LL_ERRS() << "Failed to allocate " << (U32)(width * height * sizeof(U32)) +                        << " bytes for a manual image W" << width << " H" << height << LL_ENDL; +                }                  U32 pixel_count = (U32)(width * height);                  for (U32 i = 0; i < pixel_count; i++) @@ -1291,7 +1301,12 @@ void LLImageGL::setManualImage(U32 target, S32 miplevel, S32 intformat, S32 widt              if (pixels != nullptr)              {                  use_scratch = true; -                scratch = new U32[width * height]; +                scratch = new(std::nothrow) U32[width * height]; +                if (!scratch) +                { +                    LL_ERRS() << "Failed to allocate " << (U32)(width * height * sizeof(U32)) +                        << " bytes for a manual image W" << width << " H" << height << LL_ENDL; +                }                  U32 pixel_count = (U32)(width * height);                  for (U32 i = 0; i < pixel_count; i++) diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp index c6a3ada777..d413fab270 100644 --- a/indra/llui/llfloater.cpp +++ b/indra/llui/llfloater.cpp @@ -762,17 +762,13 @@ void LLFloater::closeFloater(bool app_quitting)  		for(handle_set_iter_t dependent_it = mDependents.begin();  			dependent_it != mDependents.end(); )  		{ -			  			LLFloater* floaterp = dependent_it->get(); -			if (floaterp) -			{ -				++dependent_it; -				floaterp->closeFloater(app_quitting); -			} -			else -			{ -				mDependents.erase(dependent_it++); -			} +            dependent_it = mDependents.erase(dependent_it); +            if (floaterp) +            { +                floaterp->mDependeeHandle = LLHandle<LLFloater>(); +                floaterp->closeFloater(app_quitting); +            }  		}  		cleanupHandles(); @@ -1443,7 +1439,7 @@ void LLFloater::cleanupHandles()  		LLFloater* floaterp = dependent_it->get();  		if (!floaterp)  		{ -			mDependents.erase(dependent_it++); +            dependent_it = mDependents.erase(dependent_it);  		}  		else  		{ diff --git a/indra/llui/llmenugl.cpp b/indra/llui/llmenugl.cpp index 8f00d1274e..4264028338 100644 --- a/indra/llui/llmenugl.cpp +++ b/indra/llui/llmenugl.cpp @@ -3960,8 +3960,8 @@ void LLTearOffMenu::draw()  	{  		// animate towards target height          reshape(getRect().getWidth(), llceil(lerp((F32)getRect().getHeight(), (F32)mTargetHeight, LLSmoothInterpolation::getInterpolant(0.05f)))); -        mMenu->needsArrange();  	} +	mMenu->needsArrange();  	LLFloater::draw();  } diff --git a/indra/llui/llmodaldialog.cpp b/indra/llui/llmodaldialog.cpp index 5cfa8ea973..3e5978eb59 100644 --- a/indra/llui/llmodaldialog.cpp +++ b/indra/llui/llmodaldialog.cpp @@ -100,7 +100,10 @@ void LLModalDialog::onOpen(const LLSD& key)  		if (!sModalStack.empty())  		{  			LLModalDialog* front = sModalStack.front(); -			front->setVisible(FALSE); +            if (front != this) +            { +                front->setVisible(FALSE); +            }  		}  		// This is a modal dialog.  It sucks up all mouse and keyboard operations. @@ -108,7 +111,14 @@ void LLModalDialog::onOpen(const LLSD& key)  		LLUI::getInstance()->addPopup(this);  		setFocus(TRUE); -		sModalStack.push_front( this ); +        std::list<LLModalDialog*>::iterator iter = std::find(sModalStack.begin(), sModalStack.end(), this); +        if (iter != sModalStack.end()) +        { +            // if already present, we want to move it to front. +            sModalStack.erase(iter); +        } + +        sModalStack.push_front(this);  	}  } diff --git a/indra/llui/llscrolllistctrl.cpp b/indra/llui/llscrolllistctrl.cpp index 11b0eb9f80..65c7b420ce 100644 --- a/indra/llui/llscrolllistctrl.cpp +++ b/indra/llui/llscrolllistctrl.cpp @@ -1388,6 +1388,84 @@ BOOL LLScrollListCtrl::selectItemByPrefix(const LLWString& target, BOOL case_sen  	return found;  } +U32 LLScrollListCtrl::searchItems(const std::string& substring, bool case_sensitive, bool focus) +{ +    return searchItems(utf8str_to_wstring(substring), case_sensitive, focus); +} + +U32 LLScrollListCtrl::searchItems(const LLWString& substring, bool case_sensitive, bool focus) +{ +    U32 found = 0; + +    LLWString substring_trimmed(substring); +    S32 len = substring_trimmed.size(); + +    if (0 == len) +    { +        // at the moment search for empty element is not supported +        return 0; +    } +    else +    { +        deselectAllItems(TRUE); +        if (!case_sensitive) +        { +            // do comparisons in lower case +            LLWStringUtil::toLower(substring_trimmed); +        } + +        for (item_list::iterator iter = mItemList.begin(); iter != mItemList.end(); iter++) +        { +            LLScrollListItem* item = *iter; +            // Only select enabled items with matching names +            if (!item->getEnabled()) +            { +                continue; +            } +            LLScrollListCell* cellp = item->getColumn(getSearchColumn()); +            if (!cellp) +            { +                continue; +            } +            LLWString item_label = utf8str_to_wstring(cellp->getValue().asString()); +            if (!case_sensitive) +            { +                LLWStringUtil::toLower(item_label); +            } +            // remove extraneous whitespace from searchable label +            LLWStringUtil::trim(item_label); + +            size_t found_iter = item_label.find(substring_trimmed); + +            if (found_iter != std::string::npos) +            { +                // find offset of matching text +                cellp->highlightText(found_iter, substring_trimmed.size()); +                selectItem(item, -1, FALSE); + +                found++; + +                if (!mAllowMultipleSelection) +                { +                    break; +                } +            } +        } +    } + +    if (focus && found != 0) +    { +        mNeedsScroll = true; +    } + +    if (mCommitOnSelectionChange) +    { +        commitIfChanged(); +    } + +    return found; +} +  const std::string LLScrollListCtrl::getSelectedItemLabel(S32 column) const  {  	LLScrollListItem* item; @@ -1912,6 +1990,7 @@ BOOL LLScrollListCtrl::handleRightMouseDown(S32 x, S32 y, MASK mask)  			registrar.add("Url.SendIM", boost::bind(&LLScrollListCtrl::sendIM, id));  			registrar.add("Url.AddFriend", boost::bind(&LLScrollListCtrl::addFriend, id));  			registrar.add("Url.RemoveFriend", boost::bind(&LLScrollListCtrl::removeFriend, id)); +            registrar.add("Url.ReportAbuse", boost::bind(&LLScrollListCtrl::reportAbuse, id, is_group));  			registrar.add("Url.Execute", boost::bind(&LLScrollListCtrl::showNameDetails, id, is_group));  			registrar.add("Url.CopyLabel", boost::bind(&LLScrollListCtrl::copyNameToClipboard, id, is_group));  			registrar.add("Url.CopyUrl", boost::bind(&LLScrollListCtrl::copySLURLToClipboard, id, is_group)); @@ -1975,6 +2054,15 @@ void LLScrollListCtrl::removeFriend(std::string id)  	LLUrlAction::removeFriend(slurl);  } +void LLScrollListCtrl::reportAbuse(std::string id, bool is_group) +{ +    if (!is_group) +    { +        std::string slurl = "secondlife:///app/agent/" + id + "/about"; +        LLUrlAction::reportAbuse(slurl); +    } +} +  void LLScrollListCtrl::showNameDetails(std::string id, bool is_group)  {  	// open the resident's details or the group details diff --git a/indra/llui/llscrolllistctrl.h b/indra/llui/llscrolllistctrl.h index 08134bbfc8..77d10fdec7 100644 --- a/indra/llui/llscrolllistctrl.h +++ b/indra/llui/llscrolllistctrl.h @@ -267,6 +267,14 @@ public:  	const std::string	getSelectedItemLabel(S32 column = 0) const;  	LLSD			getSelectedValue(); +    // If multi select is on, select all element that include substring, +    // otherwise select first match only. +    // If focus is true will scroll to selection. +    // Returns number of results. +    // Note: at the moment search happens in one go and is expensive +    U32			searchItems(const std::string& substring, bool case_sensitive = false, bool focus = true); +    U32			searchItems(const LLWString& substring, bool case_sensitive = false, bool focus = true); +  	// DEPRECATED: Use LLSD versions of setCommentText() and getSelectedValue().  	// "StringUUID" interface: use this when you're creating a list that contains non-unique strings each of which  	// has an associated, unique UUID, and only one of which can be selected at a time. @@ -325,6 +333,7 @@ public:  	// support right-click context menus for avatar/group lists  	enum ContextMenuType { MENU_NONE, MENU_AVATAR, MENU_GROUP };  	void setContextMenu(const ContextMenuType &menu) { mContextMenuType = menu; } +    ContextMenuType getContextMenuType() { return mContextMenuType; }  	// Overridden from LLView  	/*virtual*/ void    draw(); @@ -460,6 +469,7 @@ private:  	static void		sendIM(std::string id);  	static void		addFriend(std::string id);  	static void		removeFriend(std::string id); +    static void		reportAbuse(std::string id, bool is_group);  	static void		showNameDetails(std::string id, bool is_group);  	static void		copyNameToClipboard(std::string id, bool is_group);  	static void		copySLURLToClipboard(std::string id, bool is_group); diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp index c4a529e4ad..7e4aaa53bf 100644 --- a/indra/llui/lltextbase.cpp +++ b/indra/llui/lltextbase.cpp @@ -2049,6 +2049,7 @@ void LLTextBase::createUrlContextMenu(S32 x, S32 y, const std::string &in_url)  	registrar.add("Url.ShowProfile", boost::bind(&LLUrlAction::showProfile, url));  	registrar.add("Url.AddFriend", boost::bind(&LLUrlAction::addFriend, url));  	registrar.add("Url.RemoveFriend", boost::bind(&LLUrlAction::removeFriend, url)); +    registrar.add("Url.ReportAbuse", boost::bind(&LLUrlAction::reportAbuse, url));  	registrar.add("Url.SendIM", boost::bind(&LLUrlAction::sendIM, url));  	registrar.add("Url.ShowOnMap", boost::bind(&LLUrlAction::showLocationOnMap, url));  	registrar.add("Url.CopyLabel", boost::bind(&LLUrlAction::copyLabelToClipboard, url)); diff --git a/indra/llui/lltexteditor.h b/indra/llui/lltexteditor.h index 26702b2412..1a10d2fd1e 100644 --- a/indra/llui/lltexteditor.h +++ b/indra/llui/lltexteditor.h @@ -196,6 +196,7 @@ public:  	const LLUUID&	getSourceID() const						{ return mSourceID; }  	const LLTextSegmentPtr	getPreviousSegment() const; +    const LLTextSegmentPtr	getLastSegment() const;  	void			getSelectedSegments(segment_vec_t& segments) const;  	void			setShowContextMenu(bool show) { mShowContextMenu = show; } diff --git a/indra/llui/lltextutil.cpp b/indra/llui/lltextutil.cpp index 538508b856..78049319bc 100644 --- a/indra/llui/lltextutil.cpp +++ b/indra/llui/lltextutil.cpp @@ -76,22 +76,6 @@ void LLTextUtil::textboxSetGreyedVal(LLTextBox *txtbox, const LLStyle::Params& n      txtbox->appendText(text.substr(greyed_begin + greyed_len),  false, normal_style);  } -const std::string& LLTextUtil::formatPhoneNumber(const std::string& phone_str) -{ -	static const std::string PHONE_SEPARATOR = LLUI::getInstance()->mSettingGroups["config"]->getString("AvalinePhoneSeparator"); -	static const S32 PHONE_PART_LEN = 2; - -	static std::string formatted_phone_str; -	formatted_phone_str = phone_str; -	S32 separator_pos = (S32)(formatted_phone_str.size()) - PHONE_PART_LEN; -	for (; separator_pos >= PHONE_PART_LEN; separator_pos -= PHONE_PART_LEN) -	{ -		formatted_phone_str.insert(separator_pos, PHONE_SEPARATOR); -	} - -	return formatted_phone_str; -} -  bool LLTextUtil::processUrlMatch(LLUrlMatch* match,LLTextBase* text_base, bool is_content_trusted)  {  	if (match == 0 || text_base == 0) diff --git a/indra/llui/lltextutil.h b/indra/llui/lltextutil.h index a9c143e445..1adc3516f7 100644 --- a/indra/llui/lltextutil.h +++ b/indra/llui/lltextutil.h @@ -59,18 +59,6 @@ namespace LLTextUtil  	        const std::string& greyed);  	/** -	 * Formats passed phone number to be more human readable. -	 * -	 * It just divides the number on parts by two digits from right to left. The first left part -	 * can have 2 or 3 digits, i.e. +44-33-33-44-55-66 or 12-34-56-78-90. Separator is set in -	 * application settings (AvalinePhoneSeparator) -	 * -	 * @param[in] phone_str string with original phone number -	 * @return reference to string with formatted phone number -	 */ -	const std::string& formatPhoneNumber(const std::string& phone_str); - -	/**  	 * Adds icon before url if need.  	 *  	 * @param[in] match an object with results of matching diff --git a/indra/llui/llurlaction.cpp b/indra/llui/llurlaction.cpp index 84ea770a8d..8216046174 100644 --- a/indra/llui/llurlaction.cpp +++ b/indra/llui/llurlaction.cpp @@ -222,6 +222,15 @@ void LLUrlAction::removeFriend(std::string url)  	}  } +void LLUrlAction::reportAbuse(std::string url) +{ +    std::string id_str = getUserID(url); +    if (LLUUID::validate(id_str)) +    { +        executeSLURL("secondlife:///app/agent/" + id_str + "/reportAbuse"); +    } +} +  void LLUrlAction::blockObject(std::string url)  {  	std::string object_id = getObjectId(url); diff --git a/indra/llui/llurlaction.h b/indra/llui/llurlaction.h index 2d2a8dfef1..c2c576254d 100644 --- a/indra/llui/llurlaction.h +++ b/indra/llui/llurlaction.h @@ -82,6 +82,7 @@ public:  	static void sendIM(std::string url);  	static void addFriend(std::string url);  	static void removeFriend(std::string url); +    static void reportAbuse(std::string url);  	static void blockObject(std::string url);  	static void unblockObject(std::string url); diff --git a/indra/llwindow/llkeyboard.cpp b/indra/llwindow/llkeyboard.cpp index 5404ac50e5..e65cc7563e 100644 --- a/indra/llwindow/llkeyboard.cpp +++ b/indra/llwindow/llkeyboard.cpp @@ -148,6 +148,22 @@ void LLKeyboard::addKeyName(KEY key, const std::string& name)  	sNamesToKeys[nameuc] = key;  } +void LLKeyboard::resetKeyDownAndHandle() +{ +    MASK mask = currentMask(FALSE); +    for (S32 i = 0; i < KEY_COUNT; i++) +    { +        if (mKeyLevel[i]) +        { +            mKeyDown[i] = FALSE; +            mKeyLevel[i] = FALSE; +            mKeyUp[i] = TRUE; +            mCurTranslatedKey = (KEY)i; +            mCallbacks->handleTranslatedKeyUp(i, mask); +        } +    } +} +  // BUG this has to be called when an OS dialog is shown, otherwise modifier key state  // is wrong because the keyup event is never received by the main window. JC  void LLKeyboard::resetKeys() diff --git a/indra/llwindow/llkeyboard.h b/indra/llwindow/llkeyboard.h index 36bd8bcbed..fb1ae10f50 100644 --- a/indra/llwindow/llkeyboard.h +++ b/indra/llwindow/llkeyboard.h @@ -58,7 +58,8 @@ public:  	LLKeyboard();  	virtual ~LLKeyboard(); -	void			resetKeys(); +    void			resetKeyDownAndHandle(); +    void			resetKeys();  	F32				getCurKeyElapsedTime()	{ return getKeyDown(mCurScanKey) ? getKeyElapsedTime( mCurScanKey ) : 0.f; } diff --git a/indra/llwindow/llopenglview-objc.mm b/indra/llwindow/llopenglview-objc.mm index fd20f2ad15..049226db65 100644 --- a/indra/llwindow/llopenglview-objc.mm +++ b/indra/llwindow/llopenglview-objc.mm @@ -495,14 +495,14 @@ attributedStringInfo getSegments(NSAttributedString *str)      // e.g. OS Window for upload something or Input Window...      // mModifiers instance variable is for insertText: or insertText:replacementRange:  (by Pell Smit)  	mModifiers = [theEvent modifierFlags]; +    unichar ch = [[theEvent charactersIgnoringModifiers] characterAtIndex:0]; +    bool acceptsText = mHasMarkedText ? false : callKeyDown(&eventData, keycode, mModifiers, ch); -    bool acceptsText = mHasMarkedText ? false : callKeyDown(&eventData, keycode, mModifiers, [[theEvent characters] characterAtIndex:0]); -    unichar ch;      if (acceptsText &&          !mMarkedTextAllowed &&          !(mModifiers & (NSControlKeyMask | NSCommandKeyMask)) &&  // commands don't invoke InputWindow          ![(LLAppDelegate*)[NSApp delegate] romanScript] && -        (ch = [[theEvent charactersIgnoringModifiers] characterAtIndex:0]) > ' ' && +        ch > ' ' &&          ch != NSDeleteCharacter &&          (ch < 0xF700 || ch > 0xF8FF))  // 0xF700-0xF8FF: reserved for function keys on the keyboard(from NSEvent.h)      { diff --git a/indra/llwindow/llwindowmacosx-objc.mm b/indra/llwindow/llwindowmacosx-objc.mm index f895c17643..5ec9b017cf 100644 --- a/indra/llwindow/llwindowmacosx-objc.mm +++ b/indra/llwindow/llwindowmacosx-objc.mm @@ -100,13 +100,13 @@ const unsigned short *copyFromPBoard()  CursorRef createImageCursor(const char *fullpath, int hotspotX, int hotspotY)  {  	NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; -	 +  	// extra retain on the NSCursor since we want it to live for the lifetime of the app.  	NSCursor *cursor =  	[[[NSCursor alloc]  	  initWithImage:  	  [[[NSImage alloc] initWithContentsOfFile: -		[NSString stringWithFormat:@"%s", fullpath] +		[NSString stringWithUTF8String:fullpath]  		]autorelease]  	  hotSpot:NSMakePoint(hotspotX, hotspotY)  	  ]retain]; diff --git a/indra/llwindow/llwindowmacosx.cpp b/indra/llwindow/llwindowmacosx.cpp index b44c6138f4..22a5462c7f 100644 --- a/indra/llwindow/llwindowmacosx.cpp +++ b/indra/llwindow/llwindowmacosx.cpp @@ -1660,7 +1660,7 @@ void LLWindowMacOSX::hideCursor()  void LLWindowMacOSX::showCursor()  { -	if(mCursorHidden) +	if(mCursorHidden || !isCGCursorVisible())  	{  		//		LL_INFOS() << "showCursor: showing" << LL_ENDL;  		mCursorHidden = FALSE; diff --git a/indra/media_plugins/cef/media_plugin_cef.cpp b/indra/media_plugins/cef/media_plugin_cef.cpp index ea70e21414..43d3a32e64 100644 --- a/indra/media_plugins/cef/media_plugin_cef.cpp +++ b/indra/media_plugins/cef/media_plugin_cef.cpp @@ -34,6 +34,7 @@  #include "llplugininstance.h"  #include "llpluginmessage.h"  #include "llpluginmessageclasses.h" +#include "llstring.h"  #include "volume_catcher.h"  #include "media_plugin_base.h" @@ -55,7 +56,7 @@ private:  	bool init();  	void onPageChangedCallback(const unsigned char* pixels, int x, int y, const int width, const int height); -	void onCustomSchemeURLCallback(std::string url); +	void onCustomSchemeURLCallback(std::string url, bool user_gesture, bool is_redirect);  	void onConsoleMessageCallback(std::string message, std::string source, int line);  	void onStatusMessageCallback(std::string value);  	void onTitleChangeCallback(std::string title); @@ -299,11 +300,18 @@ void MediaPluginCEF::onOpenPopupCallback(std::string url, std::string target)  ////////////////////////////////////////////////////////////////////////////////  // -void MediaPluginCEF::onCustomSchemeURLCallback(std::string url) +void MediaPluginCEF::onCustomSchemeURLCallback(std::string url, bool user_gesture, bool is_redirect)  {  	LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "click_nofollow"); -	message.setValue("uri", url); -	message.setValue("nav_type", "clicked");	// TODO: differentiate between click and navigate to +    message.setValue("uri", url); + +    // indicate if this interaction was from a user click (okay on a SLAPP) or  +    // via a navigation (e.g. a data URL - see SL-18151) (not okay on a SLAPP) +    const std::string nav_type = user_gesture ? "clicked" : "navigated"; + +	message.setValue("nav_type", nav_type); +    message.setValueBoolean("is_redirect", is_redirect); +  	sendMessage(message);  } @@ -592,7 +600,7 @@ void MediaPluginCEF::receiveMessage(const char* message_string)              {                  // event callbacks from Dullahan                  mCEFLib->setOnPageChangedCallback(std::bind(&MediaPluginCEF::onPageChangedCallback, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4, std::placeholders::_5)); -                mCEFLib->setOnCustomSchemeURLCallback(std::bind(&MediaPluginCEF::onCustomSchemeURLCallback, this, std::placeholders::_1)); +                mCEFLib->setOnCustomSchemeURLCallback(std::bind(&MediaPluginCEF::onCustomSchemeURLCallback, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3));                  mCEFLib->setOnConsoleMessageCallback(std::bind(&MediaPluginCEF::onConsoleMessageCallback, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3));                  mCEFLib->setOnStatusMessageCallback(std::bind(&MediaPluginCEF::onStatusMessageCallback, this, std::placeholders::_1));                  mCEFLib->setOnTitleChangeCallback(std::bind(&MediaPluginCEF::onTitleChangeCallback, this, std::placeholders::_1)); @@ -616,9 +624,9 @@ void MediaPluginCEF::receiveMessage(const char* message_string)                  // dir as the executable that loaded it (SLPlugin.exe). The code in                   // Dullahan that tried to figure out the location automatically uses                   // the location of the exe which isn't helpful so we tell it explicitly. -                char cur_dir_str[MAX_PATH]; -                GetCurrentDirectoryA(MAX_PATH, cur_dir_str); -                settings.host_process_path = std::string(cur_dir_str); +                std::vector<wchar_t> buffer(MAX_PATH + 1); +                GetCurrentDirectoryW(MAX_PATH, &buffer[0]); +                settings.host_process_path = ll_convert_wide_to_string(&buffer[0]);  #endif                  settings.accept_language_list = mHostLanguage; diff --git a/indra/media_plugins/libvlc/media_plugin_libvlc.cpp b/indra/media_plugins/libvlc/media_plugin_libvlc.cpp index 1afe25e9a1..89144922cc 100644 --- a/indra/media_plugins/libvlc/media_plugin_libvlc.cpp +++ b/indra/media_plugins/libvlc/media_plugin_libvlc.cpp @@ -73,6 +73,7 @@ private:  	static void display(void* data, void* id);  	/*virtual*/ void setDirty(int left, int top, int right, int bottom) /* override, but that is not supported in gcc 4.6 */; +    void setDurationDirty();  	static void eventCallbacks(const libvlc_event_t* event, void* ptr); @@ -93,8 +94,8 @@ private:  	bool mIsLooping; -	float mCurTime; -	float mDuration; +	F64 mCurTime; +	F64 mDuration;  	EStatus mVlcStatus;  }; @@ -214,6 +215,19 @@ void MediaPluginLibVLC::setDirty(int left, int top, int right, int bottom)  }  //////////////////////////////////////////////////////////////////////////////// +// *virtual* +void MediaPluginLibVLC::setDurationDirty() +{ +    LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "updated"); + +    message.setValueReal("current_time", mCurTime); +    message.setValueReal("duration", mDuration); +    message.setValueReal("current_rate", 1.0f); + +    sendMessage(message); +} + +////////////////////////////////////////////////////////////////////////////////  //  void MediaPluginLibVLC::eventCallbacks(const libvlc_event_t* event, void* ptr)  { @@ -233,6 +247,7 @@ void MediaPluginLibVLC::eventCallbacks(const libvlc_event_t* event, void* ptr)  		parent->mDuration = (float)(libvlc_media_get_duration(parent->mLibVLCMedia)) / 1000.0f;  		parent->mVlcStatus = STATUS_PLAYING;  		parent->setVolumeVLC(); +        parent->setDurationDirty();  		break;  	case libvlc_MediaPlayerPaused: @@ -245,6 +260,8 @@ void MediaPluginLibVLC::eventCallbacks(const libvlc_event_t* event, void* ptr)  	case libvlc_MediaPlayerEndReached:  		parent->mVlcStatus = STATUS_DONE; +        parent->mCurTime = parent->mDuration; +        parent->setDurationDirty();  		break;  	case libvlc_MediaPlayerEncounteredError: @@ -253,6 +270,11 @@ void MediaPluginLibVLC::eventCallbacks(const libvlc_event_t* event, void* ptr)  	case libvlc_MediaPlayerTimeChanged:  		parent->mCurTime = (float)libvlc_media_player_get_time(parent->mLibVLCMediaPlayer) / 1000.0f; +        if (parent->mVlcStatus == STATUS_DONE && libvlc_media_player_is_playing(parent->mLibVLCMediaPlayer)) +        { +            parent->mVlcStatus = STATUS_PLAYING; +        } +        parent->setDurationDirty();  		break;  	case libvlc_MediaPlayerPositionChanged: @@ -260,6 +282,7 @@ void MediaPluginLibVLC::eventCallbacks(const libvlc_event_t* event, void* ptr)  	case libvlc_MediaPlayerLengthChanged:  		parent->mDuration = (float)libvlc_media_get_duration(parent->mLibVLCMedia) / 1000.0f; +        parent->setDurationDirty();  		break;  	case libvlc_MediaPlayerTitleChanged: @@ -562,7 +585,24 @@ void MediaPluginLibVLC::receiveMessage(const char* message_string)  						mTextureWidth = texture_width;  						mTextureHeight = texture_height; +                        libvlc_time_t time = 1000.0 * mCurTime; +  						playMedia(); + +                        if (mLibVLCMediaPlayer) +                        { +                            libvlc_media_player_set_time(mLibVLCMediaPlayer, time); +                            time = libvlc_media_player_get_time(mLibVLCMediaPlayer); +                            if (time < 0) +                            { +                                // -1 if there is no media +                                mCurTime = 0; +                            } +                            else +                            { +                                mCurTime = (F64)time / 1000.0; +                            } +                        }  					};  				}; @@ -594,6 +634,13 @@ void MediaPluginLibVLC::receiveMessage(const char* message_string)  				{  					if (mLibVLCMediaPlayer)  					{ +                        if (mVlcStatus == STATUS_DONE && !libvlc_media_player_is_playing(mLibVLCMediaPlayer)) +                        { +                            // stop or vlc will ignore 'play', it will just +                            // make an MediaPlayerEndReached event even if +                            // seek was used +                            libvlc_media_player_stop(mLibVLCMediaPlayer); +                        }  						libvlc_media_player_play(mLibVLCMediaPlayer);  					}  				} @@ -606,15 +653,32 @@ void MediaPluginLibVLC::receiveMessage(const char* message_string)  				}  				else if (message_name == "seek")  				{ -					if (mDuration > 0) -					{ -						F64 normalized_offset = message_in.getValueReal("time") / mDuration; -						libvlc_media_player_set_position(mLibVLCMediaPlayer, normalized_offset); -					} +                    if (mLibVLCMediaPlayer) +                    { +                        libvlc_time_t time = 1000.0 * message_in.getValueReal("time"); +                        libvlc_media_player_set_time(mLibVLCMediaPlayer, time); +                        time = libvlc_media_player_get_time(mLibVLCMediaPlayer); +                        if (time < 0) +                        { +                            // -1 if there is no media +                            mCurTime = 0; +                        } +                        else +                        { +                            mCurTime = (F64)time / 1000.0; +                        } + +                        if (!libvlc_media_player_is_playing(mLibVLCMediaPlayer)) +                        { +                            // if paused, won't trigger update, update now +                            setDurationDirty(); +                        } +                    }  				}  				else if (message_name == "set_loop")  				{ -					mIsLooping = true; +					bool loop = message_in.getValueBoolean("loop"); +					mIsLooping = loop;  				}  				else if (message_name == "set_volume")  				{ diff --git a/indra/newview/VIEWER_VERSION.txt b/indra/newview/VIEWER_VERSION.txt index b22e754ac6..5dbe61b99e 100644 --- a/indra/newview/VIEWER_VERSION.txt +++ b/indra/newview/VIEWER_VERSION.txt @@ -1 +1 @@ -6.6.4 +6.6.5 diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 16d8cd9f06..b70b3f4ef7 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -544,17 +544,6 @@        <key>Value</key>        <integer>1</integer>      </map> -    <key>AvalinePhoneSeparator</key> -    <map> -      <key>Comment</key> -      <string>Separator of phone parts to have Avaline numbers human readable in Voice Control Panel</string> -      <key>Persist</key> -      <integer>1</integer> -      <key>Type</key> -      <string>String</string> -      <key>Value</key> -      <string>-</string> -    </map>      <key>AvatarAxisDeadZone0</key>      <map>        <key>Comment</key> @@ -4758,7 +4747,7 @@        <key>Type</key>        <string>String</string>        <key>Value</key> -      <string>https://search.[GRID]/viewer/[CATEGORY]/?q=[QUERY]&r=[MATURITY]&lang=[LANGUAGE]&g=[GODLIKE]&sid=[SESSION_ID]&rid=[REGION_ID]&pid=[PARCEL_ID]&channel=[CHANNEL]&version=[VERSION]&major=[VERSION_MAJOR]&minor=[VERSION_MINOR]&patch=[VERSION_PATCH]&build=[VERSION_BUILD]</string> +      <string>https://search.[GRID]/?query_term=[QUERY]&search_type=[TYPE][COLLECTION]&maturity=[MATURITY]&lang=[LANGUAGE]&g=[GODLIKE]&sid=[SESSION_ID]&rid=[REGION_ID]&pid=[PARCEL_ID]&channel=[CHANNEL]&version=[VERSION]&major=[VERSION_MAJOR]&minor=[VERSION_MINOR]&patch=[VERSION_PATCH]&build=[VERSION_BUILD]</string>      </map>      <key>GuidebookURL</key>      <map> @@ -5806,6 +5795,17 @@        <key>Value</key>        <integer>0</integer>      </map> +    <key>DiskCacheVersion</key> +    <map> +      <key>Comment</key> +      <string>Version number of disk cache</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>S32</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>LocalFileSystemBrowsingEnabled</key>      <map>        <key>Comment</key> @@ -15737,6 +15737,17 @@        <key>Value</key>        <integer>1</integer>      </map> +    <key>AllowSelectAvatar</key> +    <map> +      <key>Comment</key> +      <string>Allows user to select and move avatars, move is viewer sided, does not propagate to server, also supresses avatar position updates while avatars are selected</string> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>       <key>WebProfileFloaterRect</key>      <map>        <key>Comment</key> diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp index 7f6f6e5997..999f4a9f20 100644 --- a/indra/newview/llagent.cpp +++ b/indra/newview/llagent.cpp @@ -716,6 +716,9 @@ void LLAgent::moveYaw(F32 mag, bool reset_view)      U32 mask = AGENT_CONTROL_YAW_POS | AGENT_CONTROL_YAW_NEG;      if ((getControlFlags() & mask) == mask)      { +        // Rotation into both directions should cancel out +        // But keep sending controls to simulator, +        // it's needed for script based controls          gAgentCamera.setYawKey(0);      } diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 1e62b88dfa..33e93da0ef 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -1445,6 +1445,8 @@ bool LLAppViewer::doFrame()  			LL_PROFILE_ZONE_NAMED_CATEGORY_APP( "df suspend" )  		// give listeners a chance to run  		llcoro::suspend(); +		// if one of our coroutines threw an uncaught exception, rethrow it now +		LLCoros::instance().rethrow();  		}  		if (!LLApp::isExiting()) @@ -3286,9 +3288,18 @@ LLSD LLAppViewer::getViewerInfo() const  	info["AUDIO_DRIVER_VERSION"] = gAudiop ? LLSD(gAudiop->getDriverName(want_fullname)) : "Undefined";  	if(LLVoiceClient::getInstance()->voiceEnabled())  	{ -		LLVoiceVersionInfo version = LLVoiceClient::getInstance()->getVersion(); +        LLVoiceVersionInfo version = LLVoiceClient::getInstance()->getVersion(); +        const std::string build_version = version.mBuildVersion;  		std::ostringstream version_string; -		version_string << version.serverType << " " << version.serverVersion << std::endl; +        if (std::equal(build_version.begin(), build_version.begin() + version.serverVersion.size(), +                       version.serverVersion.begin())) +        {  // Normal case: Show type and build version. +            version_string << version.serverType << " " << build_version << std::endl; +        } +        else +        {  // Mismatch: Show both versions. +            version_string << version.serverVersion << "/" << build_version << std::endl; +        }  		info["VOICE_VERSION"] = version_string.str();  	}  	else @@ -4252,6 +4263,15 @@ U32 LLAppViewer::getTextureCacheVersion()  }  //static +U32 LLAppViewer::getDiskCacheVersion() +{ +    // Viewer disk cache version intorduced in Simple Cache Viewer, change if the cache format changes. +    const U32 DISK_CACHE_VERSION = 1; + +    return DISK_CACHE_VERSION ; +} + +//static  U32 LLAppViewer::getObjectCacheVersion()  {  	// Viewer object cache version, change if object update @@ -4280,12 +4300,16 @@ bool LLAppViewer::initCache()  	const bool enable_cache_debug_info = gSavedSettings.getBOOL("EnableDiskCacheDebugInfo");  	bool texture_cache_mismatch = false; +    bool remove_vfs_files = false;  	if (gSavedSettings.getS32("LocalCacheVersion") != LLAppViewer::getTextureCacheVersion())  	{  		texture_cache_mismatch = true;  		if(!read_only)  		{  			gSavedSettings.setS32("LocalCacheVersion", LLAppViewer::getTextureCacheVersion()); + +            //texture cache version was bumped up in Simple Cache Viewer, and at this point old vfs files are not needed +            remove_vfs_files = true;     		}  	} @@ -4331,7 +4355,19 @@ bool LLAppViewer::initCache()  	if (!read_only)  	{ -		if (mPurgeCache) +        if (gSavedSettings.getS32("DiskCacheVersion") != LLAppViewer::getDiskCacheVersion()) +        { +            LLDiskCache::getInstance()->clearCache(); +            remove_vfs_files = true; +            gSavedSettings.setS32("DiskCacheVersion", LLAppViewer::getDiskCacheVersion()); +        } + +        if (remove_vfs_files) +        { +            LLDiskCache::getInstance()->removeOldVFSFiles(); +        } +         +        if (mPurgeCache)  		{  		LLSplashScreen::update(LLTrans::getString("StartupClearingCache"));  		purgeCache(); @@ -5413,7 +5449,7 @@ void LLAppViewer::disconnectViewer()  		gFloaterView->restoreAll();  	} -	if (LLSelectMgr::getInstance()) +	if (LLSelectMgr::instanceExists())  	{  		LLSelectMgr::getInstance()->deselectAll();  	} diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h index 7ab21f35cd..f28a90c703 100644 --- a/indra/newview/llappviewer.h +++ b/indra/newview/llappviewer.h @@ -130,6 +130,7 @@ public:  	static U32 getTextureCacheVersion() ;  	static U32 getObjectCacheVersion() ; +    static U32 getDiskCacheVersion() ;  	const std::string& getSerialNumber() { return mSerialNumber; } @@ -153,16 +154,16 @@ public:  	void removeMarkerFiles();  	void removeDumpDir(); -	// LLAppViewer testing helpers. -	// *NOTE: These will potentially crash the viewer. Only for debugging. -	virtual void forceErrorLLError(); -	virtual void forceErrorBreakpoint(); -	virtual void forceErrorBadMemoryAccess(); -	virtual void forceErrorInfiniteLoop(); -	virtual void forceErrorSoftwareException(); -	virtual void forceErrorDriverCrash(); -	virtual void forceErrorCoroutineCrash(); -	virtual void forceErrorThreadCrash(); +    // LLAppViewer testing helpers. +    // *NOTE: These will potentially crash the viewer. Only for debugging. +    virtual void forceErrorLLError(); +    virtual void forceErrorBreakpoint(); +    virtual void forceErrorBadMemoryAccess(); +    virtual void forceErrorInfiniteLoop(); +    virtual void forceErrorSoftwareException(); +    virtual void forceErrorDriverCrash(); +    virtual void forceErrorCoroutineCrash(); +    virtual void forceErrorThreadCrash();  	// The list is found in app_settings/settings_files.xml  	// but since they are used explicitly in code, diff --git a/indra/newview/llavatarlist.cpp b/indra/newview/llavatarlist.cpp index b0715a3afd..c0990d9d11 100644 --- a/indra/newview/llavatarlist.cpp +++ b/indra/newview/llavatarlist.cpp @@ -241,21 +241,6 @@ void LLAvatarList::setDirty(bool val /*= true*/, bool force_refresh /*= false*/)  	}  } -void LLAvatarList::addAvalineItem(const LLUUID& item_id, const LLUUID& session_id, const std::string& item_name) -{ -	LL_DEBUGS("Avaline") << "Adding avaline item into the list: " << item_name << "|" << item_id << ", session: " << session_id << LL_ENDL; -	LLAvalineListItem* item = new LLAvalineListItem(/*hide_number=*/false); -	item->setAvatarId(item_id, session_id, true, false); -	item->setName(item_name); -	item->showLastInteractionTime(mShowLastInteractionTime); -	item->showSpeakingIndicator(mShowSpeakingIndicator); -	item->setOnline(false); - -	addItem(item, item_id); -	mIDs.push_back(item_id); -	sort(); -} -  //////////////////////////////////////////////////////////////////////////  // PROTECTED SECTION  ////////////////////////////////////////////////////////////////////////// @@ -296,18 +281,10 @@ void LLAvatarList::refresh()  			{  				// *NOTE: If you change the UI to show a different string,  				// be sure to change the filter code below. -				if (LLRecentPeople::instance().isAvalineCaller(buddy_id)) -				{ -					const LLSD& call_data = LLRecentPeople::instance().getData(buddy_id); -					addAvalineItem(buddy_id, call_data["session_id"].asUUID(), call_data["call_number"].asString()); -				} -				else -				{ -					std::string display_name = getAvatarName(av_name); -					addNewItem(buddy_id,  -						display_name.empty() ? waiting_str : display_name,  -						LLAvatarTracker::instance().isBuddyOnline(buddy_id)); -				} +				std::string display_name = getAvatarName(av_name); +				addNewItem(buddy_id,  +					display_name.empty() ? waiting_str : display_name,  +					LLAvatarTracker::instance().isBuddyOnline(buddy_id));  				modified = true;  				nadded++; @@ -463,7 +440,7 @@ void LLAvatarList::addNewItem(const LLUUID& id, const std::string& name, BOOL is  BOOL LLAvatarList::handleRightMouseDown(S32 x, S32 y, MASK mask)  {  	BOOL handled = LLUICtrl::handleRightMouseDown(x, y, mask); -	if ( mContextMenu && !isAvalineItemSelected()) +	if ( mContextMenu)  	{  		uuid_vec_t selected_uuids;  		getSelectedUUIDs(selected_uuids); @@ -523,21 +500,6 @@ BOOL LLAvatarList::handleHover(S32 x, S32 y, MASK mask)  	return handled;  } -bool LLAvatarList::isAvalineItemSelected() -{ -	std::vector<LLPanel*> selected_items; -	getSelectedItems(selected_items); -	std::vector<LLPanel*>::iterator it = selected_items.begin(); -	 -	for(; it != selected_items.end(); ++it) -	{ -		if (dynamic_cast<LLAvalineListItem*>(*it)) -			return true; -	} - -	return false; -} -  void LLAvatarList::setVisible(BOOL visible)  {  	if ( visible == FALSE && mContextMenu ) @@ -626,63 +588,3 @@ bool LLAvatarItemAgentOnTopComparator::doCompare(const LLAvatarListItem* avatar_  	}  	return LLAvatarItemNameComparator::doCompare(avatar_item1,avatar_item2);  } - -/************************************************************************/ -/*             class LLAvalineListItem                                  */ -/************************************************************************/ -LLAvalineListItem::LLAvalineListItem(bool hide_number/* = true*/) : LLAvatarListItem(false) -, mIsHideNumber(hide_number) -{ -	// should not use buildPanel from the base class to ensure LLAvalineListItem::postBuild is called. -	buildFromFile( "panel_avatar_list_item.xml"); -} - -BOOL LLAvalineListItem::postBuild() -{ -	BOOL rv = LLAvatarListItem::postBuild(); - -	if (rv) -	{ -		setOnline(true); -		showLastInteractionTime(false); -		setShowProfileBtn(false); -		setShowInfoBtn(false); -		mAvatarIcon->setValue("Avaline_Icon"); -		mAvatarIcon->setToolTip(std::string("")); -	} -	return rv; -} - -// to work correctly this method should be called AFTER setAvatarId for avaline callers with hidden phone number -void LLAvalineListItem::setName(const std::string& name) -{ -	if (mIsHideNumber) -	{ -		static U32 order = 0; -		typedef std::map<LLUUID, U32> avaline_callers_nums_t; -		static avaline_callers_nums_t mAvalineCallersNums; - -		llassert(getAvatarId() != LLUUID::null); - -		const LLUUID &uuid = getAvatarId(); - -		if (mAvalineCallersNums.find(uuid) == mAvalineCallersNums.end()) -		{ -			mAvalineCallersNums[uuid] = ++order; -			LL_DEBUGS("Avaline") << "Set name for new avaline caller: " << uuid << ", order: " << order << LL_ENDL; -		} -		LLStringUtil::format_map_t args; -		args["[ORDER]"] = llformat("%u", mAvalineCallersNums[uuid]); -		std::string hidden_name = LLTrans::getString("AvalineCaller", args); - -		LL_DEBUGS("Avaline") << "Avaline caller: " << uuid << ", name: " << hidden_name << LL_ENDL; -		LLAvatarListItem::setAvatarName(hidden_name); -		LLAvatarListItem::setAvatarToolTip(hidden_name); -	} -	else -	{ -		const std::string& formatted_phone = LLTextUtil::formatPhoneNumber(name); -		LLAvatarListItem::setAvatarName(formatted_phone); -		LLAvatarListItem::setAvatarToolTip(formatted_phone); -	} -} diff --git a/indra/newview/llavatarlist.h b/indra/newview/llavatarlist.h index 1a672c279b..48b0e70454 100644 --- a/indra/newview/llavatarlist.h +++ b/indra/newview/llavatarlist.h @@ -98,7 +98,6 @@ public:  	virtual S32 notifyParent(const LLSD& info); -	void addAvalineItem(const LLUUID& item_id, const LLUUID& session_id, const std::string& item_name);  	void handleDisplayNamesOptionChanged();  	void setShowCompleteName(bool show) { mShowCompleteName = show;}; @@ -118,8 +117,6 @@ protected:  private: -	bool isAvalineItemSelected(); -  	bool mIgnoreOnlineStatus;  	bool mShowLastInteractionTime;  	bool mDirty; @@ -189,27 +186,4 @@ protected:  	virtual bool doCompare(const LLAvatarListItem* avatar_item1, const LLAvatarListItem* avatar_item2) const;  }; -/** - * Represents Avaline caller in Avatar list in Voice Control Panel and group chats. - */ -class LLAvalineListItem : public LLAvatarListItem -{ -public: - -	/** -	 * Constructor -	 * -	 * @param hide_number - flag indicating if number should be hidden. -	 *		In this case It will be shown as "Avaline Caller 1", "Avaline Caller 1", etc. -	 */ -	LLAvalineListItem(bool hide_number = true); - -	/*virtual*/ BOOL postBuild(); - -	/*virtual*/ void setName(const std::string& name); - -private: -	bool mIsHideNumber; -}; -  #endif // LL_LLAVATARLIST_H diff --git a/indra/newview/llavatarrenderinfoaccountant.cpp b/indra/newview/llavatarrenderinfoaccountant.cpp index fe94cd27b6..275f17b02a 100644 --- a/indra/newview/llavatarrenderinfoaccountant.cpp +++ b/indra/newview/llavatarrenderinfoaccountant.cpp @@ -320,9 +320,16 @@ void LLAvatarRenderInfoAccountant::sendRenderInfoToRegion(LLViewerRegion * regio          // make sure we won't re-report, coro will update timer with correct time later          regionp->getRenderInfoReportTimer().resetWithExpiry(SECS_BETWEEN_REGION_REPORTS); -        std::string coroname = -            LLCoros::instance().launch("LLAvatarRenderInfoAccountant::avatarRenderInfoReportCoro", -            boost::bind(&LLAvatarRenderInfoAccountant::avatarRenderInfoReportCoro, url, regionp->getHandle())); +        try +        { +            std::string coroname = +                LLCoros::instance().launch("LLAvatarRenderInfoAccountant::avatarRenderInfoReportCoro", +                    boost::bind(&LLAvatarRenderInfoAccountant::avatarRenderInfoReportCoro, url, regionp->getHandle())); +        } +        catch (std::bad_alloc&) +        { +            LL_ERRS() << "LLCoros::launch() allocation failure" << LL_ENDL; +        }  	}  } @@ -343,10 +350,17 @@ void LLAvatarRenderInfoAccountant::getRenderInfoFromRegion(LLViewerRegion * regi          // make sure we won't re-request, coro will update timer with correct time later          regionp->getRenderInfoRequestTimer().resetWithExpiry(SECS_BETWEEN_REGION_REQUEST); -		// First send a request to get the latest data -        std::string coroname = -            LLCoros::instance().launch("LLAvatarRenderInfoAccountant::avatarRenderInfoGetCoro", -            boost::bind(&LLAvatarRenderInfoAccountant::avatarRenderInfoGetCoro, url, regionp->getHandle())); +        try +        { +            // First send a request to get the latest data +            std::string coroname = +                LLCoros::instance().launch("LLAvatarRenderInfoAccountant::avatarRenderInfoGetCoro", +                    boost::bind(&LLAvatarRenderInfoAccountant::avatarRenderInfoGetCoro, url, regionp->getHandle())); +        } +        catch (std::bad_alloc&) +        { +            LL_ERRS() << "LLCoros::launch() allocation failure" << LL_ENDL; +        }  	}  } diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp index bdd516e1de..7ff24f64ac 100644 --- a/indra/newview/llchathistory.cpp +++ b/indra/newview/llchathistory.cpp @@ -48,6 +48,7 @@  #include "llspeakers.h" //for LLIMSpeakerMgr  #include "lltrans.h"  #include "llfloaterreg.h" +#include "llfloaterreporter.h"  #include "llfloatersidepanelcontainer.h"  #include "llmutelist.h"  #include "llstylemap.h" @@ -118,6 +119,7 @@ public:  		mSourceType(CHAT_SOURCE_UNKNOWN),  		mFrom(),  		mSessionID(), +        mCreationTime(time_corrected()),  		mMinUserNameWidth(0),  		mUserNameFont(NULL),  		mUserNameTextBox(NULL), @@ -403,6 +405,48 @@ public:  		{  			LLAvatarActions::pay(getAvatarId());  		} +        else if (level == "report_abuse") +        { +            std::string time_string; +            if (mTime > 0) // have frame time +            { +                time_t current_time = time_corrected(); +                time_t message_time = current_time - LLFrameTimer::getElapsedSeconds() + mTime; + +                time_string = "[" + LLTrans::getString("TimeMonth") + "]/[" +                    + LLTrans::getString("TimeDay") + "]/[" +                    + LLTrans::getString("TimeYear") + "] [" +                    + LLTrans::getString("TimeHour") + "]:[" +                    + LLTrans::getString("TimeMin") + "]"; + +                LLSD substitution; + +                substitution["datetime"] = (S32)message_time; +                LLStringUtil::format(time_string, substitution); +            } +            else +            { +                // From history. This might be empty or not full. +                // See LLChatLogParser::parse +                time_string = getChild<LLTextBox>("time_box")->getValue().asString(); + +                // Just add current date if not full. +                // Should be fine since both times are supposed to be stl +                if (!time_string.empty() && time_string.size() < 7) +                { +                    time_string = "[" + LLTrans::getString("TimeMonth") + "]/[" +                        + LLTrans::getString("TimeDay") + "]/[" +                        + LLTrans::getString("TimeYear") + "] " + time_string; + +                    LLSD substitution; +                    // To avoid adding today's date to yesterday's timestamp, +                    // use creation time instead of current time +                    substitution["datetime"] = (S32)mCreationTime; +                    LLStringUtil::format(time_string, substitution); +                } +            } +            LLFloaterReporter::showFromChat(mAvatarID, mFrom, time_string, mText); +        }  		else if(level == "block_unblock")  		{  			LLAvatarActions::toggleMute(getAvatarId(), LLMute::flagVoiceChat); @@ -477,6 +521,10 @@ public:  		{  			return canModerate(userdata);  		} +        else if (level == "report_abuse") +        { +            return gAgentID != mAvatarID; +        }  		else if (level == "can_ban_member")  		{  			return canBanGroupMember(getAvatarId()); @@ -634,6 +682,12 @@ public:  		mSessionID = chat.mSessionID;  		mSourceType = chat.mSourceType; +        // To be able to report a message, we need a copy of it's text +        // and it's easier to store text directly than trying to get +        // it from a lltextsegment or chat's mEditor +        mText = chat.mText; +        mTime = chat.mTime; +  		//*TODO overly defensive thing, source type should be maintained out there  		if((chat.mFromID.isNull() && chat.mFromName.empty()) || (chat.mFromName == SYSTEM_FROM && chat.mFromID.isNull()))  		{ @@ -983,6 +1037,9 @@ protected:  	EChatSourceType		mSourceType;  	std::string			mFrom;  	LLUUID				mSessionID; +    std::string			mText; +    F64					mTime; // IM's frame time +    time_t				mCreationTime; // Views's time  	S32					mMinUserNameWidth;  	const LLFontGL*		mUserNameFont; diff --git a/indra/newview/llconversationloglist.cpp b/indra/newview/llconversationloglist.cpp index 86e23e7c83..97b16a5e93 100644 --- a/indra/newview/llconversationloglist.cpp +++ b/indra/newview/llconversationloglist.cpp @@ -391,7 +391,8 @@ bool LLConversationLogList::isActionEnabled(const LLSD& userdata)  			 "can_invite_to_group"	== command_name ||  			 "can_share"			== command_name ||  			 "can_block"			== command_name || -			 "can_pay"				== command_name) +			 "can_pay"				== command_name || +			 "report_abuse"			== command_name)  	{  		return is_p2p;  	} diff --git a/indra/newview/llconversationmodel.cpp b/indra/newview/llconversationmodel.cpp index a685639427..9ec4fb085b 100644 --- a/indra/newview/llconversationmodel.cpp +++ b/indra/newview/llconversationmodel.cpp @@ -182,6 +182,7 @@ void LLConversationItem::buildParticipantMenuOptions(menuentry_vec_t& items, U32  		items.push_back(std::string("map"));  		items.push_back(std::string("share"));  		items.push_back(std::string("pay")); +        items.push_back(std::string("report_abuse"));  		items.push_back(std::string("block_unblock"));  		items.push_back(std::string("MuteText")); diff --git a/indra/newview/lldonotdisturbnotificationstorage.cpp b/indra/newview/lldonotdisturbnotificationstorage.cpp index 7d4961c598..4d9ef99319 100644 --- a/indra/newview/lldonotdisturbnotificationstorage.cpp +++ b/indra/newview/lldonotdisturbnotificationstorage.cpp @@ -80,9 +80,14 @@ LLDoNotDisturbNotificationStorage::~LLDoNotDisturbNotificationStorage()  {  } +void LLDoNotDisturbNotificationStorage::reset() +{ +    setFileName(gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, "dnd_notifications.xml")); +} +  void LLDoNotDisturbNotificationStorage::initialize()  { -	setFileName(gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, "dnd_notifications.xml")); +    reset();  	getCommunicationChannel()->connectFailedFilter(boost::bind(&LLDoNotDisturbNotificationStorage::onChannelChanged, this, _1));  } diff --git a/indra/newview/lldonotdisturbnotificationstorage.h b/indra/newview/lldonotdisturbnotificationstorage.h index c6f0bf1ab5..237d58b4de 100644 --- a/indra/newview/lldonotdisturbnotificationstorage.h +++ b/indra/newview/lldonotdisturbnotificationstorage.h @@ -61,6 +61,7 @@ public:  	void loadNotifications();      void updateNotifications();      void removeNotification(const char * name, const LLUUID& id); +    void reset();  protected: diff --git a/indra/newview/llfloater360capture.cpp b/indra/newview/llfloater360capture.cpp index 279a8f68ea..16f251c9b3 100644 --- a/indra/newview/llfloater360capture.cpp +++ b/indra/newview/llfloater360capture.cpp @@ -114,6 +114,11 @@ BOOL LLFloater360Capture::postBuild()      // by default each time vs restoring the last value      mQualityRadioGroup->setSelectedIndex(0); +    return true; +} + +void LLFloater360Capture::onOpen(const LLSD& key) +{      // Construct a URL pointing to the first page to load. Although      // we do not use this page for anything (after some significant      // design changes), we retain the code to load the start page @@ -154,8 +159,6 @@ BOOL LLFloater360Capture::postBuild()      // We do an initial capture when the floater is opened, albeit at a 'preview'      // quality level (really low resolution, but really fast)      onCapture360ImagesBtn(); - -    return true;  }  // called when the user choose a quality level using diff --git a/indra/newview/llfloater360capture.h b/indra/newview/llfloater360capture.h index 6da7ee074a..8f765c0b1b 100644 --- a/indra/newview/llfloater360capture.h +++ b/indra/newview/llfloater360capture.h @@ -47,6 +47,7 @@ class LLFloater360Capture:          ~LLFloater360Capture();          BOOL postBuild() override; +        void onOpen(const LLSD& key) override;          void handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event) override;          void changeInterestListMode(bool send_everything); diff --git a/indra/newview/llfloateravatarpicker.cpp b/indra/newview/llfloateravatarpicker.cpp index ab95bc06b8..0186c4aebe 100644 --- a/indra/newview/llfloateravatarpicker.cpp +++ b/indra/newview/llfloateravatarpicker.cpp @@ -105,6 +105,7 @@ LLFloaterAvatarPicker::LLFloaterAvatarPicker(const LLSD& key)  	mNumResultsReturned(0),  	mNearMeListComplete(FALSE),  	mCloseOnSelect(FALSE), +    mExcludeAgentFromSearchResults(FALSE),      mContextConeOpacity	(0.f),      mContextConeInAlpha(0.f),      mContextConeOutAlpha(0.f), @@ -295,7 +296,7 @@ void LLFloaterAvatarPicker::populateNearMe()  	for(U32 i=0; i<avatar_ids.size(); i++)  	{  		LLUUID& av = avatar_ids[i]; -		if(av == gAgent.getID()) continue; +		if(mExcludeAgentFromSearchResults && (av == gAgent.getID())) continue;  		LLSD element;  		element["id"] = av; // value  		LLAvatarName av_name; diff --git a/indra/newview/llfloaterbvhpreview.cpp b/indra/newview/llfloaterbvhpreview.cpp index a3037ed651..392633bd7d 100644 --- a/indra/newview/llfloaterbvhpreview.cpp +++ b/indra/newview/llfloaterbvhpreview.cpp @@ -1047,7 +1047,12 @@ LLPreviewAnimation::LLPreviewAnimation(S32 width, S32 height) : LLViewerDynamicT  	mDummyAvatar = (LLVOAvatar*)gObjectList.createObjectViewer(LL_PCODE_LEGACY_AVATAR, gAgent.getRegion(), LLViewerObject::CO_FLAG_UI_AVATAR);  	mDummyAvatar->mSpecialRenderMode = 1;  	mDummyAvatar->startMotion(ANIM_AGENT_STAND, BASE_ANIM_TIME_OFFSET); -	mDummyAvatar->hideSkirt(); + +    // on idle overall apperance update will set skirt to visible, so either +    // call early or account for mSpecialRenderMode in updateMeshVisibility +    mDummyAvatar->updateOverallAppearance(); +    mDummyAvatar->hideHair(); +    mDummyAvatar->hideSkirt();  	// stop extraneous animations  	mDummyAvatar->stopMotion( ANIM_AGENT_HEAD_ROT, TRUE ); @@ -1135,6 +1140,7 @@ BOOL	LLPreviewAnimation::render()  		{  			LLDrawPoolAvatar *avatarPoolp = (LLDrawPoolAvatar *)face->getPool();  			avatarp->dirtyMesh(); +            gPipeline.enableLightsPreview();  			avatarPoolp->renderAvatars(avatarp);  // renders only one avatar  		}  	} diff --git a/indra/newview/llfloaterimcontainer.cpp b/indra/newview/llfloaterimcontainer.cpp index 1525bb9952..703b5d0011 100644 --- a/indra/newview/llfloaterimcontainer.cpp +++ b/indra/newview/llfloaterimcontainer.cpp @@ -45,6 +45,7 @@  #include "llflashtimer.h"  #include "llfloateravatarpicker.h"  #include "llfloaterpreference.h" +#include "llfloaterreporter.h"  #include "llimview.h"  #include "llnotificationsutil.h"  #include "lltoolbarview.h" @@ -1242,6 +1243,18 @@ void LLFloaterIMContainer::doToParticipants(const std::string& command, uuid_vec  		{  			LLAvatarActions::pay(userID);  		} +        else if ("report_abuse" == command) +        { +            LLAvatarName av_name; +            if (LLAvatarNameCache::get(userID, &av_name)) +            { +                LLFloaterReporter::showFromAvatar(userID, av_name.getCompleteName()); +            } +            else +            { +                LLFloaterReporter::showFromAvatar(userID, "not avaliable"); +            } +        }  		else if ("block_unblock" == command)  		{  			LLAvatarActions::toggleMute(userID, LLMute::flagVoiceChat); @@ -1507,7 +1520,11 @@ bool LLFloaterIMContainer::enableContextMenuItem(const std::string& item, uuid_v  	}  	// Handle all other options -	if (("can_invite" == item) || ("can_chat_history" == item) || ("can_share" == item) || ("can_pay" == item)) +	if (("can_invite" == item) +        || ("can_chat_history" == item) +        || ("can_share" == item) +        || ("can_pay" == item) +        || ("report_abuse" == item))  	{  		// Those menu items are enable only if a single avatar is selected  		return is_single_select; diff --git a/indra/newview/llfloatermarketplacelistings.cpp b/indra/newview/llfloatermarketplacelistings.cpp index 524162ba51..e755e9924c 100644 --- a/indra/newview/llfloatermarketplacelistings.cpp +++ b/indra/newview/llfloatermarketplacelistings.cpp @@ -579,7 +579,25 @@ void LLFloaterMarketplaceListings::updateView()          // Update the top message or flip to the tabs and folders view          // *TODO : check those messages and create better appropriate ones in strings.xml -        if (mRootFolderId.notNull()) +        if (mkt_status == MarketplaceStatusCodes::MARKET_PLACE_CONNECTION_FAILURE) +        { +            std::string reason = LLMarketplaceData::instance().getSLMConnectionfailureReason(); +            if (reason.empty()) +            { +                text = LLTrans::getString("InventoryMarketplaceConnectionError"); +            } +            else +            { +                LLSD args; +                args["[REASON]"] = reason; +                text = LLTrans::getString("InventoryMarketplaceConnectionErrorReason", args); +            } + +            title = LLTrans::getString("InventoryOutboxErrorTitle"); +            tooltip = LLTrans::getString("InventoryOutboxErrorTooltip"); +            LL_WARNS() << "Marketplace status code: " << mkt_status << LL_ENDL; +        } +        else if (mRootFolderId.notNull())          {              // "Marketplace listings is empty!" message strings              text = LLTrans::getString("InventoryMarketplaceListingsNoItems", subs); diff --git a/indra/newview/llfloatermediasettings.cpp b/indra/newview/llfloatermediasettings.cpp index 2afd889609..b34961e8a2 100644 --- a/indra/newview/llfloatermediasettings.cpp +++ b/indra/newview/llfloatermediasettings.cpp @@ -157,6 +157,18 @@ void LLFloaterMediaSettings::apply()  }  //////////////////////////////////////////////////////////////////////////////// +void LLFloaterMediaSettings::onOpen(const LLSD& key) +{ +    if (mPanelMediaSettingsGeneral) +    { +        // media is expensive, so only load it when nessesary. +        // If we need to preload it, set volume to 0 and any pause +        // if applicable, then unpause here +        mPanelMediaSettingsGeneral->updateMediaPreview(); +    } +} + +////////////////////////////////////////////////////////////////////////////////  void LLFloaterMediaSettings::onClose(bool app_quitting)  {  	if(mPanelMediaSettingsGeneral) diff --git a/indra/newview/llfloatermediasettings.h b/indra/newview/llfloatermediasettings.h index f93512eb3a..151e43e6b9 100644 --- a/indra/newview/llfloatermediasettings.h +++ b/indra/newview/llfloatermediasettings.h @@ -42,6 +42,7 @@ public:  	~LLFloaterMediaSettings();  	/*virtual*/ BOOL postBuild(); +    /*virtual*/ void onOpen(const LLSD& key);  	/*virtual*/ void onClose(bool app_quitting);  	static LLFloaterMediaSettings* getInstance(); diff --git a/indra/newview/llfloatermodelpreview.cpp b/indra/newview/llfloatermodelpreview.cpp index 58fbdba315..90390de52a 100644 --- a/indra/newview/llfloatermodelpreview.cpp +++ b/indra/newview/llfloatermodelpreview.cpp @@ -507,6 +507,15 @@ void LLFloaterModelPreview::onClickCalculateBtn()  	toggleCalculateButton(false);  	mUploadBtn->setEnabled(false); +  +    //disable "simplification" UI +    LLPanel* simplification_panel = getChild<LLPanel>("physics simplification"); +    LLView* child = simplification_panel->getFirstChild(); +    while (child) +    { +        child->setEnabled(false); +        child = simplification_panel->findNextSibling(child); +    }  }  // Modified cell_params, make sure to clear values if you have to reuse cell_params outside of this function diff --git a/indra/newview/llfloaterpay.cpp b/indra/newview/llfloaterpay.cpp index 87973c2286..94261b2e4e 100644 --- a/indra/newview/llfloaterpay.cpp +++ b/indra/newview/llfloaterpay.cpp @@ -72,7 +72,7 @@ struct LLGiveMoneyInfo  		mFloater(floater), mAmount(amount){}  }; -typedef boost::shared_ptr<LLGiveMoneyInfo> give_money_ptr; +typedef std::shared_ptr<LLGiveMoneyInfo> give_money_ptr;  ///----------------------------------------------------------------------------  /// Class LLFloaterPay diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp index 26ea029cac..dcd96d1f7d 100644 --- a/indra/newview/llfloaterpreference.cpp +++ b/indra/newview/llfloaterpreference.cpp @@ -2952,10 +2952,15 @@ void LLPanelPreferenceControls::cancel()          if (mConflictHandler[i].hasUnsavedChanges())          {              mConflictHandler[i].clear(); +            if (mEditingMode == i) +            { +                // cancel() can be called either when preferences floater closes +                // or when child floater closes (like advanced graphical settings) +                // in which case we need to clear and repopulate table +                regenerateControls(); +            }          }      } -    pControlsTable->clearRows(); -    pControlsTable->clearColumns();  }  void LLPanelPreferenceControls::saveSettings() diff --git a/indra/newview/llfloaterregioninfo.cpp b/indra/newview/llfloaterregioninfo.cpp index bf38a495bb..65decbcd77 100644 --- a/indra/newview/llfloaterregioninfo.cpp +++ b/indra/newview/llfloaterregioninfo.cpp @@ -1320,6 +1320,7 @@ void LLPanelRegionDebugInfo::onClickDebugConsole(void* data)  BOOL LLPanelRegionTerrainInfo::validateTextureSizes()  { +    static const S32 MAX_TERRAIN_TEXTURE_SIZE = 1024;  	for(S32 i = 0; i < TERRAIN_TEXTURE_COUNT; ++i)  	{  		std::string buffer; @@ -1341,17 +1342,19 @@ BOOL LLPanelRegionTerrainInfo::validateTextureSizes()  			LLSD args;  			args["TEXTURE_NUM"] = i+1;  			args["TEXTURE_BIT_DEPTH"] = llformat("%d",components * 8); +            args["MAX_SIZE"] = MAX_TERRAIN_TEXTURE_SIZE;  			LLNotificationsUtil::add("InvalidTerrainBitDepth", args);  			return FALSE;  		} -		if (width > 512 || height > 512) +		if (width > MAX_TERRAIN_TEXTURE_SIZE || height > MAX_TERRAIN_TEXTURE_SIZE)  		{  			LLSD args;  			args["TEXTURE_NUM"] = i+1;  			args["TEXTURE_SIZE_X"] = width;  			args["TEXTURE_SIZE_Y"] = height; +            args["MAX_SIZE"] = MAX_TERRAIN_TEXTURE_SIZE;  			LLNotificationsUtil::add("InvalidTerrainSize", args);  			return FALSE; @@ -3681,7 +3684,7 @@ void LLPanelEstateAccess::searchAgent(LLNameListCtrl* listCtrl, const std::strin  	if (!search_string.empty())  	{  		listCtrl->setSearchColumn(0); // name column -		listCtrl->selectItemByPrefix(search_string, FALSE); +		listCtrl->searchItems(search_string, false, true);  	}  	else  	{ diff --git a/indra/newview/llfloaterreporter.cpp b/indra/newview/llfloaterreporter.cpp index b73755cf4e..2df4ca973d 100644 --- a/indra/newview/llfloaterreporter.cpp +++ b/indra/newview/llfloaterreporter.cpp @@ -54,6 +54,7 @@  #include "llbutton.h"  #include "llfloaterreg.h"  #include "lltexturectrl.h" +#include "lltexteditor.h"  #include "llscrolllistctrl.h"  #include "lldispatcher.h"  #include "llviewerobject.h" @@ -250,9 +251,6 @@ LLFloaterReporter::~LLFloaterReporter()  	mPosition.setVec(0.0f, 0.0f, 0.0f); -	std::for_each(mMCDList.begin(), mMCDList.end(), DeletePointer() ); -	mMCDList.clear(); -  	delete mResourceDatap;  } @@ -661,6 +659,23 @@ void LLFloaterReporter::showFromAvatar(const LLUUID& avatar_id, const std::strin  	show(avatar_id, avatar_name);  } +// static +void LLFloaterReporter::showFromChat(const LLUUID& avatar_id, const std::string& avatar_name, const std::string& time, const std::string& description) +{ +    show(avatar_id, avatar_name); + +    LLStringUtil::format_map_t args; +    args["[MSG_TIME]"] = time; +    args["[MSG_DESCRIPTION]"] = description; + +    LLFloaterReporter *self = LLFloaterReg::findTypedInstance<LLFloaterReporter>("reporter"); +    if (self) +    { +        std::string description = self->getString("chat_report_format", args); +        self->getChild<LLUICtrl>("details_edit")->setValue(description); +    } +} +  void LLFloaterReporter::setPickedObjectProperties(const std::string& object_name, const std::string& owner_name, const LLUUID owner_id)  {  	getChild<LLUICtrl>("object_name")->setValue(object_name); @@ -1028,37 +1043,3 @@ void LLFloaterReporter::onClose(bool app_quitting)  	mSnapshotTimer.stop();  	gSavedPerAccountSettings.setBOOL("PreviousScreenshotForReport", app_quitting);  } - - -// void LLFloaterReporter::setDescription(const std::string& description, LLMeanCollisionData *mcd) -// { -// 	LLFloaterReporter *self = LLFloaterReg::findTypedInstance<LLFloaterReporter>("reporter"); -// 	if (self) -// 	{ -// 		self->getChild<LLUICtrl>("details_edit")->setValue(description); - -// 		for_each(self->mMCDList.begin(), self->mMCDList.end(), DeletePointer()); -// 		self->mMCDList.clear(); -// 		if (mcd) -// 		{ -// 			self->mMCDList.push_back(new LLMeanCollisionData(mcd)); -// 		} -// 	} -// } - -// void LLFloaterReporter::addDescription(const std::string& description, LLMeanCollisionData *mcd) -// { -// 	LLFloaterReporter *self = LLFloaterReg::findTypedInstance<LLFloaterReporter>("reporter"); -// 	if (self) -// 	{ -// 		LLTextEditor* text = self->getChild<LLTextEditor>("details_edit"); -// 		if (text) -// 		{	 -// 			text->insertText(description); -// 		} -// 		if (mcd) -// 		{ -// 			self->mMCDList.push_back(new LLMeanCollisionData(mcd)); -// 		} -// 	} -// } diff --git a/indra/newview/llfloaterreporter.h b/indra/newview/llfloaterreporter.h index c678df7155..b6c70e866d 100644 --- a/indra/newview/llfloaterreporter.h +++ b/indra/newview/llfloaterreporter.h @@ -93,6 +93,7 @@ public:  	static void showFromObject(const LLUUID& object_id, const LLUUID& experience_id = LLUUID::null);  	static void showFromAvatar(const LLUUID& avatar_id, const std::string avatar_name); +    static void showFromChat(const LLUUID& avatar_id, const std::string& avatar_name, const std::string& time, const std::string& description);  	static void showFromExperience(const LLUUID& experience_id);  	static void onClickSend			(void *userdata); @@ -101,8 +102,6 @@ public:  	void onClickSelectAbuser ();  	static void closePickTool	(void *userdata);  	static void uploadDoneCallback(const LLUUID &uuid, void* user_data, S32 result, LLExtStat ext_status); -	static void addDescription(const std::string& description, LLMeanCollisionData *mcd = NULL); -	static void setDescription(const std::string& description, LLMeanCollisionData *mcd = NULL);  	void setPickedObjectProperties(const std::string& object_name, const std::string& owner_name, const LLUUID owner_id); @@ -114,10 +113,8 @@ private:  	static void show(const LLUUID& object_id, const std::string& avatar_name = LLStringUtil::null, const LLUUID& experience_id = LLUUID::null);  	void takeScreenshot(bool use_prev_screenshot = false); -	void sendReportViaCaps(std::string url);  	void uploadImage();  	bool validateReport(); -	void setReporterID();  	LLSD gatherReport();  	void sendReportViaLegacy(const LLSD & report);  	void sendReportViaCaps(std::string url, std::string sshot_url, const LLSD & report); @@ -144,7 +141,6 @@ private:  	BOOL 			mPicking;  	LLVector3		mPosition;  	BOOL			mCopyrightWarningSeen; -	std::list<LLMeanCollisionData*> mMCDList;  	std::string		mDefaultSummary;  	LLResourceData* mResourceDatap;  	boost::signals2::connection mAvatarNameCacheConnection; diff --git a/indra/newview/llfloatersearch.cpp b/indra/newview/llfloatersearch.cpp index 2e1fbb09e0..bb3ed77772 100644 --- a/indra/newview/llfloatersearch.cpp +++ b/indra/newview/llfloatersearch.cpp @@ -57,10 +57,10 @@ public:  		const size_t parts = tokens.size();  		// get the (optional) category for the search -		std::string category; +		std::string collection;  		if (parts > 0)  		{ -			category = tokens[0].asString(); +            collection = tokens[0].asString();  		}  		// get the (optional) search string @@ -72,7 +72,7 @@ public:  		// create the LLSD arguments for the search floater  		LLFloaterSearch::Params p; -		p.search.category = category; +		p.search.collection = collection;  		p.search.query = LLURI::unescape(search_text);  		// open the search floater and perform the requested search @@ -83,8 +83,9 @@ public:  LLSearchHandler gSearchHandler;  LLFloaterSearch::SearchQuery::SearchQuery() -:	category("category", ""), -	query("query") +:   category("category", ""), +    collection("collection", ""), +    query("query")  {}  LLFloaterSearch::LLFloaterSearch(const Params& key) : @@ -93,16 +94,16 @@ LLFloaterSearch::LLFloaterSearch(const Params& key) :  {  	// declare a map that transforms a category name into  	// the URL suffix that is used to search that category -	mCategoryPaths = LLSD::emptyMap(); -	mCategoryPaths["all"]          = "search"; -	mCategoryPaths["people"]       = "search/people"; -	mCategoryPaths["places"]       = "search/places"; -	mCategoryPaths["events"]       = "search/events"; -	mCategoryPaths["groups"]       = "search/groups"; -	mCategoryPaths["wiki"]         = "search/wiki"; -	mCategoryPaths["land"]         = "land"; -	mCategoryPaths["destinations"] = "destinations"; -	mCategoryPaths["classifieds"]  = "classifieds"; + +    mSearchType.insert("standard"); +    mSearchType.insert("land"); +    mSearchType.insert("classified"); + +    mCollectionType.insert("events"); +    mCollectionType.insert("destinations"); +    mCollectionType.insert("places"); +    mCollectionType.insert("groups"); +    mCollectionType.insert("people");  }  BOOL LLFloaterSearch::postBuild() @@ -157,31 +158,49 @@ void LLFloaterSearch::search(const SearchQuery &p)  	// work out the subdir to use based on the requested category  	LLSD subs; -	if (mCategoryPaths.has(p.category)) +	if (mSearchType.find(p.category) != mSearchType.end())  	{ -		subs["CATEGORY"] = mCategoryPaths[p.category].asString(); +		subs["TYPE"] = p.category;  	}  	else  	{ -		subs["CATEGORY"] = mCategoryPaths["all"].asString(); +		subs["TYPE"] = "standard";  	}  	// add the search query string  	subs["QUERY"] = LLURI::escape(p.query); +    subs["COLLECTION"] = ""; +    if (subs["TYPE"] == "standard") +    { +        if (mCollectionType.find(p.collection) != mCollectionType.end()) +        { +            subs["COLLECTION"] = "&collection_chosen=" + std::string(p.collection); +        } +        else +        { +            std::string collection_args(""); +            for (std::set<std::string>::iterator it = mCollectionType.begin(); it != mCollectionType.end(); ++it) +            { +                collection_args += "&collection_chosen=" + std::string(*it); +            } +            subs["COLLECTION"] = collection_args; +        } +    } +  	// add the user's preferred maturity (can be changed via prefs)  	std::string maturity;  	if (gAgent.prefersAdult())  	{ -		maturity = "42";  // PG,Mature,Adult +		maturity = "gma";  // PG,Mature,Adult  	}  	else if (gAgent.prefersMature())  	{ -		maturity = "21";  // PG,Mature +		maturity = "gm";  // PG,Mature  	}  	else  	{ -		maturity = "13";  // PG +		maturity = "g";  // PG  	}  	subs["MATURITY"] = maturity; diff --git a/indra/newview/llfloatersearch.h b/indra/newview/llfloatersearch.h index 35b268e1b2..cc77ce696f 100644 --- a/indra/newview/llfloatersearch.h +++ b/indra/newview/llfloatersearch.h @@ -49,6 +49,7 @@ public:  	struct SearchQuery : public LLInitParam::Block<SearchQuery>  	{  		Optional<std::string> category; +        Optional<std::string> collection;  		Optional<std::string> query;  		SearchQuery(); @@ -84,7 +85,8 @@ public:  private:  	/*virtual*/ BOOL postBuild(); -	LLSD        mCategoryPaths; +    std::set<std::string> mSearchType; +    std::set<std::string> mCollectionType;  	U8          mSearchGodLevel;  }; diff --git a/indra/newview/llfloatertools.cpp b/indra/newview/llfloatertools.cpp index 77a04bc5d7..b6acba6558 100644 --- a/indra/newview/llfloatertools.cpp +++ b/indra/newview/llfloatertools.cpp @@ -46,7 +46,6 @@  #include "llfloaterreg.h"  #include "llfocusmgr.h"  #include "llmediaentry.h" -#include "llmediactrl.h"  #include "llmenugl.h"  #include "llnotificationsutil.h"  #include "llpanelcontents.h" @@ -240,7 +239,6 @@ BOOL	LLFloaterTools::postBuild()  	mRadioGroupMove		= getChild<LLRadioGroup>("move_radio_group");  	mRadioGroupEdit		= getChild<LLRadioGroup>("edit_radio_group");  	mBtnGridOptions		= getChild<LLButton>("Options..."); -	mTitleMedia			= getChild<LLMediaCtrl>("title_media");  	mBtnLink			= getChild<LLButton>("link_btn");  	mBtnUnlink			= getChild<LLButton>("unlink_btn"); @@ -329,7 +327,6 @@ LLFloaterTools::LLFloaterTools(const LLSD& key)  	mCheckSnapToGrid(NULL),  	mBtnGridOptions(NULL), -	mTitleMedia(NULL),  	mComboGridMode(NULL),  	mCheckStretchUniform(NULL),  	mCheckStretchTexture(NULL), @@ -369,8 +366,7 @@ LLFloaterTools::LLFloaterTools(const LLSD& key)  	mLandImpactsObserver(NULL),  	mDirty(TRUE), -	mHasSelection(TRUE), -	mNeedMediaTitle(TRUE) +	mHasSelection(TRUE)  {  	gFloaterTools = this; @@ -394,9 +390,6 @@ LLFloaterTools::LLFloaterTools(const LLSD& key)  	mCommitCallbackRegistrar.add("BuildTool.applyToSelection",	boost::bind(&click_apply_to_selection, this));  	mCommitCallbackRegistrar.add("BuildTool.commitRadioLand",	boost::bind(&commit_radio_group_land,_1));  	mCommitCallbackRegistrar.add("BuildTool.LandBrushForce",	boost::bind(&commit_slider_dozer_force,_1)); -	mCommitCallbackRegistrar.add("BuildTool.AddMedia",			boost::bind(&LLFloaterTools::onClickBtnAddMedia,this)); -	mCommitCallbackRegistrar.add("BuildTool.DeleteMedia",		boost::bind(&LLFloaterTools::onClickBtnDeleteMedia,this)); -	mCommitCallbackRegistrar.add("BuildTool.EditMedia",			boost::bind(&LLFloaterTools::onClickBtnEditMedia,this));  	mCommitCallbackRegistrar.add("BuildTool.LinkObjects",		boost::bind(&LLSelectMgr::linkObjects, LLSelectMgr::getInstance()));  	mCommitCallbackRegistrar.add("BuildTool.UnlinkObjects",		boost::bind(&LLSelectMgr::unlinkObjects, LLSelectMgr::getInstance())); @@ -553,7 +546,7 @@ void LLFloaterTools::refresh()  	mPanelObject->refresh();  	mPanelVolume->refresh();  	mPanelFace->refresh(); -	refreshMedia(); +    mPanelFace->refreshMedia();  	mPanelContents->refresh();  	mPanelLandInfo->refresh(); @@ -580,9 +573,6 @@ void LLFloaterTools::draw()  		mDirty = FALSE;  	} -	// grab media name/title and update the UI widget -	updateMediaTitle(); -  	//	mCheckSelectIndividual->set(gSavedSettings.getBOOL("EditLinkedParts"));  	LLFloater::draw();  } @@ -906,8 +896,7 @@ void LLFloaterTools::onClose(bool app_quitting)  	LLViewerJoystick::getInstance()->moveAvatar(false);  	// destroy media source used to grab media title -	if( mTitleMedia ) -		mTitleMedia->unloadMediaSource(); +	mPanelFace->unloadMedia();      // Different from handle_reset_view in that it doesn't actually   	//   move the camera if EditCameraMovement is not set. @@ -1160,51 +1149,6 @@ void LLFloaterTools::onFocusReceived()  	LLFloater::onFocusReceived();  } -// Media stuff -void LLFloaterTools::refreshMedia() -{ -	getMediaState();	 -} - -bool LLFloaterTools::selectedMediaEditable() -{ -	U32 owner_mask_on; -	U32 owner_mask_off; -	U32 valid_owner_perms = LLSelectMgr::getInstance()->selectGetPerm( PERM_OWNER,  -																	  &owner_mask_on, &owner_mask_off ); -	U32 group_mask_on; -	U32 group_mask_off; -	U32 valid_group_perms = LLSelectMgr::getInstance()->selectGetPerm( PERM_GROUP,  -																	  &group_mask_on, &group_mask_off ); -	U32 everyone_mask_on; -	U32 everyone_mask_off; -	S32 valid_everyone_perms = LLSelectMgr::getInstance()->selectGetPerm( PERM_EVERYONE,  -																		 &everyone_mask_on, &everyone_mask_off ); -	 -	bool selected_Media_editable = false; -	 -	// if perms we got back are valid -	if ( valid_owner_perms && -		valid_group_perms &&  -		valid_everyone_perms ) -	{ -		 -		if ( ( owner_mask_on & PERM_MODIFY ) || -			( group_mask_on & PERM_MODIFY ) ||  -			( group_mask_on & PERM_MODIFY ) ) -		{ -			selected_Media_editable = true; -		} -		else -			// user is NOT allowed to press the RESET button -		{ -			selected_Media_editable = false; -		}; -	}; -	 -	return selected_Media_editable; -} -  void LLFloaterTools::updateLandImpacts()  {  	LLParcel *parcel = mParcelSelection->getParcel(); @@ -1221,784 +1165,3 @@ void LLFloaterTools::updateLandImpacts()  	}  } -void LLFloaterTools::getMediaState() -{ -	LLObjectSelectionHandle selected_objects =LLSelectMgr::getInstance()->getSelection(); -	LLViewerObject* first_object = selected_objects->getFirstObject(); -	LLTextBox* media_info = getChild<LLTextBox>("media_info"); -	 -	if( !(first_object  -		  && first_object->getPCode() == LL_PCODE_VOLUME -		  &&first_object->permModify()  -	      )) -	{ -		getChildView("add_media")->setEnabled(FALSE); -		media_info->clear(); -		clearMediaSettings(); -		return; -	} -	 -	std::string url = first_object->getRegion()->getCapability("ObjectMedia"); -	bool has_media_capability = (!url.empty()); -	 -	if(!has_media_capability) -	{ -		getChildView("add_media")->setEnabled(FALSE); -		LL_WARNS("LLFloaterToolsMedia") << "Media not enabled (no capability) in this region!" << LL_ENDL; -		clearMediaSettings(); -		return; -	} -	 -	BOOL is_nonpermanent_enforced = (LLSelectMgr::getInstance()->getSelection()->getFirstRootNode()  -		&& LLSelectMgr::getInstance()->selectGetRootsNonPermanentEnforced()) -		|| LLSelectMgr::getInstance()->selectGetNonPermanentEnforced(); -	bool editable = is_nonpermanent_enforced && (first_object->permModify() || selectedMediaEditable()); - -	// Check modify permissions and whether any selected objects are in -	// the process of being fetched.  If they are, then we're not editable -	if (editable) -	{ -		LLObjectSelection::iterator iter = selected_objects->begin();  -		LLObjectSelection::iterator end = selected_objects->end(); -		for ( ; iter != end; ++iter) -		{ -			LLSelectNode* node = *iter; -			LLVOVolume* object = dynamic_cast<LLVOVolume*>(node->getObject()); -			if (NULL != object) -			{ -				if (!object->permModify()) -				{ -					LL_INFOS("LLFloaterToolsMedia") -						<< "Selection not editable due to lack of modify permissions on object id " -						<< object->getID() << LL_ENDL; -					 -					editable = false; -					break; -				} -				// XXX DISABLE this for now, because when the fetch finally  -				// does come in, the state of this floater doesn't properly -				// update.  Re-selecting fixes the problem, but there is  -				// contention as to whether this is a sufficient solution. -//				if (object->isMediaDataBeingFetched()) -//				{ -//					LL_INFOS("LLFloaterToolsMedia") -//						<< "Selection not editable due to media data being fetched for object id " -//						<< object->getID() << LL_ENDL; -//						 -//					editable = false; -//					break; -//				} -			} -		} -	} - -	// Media settings -	bool bool_has_media = false; -	struct media_functor : public LLSelectedTEGetFunctor<bool> -	{ -		bool get(LLViewerObject* object, S32 face) -		{ -			LLTextureEntry *te = object->getTE(face); -			if (te) -			{ -				return te->hasMedia(); -			} -			return false; -		} -	} func; -	 -	 -	// check if all faces have media(or, all dont have media) -	LLFloaterMediaSettings::getInstance()->mIdenticalHasMediaInfo = selected_objects->getSelectedTEValue( &func, bool_has_media ); -	 -	const LLMediaEntry default_media_data; -	 -	struct functor_getter_media_data : public LLSelectedTEGetFunctor< LLMediaEntry> -    { -		functor_getter_media_data(const LLMediaEntry& entry): mMediaEntry(entry) {}	 - -        LLMediaEntry get( LLViewerObject* object, S32 face ) -        { -            if ( object ) -                if ( object->getTE(face) ) -                    if ( object->getTE(face)->getMediaData() ) -                        return *(object->getTE(face)->getMediaData()); -			return mMediaEntry; -        }; -		 -		const LLMediaEntry& mMediaEntry; -		 -    } func_media_data(default_media_data); - -	LLMediaEntry media_data_get; -    LLFloaterMediaSettings::getInstance()->mMultipleMedia = !(selected_objects->getSelectedTEValue( &func_media_data, media_data_get )); -	 -	std::string multi_media_info_str = LLTrans::getString("Multiple Media"); -	std::string media_title = ""; -	// update UI depending on whether "object" (prim or face) has media -	// and whether or not you are allowed to edit it. -	 -	getChildView("add_media")->setEnabled(editable); -	// IF all the faces have media (or all dont have media) -	if ( LLFloaterMediaSettings::getInstance()->mIdenticalHasMediaInfo ) -	{ -		// TODO: get media title and set it. -		media_info->clear(); -		// if identical is set, all faces are same (whether all empty or has the same media) -		if(!(LLFloaterMediaSettings::getInstance()->mMultipleMedia) ) -		{ -			// Media data is valid -			if(media_data_get!=default_media_data) -			{ -				// initial media title is the media URL (until we get the name) -				media_title = media_data_get.getHomeURL(); -			} -			// else all faces might be empty.  -		} -		else // there' re Different Medias' been set on on the faces. -		{ -			media_title = multi_media_info_str; -		} -		 -		getChildView("delete_media")->setEnabled(bool_has_media && editable ); -			// TODO: display a list of all media on the face - use 'identical' flag -	} -	else // not all face has media but at least one does. -	{ -		// seleted faces have not identical value -		LLFloaterMediaSettings::getInstance()->mMultipleValidMedia = selected_objects->isMultipleTEValue(&func_media_data, default_media_data ); -	 -		if(LLFloaterMediaSettings::getInstance()->mMultipleValidMedia) -		{ -			media_title = multi_media_info_str; -		} -		else -		{ -			// Media data is valid -			if(media_data_get!=default_media_data) -			{ -				// initial media title is the media URL (until we get the name) -				media_title = media_data_get.getHomeURL(); -			} -		} -		 -		getChildView("delete_media")->setEnabled(TRUE); -	} - -	navigateToTitleMedia(media_title); -	media_info->setText(media_title); -	 -	// load values for media settings -	updateMediaSettings(); -	 -	LLFloaterMediaSettings::initValues(mMediaSettings, editable ); -} - - -////////////////////////////////////////////////////////////////////////////// -// called when a user wants to add media to a prim or prim face -void LLFloaterTools::onClickBtnAddMedia() -{ -	// check if multiple faces are selected -	if(LLSelectMgr::getInstance()->getSelection()->isMultipleTESelected()) -	{ -		LLNotificationsUtil::add("MultipleFacesSelected", LLSD(), LLSD(), multipleFacesSelectedConfirm); -	} -	else -	{ -		onClickBtnEditMedia(); -	} -} - -// static -bool LLFloaterTools::multipleFacesSelectedConfirm(const LLSD& notification, const LLSD& response) -{ -	S32 option = LLNotificationsUtil::getSelectedOption(notification, response); -	switch( option ) -	{ -		case 0:  // "Yes" -			gFloaterTools->onClickBtnEditMedia(); -			break; -		case 1:  // "No" -		default: -			break; -	} -	return false; -} - -////////////////////////////////////////////////////////////////////////////// -// called when a user wants to edit existing media settings on a prim or prim face -// TODO: test if there is media on the item and only allow editing if present -void LLFloaterTools::onClickBtnEditMedia() -{ -	refreshMedia(); -	LLFloaterReg::showInstance("media_settings");	 -} - -////////////////////////////////////////////////////////////////////////////// -// called when a user wants to delete media from a prim or prim face -void LLFloaterTools::onClickBtnDeleteMedia() -{ -	LLNotificationsUtil::add("DeleteMedia", LLSD(), LLSD(), deleteMediaConfirm); -} - - -// static -bool LLFloaterTools::deleteMediaConfirm(const LLSD& notification, const LLSD& response) -{ -	S32 option = LLNotificationsUtil::getSelectedOption(notification, response); -	switch( option ) -	{ -		case 0:  // "Yes" -			LLSelectMgr::getInstance()->selectionSetMedia( 0, LLSD() ); -			if(LLFloaterReg::instanceVisible("media_settings")) -			{ -				LLFloaterReg::hideInstance("media_settings"); -			} -			break; -			 -		case 1:  // "No" -		default: -			break; -	} -	return false; -} - -////////////////////////////////////////////////////////////////////////////// -// -void LLFloaterTools::clearMediaSettings() -{ -	LLFloaterMediaSettings::clearValues(false); -} - -////////////////////////////////////////////////////////////////////////////// -// -void LLFloaterTools::navigateToTitleMedia( const std::string url ) -{ -	std::string multi_media_info_str = LLTrans::getString("Multiple Media"); -	if (url.empty() || multi_media_info_str == url) -	{ -		// nothing to show -		mNeedMediaTitle = false; -	} -	else if (mTitleMedia) -	{ -		LLPluginClassMedia* media_plugin = mTitleMedia->getMediaPlugin(); - -		if ( media_plugin ) // Shouldn't this be after navigateTo creates plugin? -		{ -			// if it's a movie, we don't want to hear it -			media_plugin->setVolume( 0 ); -		}; - -		// check if url changed or if we need a new media source -		if (mTitleMedia->getCurrentNavUrl() != url || media_plugin == NULL) -		{ -			mTitleMedia->navigateTo( url ); -		} - -		// flag that we need to update the title (even if no request were made) -		mNeedMediaTitle = true; -	} -} - -////////////////////////////////////////////////////////////////////////////// -// -void LLFloaterTools::updateMediaTitle() -{ -	// only get the media name if we need it -	if ( ! mNeedMediaTitle ) -		return; - -	// get plugin impl -	LLPluginClassMedia* media_plugin = mTitleMedia->getMediaPlugin(); -	if ( media_plugin ) -	{ -		// get the media name (asynchronous - must call repeatedly) -		std::string media_title = media_plugin->getMediaName(); - -		// only replace the title if what we get contains something -		if ( ! media_title.empty() ) -		{ -			// update the UI widget -			LLTextBox* media_title_field = getChild<LLTextBox>("media_info"); -			if ( media_title_field ) -			{ -				media_title_field->setText( media_title ); - -				// stop looking for a title when we get one -				// FIXME: check this is the right approach -				mNeedMediaTitle = false; -			}; -		}; -	}; -} - -////////////////////////////////////////////////////////////////////////////// -// -void LLFloaterTools::updateMediaSettings() -{ -    bool identical( false ); -    std::string base_key( "" ); -    std::string value_str( "" ); -    int value_int = 0; -    bool value_bool = false; -	LLObjectSelectionHandle selected_objects =LLSelectMgr::getInstance()->getSelection(); -    // TODO: (CP) refactor this using something clever or boost or both !! - -    const LLMediaEntry default_media_data; - -    // controls  -    U8 value_u8 = default_media_data.getControls(); -    struct functor_getter_controls : public LLSelectedTEGetFunctor< U8 > -    { -		functor_getter_controls(const LLMediaEntry &entry) : mMediaEntry(entry) {} -		 -        U8 get( LLViewerObject* object, S32 face ) -        { -            if ( object ) -                if ( object->getTE(face) ) -                    if ( object->getTE(face)->getMediaData() ) -                        return object->getTE(face)->getMediaData()->getControls(); -            return mMediaEntry.getControls(); -        }; -		 -		const LLMediaEntry &mMediaEntry; -		 -    } func_controls(default_media_data); -    identical = selected_objects->getSelectedTEValue( &func_controls, value_u8 ); -    base_key = std::string( LLMediaEntry::CONTROLS_KEY ); -    mMediaSettings[ base_key ] = value_u8; -    mMediaSettings[ base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX ) ] = ! identical; -	 -    // First click (formerly left click) -    value_bool = default_media_data.getFirstClickInteract(); -    struct functor_getter_first_click : public LLSelectedTEGetFunctor< bool > -    { -		functor_getter_first_click(const LLMediaEntry& entry): mMediaEntry(entry) {}		 -		 -        bool get( LLViewerObject* object, S32 face ) -        { -            if ( object ) -                if ( object->getTE(face) ) -                    if ( object->getTE(face)->getMediaData() ) -                        return object->getTE(face)->getMediaData()->getFirstClickInteract(); -            return mMediaEntry.getFirstClickInteract(); -        }; -		 -		const LLMediaEntry &mMediaEntry; -		 -    } func_first_click(default_media_data); -    identical = selected_objects->getSelectedTEValue( &func_first_click, value_bool ); -    base_key = std::string( LLMediaEntry::FIRST_CLICK_INTERACT_KEY ); -    mMediaSettings[ base_key ] = value_bool; -    mMediaSettings[ base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX ) ] = ! identical; -	 -    // Home URL -    value_str = default_media_data.getHomeURL(); -    struct functor_getter_home_url : public LLSelectedTEGetFunctor< std::string > -    { -		functor_getter_home_url(const LLMediaEntry& entry): mMediaEntry(entry) {}		 -		 -        std::string get( LLViewerObject* object, S32 face ) -        { -            if ( object ) -                if ( object->getTE(face) ) -                    if ( object->getTE(face)->getMediaData() ) -                        return object->getTE(face)->getMediaData()->getHomeURL(); -            return mMediaEntry.getHomeURL(); -        }; -		 -		const LLMediaEntry &mMediaEntry; -		 -    } func_home_url(default_media_data); -    identical = selected_objects->getSelectedTEValue( &func_home_url, value_str ); -    base_key = std::string( LLMediaEntry::HOME_URL_KEY ); -    mMediaSettings[ base_key ] = value_str; -    mMediaSettings[ base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX ) ] = ! identical; -	 -    // Current URL -    value_str = default_media_data.getCurrentURL(); -    struct functor_getter_current_url : public LLSelectedTEGetFunctor< std::string > -    { -		functor_getter_current_url(const LLMediaEntry& entry): mMediaEntry(entry) {} -         -		std::string get( LLViewerObject* object, S32 face ) -        { -            if ( object ) -                if ( object->getTE(face) ) -                    if ( object->getTE(face)->getMediaData() ) -                        return object->getTE(face)->getMediaData()->getCurrentURL(); -            return mMediaEntry.getCurrentURL(); -        }; -		 -		const LLMediaEntry &mMediaEntry; -		 -    } func_current_url(default_media_data); -    identical = selected_objects->getSelectedTEValue( &func_current_url, value_str ); -    base_key = std::string( LLMediaEntry::CURRENT_URL_KEY ); -    mMediaSettings[ base_key ] = value_str; -    mMediaSettings[ base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX ) ] = ! identical; -	 -    // Auto zoom -    value_bool = default_media_data.getAutoZoom(); -    struct functor_getter_auto_zoom : public LLSelectedTEGetFunctor< bool > -    { -		 -		functor_getter_auto_zoom(const LLMediaEntry& entry)	: mMediaEntry(entry) {}	 -		 -        bool get( LLViewerObject* object, S32 face ) -        { -            if ( object ) -                if ( object->getTE(face) ) -                    if ( object->getTE(face)->getMediaData() ) -                        return object->getTE(face)->getMediaData()->getAutoZoom(); -            return mMediaEntry.getAutoZoom(); -        }; -		 -		const LLMediaEntry &mMediaEntry; -		 -    } func_auto_zoom(default_media_data); -    identical = selected_objects->getSelectedTEValue( &func_auto_zoom, value_bool ); -    base_key = std::string( LLMediaEntry::AUTO_ZOOM_KEY ); -    mMediaSettings[ base_key ] = value_bool; -    mMediaSettings[ base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX ) ] = ! identical; -	 -    // Auto play -    //value_bool = default_media_data.getAutoPlay(); -	// set default to auto play TRUE -- angela  EXT-5172 -	value_bool = true; -    struct functor_getter_auto_play : public LLSelectedTEGetFunctor< bool > -    { -		functor_getter_auto_play(const LLMediaEntry& entry)	: mMediaEntry(entry) {}	 -			 -        bool get( LLViewerObject* object, S32 face ) -        { -            if ( object ) -                if ( object->getTE(face) ) -                    if ( object->getTE(face)->getMediaData() ) -                        return object->getTE(face)->getMediaData()->getAutoPlay(); -            //return mMediaEntry.getAutoPlay(); set default to auto play TRUE -- angela  EXT-5172 -			return true; -        }; -		 -		const LLMediaEntry &mMediaEntry; -		 -    } func_auto_play(default_media_data); -    identical = selected_objects->getSelectedTEValue( &func_auto_play, value_bool ); -    base_key = std::string( LLMediaEntry::AUTO_PLAY_KEY ); -    mMediaSettings[ base_key ] = value_bool; -    mMediaSettings[ base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX ) ] = ! identical; -	 -	 -    // Auto scale -	// set default to auto scale TRUE -- angela  EXT-5172 -    //value_bool = default_media_data.getAutoScale(); -	value_bool = true; -    struct functor_getter_auto_scale : public LLSelectedTEGetFunctor< bool > -    { -		functor_getter_auto_scale(const LLMediaEntry& entry): mMediaEntry(entry) {}	 - -        bool get( LLViewerObject* object, S32 face ) -        { -            if ( object ) -                if ( object->getTE(face) ) -                    if ( object->getTE(face)->getMediaData() ) -                        return object->getTE(face)->getMediaData()->getAutoScale(); -           // return mMediaEntry.getAutoScale();  set default to auto scale TRUE -- angela  EXT-5172 -			return true; -		}; -		 -		const LLMediaEntry &mMediaEntry; -		 -    } func_auto_scale(default_media_data); -    identical = selected_objects->getSelectedTEValue( &func_auto_scale, value_bool ); -    base_key = std::string( LLMediaEntry::AUTO_SCALE_KEY ); -    mMediaSettings[ base_key ] = value_bool; -    mMediaSettings[ base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX ) ] = ! identical; -	 -    // Auto loop -    value_bool = default_media_data.getAutoLoop(); -    struct functor_getter_auto_loop : public LLSelectedTEGetFunctor< bool > -    { -		functor_getter_auto_loop(const LLMediaEntry& entry)	: mMediaEntry(entry) {}	 - -        bool get( LLViewerObject* object, S32 face ) -        { -            if ( object ) -                if ( object->getTE(face) ) -                    if ( object->getTE(face)->getMediaData() ) -                        return object->getTE(face)->getMediaData()->getAutoLoop(); -            return mMediaEntry.getAutoLoop(); -        }; -		 -		const LLMediaEntry &mMediaEntry; -		 -    } func_auto_loop(default_media_data); -    identical = selected_objects->getSelectedTEValue( &func_auto_loop, value_bool ); -    base_key = std::string( LLMediaEntry::AUTO_LOOP_KEY ); -    mMediaSettings[ base_key ] = value_bool; -    mMediaSettings[ base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX ) ] = ! identical; -	 -    // width pixels (if not auto scaled) -    value_int = default_media_data.getWidthPixels(); -    struct functor_getter_width_pixels : public LLSelectedTEGetFunctor< int > -    { -		functor_getter_width_pixels(const LLMediaEntry& entry): mMediaEntry(entry) {}		 - -        int get( LLViewerObject* object, S32 face ) -        { -            if ( object ) -                if ( object->getTE(face) ) -                    if ( object->getTE(face)->getMediaData() ) -                        return object->getTE(face)->getMediaData()->getWidthPixels(); -            return mMediaEntry.getWidthPixels(); -        }; -		 -		const LLMediaEntry &mMediaEntry; -		 -    } func_width_pixels(default_media_data); -    identical = selected_objects->getSelectedTEValue( &func_width_pixels, value_int ); -    base_key = std::string( LLMediaEntry::WIDTH_PIXELS_KEY ); -    mMediaSettings[ base_key ] = value_int; -    mMediaSettings[ base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX ) ] = ! identical; -	 -    // height pixels (if not auto scaled) -    value_int = default_media_data.getHeightPixels(); -    struct functor_getter_height_pixels : public LLSelectedTEGetFunctor< int > -    { -		functor_getter_height_pixels(const LLMediaEntry& entry)	: mMediaEntry(entry) {} -         -		int get( LLViewerObject* object, S32 face ) -        { -            if ( object ) -                if ( object->getTE(face) ) -                    if ( object->getTE(face)->getMediaData() ) -                        return object->getTE(face)->getMediaData()->getHeightPixels(); -            return mMediaEntry.getHeightPixels(); -        }; -		 -		const LLMediaEntry &mMediaEntry; -		 -    } func_height_pixels(default_media_data); -    identical = selected_objects->getSelectedTEValue( &func_height_pixels, value_int ); -    base_key = std::string( LLMediaEntry::HEIGHT_PIXELS_KEY ); -    mMediaSettings[ base_key ] = value_int; -    mMediaSettings[ base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX ) ] = ! identical; -	 -    // Enable Alt image -    value_bool = default_media_data.getAltImageEnable(); -    struct functor_getter_enable_alt_image : public LLSelectedTEGetFunctor< bool > -    { -		functor_getter_enable_alt_image(const LLMediaEntry& entry): mMediaEntry(entry) {} -         -		bool get( LLViewerObject* object, S32 face ) -        { -            if ( object ) -                if ( object->getTE(face) ) -                    if ( object->getTE(face)->getMediaData() ) -                        return object->getTE(face)->getMediaData()->getAltImageEnable(); -            return mMediaEntry.getAltImageEnable(); -        }; -		 -		const LLMediaEntry &mMediaEntry; -		 -    } func_enable_alt_image(default_media_data); -    identical = selected_objects->getSelectedTEValue( &func_enable_alt_image, value_bool ); -    base_key = std::string( LLMediaEntry::ALT_IMAGE_ENABLE_KEY ); -    mMediaSettings[ base_key ] = value_bool; -    mMediaSettings[ base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX ) ] = ! identical; -	 -    // Perms - owner interact -    value_bool = 0 != ( default_media_data.getPermsInteract() & LLMediaEntry::PERM_OWNER ); -    struct functor_getter_perms_owner_interact : public LLSelectedTEGetFunctor< bool > -    { -		functor_getter_perms_owner_interact(const LLMediaEntry& entry): mMediaEntry(entry) {} -         -		bool get( LLViewerObject* object, S32 face ) -        { -            if ( object ) -                if ( object->getTE(face) ) -                    if ( object->getTE(face)->getMediaData() ) -                        return (0 != (object->getTE(face)->getMediaData()->getPermsInteract() & LLMediaEntry::PERM_OWNER)); -            return 0 != ( mMediaEntry.getPermsInteract() & LLMediaEntry::PERM_OWNER ); -        }; -		 -		const LLMediaEntry &mMediaEntry; -		 -    } func_perms_owner_interact(default_media_data); -    identical = selected_objects->getSelectedTEValue( &func_perms_owner_interact, value_bool ); -    base_key = std::string( LLPanelContents::PERMS_OWNER_INTERACT_KEY ); -    mMediaSettings[ base_key ] = value_bool; -    mMediaSettings[ base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX ) ] = ! identical; -	 -    // Perms - owner control -    value_bool = 0 != ( default_media_data.getPermsControl() & LLMediaEntry::PERM_OWNER ); -    struct functor_getter_perms_owner_control : public LLSelectedTEGetFunctor< bool > -    { -		functor_getter_perms_owner_control(const LLMediaEntry& entry)	: mMediaEntry(entry) {} -         -        bool get( LLViewerObject* object, S32 face ) -        { -            if ( object ) -                if ( object->getTE(face) ) -                    if ( object->getTE(face)->getMediaData() ) -                        return (0 != (object->getTE(face)->getMediaData()->getPermsControl() & LLMediaEntry::PERM_OWNER)); -            return 0 != ( mMediaEntry.getPermsControl() & LLMediaEntry::PERM_OWNER ); -        }; -		 -		const LLMediaEntry &mMediaEntry; -		 -    } func_perms_owner_control(default_media_data); -    identical = selected_objects ->getSelectedTEValue( &func_perms_owner_control, value_bool ); -    base_key = std::string( LLPanelContents::PERMS_OWNER_CONTROL_KEY ); -    mMediaSettings[ base_key ] = value_bool; -    mMediaSettings[ base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX ) ] = ! identical; -	 -    // Perms - group interact -    value_bool = 0 != ( default_media_data.getPermsInteract() & LLMediaEntry::PERM_GROUP ); -    struct functor_getter_perms_group_interact : public LLSelectedTEGetFunctor< bool > -    { -		functor_getter_perms_group_interact(const LLMediaEntry& entry): mMediaEntry(entry) {} -         -        bool get( LLViewerObject* object, S32 face ) -        { -            if ( object ) -                if ( object->getTE(face) ) -                    if ( object->getTE(face)->getMediaData() ) -                        return (0 != (object->getTE(face)->getMediaData()->getPermsInteract() & LLMediaEntry::PERM_GROUP)); -            return 0 != ( mMediaEntry.getPermsInteract() & LLMediaEntry::PERM_GROUP ); -        }; -		 -		const LLMediaEntry &mMediaEntry; -		 -    } func_perms_group_interact(default_media_data); -    identical = selected_objects->getSelectedTEValue( &func_perms_group_interact, value_bool ); -    base_key = std::string( LLPanelContents::PERMS_GROUP_INTERACT_KEY ); -    mMediaSettings[ base_key ] = value_bool; -    mMediaSettings[ base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX ) ] = ! identical; -	 -    // Perms - group control -    value_bool = 0 != ( default_media_data.getPermsControl() & LLMediaEntry::PERM_GROUP ); -    struct functor_getter_perms_group_control : public LLSelectedTEGetFunctor< bool > -    { -		functor_getter_perms_group_control(const LLMediaEntry& entry): mMediaEntry(entry) {} -         -        bool get( LLViewerObject* object, S32 face ) -        { -            if ( object ) -                if ( object->getTE(face) ) -                    if ( object->getTE(face)->getMediaData() ) -                        return (0 != (object->getTE(face)->getMediaData()->getPermsControl() & LLMediaEntry::PERM_GROUP)); -            return 0 != ( mMediaEntry.getPermsControl() & LLMediaEntry::PERM_GROUP ); -        }; -		 -		const LLMediaEntry &mMediaEntry; -		 -    } func_perms_group_control(default_media_data); -    identical = selected_objects->getSelectedTEValue( &func_perms_group_control, value_bool ); -    base_key = std::string( LLPanelContents::PERMS_GROUP_CONTROL_KEY ); -    mMediaSettings[ base_key ] = value_bool; -    mMediaSettings[ base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX ) ] = ! identical; -	 -    // Perms - anyone interact -    value_bool = 0 != ( default_media_data.getPermsInteract() & LLMediaEntry::PERM_ANYONE ); -    struct functor_getter_perms_anyone_interact : public LLSelectedTEGetFunctor< bool > -    { -		functor_getter_perms_anyone_interact(const LLMediaEntry& entry): mMediaEntry(entry) {} -         -        bool get( LLViewerObject* object, S32 face ) -        { -            if ( object ) -                if ( object->getTE(face) ) -                    if ( object->getTE(face)->getMediaData() ) -                        return (0 != (object->getTE(face)->getMediaData()->getPermsInteract() & LLMediaEntry::PERM_ANYONE)); -            return 0 != ( mMediaEntry.getPermsInteract() & LLMediaEntry::PERM_ANYONE ); -        }; -		 -		const LLMediaEntry &mMediaEntry; -		 -    } func_perms_anyone_interact(default_media_data); -    identical = LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue( &func_perms_anyone_interact, value_bool ); -    base_key = std::string( LLPanelContents::PERMS_ANYONE_INTERACT_KEY ); -    mMediaSettings[ base_key ] = value_bool; -    mMediaSettings[ base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX ) ] = ! identical; -	 -    // Perms - anyone control -    value_bool = 0 != ( default_media_data.getPermsControl() & LLMediaEntry::PERM_ANYONE ); -    struct functor_getter_perms_anyone_control : public LLSelectedTEGetFunctor< bool > -    { -		functor_getter_perms_anyone_control(const LLMediaEntry& entry)	: mMediaEntry(entry) {} -         -        bool get( LLViewerObject* object, S32 face ) -        { -            if ( object ) -                if ( object->getTE(face) ) -                    if ( object->getTE(face)->getMediaData() ) -                        return (0 != (object->getTE(face)->getMediaData()->getPermsControl() & LLMediaEntry::PERM_ANYONE)); -            return 0 != ( mMediaEntry.getPermsControl() & LLMediaEntry::PERM_ANYONE ); -        }; -		 -		const LLMediaEntry &mMediaEntry; -		 -    } func_perms_anyone_control(default_media_data); -    identical = selected_objects->getSelectedTEValue( &func_perms_anyone_control, value_bool ); -    base_key = std::string( LLPanelContents::PERMS_ANYONE_CONTROL_KEY ); -    mMediaSettings[ base_key ] = value_bool; -    mMediaSettings[ base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX ) ] = ! identical; -	 -    // security - whitelist enable -    value_bool = default_media_data.getWhiteListEnable(); -    struct functor_getter_whitelist_enable : public LLSelectedTEGetFunctor< bool > -    { -		functor_getter_whitelist_enable(const LLMediaEntry& entry)	: mMediaEntry(entry) {} -         -        bool get( LLViewerObject* object, S32 face ) -        { -            if ( object ) -                if ( object->getTE(face) ) -                    if ( object->getTE(face)->getMediaData() ) -                        return object->getTE(face)->getMediaData()->getWhiteListEnable(); -            return mMediaEntry.getWhiteListEnable(); -        }; -		 -		const LLMediaEntry &mMediaEntry; -		 -    } func_whitelist_enable(default_media_data); -    identical = selected_objects->getSelectedTEValue( &func_whitelist_enable, value_bool ); -    base_key = std::string( LLMediaEntry::WHITELIST_ENABLE_KEY ); -    mMediaSettings[ base_key ] = value_bool; -    mMediaSettings[ base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX ) ] = ! identical; -	 -    // security - whitelist URLs -    std::vector<std::string> value_vector_str = default_media_data.getWhiteList(); -    struct functor_getter_whitelist_urls : public LLSelectedTEGetFunctor< std::vector<std::string> > -    { -		functor_getter_whitelist_urls(const LLMediaEntry& entry): mMediaEntry(entry) {} -         -        std::vector<std::string> get( LLViewerObject* object, S32 face ) -        { -            if ( object ) -                if ( object->getTE(face) ) -                    if ( object->getTE(face)->getMediaData() ) -                        return object->getTE(face)->getMediaData()->getWhiteList(); -            return mMediaEntry.getWhiteList(); -        }; -		 -		const LLMediaEntry &mMediaEntry; -		 -    } func_whitelist_urls(default_media_data); -    identical = selected_objects->getSelectedTEValue( &func_whitelist_urls, value_vector_str ); -    base_key = std::string( LLMediaEntry::WHITELIST_KEY ); -	mMediaSettings[ base_key ].clear(); -    std::vector< std::string >::iterator iter = value_vector_str.begin(); -    while( iter != value_vector_str.end() ) -    { -        std::string white_list_url = *iter; -        mMediaSettings[ base_key ].append( white_list_url ); -        ++iter; -    }; -	 -    mMediaSettings[ base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX ) ] = ! identical; -} - diff --git a/indra/newview/llfloatertools.h b/indra/newview/llfloatertools.h index ffff564ad4..3bb6492a6e 100644 --- a/indra/newview/llfloatertools.h +++ b/indra/newview/llfloatertools.h @@ -44,7 +44,6 @@ class LLRadioGroup;  class LLSlider;  class LLTabContainer;  class LLTextBox; -class LLMediaCtrl;  class LLTool;  class LLParcelSelection;  class LLObjectSelection; @@ -98,11 +97,6 @@ public:  	static void setEditTool(void* data);  	void setTool(const LLSD& user_data);  	void saveLastTool(); -	void onClickBtnDeleteMedia(); -	void onClickBtnAddMedia(); -	void onClickBtnEditMedia(); -	void clearMediaSettings(); -	bool selectedMediaEditable();  	void updateLandImpacts();  	static void setGridMode(S32 mode); @@ -111,13 +105,6 @@ public:  private:  	void refresh(); -	void refreshMedia(); -	void getMediaState(); -	void updateMediaSettings(); -	void navigateToTitleMedia( const std::string url ); // navigate if changed -	void updateMediaTitle(); -	static bool deleteMediaConfirm(const LLSD& notification, const LLSD& response); -	static bool multipleFacesSelectedConfirm(const LLSD& notification, const LLSD& response);  	static void setObjectType( LLPCode pcode );  	void onClickGridOptions(); @@ -193,19 +180,12 @@ public:  	LLParcelSelectionHandle	mParcelSelection;  	LLObjectSelectionHandle	mObjectSelection; -	LLMediaCtrl				*mTitleMedia; -	bool					mNeedMediaTitle; -  private:  	BOOL					mDirty;  	BOOL                    mHasSelection;  	std::map<std::string, std::string> mStatusText; - -protected: -	LLSD				mMediaSettings; -  public:  	static bool		sShowObjectCost;  	static bool		sPreviousFocusOnAvatar; diff --git a/indra/newview/llfloaterurlentry.cpp b/indra/newview/llfloaterurlentry.cpp index d5c2ad5f81..917d6dfcd0 100644 --- a/indra/newview/llfloaterurlentry.cpp +++ b/indra/newview/llfloaterurlentry.cpp @@ -112,16 +112,6 @@ void LLFloaterURLEntry::headerFetchComplete(S32 status, const std::string& mime_  		panel_media->setMediaType(mime_type);  		panel_media->setMediaURL(mMediaURLEdit->getValue().asString());  	} -	else -	{ -		LLPanelFace* panel_face = dynamic_cast<LLPanelFace*>(mPanelLandMediaHandle.get()); -		if(panel_face) -		{ -			panel_face->setMediaType(mime_type); -			panel_face->setMediaURL(mMediaURLEdit->getValue().asString()); -		} - -	}  	getChildView("loading_label")->setVisible( false);  	closeFloater(); diff --git a/indra/newview/llfloaterworldmap.cpp b/indra/newview/llfloaterworldmap.cpp index 09235d8fb2..977023cfe4 100644 --- a/indra/newview/llfloaterworldmap.cpp +++ b/indra/newview/llfloaterworldmap.cpp @@ -1008,7 +1008,7 @@ void LLFloaterWorldMap::clearAvatarSelection(BOOL clear_ui)  	{  		mTrackedStatus = LLTracker::TRACKING_NOTHING;  		LLCtrlListInterface *list = mListFriendCombo; -		if (list) +		if (list && list->getSelectedValue().asString() != "None")  		{  			list->selectByValue( "None" );  		} diff --git a/indra/newview/llfriendcard.cpp b/indra/newview/llfriendcard.cpp index 0be748ace9..e395da7f1e 100644 --- a/indra/newview/llfriendcard.cpp +++ b/indra/newview/llfriendcard.cpp @@ -327,22 +327,63 @@ void LLFriendCardsManager::syncFriendCardsFolders()  /************************************************************************/  /*		Private Methods                                                 */  /************************************************************************/ -const LLUUID& LLFriendCardsManager::findFriendFolderUUIDImpl() const +const LLUUID& LLFriendCardsManager::findFirstCallingCardSubfolder(const LLUUID &parent_id) const  { -	const LLUUID callingCardsFolderID = gInventory.findCategoryUUIDForType(LLFolderType::FT_CALLINGCARD); +    if (parent_id.isNull()) +    { +        return LLUUID::null; +    } -	std::string friendFolderName = get_friend_folder_name(); +    LLInventoryModel::cat_array_t* cats; +    LLInventoryModel::item_array_t* items; +    gInventory.getDirectDescendentsOf(parent_id, cats, items); -	return findChildFolderUUID(callingCardsFolderID, friendFolderName); +    if (!cats || !items || cats->size() == 0) +    { +        // call failed +        return LLUUID::null; +    } + +    if (cats->size() > 1) +    { +        const LLViewerInventoryCategory* friendFolder = gInventory.getCategory(parent_id); +        if (friendFolder) +        { +            LL_WARNS_ONCE() << friendFolder->getName() << " folder contains more than one folder" << LL_ENDL; +        } +    } + +    for (LLInventoryModel::cat_array_t::const_iterator iter = cats->begin(); +        iter != cats->end(); +        ++iter) +    { +        const LLInventoryCategory* category = (*iter); +        if (category->getPreferredType() == LLFolderType::FT_CALLINGCARD) +        { +            return category->getUUID(); +        } +    } + +    return LLUUID::null;  } -const LLUUID& LLFriendCardsManager::findFriendAllSubfolderUUIDImpl() const +// Inventorry -> +//   Calling Cards - > +//     Friends - > (the only expected folder) +//       All (the only expected folder) + +const LLUUID& LLFriendCardsManager::findFriendFolderUUIDImpl() const  { -	LLUUID friendFolderUUID = findFriendFolderUUIDImpl(); +    const LLUUID callingCardsFolderID = gInventory.findCategoryUUIDForType(LLFolderType::FT_CALLINGCARD); + +    return findFirstCallingCardSubfolder(callingCardsFolderID); +} -	std::string friendAllSubfolderName = get_friend_all_subfolder_name(); +const LLUUID& LLFriendCardsManager::findFriendAllSubfolderUUIDImpl() const +{ +    LLUUID friendFolderUUID = findFriendFolderUUIDImpl(); -	return findChildFolderUUID(friendFolderUUID, friendAllSubfolderName); +    return findFirstCallingCardSubfolder(friendFolderUUID);  }  const LLUUID& LLFriendCardsManager::findChildFolderUUID(const LLUUID& parentFolderUUID, const std::string& nonLocalizedName) const diff --git a/indra/newview/llfriendcard.h b/indra/newview/llfriendcard.h index 2fb912a930..f5679d7d85 100644 --- a/indra/newview/llfriendcard.h +++ b/indra/newview/llfriendcard.h @@ -116,6 +116,7 @@ private:  	}  	const LLUUID& findChildFolderUUID(const LLUUID& parentFolderUUID, const std::string& nonLocalizedName) const; +    const LLUUID& findFirstCallingCardSubfolder(const LLUUID &parent_id) const;  	const LLUUID& findFriendFolderUUIDImpl() const;  	const LLUUID& findFriendAllSubfolderUUIDImpl() const;  	const LLUUID& findFriendCardInventoryUUIDImpl(const LLUUID& avatarID); diff --git a/indra/newview/llgesturemgr.h b/indra/newview/llgesturemgr.h index 91ab445273..7c8e8279c2 100644 --- a/indra/newview/llgesturemgr.h +++ b/indra/newview/llgesturemgr.h @@ -185,7 +185,7 @@ private:  	std::set<LLUUID> mLoadingAssets;  	// LLEventHost interface -	boost::shared_ptr<LLGestureListener> mListener; +	std::shared_ptr<LLGestureListener> mListener;  };  #endif diff --git a/indra/newview/llgroupactions.cpp b/indra/newview/llgroupactions.cpp index e7bc2a9268..84a1278767 100644 --- a/indra/newview/llgroupactions.cpp +++ b/indra/newview/llgroupactions.cpp @@ -196,7 +196,7 @@ LLFetchLeaveGroupData* gFetchLeaveGroupData = NULL;  // static  void LLGroupActions::search()  { -	LLFloaterReg::showInstance("search"); +	LLFloaterReg::showInstance("search", LLSD().with("collection", "groups"));  }  // static diff --git a/indra/newview/llhudtext.cpp b/indra/newview/llhudtext.cpp index 7be35ac260..5952edfc44 100644 --- a/indra/newview/llhudtext.cpp +++ b/indra/newview/llhudtext.cpp @@ -330,7 +330,7 @@ void LLHUDText::updateVisibility()  	if (!mSourceObject)  	{ -		LL_WARNS() << "HUD text: mSourceObject is NULL,  mOnHUDAttachment: " << mOnHUDAttachment << LL_ENDL; +        // Beacons  		mVisible = TRUE;  		if (mOnHUDAttachment)  		{ diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp index b7e0a6a794..98c1d65f92 100644 --- a/indra/newview/llimview.cpp +++ b/indra/newview/llimview.cpp @@ -532,7 +532,6 @@ LLIMModel::LLIMSession::LLIMSession(const LLUUID& session_id, const std::string&  	mSessionInitialized(false),  	mCallBackEnabled(true),  	mTextIMPossible(true), -	mOtherParticipantIsAvatar(true),  	mStartCallOnInitialize(false),  	mStartedAsIMCall(voice),  	mIsDNDsend(false), @@ -544,13 +543,6 @@ LLIMModel::LLIMSession::LLIMSession(const LLUUID& session_id, const std::string&  	if (IM_NOTHING_SPECIAL == mType || IM_SESSION_P2P_INVITE == mType)  	{  		mVoiceChannel  = new LLVoiceChannelP2P(session_id, name, other_participant_id); -		mOtherParticipantIsAvatar = LLVoiceClient::getInstance()->isParticipantAvatar(mSessionID); - -		// check if it was AVALINE call -		if (!mOtherParticipantIsAvatar) -		{ -			mSessionType = AVALINE_SESSION; -		}   	}  	else  	{ @@ -651,9 +643,6 @@ void LLIMModel::LLIMSession::onVoiceChannelStateChanged(const LLVoiceChannel::ES  	switch(mSessionType)  	{ -	case AVALINE_SESSION: -		// no text notifications -		break;  	case P2P_SESSION:  		LLAvatarNameCache::get(mOtherParticipantID, &av_name);  		other_avatar_name = av_name.getUserName(); @@ -913,11 +902,6 @@ bool LLIMModel::LLIMSession::isGroupChat()  	return IM_SESSION_GROUP_START == mType || (IM_SESSION_INVITE == mType && gAgent.isInGroup(mSessionID, TRUE));  } -bool LLIMModel::LLIMSession::isOtherParticipantAvaline() -{ -	return !mOtherParticipantIsAvatar; -} -  LLUUID LLIMModel::LLIMSession::generateOutgoingAdHocHash() const  {  	LLUUID hash = LLUUID::null; @@ -1795,7 +1779,6 @@ LLIMMgr::onConfirmForceCloseError(  LLCallDialogManager::LLCallDialogManager():  mPreviousSessionlName(""), -mPreviousSessionType(LLIMModel::LLIMSession::P2P_SESSION),  mCurrentSessionlName(""),  mSession(NULL),  mOldState(LLVoiceChannel::STATE_READY) @@ -1826,12 +1809,6 @@ void LLCallDialogManager::onVoiceChannelChangedInt(const LLUUID &session_id)  		mCurrentSessionlName = ""; // Empty string results in "Nearby Voice Chat" after substitution  		return;  	} -	 -	if (mSession) -	{ -		// store previous session type to process Avaline calls in dialogs -		mPreviousSessionType = mSession->mSessionType; -	}  	mSession = session; @@ -1857,7 +1834,6 @@ void LLCallDialogManager::onVoiceChannelChangedInt(const LLUUID &session_id)  		mCallDialogPayload["session_name"] = mSession->mName;  		mCallDialogPayload["other_user_id"] = mSession->mOtherParticipantID;  		mCallDialogPayload["old_channel_name"] = mPreviousSessionlName; -		mCallDialogPayload["old_session_type"] = mPreviousSessionType;  		mCallDialogPayload["state"] = LLVoiceChannel::STATE_CALL_STARTED;  		mCallDialogPayload["disconnected_channel_name"] = mSession->mName;  		mCallDialogPayload["session_type"] = mSession->mSessionType; @@ -1893,7 +1869,6 @@ void LLCallDialogManager::onVoiceChannelStateChangedInt(const LLVoiceChannel::ES  	mCallDialogPayload["session_name"] = mSession->mName;  	mCallDialogPayload["other_user_id"] = mSession->mOtherParticipantID;  	mCallDialogPayload["old_channel_name"] = mPreviousSessionlName; -	mCallDialogPayload["old_session_type"] = mPreviousSessionType;  	mCallDialogPayload["state"] = new_state;  	mCallDialogPayload["disconnected_channel_name"] = mSession->mName;  	mCallDialogPayload["session_type"] = mSession->mSessionType; @@ -1910,8 +1885,7 @@ void LLCallDialogManager::onVoiceChannelStateChangedInt(const LLVoiceChannel::ES  		break;  	case LLVoiceChannel::STATE_HUNG_UP: -		// this state is coming before session is changed, so, put it into payload map -		mCallDialogPayload["old_session_type"] = mSession->mSessionType; +		// this state is coming before session is changed  		break;  	case LLVoiceChannel::STATE_CONNECTED : @@ -2031,7 +2005,6 @@ void LLCallDialog::onOpen(const LLSD& key)  void LLCallDialog::setIcon(const LLSD& session_id, const LLSD& participant_id)  { -	// *NOTE: 12/28/2009: check avaline calls: LLVoiceClient::isParticipantAvatar returns false for them  	bool participant_is_avatar = LLVoiceClient::getInstance()->isParticipantAvatar(session_id);  	bool is_group = participant_is_avatar && gAgent.isInGroup(session_id, TRUE); @@ -2052,8 +2025,8 @@ void LLCallDialog::setIcon(const LLSD& session_id, const LLSD& participant_id)  	}  	else  	{ -		avatar_icon->setValue("Avaline_Icon"); -		avatar_icon->setToolTip(std::string("")); +        LL_WARNS() << "Participant neither avatar nor group" << LL_ENDL; +        group_icon->setValue(session_id);  	}  } @@ -2097,13 +2070,7 @@ void LLOutgoingCallDialog::show(const LLSD& key)  	// tell the user which voice channel they are leaving  	if (!mPayload["old_channel_name"].asString().empty())  	{ -		bool was_avaline_call = LLIMModel::LLIMSession::AVALINE_SESSION == mPayload["old_session_type"].asInteger(); -  		std::string old_caller_name = mPayload["old_channel_name"].asString(); -		if (was_avaline_call) -		{ -			old_caller_name = LLTextUtil::formatPhoneNumber(old_caller_name); -		}  		getChild<LLUICtrl>("leaving")->setTextArg("[CURRENT_CHAT]", old_caller_name);  		show_oldchannel = true; @@ -2116,10 +2083,6 @@ void LLOutgoingCallDialog::show(const LLSD& key)  	if (!mPayload["disconnected_channel_name"].asString().empty())  	{  		std::string channel_name = mPayload["disconnected_channel_name"].asString(); -		if (LLIMModel::LLIMSession::AVALINE_SESSION == mPayload["session_type"].asInteger()) -		{ -			channel_name = LLTextUtil::formatPhoneNumber(channel_name); -		}  		getChild<LLUICtrl>("nearby")->setTextArg("[VOICE_CHANNEL_NAME]", channel_name);  		// skipping "You will now be reconnected to nearby" in notification when call is ended by disabling voice, @@ -2135,16 +2098,11 @@ void LLOutgoingCallDialog::show(const LLSD& key)  	std::string callee_name = mPayload["session_name"].asString();  	LLUUID session_id = mPayload["session_id"].asUUID(); -	bool is_avatar = LLVoiceClient::getInstance()->isParticipantAvatar(session_id); -	if (callee_name == "anonymous") +	if (callee_name == "anonymous") // obsolete? Likely was part of avaline support  	{  		callee_name = getString("anonymous");  	} -	else if (!is_avatar) -	{ -		callee_name = LLTextUtil::formatPhoneNumber(callee_name); -	}  	LLSD callee_id = mPayload["other_user_id"];  	// Beautification:  Since you know who you called, just show display name @@ -2344,18 +2302,11 @@ BOOL LLIncomingCallDialog::postBuild()  		call_type = getString(notify_box_type);  	} -	// check to see if this is an Avaline call -	bool is_avatar = LLVoiceClient::getInstance()->isParticipantAvatar(session_id); -	if (caller_name == "anonymous") +	if (caller_name == "anonymous") // obsolete?  Likely was part of avaline support  	{  		caller_name = getString("anonymous");  		setCallerName(caller_name, caller_name, call_type);  	} -	else if (!is_avatar) -	{ -		caller_name = LLTextUtil::formatPhoneNumber(caller_name); -		setCallerName(caller_name, caller_name, call_type); -	}  	else  	{  		// Get the full name information @@ -2375,7 +2326,7 @@ BOOL LLIncomingCallDialog::postBuild()  	if(notify_box_type != "VoiceInviteGroup" && notify_box_type != "VoiceInviteAdHoc")  	{ -		// starting notification's timer for P2P and AVALINE invitations +		// starting notification's timer for P2P invitations  		mLifetimeTimer.start();  	}  	else @@ -2384,7 +2335,7 @@ BOOL LLIncomingCallDialog::postBuild()  	}  	//it's not possible to connect to existing Ad-Hoc/Group chat through incoming ad-hoc call -	//and no IM for avaline +	bool is_avatar = LLVoiceClient::getInstance()->isParticipantAvatar(session_id);  	getChildView("Start IM")->setVisible( is_avatar && notify_box_type != "VoiceInviteAdHoc" && notify_box_type != "VoiceInviteGroup");  	setCanDrag(FALSE); diff --git a/indra/newview/llimview.h b/indra/newview/llimview.h index 79c831ebb6..fdf9806e2e 100644 --- a/indra/newview/llimview.h +++ b/indra/newview/llimview.h @@ -72,7 +72,6 @@ public:  			P2P_SESSION,  			GROUP_SESSION,  			ADHOC_SESSION, -			AVALINE_SESSION,  			NONE_SESSION,  		} SType; @@ -92,12 +91,10 @@ public:  		bool isAdHoc();  		bool isP2P();  		bool isGroupChat(); -		bool isOtherParticipantAvaline();  		bool isP2PSessionType() const { return mSessionType == P2P_SESSION;}  		bool isAdHocSessionType() const { return mSessionType == ADHOC_SESSION;}  		bool isGroupSessionType() const { return mSessionType == GROUP_SESSION;} -		bool isAvalineSessionType() const { return mSessionType == AVALINE_SESSION;}  		LLUUID generateOutgoingAdHocHash() const; @@ -136,7 +133,6 @@ public:  		bool mCallBackEnabled;  		bool mTextIMPossible; -		bool mOtherParticipantIsAvatar;  		bool mStartCallOnInitialize;  		//if IM session is created for a voice call @@ -516,7 +512,6 @@ private:  protected:  	std::string mPreviousSessionlName; -	LLIMModel::LLIMSession::SType mPreviousSessionType;  	std::string mCurrentSessionlName;  	LLIMModel::LLIMSession* mSession;  	LLVoiceChannel::EState mOldState; diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index 884007d2a6..f42c954185 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -1115,7 +1115,10 @@ void LLInvFVBridge::addMarketplaceContextMenuOptions(U32 flags,          LLInventoryModel::cat_array_t categories;          LLInventoryModel::item_array_t items;          gInventory.collectDescendents(local_version_folder_id, categories, items, FALSE); -        if (categories.size() >= gSavedSettings.getU32("InventoryOutboxMaxFolderCount")) +        LLCachedControl<U32> max_depth(gSavedSettings, "InventoryOutboxMaxFolderDepth", 4); +        LLCachedControl<U32> max_count(gSavedSettings, "InventoryOutboxMaxFolderCount", 20); +        if (categories.size() >= max_count +            || depth > (max_depth + 1))          {              disabled_items.push_back(std::string("New Folder"));          } diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp index ad957fa039..b0859060ba 100644 --- a/indra/newview/llinventorymodel.cpp +++ b/indra/newview/llinventorymodel.cpp @@ -135,15 +135,7 @@ bool LLCanCache::operator()(LLInventoryCategory* cat, LLInventoryItem* item)  ///----------------------------------------------------------------------------  /// Class LLInventoryValidationInfo  ///---------------------------------------------------------------------------- -LLInventoryValidationInfo::LLInventoryValidationInfo(): -	mFatalErrorCount(0), -	mWarningCount(0), -    mLoopCount(0), -    mOrphanedCount(0), -	mInitialized(false), -	mFatalNoRootFolder(false), -	mFatalNoLibraryRootFolder(false), -	mFatalQADebugMode(false) +LLInventoryValidationInfo::LLInventoryValidationInfo()  {  } @@ -165,7 +157,6 @@ std::ostream& operator<<(std::ostream& os, const LLInventoryValidationInfo& v)  void LLInventoryValidationInfo::asLLSD(LLSD& sd) const  {  	sd["fatal_error_count"] = mFatalErrorCount; -	sd["warning_count"] = mWarningCount;      sd["loop_count"] = mLoopCount;      sd["orphaned_count"] = mOrphanedCount;  	sd["initialized"] = mInitialized; @@ -173,6 +164,20 @@ void LLInventoryValidationInfo::asLLSD(LLSD& sd) const  	sd["fatal_no_root_folder"] = mFatalNoRootFolder;  	sd["fatal_no_library_root_folder"] = mFatalNoLibraryRootFolder;  	sd["fatal_qa_debug_mode"] = mFatalQADebugMode; + +	sd["warning_count"] = mWarningCount; +	if (mWarningCount>0) +	{ +		sd["warnings"] = LLSD::emptyArray(); +		for (auto const& it : mWarnings) +		{ +			S32 val =LLSD::Integer(it.second); +			if (val>0) +			{ +				sd["warnings"][it.first] = val; +			} +		} +	}  	if (mMissingRequiredSystemFolders.size()>0)  	{  		sd["missing_system_folders"] = LLSD::emptyArray(); @@ -344,13 +349,13 @@ const LLViewerInventoryCategory* LLInventoryModel::getFirstDescendantOf(const LL  	return NULL;  } -LLInventoryModel::EAnscestorResult LLInventoryModel::getObjectTopmostAncestor(const LLUUID& object_id, LLUUID& result) const +LLInventoryModel::EAncestorResult LLInventoryModel::getObjectTopmostAncestor(const LLUUID& object_id, LLUUID& result) const  {  	LLInventoryObject *object = getObject(object_id);      if (!object)      {          LL_WARNS(LOG_INV) << "Unable to trace topmost ancestor, initial object " << object_id << " does not exist" << LL_ENDL; -        return ANSCESTOR_MISSING; +        return ANCESTOR_MISSING;      }      std::set<LLUUID> object_ids{ object_id }; // loop protection @@ -360,19 +365,19 @@ LLInventoryModel::EAnscestorResult LLInventoryModel::getObjectTopmostAncestor(co          if (object_ids.find(parent_id) != object_ids.end())          {              LL_WARNS(LOG_INV) << "Detected a loop on an object " << parent_id << " when searching for ancestor of " << object_id << LL_ENDL; -            return ANSCESTOR_LOOP; +            return ANCESTOR_LOOP;          }          object_ids.insert(parent_id);          LLInventoryObject *parent_object = getObject(parent_id);  		if (!parent_object)  		{  			LL_WARNS(LOG_INV) << "unable to trace topmost ancestor of " << object_id << ", missing item for uuid " << parent_id << LL_ENDL; -			return ANSCESTOR_MISSING; +			return ANCESTOR_MISSING;  		}  		object = parent_object;  	}  	result = object->getUUID(); -	return ANSCESTOR_OK; +	return ANCESTOR_OK;  }  // Get the object by id. Returns NULL if not found. @@ -541,9 +546,18 @@ void LLInventoryModel::consolidateForType(const LLUUID& main_id, LLFolderType::E              LLViewerInventoryCategory* cat = getCategory(*it);              changeCategoryParent(cat, main_id, TRUE);          } -         +          // Purge the emptied folder -        removeCategory(folder_id); +        // Note that this might be a system folder, don't validate removability +        LLViewerInventoryCategory* cat = getCategory(folder_id); +        if (cat) +        { +            const LLUUID trash_id = findCategoryUUIDForType(LLFolderType::FT_TRASH); +            if (trash_id.notNull()) +            { +                changeCategoryParent(cat, trash_id, TRUE); +            } +        }          remove_inventory_category(folder_id, NULL);  	}  } @@ -3898,9 +3912,9 @@ LLPointer<LLInventoryValidationInfo> LLInventoryModel::validate() const  {  	LLPointer<LLInventoryValidationInfo> validation_info = new LLInventoryValidationInfo;  	S32 fatal_errs = 0; -	S32 warnings = 0; -    S32 loops = 0; -    S32 orphaned = 0; +	S32 warning_count= 0; +    S32 loop_count = 0; +    S32 orphaned_count = 0;  	if (getRootFolderID().isNull())  	{ @@ -3921,7 +3935,9 @@ LLPointer<LLInventoryValidationInfo> LLInventoryModel::validate() const  		// ParentChild should be one larger because of the special entry for null uuid.  		LL_INFOS("Inventory") << "unexpected sizes: cat map size " << mCategoryMap.size()  							  << " parent/child " << mParentChildCategoryTree.size() << LL_ENDL; -		warnings++; + +		validation_info->mWarnings["category_map_size"]++; +		warning_count++;  	}  	S32 cat_lock = 0;  	S32 item_lock = 0; @@ -3940,32 +3956,35 @@ LLPointer<LLInventoryValidationInfo> LLInventoryModel::validate() const  		if (!cat)  		{  			LL_WARNS("Inventory") << "null cat" << LL_ENDL; -			warnings++; +			validation_info->mWarnings["null_cat"]++; +			warning_count++;  			continue;  		}  		LLUUID topmost_ancestor_id;  		// Will leave as null uuid on failure -        EAnscestorResult res = getObjectTopmostAncestor(cat_id, topmost_ancestor_id); +        EAncestorResult res = getObjectTopmostAncestor(cat_id, topmost_ancestor_id);          switch (res)          { -        case ANSCESTOR_MISSING: -            orphaned++; +        case ANCESTOR_MISSING: +            orphaned_count++;              break; -        case ANSCESTOR_LOOP: -            loops++; +        case ANCESTOR_LOOP: +            loop_count++;              break; -        case ANSCESTOR_OK: +        case ANCESTOR_OK:              break;          default:              LL_WARNS("Inventory") << "Unknown ancestor error for " << cat_id << LL_ENDL; -            warnings++; +			validation_info->mWarnings["unknown_ancestor_status"]++; +            warning_count++;              break;          }  		if (cat_id != cat->getUUID())  		{  			LL_WARNS("Inventory") << "cat id/index mismatch " << cat_id << " " << cat->getUUID() << LL_ENDL; -			warnings++; +			validation_info->mWarnings["cat_id_index_mismatch"]++; +			warning_count++;  		}  		if (cat->getParentUUID().isNull()) @@ -3975,7 +3994,8 @@ LLPointer<LLInventoryValidationInfo> LLInventoryModel::validate() const  				LL_WARNS("Inventory") << "cat " << cat_id << " has no parent, but is not root ("  									  << getRootFolderID() << ") or library root ("  									  << getLibraryRootFolderID() << ")" << LL_ENDL; -				warnings++; +				validation_info->mWarnings["null_parent"]++; +				warning_count++;  			}  		}  		cat_array_t* cats; @@ -3984,7 +4004,8 @@ LLPointer<LLInventoryValidationInfo> LLInventoryModel::validate() const  		if (!cats || !items)  		{  			LL_WARNS("Inventory") << "invalid direct descendents for " << cat_id << LL_ENDL; -			warnings++; +			validation_info->mWarnings["direct_descendents"]++; +			warning_count++;  			continue;  		}  		if (cat->getDescendentCount() == LLViewerInventoryCategory::DESCENDENT_COUNT_UNKNOWN) @@ -4002,7 +4023,8 @@ LLPointer<LLInventoryValidationInfo> LLInventoryModel::validate() const  									  << " cached " << cat->getDescendentCount()  									  << " expected " << cats->size() << "+" << items->size()  									  << "=" << cats->size() +items->size() << LL_ENDL; -				warnings++; +				validation_info->mWarnings["invalid_descendent_count"]++; +				warning_count++;  			}  		}  		if (cat->getVersion() == LLViewerInventoryCategory::VERSION_UNKNOWN) @@ -4026,7 +4048,8 @@ LLPointer<LLInventoryValidationInfo> LLInventoryModel::validate() const  			if (!item)  			{  				LL_WARNS("Inventory") << "null item at index " << i << " for cat " << cat_id << LL_ENDL; -				warnings++; +				validation_info->mWarnings["null_item_at_index"]++; +				warning_count++;  				continue;  			} @@ -4037,7 +4060,8 @@ LLPointer<LLInventoryValidationInfo> LLInventoryModel::validate() const  				LL_WARNS("Inventory") << "wrong parent for " << item_id << " found "  									  << item->getParentUUID() << " expected " << cat_id  									  << LL_ENDL; -				warnings++; +				validation_info->mWarnings["wrong_parent_for_item"]++; +				warning_count++;  			} @@ -4047,7 +4071,8 @@ LLPointer<LLInventoryValidationInfo> LLInventoryModel::validate() const  			{  				LL_WARNS("Inventory") << "item " << item_id << " found as child of "  									  << cat_id << " but not in top level mItemMap" << LL_ENDL; -				warnings++; +				validation_info->mWarnings["item_not_in_top_map"]++; +				warning_count++;  			}  			else  			{ @@ -4061,11 +4086,12 @@ LLPointer<LLInventoryValidationInfo> LLInventoryModel::validate() const  			// Topmost ancestor should be root or library.  			LLUUID topmost_ancestor_id; -            EAnscestorResult found = getObjectTopmostAncestor(item_id, topmost_ancestor_id); -			if (found != ANSCESTOR_OK) +            EAncestorResult found = getObjectTopmostAncestor(item_id, topmost_ancestor_id); +			if (found != ANCESTOR_OK)  			{  				LL_WARNS("Inventory") << "unable to find topmost ancestor for " << item_id << LL_ENDL; -				warnings++; +				validation_info->mWarnings["topmost_ancestor_not_found"]++; +				warning_count++;  			}  			else  			{ @@ -4076,7 +4102,8 @@ LLPointer<LLInventoryValidationInfo> LLInventoryModel::validate() const  										  << " got " << topmost_ancestor_id  										  << " expected " << getRootFolderID()  										  << " or " << getLibraryRootFolderID() << LL_ENDL; -					warnings++; +					validation_info->mWarnings["topmost_ancestor_not_recognized"]++; +					warning_count++;  				}  			}  		} @@ -4092,7 +4119,7 @@ LLPointer<LLInventoryValidationInfo> LLInventoryModel::validate() const  			{  				LL_WARNS("Inventory") << "cat " << cat_id << " name [" << cat->getName()  									  << "] orphaned - no child cat array for alleged parent " << parent_id << LL_ENDL; -                orphaned++; +                orphaned_count++;  			}  			else  			{ @@ -4110,7 +4137,7 @@ LLPointer<LLInventoryValidationInfo> LLInventoryModel::validate() const  				{  					LL_WARNS("Inventory") << "cat " << cat_id << " name [" << cat->getName()  										  << "] orphaned - not found in child cat array of alleged parent " << parent_id << LL_ENDL; -                    orphaned++; +                    orphaned_count++;  				}  			}  		} @@ -4119,7 +4146,7 @@ LLPointer<LLInventoryValidationInfo> LLInventoryModel::validate() const  		LLFolderType::EType folder_type = cat->getPreferredType();  		bool cat_is_in_library = false;  		LLUUID topmost_id; -		if (getObjectTopmostAncestor(cat->getUUID(),topmost_id) == ANSCESTOR_OK && topmost_id == getLibraryRootFolderID()) +		if (getObjectTopmostAncestor(cat->getUUID(),topmost_id) == ANCESTOR_OK && topmost_id == getLibraryRootFolderID())  		{  			cat_is_in_library = true;  		} @@ -4152,14 +4179,15 @@ LLPointer<LLInventoryValidationInfo> LLInventoryModel::validate() const  		if (item->getUUID() != item_id)  		{  			LL_WARNS("Inventory") << "item_id " << item_id << " does not match " << item->getUUID() << LL_ENDL; -			warnings++; +			validation_info->mWarnings["item_id_mismatch"]++; +			warning_count++;  		}  		const LLUUID& parent_id = item->getParentUUID();  		if (parent_id.isNull())  		{  			LL_WARNS("Inventory") << "item " << item_id << " name [" << item->getName() << "] has null parent id!" << LL_ENDL; -            orphaned++; +            orphaned_count++;  		}  		else  		{ @@ -4170,7 +4198,7 @@ LLPointer<LLInventoryValidationInfo> LLInventoryModel::validate() const  			{  				LL_WARNS("Inventory") << "item " << item_id << " name [" << item->getName()  									  << "] orphaned - alleged parent has no child items list " << parent_id << LL_ENDL; -                orphaned++; +                orphaned_count++;  			}  			else  			{ @@ -4187,7 +4215,7 @@ LLPointer<LLInventoryValidationInfo> LLInventoryModel::validate() const  				{  					LL_WARNS("Inventory") << "item " << item_id << " name [" << item->getName()  										  << "] orphaned - not found as child of alleged parent " << parent_id << LL_ENDL; -                    orphaned++; +                    orphaned_count++;  				}  			} @@ -4205,18 +4233,18 @@ LLPointer<LLInventoryValidationInfo> LLInventoryModel::validate() const  				LL_WARNS("Inventory") << "link " << item->getUUID() << " type " << item->getActualType()  									  << " missing backlink info at target_id " << target_id  									  << LL_ENDL; -                orphaned++; +                orphaned_count++;  			}  			// Links should have referents.  			if (item->getActualType() == LLAssetType::AT_LINK && !target_item)  			{  				LL_WARNS("Inventory") << "broken item link " << item->getName() << " id " << item->getUUID() << LL_ENDL; -                orphaned++; +                orphaned_count++;  			}  			else if (item->getActualType() == LLAssetType::AT_LINK_FOLDER && !target_cat)  			{  				LL_WARNS("Inventory") << "broken folder link " << item->getName() << " id " << item->getUUID() << LL_ENDL; -                orphaned++; +                orphaned_count++;  			}  			if (target_item && target_item->getIsLinkType())  			{ @@ -4288,13 +4316,15 @@ LLPointer<LLInventoryValidationInfo> LLInventoryModel::validate() const  				if (is_automatic)  				{  					LL_WARNS("Inventory") << "Fatal inventory corruption: cannot create system folder of type " << ft << LL_ENDL; -                    fatal_errs++;  					validation_info->mMissingRequiredSystemFolders.insert(folder_type); +                    fatal_errs++;  				}  				else  				{  					// Can create, and will when needed. -					warnings++; +					// (Not sure this is really a warning, but worth logging) +					validation_info->mWarnings["missing_system_folder_can_create"]++; +					warning_count++;  				}  			}  			else if (count_under_root > 1) @@ -4305,6 +4335,7 @@ LLPointer<LLInventoryValidationInfo> LLInventoryModel::validate() const                  {                      // It is a fatal problem or can lead to fatal problems for COF,                      // outfits, trash and other non-automatic folders. +					validation_info->mFatalSystemDuplicate++;                      fatal_errs++;                  }                  else @@ -4312,13 +4343,15 @@ LLPointer<LLInventoryValidationInfo> LLInventoryModel::validate() const                      // For automatic folders it's not a fatal issue and shouldn't                      // break inventory or other functionality further                      // Exception: FT_SETTINGS is not automatic, but only deserves a warning. -                    warnings++; +					validation_info->mWarnings["non_fatal_system_duplicate_under_root"]++; +                    warning_count++;                  }  			}  			if (count_elsewhere > 0)  			{  				LL_WARNS("Inventory") << "Found " << count_elsewhere << " extra folders of type " << ft << " outside of root" << LL_ENDL; -				warnings++; +				validation_info->mWarnings["non_fatal_system_duplicate_elsewhere"]++; +				warning_count++;  			}  		}  	} @@ -4340,12 +4373,12 @@ LLPointer<LLInventoryValidationInfo> LLInventoryModel::validate() const  	// FIXME need to fail login and tell user to retry, contact support if problem persists.  	bool valid = (fatal_errs == 0); -	LL_INFOS("Inventory") << "Validate done, fatal errors: " << fatal_errs << ", warnings: " << warnings << ", valid: " << valid << LL_ENDL; +	LL_INFOS("Inventory") << "Validate done, fatal errors: " << fatal_errs << ", warnings: " << warning_count << ", valid: " << valid << LL_ENDL;  	validation_info->mFatalErrorCount = fatal_errs; -	validation_info->mWarningCount = warnings; -    validation_info->mLoopCount = loops; -    validation_info->mOrphanedCount = orphaned; +	validation_info->mWarningCount = warning_count; +    validation_info->mLoopCount = loop_count; +    validation_info->mOrphanedCount = orphaned_count;  	return validation_info;   } diff --git a/indra/newview/llinventorymodel.h b/indra/newview/llinventorymodel.h index eeec89bfb0..c4133ff9bb 100644 --- a/indra/newview/llinventorymodel.h +++ b/indra/newview/llinventorymodel.h @@ -65,15 +65,19 @@ public:  	void toOstream(std::ostream& os) const;  	void asLLSD(LLSD& sd) const; +	bool mInitialized{false}; +	S32 mWarningCount{0}; +	std::map<std::string,U32> mWarnings; + +    S32 mLoopCount{0}; // Presence of folders whose ancestors loop onto themselves +    S32 mOrphanedCount{0}; // Missing or orphaned items, links and folders + +	S32 mFatalErrorCount{0}; +	bool mFatalNoRootFolder{false}; +	S32 mFatalSystemDuplicate{0}; +	bool mFatalNoLibraryRootFolder{false}; +	bool mFatalQADebugMode{false}; -	S32 mFatalErrorCount; -	S32 mWarningCount; -    S32 mLoopCount; // Presence of folders whose ansestors loop onto themselves -    S32 mOrphanedCount; // Missing or orphaned items, links and folders -	bool mInitialized; -	bool mFatalNoRootFolder; -	bool mFatalNoLibraryRootFolder; -	bool mFatalQADebugMode;  	std::set<LLFolderType::EType> mMissingRequiredSystemFolders;  	std::set<LLFolderType::EType> mDuplicateRequiredSystemFolders;  }; @@ -286,13 +290,13 @@ public:  	// Check if one object has a parent chain up to the category specified by UUID.  	BOOL isObjectDescendentOf(const LLUUID& obj_id, const LLUUID& cat_id) const; -    enum EAnscestorResult{ -        ANSCESTOR_OK = 0, -        ANSCESTOR_MISSING = 1, -        ANSCESTOR_LOOP = 2, +    enum EAncestorResult{ +        ANCESTOR_OK = 0, +        ANCESTOR_MISSING = 1, +        ANCESTOR_LOOP = 2,      };  	// Follow parent chain to the top. -    EAnscestorResult getObjectTopmostAncestor(const LLUUID& object_id, LLUUID& result) const; +    EAncestorResult getObjectTopmostAncestor(const LLUUID& object_id, LLUUID& result) const;  	//--------------------------------------------------------------------  	// Find diff --git a/indra/newview/lllocationinputctrl.h b/indra/newview/lllocationinputctrl.h index 79dbe17982..af2a9f6afd 100644 --- a/indra/newview/lllocationinputctrl.h +++ b/indra/newview/lllocationinputctrl.h @@ -109,6 +109,8 @@ public:  	LLLineEditor*			getTextEntry() const { return mTextEntry; }  	void					handleLoginComplete(); +    bool isNavMeshDirty() { return mIsNavMeshDirty; } +  private:  	enum EParcelIcon diff --git a/indra/newview/llmarketplacefunctions.cpp b/indra/newview/llmarketplacefunctions.cpp index 044c76ce2c..dd4ae4d201 100644 --- a/indra/newview/llmarketplacefunctions.cpp +++ b/indra/newview/llmarketplacefunctions.cpp @@ -758,7 +758,14 @@ void LLMarketplaceData::initializeSLM(const status_updated_signal_t::slot_type&      if (mMarketPlaceStatus != MarketplaceStatusCodes::MARKET_PLACE_NOT_INITIALIZED)      {          // If already initialized, just confirm the status so the callback gets called -        setSLMStatus(mMarketPlaceStatus); +        if (mMarketPlaceFailureReason.empty()) +        { +            setSLMStatus(mMarketPlaceStatus); +        } +        else +        { +            setSLMConnectionFailure(mMarketPlaceFailureReason); +        }      }      else      { @@ -799,28 +806,27 @@ void LLMarketplaceData::getMerchantStatusCoro()          if (httpCode == HTTP_NOT_FOUND)          {              log_SLM_infos("Get /merchant", httpCode, std::string("User is not a merchant")); -            setSLMStatus(MarketplaceStatusCodes::MARKET_PLACE_NOT_MERCHANT); +            LLMarketplaceData::instance().setSLMStatus(MarketplaceStatusCodes::MARKET_PLACE_NOT_MERCHANT);          }          else if (httpCode == HTTP_SERVICE_UNAVAILABLE)          {              log_SLM_infos("Get /merchant", httpCode, std::string("Merchant is not migrated")); -            setSLMStatus(MarketplaceStatusCodes::MARKET_PLACE_NOT_MIGRATED_MERCHANT); +            LLMarketplaceData::instance().setSLMStatus(MarketplaceStatusCodes::MARKET_PLACE_NOT_MIGRATED_MERCHANT);          } -        else if (httpCode == HTTP_INTERNAL_ERROR) +        else          { -            // 499 includes timeout and ssl error - marketplace is down or having issues, we do not show it in this request according to MAINT-5938              LL_WARNS("SLM") << "SLM Merchant Request failed with status: " << httpCode                                      << ", reason : " << status.toString()                                      << ", code : " << result["error_code"].asString()                                      << ", description : " << result["error_description"].asString() << LL_ENDL; -            LLMarketplaceData::instance().setSLMStatus(MarketplaceStatusCodes::MARKET_PLACE_CONNECTION_FAILURE); -        } -        else -        { -            std::string err_code = result["error_code"].asString(); -            //std::string err_description = result["error_description"].asString(); -            log_SLM_warning("Get /merchant", httpCode, status.toString(), err_code, result["error_description"]); -            setSLMStatus(MarketplaceStatusCodes::MARKET_PLACE_CONNECTION_FAILURE); +            std::string reason = status.toString(); +            if (reason.empty()) +            { +                reason = result["error_code"].asString(); +            } +            // Since user might not even have a marketplace, there is no reason to report the error +            // to the user, instead write it down into listings' floater +            LLMarketplaceData::instance().setSLMConnectionFailure(reason);          }          return;      } @@ -1298,6 +1304,17 @@ std::string LLMarketplaceData::getSLMConnectURL(const std::string& route)  void LLMarketplaceData::setSLMStatus(U32 status)  {      mMarketPlaceStatus = status; +    mMarketPlaceFailureReason.clear(); +    if (mStatusUpdatedSignal) +    { +        (*mStatusUpdatedSignal)(); +    } +} + +void LLMarketplaceData::setSLMConnectionFailure(const std::string& reason) +{ +    mMarketPlaceStatus = MarketplaceStatusCodes::MARKET_PLACE_CONNECTION_FAILURE; +    mMarketPlaceFailureReason = reason;      if (mStatusUpdatedSignal)      {          (*mStatusUpdatedSignal)(); diff --git a/indra/newview/llmarketplacefunctions.h b/indra/newview/llmarketplacefunctions.h index fee9225f77..088507d850 100644 --- a/indra/newview/llmarketplacefunctions.h +++ b/indra/newview/llmarketplacefunctions.h @@ -198,7 +198,9 @@ public:  	typedef boost::signals2::signal<void ()> status_updated_signal_t;      void initializeSLM(const status_updated_signal_t::slot_type& cb);  	U32  getSLMStatus() const { return mMarketPlaceStatus; } +    std::string getSLMConnectionfailureReason() { return mMarketPlaceFailureReason; }  	void setSLMStatus(U32 status); +    void setSLMConnectionFailure(const std::string& reason);      void getSLMListings();      bool isEmpty() { return (mMarketplaceItems.size() == 0); }      void setDataFetchedSignal(const status_updated_signal_t::slot_type& cb); @@ -272,6 +274,7 @@ private:      // Handling Marketplace connection and inventory connection  	U32  mMarketPlaceStatus; +    std::string mMarketPlaceFailureReason;  	status_updated_signal_t* mStatusUpdatedSignal;  	LLInventoryObserver* mInventoryObserver;      bool mDirtyCount;   // If true, stock count value need to be updated at the next check diff --git a/indra/newview/llmediadataclient.cpp b/indra/newview/llmediadataclient.cpp index bc45eb6d3a..9d0f62a30d 100644 --- a/indra/newview/llmediadataclient.cpp +++ b/indra/newview/llmediadataclient.cpp @@ -154,8 +154,7 @@ void mark_dead_and_remove_if(T &c, const PredicateMatchRequest &matchPred)          if (matchPred(*it))          {              (*it)->markDead(); -            // *TDOO: When C++11 is in change the following line to: it = c.erase(it); -            c.erase(it++); +            it = c.erase(it);          }          else          { diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp index a6d55b4ae9..14c039a0a2 100644 --- a/indra/newview/llmeshrepository.cpp +++ b/indra/newview/llmeshrepository.cpp @@ -383,6 +383,9 @@ U32 LLMeshRepository::sLODPending = 0;  U32 LLMeshRepository::sCacheBytesRead = 0;  U32 LLMeshRepository::sCacheBytesWritten = 0; +U32 LLMeshRepository::sCacheBytesHeaders = 0; +U32 LLMeshRepository::sCacheBytesSkins = 0; +U32 LLMeshRepository::sCacheBytesDecomps = 0;  U32 LLMeshRepository::sCacheReads = 0;  U32 LLMeshRepository::sCacheWrites = 0;  U32 LLMeshRepository::sMaxLockHoldoffs = 0; @@ -1877,6 +1880,7 @@ EMeshProcessingResult LLMeshRepoThread::headerReceived(const LLVolumeParams& mes  			LLMutexLock lock(mHeaderMutex);  			mMeshHeaderSize[mesh_id] = header_size;  			mMeshHeader[mesh_id] = header; +            LLMeshRepository::sCacheBytesHeaders += header_size;  		} @@ -3009,27 +3013,6 @@ S32 LLMeshRepository::getActualMeshLOD(LLSD& header, S32 lod)  	return -1;  } -void LLMeshRepository::cacheOutgoingMesh(LLMeshUploadData& data, LLSD& header) -{ -	mThread->mMeshHeader[data.mUUID] = header; - -	// we cache the mesh for default parameters -	LLVolumeParams volume_params; -	volume_params.setType(LL_PCODE_PROFILE_SQUARE, LL_PCODE_PATH_LINE); -	volume_params.setSculptID(data.mUUID, LL_SCULPT_TYPE_MESH); - -	for (U32 i = 0; i < 4; i++) -	{ -		if (data.mModel[i].notNull()) -		{ -			LLPointer<LLVolume> volume = new LLVolume(volume_params, LLVolumeLODGroup::getVolumeScaleFromDetail(i)); -			volume->copyVolumeFaces(data.mModel[i]); -			volume->setMeshAssetLoaded(TRUE); -		} -	} - -} -  // Handle failed or successful requests for mesh assets.  //  // Support for 200 responses was added for several reasons.  One, @@ -3947,6 +3930,8 @@ void LLMeshRepository::notifyLoadedMeshes()  void LLMeshRepository::notifySkinInfoReceived(LLMeshSkinInfo& info)  {  	mSkinMap[info.mMeshID] = info; +    // Alternative: We can get skin size from header +    sCacheBytesSkins += info.sizeBytes();  	skin_load_map::iterator iter = mLoadingSkins.find(info.mMeshID);  	if (iter != mLoadingSkins.end()) @@ -3970,10 +3955,14 @@ void LLMeshRepository::notifyDecompositionReceived(LLModel::Decomposition* decom  	{ //just insert decomp into map  		mDecompositionMap[decomp->mMeshID] = decomp;  		mLoadingDecompositions.erase(decomp->mMeshID); +        sCacheBytesDecomps += decomp->sizeBytes();  	}  	else  	{ //merge decomp with existing entry +        sCacheBytesDecomps -= iter->second->sizeBytes();  		iter->second->merge(decomp); +        sCacheBytesDecomps += iter->second->sizeBytes(); +  		mLoadingDecompositions.erase(decomp->mMeshID);  		delete decomp;  	} diff --git a/indra/newview/llmeshrepository.h b/indra/newview/llmeshrepository.h index 1989350303..f61da3e571 100644 --- a/indra/newview/llmeshrepository.h +++ b/indra/newview/llmeshrepository.h @@ -554,6 +554,9 @@ public:  	static U32 sLODProcessing;  	static U32 sCacheBytesRead;  	static U32 sCacheBytesWritten; +    static U32 sCacheBytesHeaders; +    static U32 sCacheBytesSkins; +    static U32 sCacheBytesDecomps;  	static U32 sCacheReads;						  	static U32 sCacheWrites;  	static U32 sMaxLockHoldoffs;				// Maximum sequential locking failures @@ -643,8 +646,6 @@ public:  	std::queue<LLUUID> mPendingPhysicsShapeRequests;  	U32 mMeshThreadCount; - -	void cacheOutgoingMesh(LLMeshUploadData& data, LLSD& header);  	LLMeshRepoThread* mThread;  	std::vector<LLMeshUploadThread*> mUploads; diff --git a/indra/newview/llmodelpreview.cpp b/indra/newview/llmodelpreview.cpp index 54ec41026d..ae5dd6ec54 100644 --- a/indra/newview/llmodelpreview.cpp +++ b/indra/newview/llmodelpreview.cpp @@ -2712,7 +2712,6 @@ void LLModelPreview::genBuffers(S32 lod, bool include_skin_weights)              continue;          } -        LLModel* base_mdl = *base_iter;          base_iter++;          S32 num_faces = mdl->getNumVolumeFaces(); @@ -2787,7 +2786,7 @@ void LLModelPreview::genBuffers(S32 lod, bool include_skin_weights)                      //find closest weight to vf.mVertices[i].mPosition                      LLVector3 pos(vf.mPositions[i].getF32ptr()); -                    const LLModel::weight_list& weight_list = base_mdl->getJointInfluences(pos); +                    const LLModel::weight_list& weight_list = mdl->getJointInfluences(pos);                      llassert(weight_list.size()>0 && weight_list.size() <= 4); // LLModel::loadModel() should guarantee this                      LLVector4 w(0, 0, 0, 0); @@ -2912,6 +2911,20 @@ void LLModelPreview::loadedCallback(          {              pPreview->lookupLODModelFiles(lod);          } + +        const LLVOAvatar* avatarp = pPreview->getPreviewAvatar(); +        if (avatarp) { // set up ground plane for possible rendering +            const LLVector3 root_pos = avatarp->mRoot->getPosition(); +            const LLVector4a* ext = avatarp->mDrawable->getSpatialExtents(); +            const LLVector4a min = ext[0], max = ext[1]; +            const F32 center = (max[2] - min[2]) * 0.5f; +            const F32 ground = root_pos[2] - center; +            auto plane = pPreview->mGroundPlane; +            plane[0] = {min[0], min[1], ground}; +            plane[1] = {max[0], min[1], ground}; +            plane[2] = {max[0], max[1], ground}; +            plane[3] = {min[0], max[1], ground}; +        }      }  } @@ -3119,6 +3132,9 @@ BOOL LLModelPreview::render()                      // (note: all these UI updates need to be somewhere that is not render)                      fmp->childSetValue("upload_skin", true);                      mFirstSkinUpdate = false; +                    upload_skin = true; +                    skin_weight = true; +                    mViewOption["show_skin_weight"] = true;                  }                  fmp->enableViewOption("show_skin_weight"); @@ -3723,6 +3739,7 @@ BOOL LLModelPreview::render()                  {                      getPreviewAvatar()->renderBones();                  } +                renderGroundPlane(mPelvisZOffset);                  if (shader)                  {                      shader->bind(); @@ -3744,6 +3761,28 @@ BOOL LLModelPreview::render()      return TRUE;  } +void LLModelPreview::renderGroundPlane(float z_offset) +{   // Not necesarilly general - beware - but it seems to meet the needs of LLModelPreview::render + +	gGL.diffuseColor3f( 1.0f, 0.0f, 1.0f ); + +	gGL.begin(LLRender::LINES); +	gGL.vertex3fv(mGroundPlane[0].mV); +	gGL.vertex3fv(mGroundPlane[1].mV); + +	gGL.vertex3fv(mGroundPlane[1].mV); +	gGL.vertex3fv(mGroundPlane[2].mV); + +	gGL.vertex3fv(mGroundPlane[2].mV); +	gGL.vertex3fv(mGroundPlane[3].mV); + +	gGL.vertex3fv(mGroundPlane[3].mV); +	gGL.vertex3fv(mGroundPlane[0].mV); + +	gGL.end(); +} + +  //-----------------------------------------------------------------------------  // refresh()  //----------------------------------------------------------------------------- diff --git a/indra/newview/llmodelpreview.h b/indra/newview/llmodelpreview.h index 215f44357f..7cb5fd6845 100644 --- a/indra/newview/llmodelpreview.h +++ b/indra/newview/llmodelpreview.h @@ -224,6 +224,8 @@ private:      LLVOAvatar* getPreviewAvatar(void) { return mPreviewAvatar; }      // Count amount of original models, excluding sub-models      static U32 countRootModels(LLModelLoader::model_list models); +    LLVector3   mGroundPlane[4]; +	void		renderGroundPlane(float z_offset = 0.0f);      typedef enum      { diff --git a/indra/newview/llmutelist.cpp b/indra/newview/llmutelist.cpp index 4a8ef53a8b..bf00d77dea 100644 --- a/indra/newview/llmutelist.cpp +++ b/indra/newview/llmutelist.cpp @@ -352,7 +352,7 @@ BOOL LLMuteList::add(const LLMute& mute, U32 flags)  void LLMuteList::updateAdd(const LLMute& mute)  { -	// External mutes (e.g. Avaline callers) are local only, don't send them to the server. +	// External mutes are local only, don't send them to the server.  	if (mute.mType == LLMute::EXTERNAL)  	{  		return; diff --git a/indra/newview/llnamelistctrl.cpp b/indra/newview/llnamelistctrl.cpp index 5215126789..8058faa5c7 100644 --- a/indra/newview/llnamelistctrl.cpp +++ b/indra/newview/llnamelistctrl.cpp @@ -271,6 +271,25 @@ BOOL LLNameListCtrl::handleToolTip(S32 x, S32 y, MASK mask)  	return handled;  } +// virtual +BOOL LLNameListCtrl::handleRightMouseDown(S32 x, S32 y, MASK mask) +{ +    LLNameListItem* hit_item = dynamic_cast<LLNameListItem*>(hitItem(x, y)); +    LLFloater* floater = gFloaterView->getParentFloater(this); +    if (floater && floater->isFrontmost() && hit_item) +    { +        if(hit_item->isGroup()) +        { +            ContextMenuType prev_menu = getContextMenuType(); +            setContextMenu(MENU_GROUP); +            BOOL handled = LLScrollListCtrl::handleRightMouseDown(x, y, mask); +            setContextMenu(prev_menu); +            return handled; +        } +    } +    return LLScrollListCtrl::handleRightMouseDown(x, y, mask);     +} +  // public  void LLNameListCtrl::addGroupNameItem(const LLUUID& group_id, EAddPosition pos,  									  BOOL enabled) diff --git a/indra/newview/llnamelistctrl.h b/indra/newview/llnamelistctrl.h index ef0be135e6..5dd5da5892 100644 --- a/indra/newview/llnamelistctrl.h +++ b/indra/newview/llnamelistctrl.h @@ -170,6 +170,7 @@ public:  	/*virtual*/ void updateColumns(bool force_update);  	/*virtual*/ void mouseOverHighlightNthItem( S32 index ); +    /*virtual*/ BOOL handleRightMouseDown(S32 x, S32 y, MASK mask);  private:  	void showInspector(const LLUUID& avatar_id, bool is_group, bool is_experience = false);  	void onAvatarNameCache(const LLUUID& agent_id, const LLAvatarName& av_name, std::string suffix, std::string prefix, LLHandle<LLNameListItem> item); diff --git a/indra/newview/llnavigationbar.cpp b/indra/newview/llnavigationbar.cpp index 19dbbeb60e..2dd7cfab27 100644 --- a/indra/newview/llnavigationbar.cpp +++ b/indra/newview/llnavigationbar.cpp @@ -713,7 +713,7 @@ void LLNavigationBar::resizeLayoutPanel()  }  void LLNavigationBar::invokeSearch(std::string search_text)  { -	LLFloaterReg::showInstance("search", LLSD().with("category", "all").with("query", LLSD(search_text))); +	LLFloaterReg::showInstance("search", LLSD().with("category", "standard").with("query", LLSD(search_text)));  }  void LLNavigationBar::clearHistoryCache() @@ -733,3 +733,8 @@ int LLNavigationBar::getDefFavBarHeight()  {  	return mDefaultFpRect.getHeight();  } + +bool LLNavigationBar::isRebakeNavMeshAvailable() +{ +    return mCmbLocation->isNavMeshDirty(); +} diff --git a/indra/newview/llnavigationbar.h b/indra/newview/llnavigationbar.h index 646911a62c..11c671294a 100755 --- a/indra/newview/llnavigationbar.h +++ b/indra/newview/llnavigationbar.h @@ -102,6 +102,8 @@ public:  	int getDefNavBarHeight();  	int getDefFavBarHeight(); + +    bool isRebakeNavMeshAvailable();  private:  	// the distance between navigation panel and favorites panel in pixels diff --git a/indra/newview/llpanelavatar.cpp b/indra/newview/llpanelavatar.cpp index 9a030f1d7d..ff33efe4aa 100644 --- a/indra/newview/llpanelavatar.cpp +++ b/indra/newview/llpanelavatar.cpp @@ -120,7 +120,7 @@ void LLPanelProfileTab::setApplyProgress(bool started)          }      } -    LLPanel* panel = findChild<LLPanel>("indicator_stack"); +    LLView* panel = findChild<LLView>("indicator_stack");      if (panel)      {          panel->setVisible(started); diff --git a/indra/newview/llpaneleditwearable.cpp b/indra/newview/llpaneleditwearable.cpp index 6e897e2c7e..ea10aa75ae 100644 --- a/indra/newview/llpaneleditwearable.cpp +++ b/indra/newview/llpaneleditwearable.cpp @@ -1308,7 +1308,8 @@ void LLPanelEditWearable::changeCamera(U8 subpart)          gMorphView->setCameraOffset( subpart_entry->mCameraOffset );          if (gSavedSettings.getBOOL("AppearanceCameraMovement"))          { -            gAgentCamera.setFocusOnAvatar(FALSE, FALSE); +            // Unlock focus from avatar but don't stop animation to not interrupt ANIM_AGENT_CUSTOMIZE +            gAgentCamera.setFocusOnAvatar(FALSE, gAgentCamera.getCameraAnimating());              gMorphView->updateCamera();          }  } diff --git a/indra/newview/llpanelface.cpp b/indra/newview/llpanelface.cpp index 7fe5b1dd3f..178aba11a3 100644 --- a/indra/newview/llpanelface.cpp +++ b/indra/newview/llpanelface.cpp @@ -49,11 +49,15 @@  #include "llinventoryfunctions.h"  #include "llinventorymodel.h" // gInventory  #include "llinventorymodelbackgroundfetch.h" +#include "llfloatermediasettings.h" +#include "llfloaterreg.h"  #include "lllineeditor.h"  #include "llmaterialmgr.h" +#include "llmediactrl.h"  #include "llmediaentry.h"  #include "llmenubutton.h"  #include "llnotificationsutil.h" +#include "llpanelcontents.h"  #include "llradiogroup.h"  #include "llresmgr.h"  #include "llselectmgr.h" @@ -99,10 +103,9 @@ std::string USE_TEXTURE;  LLRender::eTexIndex LLPanelFace::getTextureChannelToEdit()  { -	LLComboBox* combobox_matmedia = getChild<LLComboBox>("combobox matmedia");  	LLRadioGroup* radio_mat_type = getChild<LLRadioGroup>("radio_material_type"); -	LLRender::eTexIndex channel_to_edit = (combobox_matmedia && combobox_matmedia->getCurrentIndex() == MATMEDIA_MATERIAL) ? +	LLRender::eTexIndex channel_to_edit = (mComboMatMedia && mComboMatMedia->getCurrentIndex() == MATMEDIA_MATERIAL) ?  	                                                    (radio_mat_type ? (LLRender::eTexIndex)radio_mat_type->getSelectedIndex() : LLRender::DIFFUSE_MAP) : LLRender::DIFFUSE_MAP;  	channel_to_edit = (channel_to_edit == LLRender::NORMAL_MAP)		? (getCurrentNormalMap().isNull()		? LLRender::DIFFUSE_MAP : channel_to_edit) : channel_to_edit; @@ -161,6 +164,8 @@ BOOL	LLPanelFace::postBuild()  	childSetCommitCallback("glossiness",&LLPanelFace::onCommitMaterialGloss, this);  	childSetCommitCallback("environment",&LLPanelFace::onCommitMaterialEnv, this);  	childSetCommitCallback("maskcutoff",&LLPanelFace::onCommitMaterialMaskCutoff, this); +    childSetCommitCallback("add_media", &LLPanelFace::onClickBtnAddMedia, this); +    childSetCommitCallback("delete_media", &LLPanelFace::onClickBtnDeleteMedia, this);  	childSetAction("button align",&LLPanelFace::onClickAutoFix,this);  	childSetAction("button align textures", &LLPanelFace::onAlignTexture, this); @@ -172,7 +177,6 @@ BOOL	LLPanelFace::postBuild()  	LLColorSwatchCtrl*	mShinyColorSwatch;  	LLComboBox*		mComboTexGen; -	LLComboBox*		mComboMatMedia;  	LLCheckBoxCtrl	*mCheckFullbright; @@ -308,6 +312,9 @@ BOOL	LLPanelFace::postBuild()      mMenuClipboardColor = getChild<LLMenuButton>("clipboard_color_params_btn");      mMenuClipboardTexture = getChild<LLMenuButton>("clipboard_texture_params_btn"); +     +    mTitleMedia = getChild<LLMediaCtrl>("title_media"); +    mTitleMediaText = getChild<LLTextBox>("media_info");  	clearCtrls(); @@ -316,24 +323,31 @@ BOOL	LLPanelFace::postBuild()  LLPanelFace::LLPanelFace()  :	LLPanel(), -	mIsAlpha(false) +    mIsAlpha(false), +    mComboMatMedia(NULL), +    mTitleMedia(NULL), +    mTitleMediaText(NULL), +    mNeedMediaTitle(true)  {      USE_TEXTURE = LLTrans::getString("use_texture");      mCommitCallbackRegistrar.add("PanelFace.menuDoToSelected", boost::bind(&LLPanelFace::menuDoToSelected, this, _2));      mEnableCallbackRegistrar.add("PanelFace.menuEnable", boost::bind(&LLPanelFace::menuEnableItem, this, _2));  } -  LLPanelFace::~LLPanelFace()  { -	// Children all cleaned up by default view destructor. +    unloadMedia();  } -  void LLPanelFace::draw()  {      updateCopyTexButton(); +    // grab media name/title and update the UI widget +    // Todo: move it, it's preferable not to update +    // labels inside draw +    updateMediaTitle(); +      LLPanel::draw();  } @@ -824,21 +838,20 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)  		BOOL editable = objectp->permModify() && !objectp->isPermanentEnforced();  		// only turn on auto-adjust button if there is a media renderer and the media is loaded -		getChildView("button align")->setEnabled(editable); +        childSetEnabled("button align", editable); -		LLComboBox* combobox_matmedia = getChild<LLComboBox>("combobox matmedia"); -		if (combobox_matmedia) +		if (mComboMatMedia)  		{ -			if (combobox_matmedia->getCurrentIndex() < MATMEDIA_MATERIAL) +			if (mComboMatMedia->getCurrentIndex() < MATMEDIA_MATERIAL)  			{ -				combobox_matmedia->selectNthItem(MATMEDIA_MATERIAL); +                mComboMatMedia->selectNthItem(MATMEDIA_MATERIAL);  			} +            mComboMatMedia->setEnabled(editable);  		}  		else  		{  			LL_WARNS() << "failed getChild for 'combobox matmedia'" << LL_ENDL;  		} -		getChildView("combobox matmedia")->setEnabled(editable);  		LLRadioGroup* radio_mat_type = getChild<LLRadioGroup>("radio_material_type");  		if(radio_mat_type) @@ -847,7 +860,6 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)  		    {  		        radio_mat_type->selectNthItem(MATTYPE_DIFFUSE);  		    } -  		}  		else  		{ @@ -876,22 +888,22 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)  		{  			getChildView("color label")->setEnabled(editable);  		} -		LLColorSwatchCtrl*	mColorSwatch = getChild<LLColorSwatchCtrl>("colorswatch"); +		LLColorSwatchCtrl*	color_swatch = findChild<LLColorSwatchCtrl>("colorswatch");  		LLColor4 color					= LLColor4::white;  		bool		identical_color	= false; -		if(mColorSwatch) +		if(color_swatch)  		{  			LLSelectedTE::getColor(color, identical_color); -			LLColor4 prev_color = mColorSwatch->get(); +			LLColor4 prev_color = color_swatch->get(); -			mColorSwatch->setOriginal(color); -			mColorSwatch->set(color, force_set_values || (prev_color != color) || !editable); +            color_swatch->setOriginal(color); +            color_swatch->set(color, force_set_values || (prev_color != color) || !editable); -			mColorSwatch->setValid(editable); -			mColorSwatch->setEnabled( editable ); -			mColorSwatch->setCanApplyImmediately( editable ); +            color_swatch->setValid(editable); +            color_swatch->setEnabled( editable ); +            color_swatch->setCanApplyImmediately( editable );  		}  		// Color transparency @@ -1374,7 +1386,7 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)  				BOOL identical_repeats = true;  				F32  repeats = 1.0f; -				U32 material_type = (combobox_matmedia->getCurrentIndex() == MATMEDIA_MATERIAL) ? radio_mat_type->getSelectedIndex() : MATTYPE_DIFFUSE; +				U32 material_type = (mComboMatMedia->getCurrentIndex() == MATMEDIA_MATERIAL) ? radio_mat_type->getSelectedIndex() : MATTYPE_DIFFUSE;  				LLSelectMgr::getInstance()->setTextureChannel(LLRender::eTexIndex(material_type));  				switch (material_type) @@ -1606,6 +1618,755 @@ void LLPanelFace::refresh()  	getState();  } +void LLPanelFace::refreshMedia() +{ +    LLObjectSelectionHandle selected_objects = LLSelectMgr::getInstance()->getSelection(); +    LLViewerObject* first_object = selected_objects->getFirstObject(); + +    if (!(first_object +        && first_object->getPCode() == LL_PCODE_VOLUME +        && first_object->permModify() +        )) +    { +        getChildView("add_media")->setEnabled(FALSE); +        mTitleMediaText->clear(); +        clearMediaSettings(); +        return; +    } + +    std::string url = first_object->getRegion()->getCapability("ObjectMedia"); +    bool has_media_capability = (!url.empty()); + +    if (!has_media_capability) +    { +        getChildView("add_media")->setEnabled(FALSE); +        LL_WARNS("LLFloaterToolsMedia") << "Media not enabled (no capability) in this region!" << LL_ENDL; +        clearMediaSettings(); +        return; +    } + +    BOOL is_nonpermanent_enforced = (LLSelectMgr::getInstance()->getSelection()->getFirstRootNode() +        && LLSelectMgr::getInstance()->selectGetRootsNonPermanentEnforced()) +        || LLSelectMgr::getInstance()->selectGetNonPermanentEnforced(); +    bool editable = is_nonpermanent_enforced && (first_object->permModify() || selectedMediaEditable()); + +    // Check modify permissions and whether any selected objects are in +    // the process of being fetched.  If they are, then we're not editable +    if (editable) +    { +        LLObjectSelection::iterator iter = selected_objects->begin(); +        LLObjectSelection::iterator end = selected_objects->end(); +        for (; iter != end; ++iter) +        { +            LLSelectNode* node = *iter; +            LLVOVolume* object = dynamic_cast<LLVOVolume*>(node->getObject()); +            if (NULL != object) +            { +                if (!object->permModify()) +                { +                    LL_INFOS("LLFloaterToolsMedia") +                        << "Selection not editable due to lack of modify permissions on object id " +                        << object->getID() << LL_ENDL; + +                    editable = false; +                    break; +                } +            } +        } +    } + +    // Media settings +    bool bool_has_media = false; +    struct media_functor : public LLSelectedTEGetFunctor<bool> +    { +        bool get(LLViewerObject* object, S32 face) +        { +            LLTextureEntry *te = object->getTE(face); +            if (te) +            { +                return te->hasMedia(); +            } +            return false; +        } +    } func; + + +    // check if all faces have media(or, all dont have media) +    LLFloaterMediaSettings::getInstance()->mIdenticalHasMediaInfo = selected_objects->getSelectedTEValue(&func, bool_has_media); + +    const LLMediaEntry default_media_data; + +    struct functor_getter_media_data : public LLSelectedTEGetFunctor< LLMediaEntry> +    { +        functor_getter_media_data(const LLMediaEntry& entry) : mMediaEntry(entry) {} + +        LLMediaEntry get(LLViewerObject* object, S32 face) +        { +            if (object) +                if (object->getTE(face)) +                    if (object->getTE(face)->getMediaData()) +                        return *(object->getTE(face)->getMediaData()); +            return mMediaEntry; +        }; + +        const LLMediaEntry& mMediaEntry; + +    } func_media_data(default_media_data); + +    LLMediaEntry media_data_get; +    LLFloaterMediaSettings::getInstance()->mMultipleMedia = !(selected_objects->getSelectedTEValue(&func_media_data, media_data_get)); + +    std::string multi_media_info_str = LLTrans::getString("Multiple Media"); +    std::string media_title = ""; +    // update UI depending on whether "object" (prim or face) has media +    // and whether or not you are allowed to edit it. + +    getChildView("add_media")->setEnabled(editable); +    // IF all the faces have media (or all dont have media) +    if (LLFloaterMediaSettings::getInstance()->mIdenticalHasMediaInfo) +    { +        // TODO: get media title and set it. +        mTitleMediaText->clear(); +        // if identical is set, all faces are same (whether all empty or has the same media) +        if (!(LLFloaterMediaSettings::getInstance()->mMultipleMedia)) +        { +            // Media data is valid +            if (media_data_get != default_media_data) +            { +                // initial media title is the media URL (until we get the name) +                media_title = media_data_get.getHomeURL(); +            } +            // else all faces might be empty.  +        } +        else // there' re Different Medias' been set on on the faces. +        { +            media_title = multi_media_info_str; +        } + +        getChildView("delete_media")->setEnabled(bool_has_media && editable); +        // TODO: display a list of all media on the face - use 'identical' flag +    } +    else // not all face has media but at least one does. +    { +        // seleted faces have not identical value +        LLFloaterMediaSettings::getInstance()->mMultipleValidMedia = selected_objects->isMultipleTEValue(&func_media_data, default_media_data); + +        if (LLFloaterMediaSettings::getInstance()->mMultipleValidMedia) +        { +            media_title = multi_media_info_str; +        } +        else +        { +            // Media data is valid +            if (media_data_get != default_media_data) +            { +                // initial media title is the media URL (until we get the name) +                media_title = media_data_get.getHomeURL(); +            } +        } + +        getChildView("delete_media")->setEnabled(TRUE); +    } + +    U32 materials_media = mComboMatMedia->getCurrentIndex(); +    if (materials_media == MATMEDIA_MEDIA) +    { +        // currently displaying media info, navigateTo and update title +        navigateToTitleMedia(media_title); +    } +    else +    { +        // Media can be heavy, don't keep it around +        // MAC specific: MAC doesn't support setVolume(0) so if  not +        // unloaded, it might keep playing audio until user closes editor +        unloadMedia(); +        mNeedMediaTitle = false; +    } + +    mTitleMediaText->setText(media_title); + +    // load values for media settings +    updateMediaSettings(); + +    LLFloaterMediaSettings::initValues(mMediaSettings, editable); +} + +void LLPanelFace::unloadMedia() +{ +    // destroy media source used to grab media title +    if (mTitleMedia) +        mTitleMedia->unloadMediaSource(); +} + +////////////////////////////////////////////////////////////////////////////// +// +void LLPanelFace::navigateToTitleMedia( const std::string url ) +{ +	std::string multi_media_info_str = LLTrans::getString("Multiple Media"); +	if (url.empty() || multi_media_info_str == url) +	{ +		// nothing to show +		mNeedMediaTitle = false; +	} +	else if (mTitleMedia) +	{ +		LLPluginClassMedia* media_plugin = mTitleMedia->getMediaPlugin(); +		// check if url changed or if we need a new media source +		if (mTitleMedia->getCurrentNavUrl() != url || media_plugin == NULL) +		{ +			mTitleMedia->navigateTo( url ); + +            LLViewerMediaImpl* impl = LLViewerMedia::getInstance()->getMediaImplFromTextureID(mTitleMedia->getTextureID()); +            if (impl) +            { +                // if it's a page with a movie, we don't want to hear it +                impl->setVolume(0); +            }; +		} + +		// flag that we need to update the title (even if no request were made) +		mNeedMediaTitle = true; +	} +} + +bool LLPanelFace::selectedMediaEditable() +{ +    U32 owner_mask_on; +    U32 owner_mask_off; +    U32 valid_owner_perms = LLSelectMgr::getInstance()->selectGetPerm(PERM_OWNER, +        &owner_mask_on, &owner_mask_off); +    U32 group_mask_on; +    U32 group_mask_off; +    U32 valid_group_perms = LLSelectMgr::getInstance()->selectGetPerm(PERM_GROUP, +        &group_mask_on, &group_mask_off); +    U32 everyone_mask_on; +    U32 everyone_mask_off; +    S32 valid_everyone_perms = LLSelectMgr::getInstance()->selectGetPerm(PERM_EVERYONE, +        &everyone_mask_on, &everyone_mask_off); + +    bool selected_Media_editable = false; + +    // if perms we got back are valid +    if (valid_owner_perms && +        valid_group_perms && +        valid_everyone_perms) +    { + +        if ((owner_mask_on & PERM_MODIFY) || +            (group_mask_on & PERM_MODIFY) || +            (everyone_mask_on & PERM_MODIFY)) +        { +            selected_Media_editable = true; +        } +        else +            // user is NOT allowed to press the RESET button +        { +            selected_Media_editable = false; +        }; +    }; + +    return selected_Media_editable; +} + +void LLPanelFace::clearMediaSettings() +{ +    LLFloaterMediaSettings::clearValues(false); +} + +void LLPanelFace::updateMediaSettings() +{ +    bool identical(false); +    std::string base_key(""); +    std::string value_str(""); +    int value_int = 0; +    bool value_bool = false; +    LLObjectSelectionHandle selected_objects = LLSelectMgr::getInstance()->getSelection(); +    // TODO: (CP) refactor this using something clever or boost or both !! + +    const LLMediaEntry default_media_data; + +    // controls  +    U8 value_u8 = default_media_data.getControls(); +    struct functor_getter_controls : public LLSelectedTEGetFunctor< U8 > +    { +        functor_getter_controls(const LLMediaEntry &entry) : mMediaEntry(entry) {} + +        U8 get(LLViewerObject* object, S32 face) +        { +            if (object) +                if (object->getTE(face)) +                    if (object->getTE(face)->getMediaData()) +                        return object->getTE(face)->getMediaData()->getControls(); +            return mMediaEntry.getControls(); +        }; + +        const LLMediaEntry &mMediaEntry; + +    } func_controls(default_media_data); +    identical = selected_objects->getSelectedTEValue(&func_controls, value_u8); +    base_key = std::string(LLMediaEntry::CONTROLS_KEY); +    mMediaSettings[base_key] = value_u8; +    mMediaSettings[base_key + std::string(LLPanelContents::TENTATIVE_SUFFIX)] = !identical; + +    // First click (formerly left click) +    value_bool = default_media_data.getFirstClickInteract(); +    struct functor_getter_first_click : public LLSelectedTEGetFunctor< bool > +    { +        functor_getter_first_click(const LLMediaEntry& entry) : mMediaEntry(entry) {} + +        bool get(LLViewerObject* object, S32 face) +        { +            if (object) +                if (object->getTE(face)) +                    if (object->getTE(face)->getMediaData()) +                        return object->getTE(face)->getMediaData()->getFirstClickInteract(); +            return mMediaEntry.getFirstClickInteract(); +        }; + +        const LLMediaEntry &mMediaEntry; + +    } func_first_click(default_media_data); +    identical = selected_objects->getSelectedTEValue(&func_first_click, value_bool); +    base_key = std::string(LLMediaEntry::FIRST_CLICK_INTERACT_KEY); +    mMediaSettings[base_key] = value_bool; +    mMediaSettings[base_key + std::string(LLPanelContents::TENTATIVE_SUFFIX)] = !identical; + +    // Home URL +    value_str = default_media_data.getHomeURL(); +    struct functor_getter_home_url : public LLSelectedTEGetFunctor< std::string > +    { +        functor_getter_home_url(const LLMediaEntry& entry) : mMediaEntry(entry) {} + +        std::string get(LLViewerObject* object, S32 face) +        { +            if (object) +                if (object->getTE(face)) +                    if (object->getTE(face)->getMediaData()) +                        return object->getTE(face)->getMediaData()->getHomeURL(); +            return mMediaEntry.getHomeURL(); +        }; + +        const LLMediaEntry &mMediaEntry; + +    } func_home_url(default_media_data); +    identical = selected_objects->getSelectedTEValue(&func_home_url, value_str); +    base_key = std::string(LLMediaEntry::HOME_URL_KEY); +    mMediaSettings[base_key] = value_str; +    mMediaSettings[base_key + std::string(LLPanelContents::TENTATIVE_SUFFIX)] = !identical; + +    // Current URL +    value_str = default_media_data.getCurrentURL(); +    struct functor_getter_current_url : public LLSelectedTEGetFunctor< std::string > +    { +        functor_getter_current_url(const LLMediaEntry& entry) : mMediaEntry(entry) {} + +        std::string get(LLViewerObject* object, S32 face) +        { +            if (object) +                if (object->getTE(face)) +                    if (object->getTE(face)->getMediaData()) +                        return object->getTE(face)->getMediaData()->getCurrentURL(); +            return mMediaEntry.getCurrentURL(); +        }; + +        const LLMediaEntry &mMediaEntry; + +    } func_current_url(default_media_data); +    identical = selected_objects->getSelectedTEValue(&func_current_url, value_str); +    base_key = std::string(LLMediaEntry::CURRENT_URL_KEY); +    mMediaSettings[base_key] = value_str; +    mMediaSettings[base_key + std::string(LLPanelContents::TENTATIVE_SUFFIX)] = !identical; + +    // Auto zoom +    value_bool = default_media_data.getAutoZoom(); +    struct functor_getter_auto_zoom : public LLSelectedTEGetFunctor< bool > +    { + +        functor_getter_auto_zoom(const LLMediaEntry& entry) : mMediaEntry(entry) {} + +        bool get(LLViewerObject* object, S32 face) +        { +            if (object) +                if (object->getTE(face)) +                    if (object->getTE(face)->getMediaData()) +                        return object->getTE(face)->getMediaData()->getAutoZoom(); +            return mMediaEntry.getAutoZoom(); +        }; + +        const LLMediaEntry &mMediaEntry; + +    } func_auto_zoom(default_media_data); +    identical = selected_objects->getSelectedTEValue(&func_auto_zoom, value_bool); +    base_key = std::string(LLMediaEntry::AUTO_ZOOM_KEY); +    mMediaSettings[base_key] = value_bool; +    mMediaSettings[base_key + std::string(LLPanelContents::TENTATIVE_SUFFIX)] = !identical; + +    // Auto play +    //value_bool = default_media_data.getAutoPlay(); +    // set default to auto play TRUE -- angela  EXT-5172 +    value_bool = true; +    struct functor_getter_auto_play : public LLSelectedTEGetFunctor< bool > +    { +        functor_getter_auto_play(const LLMediaEntry& entry) : mMediaEntry(entry) {} + +        bool get(LLViewerObject* object, S32 face) +        { +            if (object) +                if (object->getTE(face)) +                    if (object->getTE(face)->getMediaData()) +                        return object->getTE(face)->getMediaData()->getAutoPlay(); +            //return mMediaEntry.getAutoPlay(); set default to auto play TRUE -- angela  EXT-5172 +            return true; +        }; + +        const LLMediaEntry &mMediaEntry; + +    } func_auto_play(default_media_data); +    identical = selected_objects->getSelectedTEValue(&func_auto_play, value_bool); +    base_key = std::string(LLMediaEntry::AUTO_PLAY_KEY); +    mMediaSettings[base_key] = value_bool; +    mMediaSettings[base_key + std::string(LLPanelContents::TENTATIVE_SUFFIX)] = !identical; + + +    // Auto scale +    // set default to auto scale TRUE -- angela  EXT-5172 +    //value_bool = default_media_data.getAutoScale(); +    value_bool = true; +    struct functor_getter_auto_scale : public LLSelectedTEGetFunctor< bool > +    { +        functor_getter_auto_scale(const LLMediaEntry& entry) : mMediaEntry(entry) {} + +        bool get(LLViewerObject* object, S32 face) +        { +            if (object) +                if (object->getTE(face)) +                    if (object->getTE(face)->getMediaData()) +                        return object->getTE(face)->getMediaData()->getAutoScale(); +            // return mMediaEntry.getAutoScale();  set default to auto scale TRUE -- angela  EXT-5172 +            return true; +        }; + +        const LLMediaEntry &mMediaEntry; + +    } func_auto_scale(default_media_data); +    identical = selected_objects->getSelectedTEValue(&func_auto_scale, value_bool); +    base_key = std::string(LLMediaEntry::AUTO_SCALE_KEY); +    mMediaSettings[base_key] = value_bool; +    mMediaSettings[base_key + std::string(LLPanelContents::TENTATIVE_SUFFIX)] = !identical; + +    // Auto loop +    value_bool = default_media_data.getAutoLoop(); +    struct functor_getter_auto_loop : public LLSelectedTEGetFunctor< bool > +    { +        functor_getter_auto_loop(const LLMediaEntry& entry) : mMediaEntry(entry) {} + +        bool get(LLViewerObject* object, S32 face) +        { +            if (object) +                if (object->getTE(face)) +                    if (object->getTE(face)->getMediaData()) +                        return object->getTE(face)->getMediaData()->getAutoLoop(); +            return mMediaEntry.getAutoLoop(); +        }; + +        const LLMediaEntry &mMediaEntry; + +    } func_auto_loop(default_media_data); +    identical = selected_objects->getSelectedTEValue(&func_auto_loop, value_bool); +    base_key = std::string(LLMediaEntry::AUTO_LOOP_KEY); +    mMediaSettings[base_key] = value_bool; +    mMediaSettings[base_key + std::string(LLPanelContents::TENTATIVE_SUFFIX)] = !identical; + +    // width pixels (if not auto scaled) +    value_int = default_media_data.getWidthPixels(); +    struct functor_getter_width_pixels : public LLSelectedTEGetFunctor< int > +    { +        functor_getter_width_pixels(const LLMediaEntry& entry) : mMediaEntry(entry) {} + +        int get(LLViewerObject* object, S32 face) +        { +            if (object) +                if (object->getTE(face)) +                    if (object->getTE(face)->getMediaData()) +                        return object->getTE(face)->getMediaData()->getWidthPixels(); +            return mMediaEntry.getWidthPixels(); +        }; + +        const LLMediaEntry &mMediaEntry; + +    } func_width_pixels(default_media_data); +    identical = selected_objects->getSelectedTEValue(&func_width_pixels, value_int); +    base_key = std::string(LLMediaEntry::WIDTH_PIXELS_KEY); +    mMediaSettings[base_key] = value_int; +    mMediaSettings[base_key + std::string(LLPanelContents::TENTATIVE_SUFFIX)] = !identical; + +    // height pixels (if not auto scaled) +    value_int = default_media_data.getHeightPixels(); +    struct functor_getter_height_pixels : public LLSelectedTEGetFunctor< int > +    { +        functor_getter_height_pixels(const LLMediaEntry& entry) : mMediaEntry(entry) {} + +        int get(LLViewerObject* object, S32 face) +        { +            if (object) +                if (object->getTE(face)) +                    if (object->getTE(face)->getMediaData()) +                        return object->getTE(face)->getMediaData()->getHeightPixels(); +            return mMediaEntry.getHeightPixels(); +        }; + +        const LLMediaEntry &mMediaEntry; + +    } func_height_pixels(default_media_data); +    identical = selected_objects->getSelectedTEValue(&func_height_pixels, value_int); +    base_key = std::string(LLMediaEntry::HEIGHT_PIXELS_KEY); +    mMediaSettings[base_key] = value_int; +    mMediaSettings[base_key + std::string(LLPanelContents::TENTATIVE_SUFFIX)] = !identical; + +    // Enable Alt image +    value_bool = default_media_data.getAltImageEnable(); +    struct functor_getter_enable_alt_image : public LLSelectedTEGetFunctor< bool > +    { +        functor_getter_enable_alt_image(const LLMediaEntry& entry) : mMediaEntry(entry) {} + +        bool get(LLViewerObject* object, S32 face) +        { +            if (object) +                if (object->getTE(face)) +                    if (object->getTE(face)->getMediaData()) +                        return object->getTE(face)->getMediaData()->getAltImageEnable(); +            return mMediaEntry.getAltImageEnable(); +        }; + +        const LLMediaEntry &mMediaEntry; + +    } func_enable_alt_image(default_media_data); +    identical = selected_objects->getSelectedTEValue(&func_enable_alt_image, value_bool); +    base_key = std::string(LLMediaEntry::ALT_IMAGE_ENABLE_KEY); +    mMediaSettings[base_key] = value_bool; +    mMediaSettings[base_key + std::string(LLPanelContents::TENTATIVE_SUFFIX)] = !identical; + +    // Perms - owner interact +    value_bool = 0 != (default_media_data.getPermsInteract() & LLMediaEntry::PERM_OWNER); +    struct functor_getter_perms_owner_interact : public LLSelectedTEGetFunctor< bool > +    { +        functor_getter_perms_owner_interact(const LLMediaEntry& entry) : mMediaEntry(entry) {} + +        bool get(LLViewerObject* object, S32 face) +        { +            if (object) +                if (object->getTE(face)) +                    if (object->getTE(face)->getMediaData()) +                        return (0 != (object->getTE(face)->getMediaData()->getPermsInteract() & LLMediaEntry::PERM_OWNER)); +            return 0 != (mMediaEntry.getPermsInteract() & LLMediaEntry::PERM_OWNER); +        }; + +        const LLMediaEntry &mMediaEntry; + +    } func_perms_owner_interact(default_media_data); +    identical = selected_objects->getSelectedTEValue(&func_perms_owner_interact, value_bool); +    base_key = std::string(LLPanelContents::PERMS_OWNER_INTERACT_KEY); +    mMediaSettings[base_key] = value_bool; +    mMediaSettings[base_key + std::string(LLPanelContents::TENTATIVE_SUFFIX)] = !identical; + +    // Perms - owner control +    value_bool = 0 != (default_media_data.getPermsControl() & LLMediaEntry::PERM_OWNER); +    struct functor_getter_perms_owner_control : public LLSelectedTEGetFunctor< bool > +    { +        functor_getter_perms_owner_control(const LLMediaEntry& entry) : mMediaEntry(entry) {} + +        bool get(LLViewerObject* object, S32 face) +        { +            if (object) +                if (object->getTE(face)) +                    if (object->getTE(face)->getMediaData()) +                        return (0 != (object->getTE(face)->getMediaData()->getPermsControl() & LLMediaEntry::PERM_OWNER)); +            return 0 != (mMediaEntry.getPermsControl() & LLMediaEntry::PERM_OWNER); +        }; + +        const LLMediaEntry &mMediaEntry; + +    } func_perms_owner_control(default_media_data); +    identical = selected_objects->getSelectedTEValue(&func_perms_owner_control, value_bool); +    base_key = std::string(LLPanelContents::PERMS_OWNER_CONTROL_KEY); +    mMediaSettings[base_key] = value_bool; +    mMediaSettings[base_key + std::string(LLPanelContents::TENTATIVE_SUFFIX)] = !identical; + +    // Perms - group interact +    value_bool = 0 != (default_media_data.getPermsInteract() & LLMediaEntry::PERM_GROUP); +    struct functor_getter_perms_group_interact : public LLSelectedTEGetFunctor< bool > +    { +        functor_getter_perms_group_interact(const LLMediaEntry& entry) : mMediaEntry(entry) {} + +        bool get(LLViewerObject* object, S32 face) +        { +            if (object) +                if (object->getTE(face)) +                    if (object->getTE(face)->getMediaData()) +                        return (0 != (object->getTE(face)->getMediaData()->getPermsInteract() & LLMediaEntry::PERM_GROUP)); +            return 0 != (mMediaEntry.getPermsInteract() & LLMediaEntry::PERM_GROUP); +        }; + +        const LLMediaEntry &mMediaEntry; + +    } func_perms_group_interact(default_media_data); +    identical = selected_objects->getSelectedTEValue(&func_perms_group_interact, value_bool); +    base_key = std::string(LLPanelContents::PERMS_GROUP_INTERACT_KEY); +    mMediaSettings[base_key] = value_bool; +    mMediaSettings[base_key + std::string(LLPanelContents::TENTATIVE_SUFFIX)] = !identical; + +    // Perms - group control +    value_bool = 0 != (default_media_data.getPermsControl() & LLMediaEntry::PERM_GROUP); +    struct functor_getter_perms_group_control : public LLSelectedTEGetFunctor< bool > +    { +        functor_getter_perms_group_control(const LLMediaEntry& entry) : mMediaEntry(entry) {} + +        bool get(LLViewerObject* object, S32 face) +        { +            if (object) +                if (object->getTE(face)) +                    if (object->getTE(face)->getMediaData()) +                        return (0 != (object->getTE(face)->getMediaData()->getPermsControl() & LLMediaEntry::PERM_GROUP)); +            return 0 != (mMediaEntry.getPermsControl() & LLMediaEntry::PERM_GROUP); +        }; + +        const LLMediaEntry &mMediaEntry; + +    } func_perms_group_control(default_media_data); +    identical = selected_objects->getSelectedTEValue(&func_perms_group_control, value_bool); +    base_key = std::string(LLPanelContents::PERMS_GROUP_CONTROL_KEY); +    mMediaSettings[base_key] = value_bool; +    mMediaSettings[base_key + std::string(LLPanelContents::TENTATIVE_SUFFIX)] = !identical; + +    // Perms - anyone interact +    value_bool = 0 != (default_media_data.getPermsInteract() & LLMediaEntry::PERM_ANYONE); +    struct functor_getter_perms_anyone_interact : public LLSelectedTEGetFunctor< bool > +    { +        functor_getter_perms_anyone_interact(const LLMediaEntry& entry) : mMediaEntry(entry) {} + +        bool get(LLViewerObject* object, S32 face) +        { +            if (object) +                if (object->getTE(face)) +                    if (object->getTE(face)->getMediaData()) +                        return (0 != (object->getTE(face)->getMediaData()->getPermsInteract() & LLMediaEntry::PERM_ANYONE)); +            return 0 != (mMediaEntry.getPermsInteract() & LLMediaEntry::PERM_ANYONE); +        }; + +        const LLMediaEntry &mMediaEntry; + +    } func_perms_anyone_interact(default_media_data); +    identical = LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue(&func_perms_anyone_interact, value_bool); +    base_key = std::string(LLPanelContents::PERMS_ANYONE_INTERACT_KEY); +    mMediaSettings[base_key] = value_bool; +    mMediaSettings[base_key + std::string(LLPanelContents::TENTATIVE_SUFFIX)] = !identical; + +    // Perms - anyone control +    value_bool = 0 != (default_media_data.getPermsControl() & LLMediaEntry::PERM_ANYONE); +    struct functor_getter_perms_anyone_control : public LLSelectedTEGetFunctor< bool > +    { +        functor_getter_perms_anyone_control(const LLMediaEntry& entry) : mMediaEntry(entry) {} + +        bool get(LLViewerObject* object, S32 face) +        { +            if (object) +                if (object->getTE(face)) +                    if (object->getTE(face)->getMediaData()) +                        return (0 != (object->getTE(face)->getMediaData()->getPermsControl() & LLMediaEntry::PERM_ANYONE)); +            return 0 != (mMediaEntry.getPermsControl() & LLMediaEntry::PERM_ANYONE); +        }; + +        const LLMediaEntry &mMediaEntry; + +    } func_perms_anyone_control(default_media_data); +    identical = selected_objects->getSelectedTEValue(&func_perms_anyone_control, value_bool); +    base_key = std::string(LLPanelContents::PERMS_ANYONE_CONTROL_KEY); +    mMediaSettings[base_key] = value_bool; +    mMediaSettings[base_key + std::string(LLPanelContents::TENTATIVE_SUFFIX)] = !identical; + +    // security - whitelist enable +    value_bool = default_media_data.getWhiteListEnable(); +    struct functor_getter_whitelist_enable : public LLSelectedTEGetFunctor< bool > +    { +        functor_getter_whitelist_enable(const LLMediaEntry& entry) : mMediaEntry(entry) {} + +        bool get(LLViewerObject* object, S32 face) +        { +            if (object) +                if (object->getTE(face)) +                    if (object->getTE(face)->getMediaData()) +                        return object->getTE(face)->getMediaData()->getWhiteListEnable(); +            return mMediaEntry.getWhiteListEnable(); +        }; + +        const LLMediaEntry &mMediaEntry; + +    } func_whitelist_enable(default_media_data); +    identical = selected_objects->getSelectedTEValue(&func_whitelist_enable, value_bool); +    base_key = std::string(LLMediaEntry::WHITELIST_ENABLE_KEY); +    mMediaSettings[base_key] = value_bool; +    mMediaSettings[base_key + std::string(LLPanelContents::TENTATIVE_SUFFIX)] = !identical; + +    // security - whitelist URLs +    std::vector<std::string> value_vector_str = default_media_data.getWhiteList(); +    struct functor_getter_whitelist_urls : public LLSelectedTEGetFunctor< std::vector<std::string> > +    { +        functor_getter_whitelist_urls(const LLMediaEntry& entry) : mMediaEntry(entry) {} + +        std::vector<std::string> get(LLViewerObject* object, S32 face) +        { +            if (object) +                if (object->getTE(face)) +                    if (object->getTE(face)->getMediaData()) +                        return object->getTE(face)->getMediaData()->getWhiteList(); +            return mMediaEntry.getWhiteList(); +        }; + +        const LLMediaEntry &mMediaEntry; + +    } func_whitelist_urls(default_media_data); +    identical = selected_objects->getSelectedTEValue(&func_whitelist_urls, value_vector_str); +    base_key = std::string(LLMediaEntry::WHITELIST_KEY); +    mMediaSettings[base_key].clear(); +    std::vector< std::string >::iterator iter = value_vector_str.begin(); +    while (iter != value_vector_str.end()) +    { +        std::string white_list_url = *iter; +        mMediaSettings[base_key].append(white_list_url); +        ++iter; +    }; + +    mMediaSettings[base_key + std::string(LLPanelContents::TENTATIVE_SUFFIX)] = !identical; +} + +void LLPanelFace::updateMediaTitle() +{ +    // only get the media name if we need it +    if (!mNeedMediaTitle) +        return; + +    // get plugin impl +    LLPluginClassMedia* media_plugin = mTitleMedia->getMediaPlugin(); +    if (media_plugin && mTitleMedia->getCurrentNavUrl() == media_plugin->getNavigateURI()) +    { +        // get the media name (asynchronous - must call repeatedly) +        std::string media_title = media_plugin->getMediaName(); + +        // only replace the title if what we get contains something +        if (!media_title.empty()) +        { +            // update the UI widget +            if (mTitleMediaText) +            { +                mTitleMediaText->setText(media_title); + +                // stop looking for a title when we get one +                mNeedMediaTitle = false; +            }; +        }; +    }; +} +  //  // Static functions  // @@ -1664,30 +2425,29 @@ void LLPanelFace::onCommitMaterialsMedia(LLUICtrl* ctrl, void* userdata)  	self->updateShinyControls(false,true);  	self->updateBumpyControls(false,true);  	self->updateUI(); +	self->refreshMedia();  } -// static  void LLPanelFace::updateVisibility()  {	 -	LLComboBox* combo_matmedia = getChild<LLComboBox>("combobox matmedia");  	LLRadioGroup* radio_mat_type = getChild<LLRadioGroup>("radio_material_type");  	LLComboBox* combo_shininess = getChild<LLComboBox>("combobox shininess");  	LLComboBox* combo_bumpiness = getChild<LLComboBox>("combobox bumpiness"); -	if (!radio_mat_type || !combo_matmedia || !combo_shininess || !combo_bumpiness) +	if (!radio_mat_type || !mComboMatMedia || !combo_shininess || !combo_bumpiness)  	{  		LL_WARNS("Materials") << "Combo box not found...exiting." << LL_ENDL;  		return;  	} -	U32 materials_media = combo_matmedia->getCurrentIndex(); +	U32 materials_media = mComboMatMedia->getCurrentIndex();  	U32 material_type = radio_mat_type->getSelectedIndex(); -	bool show_media = (materials_media == MATMEDIA_MEDIA) && combo_matmedia->getEnabled(); -	bool show_texture = (show_media || ((material_type == MATTYPE_DIFFUSE) && combo_matmedia->getEnabled())); -	bool show_bumpiness = (!show_media) && (material_type == MATTYPE_NORMAL) && combo_matmedia->getEnabled(); -	bool show_shininess = (!show_media) && (material_type == MATTYPE_SPECULAR) && combo_matmedia->getEnabled(); +	bool show_media = (materials_media == MATMEDIA_MEDIA) && mComboMatMedia->getEnabled(); +	bool show_texture = (show_media || ((material_type == MATTYPE_DIFFUSE) && mComboMatMedia->getEnabled())); +	bool show_bumpiness = (!show_media) && (material_type == MATTYPE_NORMAL) && mComboMatMedia->getEnabled(); +	bool show_shininess = (!show_media) && (material_type == MATTYPE_SPECULAR) && mComboMatMedia->getEnabled();  	getChildView("radio_material_type")->setVisible(!show_media);  	// Media controls -	getChildView("media_info")->setVisible(show_media); +    mTitleMediaText->setVisible(show_media);  	getChildView("add_media")->setVisible(show_media);  	getChildView("delete_media")->setVisible(show_media);  	getChildView("button align")->setVisible(show_media); @@ -1819,12 +2579,11 @@ void LLPanelFace::updateShinyControls(bool is_setting_texture, bool mess_with_sh  	} -	LLComboBox* combo_matmedia = getChild<LLComboBox>("combobox matmedia");  	LLRadioGroup* radio_mat_type = getChild<LLRadioGroup>("radio_material_type"); -	U32 materials_media = combo_matmedia->getCurrentIndex(); +	U32 materials_media = mComboMatMedia->getCurrentIndex();  	U32 material_type = radio_mat_type->getSelectedIndex(); -	bool show_media = (materials_media == MATMEDIA_MEDIA) && combo_matmedia->getEnabled(); -	bool show_shininess = (!show_media) && (material_type == MATTYPE_SPECULAR) && combo_matmedia->getEnabled(); +	bool show_media = (materials_media == MATMEDIA_MEDIA) && mComboMatMedia->getEnabled(); +	bool show_shininess = (!show_media) && (material_type == MATTYPE_SPECULAR) && mComboMatMedia->getEnabled();  	U32 shiny_value = comboShiny->getCurrentIndex();  	bool show_shinyctrls = (shiny_value == SHINY_TEXTURE) && show_shininess; // Use texture  	getChildView("label glossiness")->setVisible(show_shinyctrls); @@ -1898,11 +2657,10 @@ void LLPanelFace::updateAlphaControls()  	U32 alpha_value = comboAlphaMode->getCurrentIndex();  	bool show_alphactrls = (alpha_value == ALPHAMODE_MASK); // Alpha masking -    LLComboBox* combobox_matmedia = getChild<LLComboBox>("combobox matmedia");      U32 mat_media = MATMEDIA_MATERIAL; -    if (combobox_matmedia) +    if (mComboMatMedia)      { -        mat_media = combobox_matmedia->getCurrentIndex(); +        mat_media = mComboMatMedia->getCurrentIndex();      }      U32 mat_type = MATTYPE_DIFFUSE; @@ -2059,6 +2817,77 @@ void LLPanelFace::onSelectNormalTexture(const LLSD& data)  	sendBump(nmap_id.isNull() ? 0 : BUMPY_TEXTURE);  } +////////////////////////////////////////////////////////////////////////////// +// called when a user wants to edit existing media settings on a prim or prim face +// TODO: test if there is media on the item and only allow editing if present +void LLPanelFace::onClickBtnEditMedia(LLUICtrl* ctrl, void* userdata) +{ +    LLPanelFace* self = (LLPanelFace*)userdata; +    self->refreshMedia(); +    LLFloaterReg::showInstance("media_settings"); +} + +////////////////////////////////////////////////////////////////////////////// +// called when a user wants to delete media from a prim or prim face +void LLPanelFace::onClickBtnDeleteMedia(LLUICtrl* ctrl, void* userdata) +{ +    LLNotificationsUtil::add("DeleteMedia", LLSD(), LLSD(), deleteMediaConfirm); +} + +////////////////////////////////////////////////////////////////////////////// +// called when a user wants to add media to a prim or prim face +void LLPanelFace::onClickBtnAddMedia(LLUICtrl* ctrl, void* userdata) +{ +    // check if multiple faces are selected +    if (LLSelectMgr::getInstance()->getSelection()->isMultipleTESelected()) +    { +        LLPanelFace* self = (LLPanelFace*)userdata; +        self->refreshMedia(); +        LLNotificationsUtil::add("MultipleFacesSelected", LLSD(), LLSD(), multipleFacesSelectedConfirm); +    } +    else +    { +        onClickBtnEditMedia(ctrl, userdata); +    } +} + +// static +bool LLPanelFace::deleteMediaConfirm(const LLSD& notification, const LLSD& response) +{ +    S32 option = LLNotificationsUtil::getSelectedOption(notification, response); +    switch (option) +    { +    case 0:  // "Yes" +        LLSelectMgr::getInstance()->selectionSetMedia(0, LLSD()); +        if (LLFloaterReg::instanceVisible("media_settings")) +        { +            LLFloaterReg::hideInstance("media_settings"); +        } +        break; + +    case 1:  // "No" +    default: +        break; +    } +    return false; +} + +// static +bool LLPanelFace::multipleFacesSelectedConfirm(const LLSD& notification, const LLSD& response) +{ +    S32 option = LLNotificationsUtil::getSelectedOption(notification, response); +    switch (option) +    { +    case 0:  // "Yes" +        LLFloaterReg::showInstance("media_settings"); +        break; +    case 1:  // "No" +    default: +        break; +    } +    return false; +} +  //static  void LLPanelFace::syncOffsetX(LLPanelFace* self, F32 offsetU)  { @@ -2436,10 +3265,9 @@ void LLPanelFace::onCommitRepeatsPerMeter(LLUICtrl* ctrl, void* userdata)  	LLPanelFace* self = (LLPanelFace*) userdata;  	LLUICtrl*	repeats_ctrl	= self->getChild<LLUICtrl>("rptctrl"); -	LLComboBox* combo_matmedia = self->getChild<LLComboBox>("combobox matmedia");  	LLRadioGroup* radio_mat_type = self->getChild<LLRadioGroup>("radio_material_type"); -	U32 materials_media = combo_matmedia->getCurrentIndex(); +	U32 materials_media = self->mComboMatMedia->getCurrentIndex();  	U32 material_type           = (materials_media == MATMEDIA_MATERIAL) ? radio_mat_type->getSelectedIndex() : 0;  	F32 repeats_per_meter	= repeats_ctrl->getValue().asReal(); @@ -3375,14 +4203,6 @@ bool LLPanelFace::menuEnableItem(const LLSD& userdata)  } -// TODO: I don't know who put these in or what these are for??? -void LLPanelFace::setMediaURL(const std::string& url) -{ -} -void LLPanelFace::setMediaType(const std::string& mime_type) -{ -} -  // static  void LLPanelFace::onCommitPlanarAlign(LLUICtrl* ctrl, void* userdata)  { diff --git a/indra/newview/llpanelface.h b/indra/newview/llpanelface.h index e3b925c1d4..44bc442bbb 100644 --- a/indra/newview/llpanelface.h +++ b/indra/newview/llpanelface.h @@ -47,6 +47,7 @@ class LLUICtrl;  class LLViewerObject;  class LLFloater;  class LLMaterialID; +class LLMediaCtrl;  class LLMenuButton;  // Represents an edit for use in replicating the op across one or more materials in the selection set. @@ -97,11 +98,11 @@ public:  	LLPanelFace();  	virtual ~LLPanelFace(); -    void draw(); -  	void			refresh(); -	void			setMediaURL(const std::string& url); -	void			setMediaType(const std::string& mime_type); +    void			refreshMedia(); +    void			unloadMedia(); + +    /*virtual*/ void draw();  	LLMaterialPtr createDefaultMaterial(LLMaterialPtr current_material)  	{ @@ -117,6 +118,12 @@ public:  	LLRender::eTexIndex getTextureChannelToEdit();  protected: +    void			navigateToTitleMedia(const std::string url); +    bool			selectedMediaEditable(); +    void			clearMediaSettings(); +    void			updateMediaSettings(); +    void			updateMediaTitle(); +  	void			getState();  	void			sendTexture();			// applies and sends texture @@ -155,6 +162,9 @@ protected:  	void 	onCloseTexturePicker(const LLSD& data); +    static bool deleteMediaConfirm(const LLSD& notification, const LLSD& response); +    static bool multipleFacesSelectedConfirm(const LLSD& notification, const LLSD& response); +  	// Make UI reflect state of currently selected material (refresh)  	// and UI mode (e.g. editing normal map v diffuse map)  	// @@ -199,6 +209,9 @@ protected:  	static void		onCommitMaterialsMedia(	LLUICtrl* ctrl, void* userdata);  	static void		onCommitMaterialType(	LLUICtrl* ctrl, void* userdata); +	static void 	onClickBtnEditMedia(LLUICtrl* ctrl, void* userdata); +	static void 	onClickBtnDeleteMedia(LLUICtrl* ctrl, void* userdata); +	static void 	onClickBtnAddMedia(LLUICtrl* ctrl, void* userdata);  	static void		onCommitBump(				LLUICtrl* ctrl, void* userdata);  	static void		onCommitTexGen(			LLUICtrl* ctrl, void* userdata);  	static void		onCommitShiny(				LLUICtrl* ctrl, void* userdata); @@ -251,6 +264,10 @@ private:  	F32		getCurrentShinyOffsetU();  	F32		getCurrentShinyOffsetV(); +    LLComboBox *mComboMatMedia; +    LLMediaCtrl *mTitleMedia; +    LLTextBox *mTitleMediaText; +  	// Update visibility of controls to match current UI mode  	// (e.g. materials vs media editing)  	// @@ -258,10 +275,6 @@ private:  	//  	void updateVisibility(); -	// Make material(s) reflect current state of UI (apply edit) -	// -	void updateMaterial(); -  	// Hey look everyone, a type-safe alternative to copy and paste! :)  	// @@ -439,6 +452,9 @@ private:      LLSD            mClipboardParams; +    LLSD mMediaSettings; +    bool mNeedMediaTitle; +  public:  	#if defined(DEF_GET_MAT_STATE)  		#undef DEF_GET_MAT_STATE diff --git a/indra/newview/llpanellandaudio.cpp b/indra/newview/llpanellandaudio.cpp index e7bdc51b4a..9e3fc54477 100644 --- a/indra/newview/llpanellandaudio.cpp +++ b/indra/newview/llpanellandaudio.cpp @@ -97,6 +97,9 @@ BOOL LLPanelLandAudio::postBuild()  	mCheckAVSoundGroup = getChild<LLCheckBoxCtrl>("group av sound check");  	childSetCommitCallback("group av sound check", onCommitAny, this); +    mCheckObscureMOAP = getChild<LLCheckBoxCtrl>("obscure_moap"); +    childSetCommitCallback("obscure_moap", onCommitAny, this); +  	return TRUE;  } @@ -157,6 +160,9 @@ void LLPanelLandAudio::refresh()  		mCheckAVSoundGroup->set(parcel->getAllowGroupAVSounds() || parcel->getAllowAnyAVSounds());	// On if "Everyone" is on  		mCheckAVSoundGroup->setEnabled(can_change_av_sounds && !parcel->getAllowAnyAVSounds());		// Enabled if "Everyone" is off + +        mCheckObscureMOAP->set(parcel->getObscureMOAP()); +        mCheckObscureMOAP->setEnabled(can_change_media);  	}  }  // static @@ -184,6 +190,8 @@ void LLPanelLandAudio::onCommitAny(LLUICtrl*, void *userdata)  		group_av_sound = self->mCheckAVSoundGroup->get();  	} +    bool obscure_moap = self->mCheckObscureMOAP->get(); +  	// Remove leading/trailing whitespace (common when copying/pasting)  	LLStringUtil::trim(music_url); @@ -194,6 +202,7 @@ void LLPanelLandAudio::onCommitAny(LLUICtrl*, void *userdata)  	parcel->setMusicURL(music_url);  	parcel->setAllowAnyAVSounds(any_av_sound);  	parcel->setAllowGroupAVSounds(group_av_sound); +    parcel->setObscureMOAP(obscure_moap);  	// Send current parcel data upstream to server  	LLViewerParcelMgr::getInstance()->sendParcelPropertiesUpdate( parcel ); diff --git a/indra/newview/llpanellandaudio.h b/indra/newview/llpanellandaudio.h index 7e4fce80e4..b54fe62179 100644 --- a/indra/newview/llpanellandaudio.h +++ b/indra/newview/llpanellandaudio.h @@ -53,6 +53,7 @@ private:  	LLLineEditor*	mMusicURLEdit;  	LLCheckBoxCtrl* mCheckAVSoundAny;  	LLCheckBoxCtrl* mCheckAVSoundGroup; +    LLCheckBoxCtrl* mCheckObscureMOAP;  	LLSafeHandle<LLParcelSelection>&	mParcel;  }; diff --git a/indra/newview/llpanelmediasettingsgeneral.cpp b/indra/newview/llpanelmediasettingsgeneral.cpp index 9730f0f16d..e1818cc68b 100644 --- a/indra/newview/llpanelmediasettingsgeneral.cpp +++ b/indra/newview/llpanelmediasettingsgeneral.cpp @@ -98,9 +98,6 @@ BOOL LLPanelMediaSettingsGeneral::postBuild()  	childSetCommitCallback( LLMediaEntry::HOME_URL_KEY, onCommitHomeURL, this);  	childSetCommitCallback( "current_url_reset_btn",onBtnResetCurrentUrl, this); -	// interrogates controls and updates widgets as required -	updateMediaPreview(); -  	return true;  } @@ -313,9 +310,6 @@ void LLPanelMediaSettingsGeneral::initValues( void* userdata, const LLSD& _media  			data_set[ i ].ctrl_ptr->setTentative( media_settings[ tentative_key ].asBoolean() );  		};  	}; - -	// interrogates controls and updates widgets as required -	self->updateMediaPreview();  }  //////////////////////////////////////////////////////////////////////////////// diff --git a/indra/newview/llpanelprofile.cpp b/indra/newview/llpanelprofile.cpp index 29c9329a26..f4eaa78f11 100644 --- a/indra/newview/llpanelprofile.cpp +++ b/indra/newview/llpanelprofile.cpp @@ -61,6 +61,7 @@  #include "llcommandhandler.h"  #include "llfloaterprofiletexture.h"  #include "llfloaterreg.h" +#include "llfloaterreporter.h"  #include "llfilepicker.h"  #include "llfirstuse.h"  #include "llgroupactions.h" @@ -582,6 +583,22 @@ public:  			}  			return true;  		} + +        // reportAbuse is here due to convoluted avatar handling +        // in LLScrollListCtrl and LLTextBase +        if (verb == "reportAbuse" && web == NULL)  +        { +            LLAvatarName av_name; +            if (LLAvatarNameCache::get(avatar_id, &av_name)) +            { +                LLFloaterReporter::showFromAvatar(avatar_id, av_name.getCompleteName()); +            } +            else +            { +                LLFloaterReporter::showFromAvatar(avatar_id, "not avaliable"); +            } +            return true; +        }  		return false;  	}  }; @@ -887,8 +904,6 @@ BOOL LLPanelProfileSecondLife::postBuild()      mDiscardDescriptionChanges->setCommitCallback([this](LLUICtrl*, void*) { onDiscardDescriptionChanges(); }, nullptr);      mDescriptionEdit->setKeystrokeCallback([this](LLTextEditor* caller) { onSetDescriptionDirty(); }); -    getChild<LLButton>("open_notes")->setCommitCallback([this](LLUICtrl*, void*) { onOpenNotes(); }, nullptr); -      mCanSeeOnlineIcon->setMouseUpCallback([this](LLUICtrl*, S32 x, S32 y, MASK mask) { onShowAgentPermissionsDialog(); });      mCantSeeOnlineIcon->setMouseUpCallback([this](LLUICtrl*, S32 x, S32 y, MASK mask) { onShowAgentPermissionsDialog(); });      mCanSeeOnMapIcon->setMouseUpCallback([this](LLUICtrl*, S32 x, S32 y, MASK mask) { onShowAgentPermissionsDialog(); }); @@ -1938,23 +1953,6 @@ void LLPanelProfileSecondLife::onCommitProfileImage(const LLUUID& id)      }  } -void LLPanelProfileSecondLife::onOpenNotes() -{ -    LLFloater* parent_floater = gFloaterView->getParentFloater(this); -    if (!parent_floater) -    { -        return; -    } - -    LLTabContainer* tab_container = parent_floater->findChild<LLTabContainer>("panel_profile_tabs", TRUE); -    if (!tab_container) -    { -        return; -    } - -    tab_container->selectTabByName(PANEL_NOTES); -} -  //////////////////////////////////////////////////////////////////////////  // LLPanelProfileWeb diff --git a/indra/newview/llpanelprofile.h b/indra/newview/llpanelprofile.h index ca6ef3f794..d32bb943bd 100644 --- a/indra/newview/llpanelprofile.h +++ b/indra/newview/llpanelprofile.h @@ -184,7 +184,6 @@ private:      void onShowAgentProfileTexture();      void onShowTexturePicker();      void onCommitProfileImage(const LLUUID& id); -    void onOpenNotes();  private:  	typedef std::map<std::string, LLUUID> group_map_t; diff --git a/indra/newview/llpanelvolume.cpp b/indra/newview/llpanelvolume.cpp index 5b02609a53..39f4c7485b 100644 --- a/indra/newview/llpanelvolume.cpp +++ b/indra/newview/llpanelvolume.cpp @@ -595,13 +595,6 @@ void LLPanelVolume::refresh()  		mRootObject = NULL;  	} -	BOOL visible = LLViewerShaderMgr::instance()->getShaderLevel(LLViewerShaderMgr::SHADER_DEFERRED) > 0 ? TRUE : FALSE; - -	getChildView("Light FOV")->setVisible( visible); -	getChildView("Light Focus")->setVisible( visible); -	getChildView("Light Ambiance")->setVisible( visible); -	getChildView("light texture control")->setVisible( visible); -  	bool enable_mesh = false;  	LLSD sim_features; diff --git a/indra/newview/llparticipantlist.cpp b/indra/newview/llparticipantlist.cpp index 94d20828ec..9b60d1ae2f 100644 --- a/indra/newview/llparticipantlist.cpp +++ b/indra/newview/llparticipantlist.cpp @@ -38,154 +38,11 @@  #pragma warning (disable : 4355) // 'this' used in initializer list: yes, intentionally  #endif -// See EXT-4301. -/** - * class LLAvalineUpdater - observe the list of voice participants in session and check - *  presence of Avaline Callers among them. - * - * LLAvalineUpdater is a LLVoiceClientParticipantObserver. It provides two kinds of validation: - *	- whether Avaline caller presence among participants; - *	- whether watched Avaline caller still exists in voice channel. - * Both validations have callbacks which will notify subscriber if any of event occur. - * - * @see findAvalineCaller() - * @see checkIfAvalineCallersExist() - */ -class LLAvalineUpdater : public LLVoiceClientParticipantObserver -{ -public: -	typedef boost::function<void(const LLUUID& speaker_id)> process_avaline_callback_t; - -	LLAvalineUpdater(process_avaline_callback_t found_cb, process_avaline_callback_t removed_cb) -		: mAvalineFoundCallback(found_cb) -		, mAvalineRemovedCallback(removed_cb) -	{ -		LLVoiceClient::getInstance()->addObserver(this); -	} -	~LLAvalineUpdater() -	{ -		if (LLVoiceClient::instanceExists()) -		{ -			LLVoiceClient::getInstance()->removeObserver(this); -		} -	} - -	/** -	 * Adds UUID of Avaline caller to watch. -	 * -	 * @see checkIfAvalineCallersExist(). -	 */ -	void watchAvalineCaller(const LLUUID& avaline_caller_id) -	{ -		mAvalineCallers.insert(avaline_caller_id); -	} - -	void onParticipantsChanged() -	{ -		uuid_set_t participant_uuids; -		LLVoiceClient::getInstance()->getParticipantList(participant_uuids); - - -		// check whether Avaline caller exists among voice participants -		// and notify Participant List -		findAvalineCaller(participant_uuids); - -		// check whether watched Avaline callers still present among voice participant -		// and remove if absents. -		checkIfAvalineCallersExist(participant_uuids); -	} - -private: -	typedef std::set<LLUUID> uuid_set_t; - -	/** -	 * Finds Avaline callers among voice participants and calls mAvalineFoundCallback. -	 * -	 * When Avatar is in group call with Avaline caller and then ends call Avaline caller stays -	 * in Group Chat floater (exists in LLSpeakerMgr). If Avatar starts call with that group again -	 * Avaline caller is added to voice channel AFTER Avatar is connected to group call. -	 * But Voice Control Panel (VCP) is filled from session LLSpeakerMgr and there is no information -	 * if a speaker is Avaline caller. -	 * -	 * In this case this speaker is created as avatar and will be recreated when it appears in -	 * Avatar's Voice session. -	 * -	 * @see LLParticipantList::onAvalineCallerFound() -	 */ -	void findAvalineCaller(const uuid_set_t& participant_uuids) -	{ -		uuid_set_t::const_iterator it = participant_uuids.begin(), it_end = participant_uuids.end(); - -		for(; it != it_end; ++it) -		{ -			const LLUUID& participant_id = *it; -			if (!LLVoiceClient::getInstance()->isParticipantAvatar(participant_id)) -			{ -				LL_DEBUGS("Avaline") << "Avaline caller found among voice participants: " << participant_id << LL_ENDL; - -				if (mAvalineFoundCallback) -				{ -					mAvalineFoundCallback(participant_id); -				} -			} -		} -	} - -	/** -	 * Finds Avaline callers which are not anymore among voice participants and calls mAvalineRemovedCallback. -	 * -	 * The problem is when Avaline caller ends a call it is removed from Voice Client session but -	 * still exists in LLSpeakerMgr. Server does not send such information. -	 * This method implements a HUCK to notify subscribers that watched Avaline callers by class -	 * are not anymore in the call. -	 * -	 * @see LLParticipantList::onAvalineCallerRemoved() -	 */ -	void checkIfAvalineCallersExist(const uuid_set_t& participant_uuids) -	{ -		uuid_set_t::iterator it = mAvalineCallers.begin(); -		uuid_set_t::const_iterator participants_it_end = participant_uuids.end(); - -		while (it != mAvalineCallers.end()) -		{ -			const LLUUID participant_id = *it; -			LL_DEBUGS("Avaline") << "Check avaline caller: " << participant_id << LL_ENDL; -			bool not_found = participant_uuids.find(participant_id) == participants_it_end; -			if (not_found) -			{ -				LL_DEBUGS("Avaline") << "Watched Avaline caller is not found among voice participants: " << participant_id << LL_ENDL; - -				// notify Participant List -				if (mAvalineRemovedCallback) -				{ -					mAvalineRemovedCallback(participant_id); -				} - -				// remove from the watch list -				mAvalineCallers.erase(it++); -			} -			else -			{ -				++it; -			} -		} -	} - -	process_avaline_callback_t mAvalineFoundCallback; -	process_avaline_callback_t mAvalineRemovedCallback; - -	uuid_set_t mAvalineCallers; -}; -  LLParticipantList::LLParticipantList(LLSpeakerMgr* data_source, LLFolderViewModelInterface& root_view_model) :  	LLConversationItemSession(data_source->getSessionID(), root_view_model),  	mSpeakerMgr(data_source),  	mValidateSpeakerCallback(NULL)  { - -	mAvalineUpdater = new LLAvalineUpdater(boost::bind(&LLParticipantList::onAvalineCallerFound, this, _1), -										   boost::bind(&LLParticipantList::onAvalineCallerRemoved, this, _1)); -  	mSpeakerAddListener = new SpeakerAddListener(*this);  	mSpeakerRemoveListener = new SpeakerRemoveListener(*this);  	mSpeakerClearListener = new SpeakerClearListener(*this); @@ -243,32 +100,6 @@ LLParticipantList::LLParticipantList(LLSpeakerMgr* data_source, LLFolderViewMode  LLParticipantList::~LLParticipantList()  { -	delete mAvalineUpdater; -} - -/* -  Seems this method is not necessary after onAvalineCallerRemoved was implemented; - -  It does nothing because list item is always created with correct class type for Avaline caller. -  For now Avaline Caller is removed from the LLSpeakerMgr List when it is removed from the Voice Client -  session. -  This happens in two cases: if Avaline Caller ends call itself or if Resident ends group call. - -  Probably Avaline caller should be removed from the LLSpeakerMgr list ONLY if it ends call itself. -  Asked in EXT-4301. -*/ -void LLParticipantList::onAvalineCallerFound(const LLUUID& participant_id) -{ -	removeParticipant(participant_id); -	// re-add avaline caller with a correct class instance. -	addAvatarIDExceptAgent(participant_id); -} - -void LLParticipantList::onAvalineCallerRemoved(const LLUUID& participant_id) -{ -	LL_DEBUGS("Avaline") << "Removing avaline caller from the list: " << participant_id << LL_ENDL; - -	mSpeakerMgr->removeAvalineSpeaker(participant_id);  }  void LLParticipantList::setValidateSpeakerCallback(validate_speaker_callback_t cb) @@ -386,7 +217,6 @@ void LLParticipantList::addAvatarIDExceptAgent(const LLUUID& avatar_id)  		std::string display_name = LLVoiceClient::getInstance()->getDisplayName(avatar_id);  		// Create a participant view model instance  		participant = new LLConversationItemParticipant(display_name.empty() ? LLTrans::getString("AvatarNameWaiting") : display_name, avatar_id, mRootViewModel); -		mAvalineUpdater->watchAvalineCaller(avatar_id);  	}  	// *TODO : Need to update the online/offline status of the participant diff --git a/indra/newview/llparticipantlist.h b/indra/newview/llparticipantlist.h index 3a3ae76604..14c0a63692 100644 --- a/indra/newview/llparticipantlist.h +++ b/indra/newview/llparticipantlist.h @@ -32,7 +32,6 @@  class LLSpeakerMgr;  class LLUICtrl; -class LLAvalineUpdater;  class LLParticipantList : public LLConversationItemSession  { @@ -133,8 +132,6 @@ protected:  	};  private: -	void onAvalineCallerFound(const LLUUID& participant_id); -	void onAvalineCallerRemoved(const LLUUID& participant_id);  	/**  	 * Adjusts passed participant to work properly. @@ -156,7 +153,6 @@ private:  	LLPointer<SpeakerMuteListener>				mSpeakerMuteListener;  	validate_speaker_callback_t mValidateSpeakerCallback; -	LLAvalineUpdater* mAvalineUpdater;  };  #endif // LL_PARTICIPANTLIST_H diff --git a/indra/newview/llpersistentnotificationstorage.cpp b/indra/newview/llpersistentnotificationstorage.cpp index 9bc77393dc..9bf771db8a 100644 --- a/indra/newview/llpersistentnotificationstorage.cpp +++ b/indra/newview/llpersistentnotificationstorage.cpp @@ -163,12 +163,16 @@ void LLPersistentNotificationStorage::loadNotifications()  	LL_INFOS("LLPersistentNotificationStorage") << "finished loading notifications" << LL_ENDL;  } -void LLPersistentNotificationStorage::initialize() +void LLPersistentNotificationStorage::reset()  { -	std::string file_name = "open_notifications_" + LLGridManager::getInstance()->getGrid() + ".xml"; -	setFileName(gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, file_name)); -	setOldFileName(gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, "open_notifications.xml")); +    std::string file_name = "open_notifications_" + LLGridManager::getInstance()->getGrid() + ".xml"; +    setFileName(gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, file_name)); +    setOldFileName(gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, "open_notifications.xml")); +} +void LLPersistentNotificationStorage::initialize() +{ +    reset();  	LLNotifications::instance().getChannel("Persistent")->  		connectChanged(boost::bind(&LLPersistentNotificationStorage::onPersistentChannelChanged, this, _1));  } diff --git a/indra/newview/llpersistentnotificationstorage.h b/indra/newview/llpersistentnotificationstorage.h index 1fb4487286..335d85aaf6 100644 --- a/indra/newview/llpersistentnotificationstorage.h +++ b/indra/newview/llpersistentnotificationstorage.h @@ -52,6 +52,7 @@ public:  	void saveNotifications();  	void loadNotifications(); +    void reset();  protected: diff --git a/indra/newview/llpreviewnotecard.cpp b/indra/newview/llpreviewnotecard.cpp index 230def5362..3fd4f51559 100644 --- a/indra/newview/llpreviewnotecard.cpp +++ b/indra/newview/llpreviewnotecard.cpp @@ -866,7 +866,10 @@ bool LLPreviewNotecard::loadNotecardText(const std::string& filename)      buffer[nread] = '\0';      fclose(file); -    mEditor->setText(LLStringExplicit(buffer)); +    std::string text = std::string(buffer); +    LLStringUtil::replaceTabsWithSpaces(text, LLTextEditor::spacesPerTab()); + +    mEditor->setText(text);      delete[] buffer;      return true; diff --git a/indra/newview/llpreviewscript.cpp b/indra/newview/llpreviewscript.cpp index a32dc8beda..d677a996c1 100644 --- a/indra/newview/llpreviewscript.cpp +++ b/indra/newview/llpreviewscript.cpp @@ -601,7 +601,10 @@ bool LLScriptEdCore::loadScriptText(const std::string& filename)  	buffer[nread] = '\0';  	fclose(file); -	mEditor->setText(LLStringExplicit(buffer)); +    std::string text = std::string(buffer); +    LLStringUtil::replaceTabsWithSpaces(text, LLTextEditor::spacesPerTab()); + +    mEditor->setText(text);  	delete[] buffer;  	return true; diff --git a/indra/newview/llrecentpeople.cpp b/indra/newview/llrecentpeople.cpp index 83b0c4f1bf..0faf6bf889 100644 --- a/indra/newview/llrecentpeople.cpp +++ b/indra/newview/llrecentpeople.cpp @@ -42,14 +42,6 @@ bool LLRecentPeople::add(const LLUUID& id, const LLSD& userdata)  	if (is_not_group_id)  	{ -		// For each avaline call the id of caller is different even if -		// the phone number is the same. -		// To avoid duplication of avaline list items in the recent list -		// of panel People, deleting id's with similar phone number. -		const LLUUID& caller_id = getIDByPhoneNumber(userdata); -		if (caller_id.notNull()) -			mPeople.erase(caller_id); -  		//[] instead of insert to replace existing id->llsd["date"] with new date value  		mPeople[id] = userdata;  		mChangedSignal(); @@ -90,35 +82,6 @@ const LLSD& LLRecentPeople::getData(const LLUUID& id) const  	return no_data;  } -bool LLRecentPeople::isAvalineCaller(const LLUUID& id) const -{ -	recent_people_t::const_iterator it = mPeople.find(id); - -	if (it != mPeople.end()) -	{ -		const LLSD& user = it->second;		 -		return user["avaline_call"].asBoolean(); -	} - -	return false; -} - -const LLUUID& LLRecentPeople::getIDByPhoneNumber(const LLSD& userdata) -{ -	if (!userdata["avaline_call"].asBoolean()) -		return LLUUID::null; - -	for (recent_people_t::const_iterator it = mPeople.begin(); it != mPeople.end(); ++it) -	{ -		const LLSD& user_info = it->second; -		 -		if (user_info["call_number"].asString() == userdata["call_number"].asString()) -			return it->first; -	} -	 -	return LLUUID::null; -} -  // virtual  bool LLRecentPeople::handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)  { diff --git a/indra/newview/llrecentpeople.h b/indra/newview/llrecentpeople.h index 18b669ff4f..1b322f2c0a 100644 --- a/indra/newview/llrecentpeople.h +++ b/indra/newview/llrecentpeople.h @@ -62,9 +62,7 @@ public:  	 * @param id avatar to add.  	 *  	 * @param userdata additional information about last interaction party. -	 *				   For example when last interaction party is not an avatar -	 *				   but an avaline caller, additional info (such as phone -	 *				   number, session id and etc.) should be added. +	 *				   For example session id can be added.  	 *  	 * @return false if the avatar is in the list already, true otherwise  	 */ @@ -97,13 +95,6 @@ public:  	const LLSD& getData(const LLUUID& id) const;  	/** -	 * Checks whether specific participant is an avaline caller -	 * -	 * @param id identifier of specific participant -	 */ -	bool isAvalineCaller(const LLUUID& id) const; - -	/**  	 * Set callback to be called when the list changed.  	 *   	 * Multiple callbacks can be set. @@ -122,8 +113,6 @@ public:  private: -	const LLUUID& getIDByPhoneNumber(const LLSD& userdata); -  	typedef std::map<LLUUID, LLSD> recent_people_t;  	recent_people_t		mPeople;  	signal_t			mChangedSignal; diff --git a/indra/newview/llsearchableui.h b/indra/newview/llsearchableui.h index e033cae3ab..31f11eb8ef 100644 --- a/indra/newview/llsearchableui.h +++ b/indra/newview/llsearchableui.h @@ -41,9 +41,9 @@ namespace ll  		struct PanelData;  		struct TabContainerData; -		typedef boost::shared_ptr< SearchableItem > SearchableItemPtr; -		typedef boost::shared_ptr< PanelData > PanelDataPtr; -		typedef boost::shared_ptr< TabContainerData > TabContainerDataPtr; +		typedef std::shared_ptr< SearchableItem > SearchableItemPtr; +		typedef std::shared_ptr< PanelData > PanelDataPtr; +		typedef std::shared_ptr< TabContainerData > TabContainerDataPtr;  		typedef std::vector< TabContainerData > tTabContainerDataList;  		typedef std::vector< SearchableItemPtr > tSearchableItemList; @@ -55,7 +55,7 @@ namespace ll  			LLView const *mView;  			ll::ui::SearchableControl const *mCtrl; -			std::vector< boost::shared_ptr< SearchableItem >  > mChildren; +			std::vector< std::shared_ptr< SearchableItem >  > mChildren;  			virtual ~SearchableItem(); @@ -68,8 +68,8 @@ namespace ll  			LLPanel const *mPanel;  			std::string mLabel; -			std::vector< boost::shared_ptr< SearchableItem > > mChildren; -			std::vector< boost::shared_ptr< PanelData > > mChildPanel; +			std::vector< std::shared_ptr< SearchableItem > > mChildren; +			std::vector< std::shared_ptr< PanelData > > mChildPanel;  			virtual ~PanelData(); diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp index 82a165cb35..86f7d2bf25 100644 --- a/indra/newview/llselectmgr.cpp +++ b/indra/newview/llselectmgr.cpp @@ -310,14 +310,29 @@ void LLSelectMgr::resetObjectOverrides(LLObjectSelectionHandle selected_handle)  {      struct f : public LLSelectedNodeFunctor      { +        f(bool a, LLSelectMgr* p) : mAvatarOverridesPersist(a), mManager(p) {} +        bool mAvatarOverridesPersist; +        LLSelectMgr* mManager;          virtual bool apply(LLSelectNode* node)          { +            if (mAvatarOverridesPersist) +            { +                LLViewerObject* object = node->getObject(); +                if (object && !object->getParent()) +                { +                    LLVOAvatar* avatar = object->asAvatar(); +                    if (avatar) +                    { +                        mManager->mAvatarOverridesMap.emplace(avatar->getID(), AvatarPositionOverride(node->mLastPositionLocal, node->mLastRotation, object)); +                    } +                } +            }              node->mLastPositionLocal.setVec(0, 0, 0);              node->mLastRotation = LLQuaternion();              node->mLastScale.setVec(0, 0, 0);              return true;          } -    } func; +    } func(mAllowSelectAvatar, this);      selected_handle->applyToNodes(&func);  } @@ -351,6 +366,93 @@ void LLSelectMgr::overrideObjectUpdates()  	getSelection()->applyToNodes(&func);  } +void LLSelectMgr::resetAvatarOverrides() +{ +    mAvatarOverridesMap.clear(); +} + +void LLSelectMgr::overrideAvatarUpdates() +{ +    if (mAvatarOverridesMap.size() == 0) +    { +        return; +    } + +    if (!mAllowSelectAvatar || !gFloaterTools) +    { +        resetAvatarOverrides(); +        return; +    } + +    if (!gFloaterTools->getVisible() && getSelection()->isEmpty()) +    { +        // when user switches selection, floater is invisible and selection is empty +        LLToolset *toolset = LLToolMgr::getInstance()->getCurrentToolset(); +        if (toolset->isShowFloaterTools() +            && toolset->isToolSelected(0)) // Pie tool +        { +            resetAvatarOverrides(); +            return; +        } +    } + +    // remove selected avatars from this list, +    // but set object overrides to make sure avatar won't snap back  +    struct f : public LLSelectedNodeFunctor +    { +        f(LLSelectMgr* p) : mManager(p) {} +        LLSelectMgr* mManager; +        virtual bool apply(LLSelectNode* selectNode) +        { +            LLViewerObject* object = selectNode->getObject(); +            if (object && !object->getParent()) +            { +                LLVOAvatar* avatar = object->asAvatar(); +                if (avatar) +                { +                    uuid_av_override_map_t::iterator iter = mManager->mAvatarOverridesMap.find(avatar->getID()); +                    if (iter != mManager->mAvatarOverridesMap.end()) +                    { +                        if (selectNode->mLastPositionLocal.isExactlyZero()) +                        { +                            selectNode->mLastPositionLocal = iter->second.mLastPositionLocal; +                        } +                        if (selectNode->mLastRotation == LLQuaternion()) +                        { +                            selectNode->mLastRotation = iter->second.mLastRotation; +                        } +                        mManager->mAvatarOverridesMap.erase(iter); +                    } +                } +            } +            return true; +        } +    } func(this); +    getSelection()->applyToNodes(&func); + +    // Override avatar positions +    uuid_av_override_map_t::iterator it = mAvatarOverridesMap.begin(); +    while (it != mAvatarOverridesMap.end()) +    { +        if (it->second.mObject->isDead()) +        { +            it = mAvatarOverridesMap.erase(it); +        } +        else +        { +            if (!it->second.mLastPositionLocal.isExactlyZero()) +            { +                it->second.mObject->setPosition(it->second.mLastPositionLocal); +            } +            if (it->second.mLastRotation != LLQuaternion()) +            { +                it->second.mObject->setRotation(it->second.mLastRotation); +            } +            it++; +        } +    } +} +  //-----------------------------------------------------------------------------  // Select just the object, not any other group members.  //----------------------------------------------------------------------------- @@ -886,7 +988,7 @@ void LLSelectMgr::addAsFamily(std::vector<LLViewerObject*>& objects, BOOL add_to  		// Can't select yourself  		if (objectp->mID == gAgentID -			&& !LLSelectMgr::getInstance()->mAllowSelectAvatar) +			&& !mAllowSelectAvatar)  		{  			continue;  		} @@ -6281,6 +6383,24 @@ LLSelectNode::LLSelectNode(const LLSelectNode& nodep)  LLSelectNode::~LLSelectNode()  { +    LLSelectMgr *manager = LLSelectMgr::getInstance(); +    if (manager->mAllowSelectAvatar +        && (!mLastPositionLocal.isExactlyZero() +            || mLastRotation != LLQuaternion())) +    { +        LLViewerObject* object = getObject(); //isDead() check +        if (object && !object->getParent()) +        { +            LLVOAvatar* avatar = object->asAvatar(); +            if (avatar) +            { +                // Avatar was moved and needs to stay that way +                manager->mAvatarOverridesMap.emplace(avatar->getID(), LLSelectMgr::AvatarPositionOverride(mLastPositionLocal, mLastRotation, object)); +            } +        } +    } + +  	delete mPermissions;  	mPermissions = NULL;  } @@ -6788,6 +6908,10 @@ void LLSelectMgr::updateSelectionCenter()  	const F32 MOVE_SELECTION_THRESHOLD = 1.f;		//  Movement threshold in meters for updating selection  													//  center (tractor beam) +    // override any avatar updates received +    // Works only if avatar was repositioned +    // and edit floater is visible +    overrideAvatarUpdates();  	//override any object updates received  	//for selected objects  	overrideObjectUpdates(); diff --git a/indra/newview/llselectmgr.h b/indra/newview/llselectmgr.h index ce0316e610..199141fc32 100644 --- a/indra/newview/llselectmgr.h +++ b/indra/newview/llselectmgr.h @@ -467,6 +467,30 @@ public:  	void resetObjectOverrides(LLObjectSelectionHandle selected_handle);  	void overrideObjectUpdates(); +    void resetAvatarOverrides(); +    void overrideAvatarUpdates(); + +    struct AvatarPositionOverride +    { +        AvatarPositionOverride(); +        AvatarPositionOverride(LLVector3 &vec, LLQuaternion &quat, LLViewerObject *obj) : +            mLastPositionLocal(vec), +            mLastRotation(quat), +            mObject(obj) +        { +        } +        LLVector3 mLastPositionLocal; +        LLQuaternion mLastRotation; +        LLPointer<LLViewerObject> mObject; +    }; + +    // Avatar overrides should persist even after selection +    // was removed as long as edit floater is up +    typedef std::map<LLUUID, AvatarPositionOverride> uuid_av_override_map_t; +    uuid_av_override_map_t mAvatarOverridesMap; +public: + +  	// Returns the previous value of mForceSelection  	BOOL setForceSelection(BOOL force); diff --git a/indra/newview/llspeakers.cpp b/indra/newview/llspeakers.cpp index abb936c3e5..ea671a130e 100644 --- a/indra/newview/llspeakers.cpp +++ b/indra/newview/llspeakers.cpp @@ -534,7 +534,7 @@ void LLSpeakerMgr::updateSpeakerList()  			}  			else if (mSpeakers.size() == 0)  			{ -				// For all other session type (ad-hoc, P2P, avaline), we use the initial participants targets list +				// For all other session type (ad-hoc, P2P), we use the initial participants targets list  				for (uuid_vec_t::iterator it = session->mInitialTargetIDs.begin();it!=session->mInitialTargetIDs.end();++it)  				{  					// Add buddies if they are on line, add any other avatar. diff --git a/indra/newview/llspeakers.h b/indra/newview/llspeakers.h index d1dbf72fe9..ed795b5155 100644 --- a/indra/newview/llspeakers.h +++ b/indra/newview/llspeakers.h @@ -245,14 +245,6 @@ public:  	bool isSpeakerToBeRemoved(const LLUUID& speaker_id);  	/** -	 * Removes avaline speaker. -	 * -	 * This is a HACK due to server does not send information that Avaline caller ends call. -	 * It can be removed when server is updated. See EXT-4301 for details -	 */ -	bool removeAvalineSpeaker(const LLUUID& speaker_id) { return removeSpeaker(speaker_id); } - -	/**  	 * Initializes mVoiceModerated depend on LLSpeaker::mModeratorMutedVoice of agent's participant.  	 *  	 * Is used only to implement workaround to initialize mVoiceModerated on first join to group chat. See EXT-6937 diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index 142dc4c46e..43e808f8aa 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -255,6 +255,7 @@ static bool mLoginStatePastUI = false;  static bool mBenefitsSuccessfullyInit = false;  const F32 STATE_AGENT_WAIT_TIMEOUT = 240; //seconds +const S32 MAX_SEED_CAP_ATTEMPTS_BEFORE_LOGIN = 3; // Give region 3 chances  std::unique_ptr<LLEventPump> LLStartUp::sStateWatcher(new LLEventStream("StartupState"));  std::unique_ptr<LLStartupListener> LLStartUp::sListener(new LLStartupListener()); @@ -927,6 +928,12 @@ bool idle_startup()  			LLPersistentNotificationStorage::initParamSingleton();  			LLDoNotDisturbNotificationStorage::initParamSingleton();  		} +        else +        { +            // reinitialize paths in case user switched grids or accounts +            LLPersistentNotificationStorage::getInstance()->reset(); +            LLDoNotDisturbNotificationStorage::getInstance()->reset(); +        }  		// Set PerAccountSettingsFile to the default value.  		std::string settings_per_account = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, LLAppViewer::instance()->getSettingsFilename("Default", "PerAccount")); @@ -1388,10 +1395,21 @@ bool idle_startup()  		{  			LLStartUp::setStartupState( STATE_SEED_CAP_GRANTED );  		} +        else if (regionp->capabilitiesError()) +        { +            // Try to connect despite capabilities' error state +            LLStartUp::setStartupState(STATE_SEED_CAP_GRANTED); +        }  		else  		{  			U32 num_retries = regionp->getNumSeedCapRetries(); -			if (num_retries > 0) +            if (num_retries > MAX_SEED_CAP_ATTEMPTS_BEFORE_LOGIN) +            { +                // Region will keep trying to get capabilities, +                // but for now continue as if caps were granted +                LLStartUp::setStartupState(STATE_SEED_CAP_GRANTED); +            } +			else if (num_retries > 0)  			{  				LLStringUtil::format_map_t args;  				args["[NUMBER]"] = llformat("%d", num_retries + 1); @@ -2385,6 +2403,11 @@ void login_callback(S32 option, void *userdata)  void show_release_notes_if_required()  {      static bool release_notes_shown = false; +    // We happen to know that instantiating LLVersionInfo implicitly +    // instantiates the LLEventMailDrop named "relnotes", which we (might) use +    // below. If viewer release notes stop working, might be because that +    // LLEventMailDrop got moved out of LLVersionInfo and hasn't yet been +    // instantiated.      if (!release_notes_shown && (LLVersionInfo::instance().getChannelAndVersion() != gLastRunVersion)          && LLVersionInfo::instance().getViewerMaturity() != LLVersionInfo::TEST_VIEWER // don't show Release Notes for the test builds          && gSavedSettings.getBOOL("UpdaterShowReleaseNotes") diff --git a/indra/newview/llviewerdisplay.cpp b/indra/newview/llviewerdisplay.cpp index 6a2b06d9b5..bc0fafb29f 100644 --- a/indra/newview/llviewerdisplay.cpp +++ b/indra/newview/llviewerdisplay.cpp @@ -739,7 +739,6 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)  				glh::matrix4f proj = get_current_projection();  				glh::matrix4f mod = get_current_modelview();  				glViewport(0,0,512,512); -				LLVOAvatar::updateFreezeCounter() ;  				LLVOAvatar::updateImpostors(); diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp index 661f70972d..636909e6f2 100644 --- a/indra/newview/llviewermedia.cpp +++ b/indra/newview/llviewermedia.cpp @@ -3194,7 +3194,7 @@ bool LLViewerMediaImpl::isForcedUnloaded() const  	}  	// If this media's class is not supposed to be shown, unload -	if (!shouldShowBasedOnClass()) +	if (!shouldShowBasedOnClass() || isObscured())  	{  		return true;  	} @@ -3881,6 +3881,26 @@ bool LLViewerMediaImpl::shouldShowBasedOnClass() const  //////////////////////////////////////////////////////////////////////////////////////////  // +bool LLViewerMediaImpl::isObscured() const +{ +    if (getUsedInUI() || isParcelMedia()) return false; + +    LLParcel* agent_parcel = LLViewerParcelMgr::getInstance()->getAgentParcel(); +    if (!agent_parcel) +    { +        return false; +    } +     +    if (agent_parcel->getObscureMOAP() && !isInAgentParcel()) +    { +        return true; +    } + +    return false; +} + +////////////////////////////////////////////////////////////////////////////////////////// +//  bool LLViewerMediaImpl::isAttachedToAnotherAvatar() const  {  	bool result = false; diff --git a/indra/newview/llviewermedia.h b/indra/newview/llviewermedia.h index 806692929a..b95cfd4c68 100644 --- a/indra/newview/llviewermedia.h +++ b/indra/newview/llviewermedia.h @@ -423,6 +423,7 @@ public:  private:  	bool isAutoPlayable() const;  	bool shouldShowBasedOnClass() const; +	bool isObscured() const;  	static bool isObjectAttachedToAnotherAvatar(LLVOVolume *obj);  	static bool isObjectInAgentParcel(LLVOVolume *obj); diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index ac516b8460..f76031953d 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -33,10 +33,11 @@  #include "llviewermenu.h"   // linden library includes -#include "llavatarnamecache.h"	// IDEVO +#include "llavatarnamecache.h"  // IDEVO (I Are Not Men!) +#include "llcombobox.h" +#include "llcoros.h"  #include "llfloaterreg.h"  #include "llfloatersidepanelcontainer.h" -#include "llcombobox.h"  #include "llinventorypanel.h"  #include "llnotifications.h"  #include "llnotificationsutil.h" @@ -93,6 +94,7 @@  #include "llmarketplacefunctions.h"  #include "llmenuoptionpathfindingrebakenavmesh.h"  #include "llmoveview.h" +#include "llnavigationbar.h"  #include "llparcel.h"  #include "llrootview.h"  #include "llsceneview.h" @@ -2407,6 +2409,7 @@ class LLAdvancedForceErrorLlerror : public view_listener_t  		return true;  	}  }; +  class LLAdvancedForceErrorBadMemoryAccess : public view_listener_t  {  	bool handleEvent(const LLSD& userdata) @@ -2416,6 +2419,22 @@ class LLAdvancedForceErrorBadMemoryAccess : public view_listener_t  	}  }; +class LLAdvancedForceErrorBadMemoryAccessCoro : public view_listener_t +{ +    bool handleEvent(const LLSD& userdata) +    { +        LLCoros::instance().launch( +            "AdvancedForceErrorBadMemoryAccessCoro", +            [](){ +                // Wait for one mainloop() iteration, letting the enclosing +                // handleEvent() method return. +                llcoro::suspend(); +                force_error_bad_memory_access(NULL); +            }); +        return true; +    } +}; +  class LLAdvancedForceErrorInfiniteLoop : public view_listener_t  {  	bool handleEvent(const LLSD& userdata) @@ -2434,6 +2453,22 @@ class LLAdvancedForceErrorSoftwareException : public view_listener_t  	}  }; +class LLAdvancedForceErrorSoftwareExceptionCoro : public view_listener_t +{ +    bool handleEvent(const LLSD& userdata) +    { +        LLCoros::instance().launch( +            "AdvancedForceErrorSoftwareExceptionCoro", +            [](){ +                // Wait for one mainloop() iteration, letting the enclosing +                // handleEvent() method return. +                llcoro::suspend(); +                force_error_software_exception(NULL); +            }); +        return true; +    } +}; +  class LLAdvancedForceErrorDriverCrash : public view_listener_t  {  	bool handleEvent(const LLSD& userdata) @@ -5365,12 +5400,10 @@ class LLToolsEnablePathfindingRebakeRegion : public view_listener_t  	{  		bool returnValue = false; -		if (LLPathfindingManager::getInstance() != NULL) -		{ -			LLMenuOptionPathfindingRebakeNavmesh *rebakeInstance = LLMenuOptionPathfindingRebakeNavmesh::getInstance(); -			returnValue = (rebakeInstance->canRebakeRegion() && -				(rebakeInstance->getMode() == LLMenuOptionPathfindingRebakeNavmesh::kRebakeNavMesh_Available)); -		} +        if (LLNavigationBar::instanceExists()) +        { +            returnValue = LLNavigationBar::getInstance()->isRebakeNavMeshAvailable(); +        }  		return returnValue;  	}  }; @@ -9482,8 +9515,10 @@ void initialize_menus()  	view_listener_t::addMenu(new LLAdvancedForceErrorBreakpoint(), "Advanced.ForceErrorBreakpoint");  	view_listener_t::addMenu(new LLAdvancedForceErrorLlerror(), "Advanced.ForceErrorLlerror");  	view_listener_t::addMenu(new LLAdvancedForceErrorBadMemoryAccess(), "Advanced.ForceErrorBadMemoryAccess"); +	view_listener_t::addMenu(new LLAdvancedForceErrorBadMemoryAccessCoro(), "Advanced.ForceErrorBadMemoryAccessCoro");  	view_listener_t::addMenu(new LLAdvancedForceErrorInfiniteLoop(), "Advanced.ForceErrorInfiniteLoop");  	view_listener_t::addMenu(new LLAdvancedForceErrorSoftwareException(), "Advanced.ForceErrorSoftwareException"); +	view_listener_t::addMenu(new LLAdvancedForceErrorSoftwareExceptionCoro(), "Advanced.ForceErrorSoftwareExceptionCoro");  	view_listener_t::addMenu(new LLAdvancedForceErrorDriverCrash(), "Advanced.ForceErrorDriverCrash");      view_listener_t::addMenu(new LLAdvancedForceErrorCoroutineCrash(), "Advanced.ForceErrorCoroutineCrash");      view_listener_t::addMenu(new LLAdvancedForceErrorThreadCrash(), "Advanced.ForceErrorThreadCrash"); diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index be80d0bc0a..5f82f1c44f 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -3334,13 +3334,6 @@ void send_agent_update(BOOL force_send, BOOL send_reliable)  	// trigger a control event.  	U32 control_flags = gAgent.getControlFlags(); -    // Rotation into both directions should cancel out -    U32 mask = AGENT_CONTROL_YAW_POS | AGENT_CONTROL_YAW_NEG; -    if ((control_flags & mask) == mask) -    { -        control_flags &= ~mask; -    } -  	MASK	key_mask = gKeyboard->currentMask(TRUE);  	if (key_mask & MASK_ALT || key_mask & MASK_CONTROL) diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index a95636ff23..aad6c14b4d 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -356,6 +356,13 @@ LLViewerObject::~LLViewerObject()  		mPartSourcep = NULL;  	} +    if (mText) +    { +        // something recovered LLHUDText when object was already dead +        mText->markDead(); +        mText = NULL; +    } +  	// Delete memory associated with extra parameters.  	std::map<U16, ExtraParameter*>::iterator iter;  	for (iter = mExtraParameterList.begin(); iter != mExtraParameterList.end(); ++iter) @@ -2457,11 +2464,19 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys,  		needs_refresh = needs_refresh || child->mUserSelected;  	} +    static LLCachedControl<bool> allow_select_avatar(gSavedSettings, "AllowSelectAvatar", FALSE);  	if (needs_refresh)  	{  		LLSelectMgr::getInstance()->updateSelectionCenter();  		dialog_refresh_all(); -	}  +	} +    else if (allow_select_avatar && asAvatar()) +    { +        // Override any avatar position updates received +        // Works only if avatar was repositioned using build +        // tools and build floater is visible +        LLSelectMgr::getInstance()->overrideAvatarUpdates(); +    }  	// Mark update time as approx. now, with the ping delay. diff --git a/indra/newview/llviewerobjectlist.cpp b/indra/newview/llviewerobjectlist.cpp index 55e2386d10..e930b58111 100644 --- a/indra/newview/llviewerobjectlist.cpp +++ b/indra/newview/llviewerobjectlist.cpp @@ -571,7 +571,8 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys,  		if(update_cache)  		{ -			objectp = regionp->updateCacheEntry(local_id, objectp, update_type); +            //update object cache if the object receives a full-update or terse update +			objectp = regionp->updateCacheEntry(local_id, objectp);  		}  		// This looks like it will break if the local_id of the object doesn't change diff --git a/indra/newview/llviewerparcelmgr.cpp b/indra/newview/llviewerparcelmgr.cpp index e69b0347f8..f58eac2ed9 100644 --- a/indra/newview/llviewerparcelmgr.cpp +++ b/indra/newview/llviewerparcelmgr.cpp @@ -1553,6 +1553,7 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use      BOOL    region_allow_environment_override = true;      S32     parcel_environment_version = 0;      BOOL	agent_parcel_update = false; // updating previous(existing) agent parcel +    U32     extended_flags = 0; //obscure MOAP      S32		other_clean_time = 0; @@ -1642,6 +1643,11 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use          msg->getBOOLFast(_PREHASH_RegionAllowAccessBlock, _PREHASH_RegionAllowAccessOverride, region_allow_access_override);      } +    if (msg->getNumberOfBlocks(_PREHASH_ParcelExtendedFlags)) +    { +        msg->getU32Fast(_PREHASH_ParcelExtendedFlags, _PREHASH_Flags, extended_flags); +     } +      if (msg->getNumberOfBlocks(_PREHASH_ParcelEnvironmentBlock))      {          msg->getS32Fast(_PREHASH_ParcelEnvironmentBlock, _PREHASH_ParcelEnvironmentVersion, parcel_environment_version); @@ -1698,6 +1704,8 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use          parcel->setParcelEnvironmentVersion(cur_parcel_environment_version);          parcel->setRegionAllowEnvironmentOverride(region_allow_environment_override); +        parcel->setObscureMOAP((bool)extended_flags); +  		parcel->unpackMessage(msg);  		if (parcel == parcel_mgr.mAgentParcel) diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp index f48543822a..fb55c5e816 100644 --- a/indra/newview/llviewerregion.cpp +++ b/indra/newview/llviewerregion.cpp @@ -95,8 +95,6 @@  // The server only keeps our pending agent info for 60 seconds.  // We want to allow for seed cap retry, but its not useful after that 60 seconds. -// Give it 3 chances, each at 18 seconds to give ourselves a few seconds to connect anyways if we give up. -const S32 MAX_SEED_CAP_ATTEMPTS_BEFORE_LOGIN = 3;  // Even though we gave up on login, keep trying for caps after we are logged in:  const S32 MAX_CAP_REQUEST_ATTEMPTS = 30;  const U32 DEFAULT_MAX_REGION_WIDE_PRIM_COUNT = 15000; @@ -178,7 +176,6 @@ public:          mCompositionp(NULL),          mEventPoll(NULL),          mSeedCapMaxAttempts(MAX_CAP_REQUEST_ATTEMPTS), -        mSeedCapMaxAttemptsBeforeLogin(MAX_SEED_CAP_ATTEMPTS_BEFORE_LOGIN),          mSeedCapAttempts(0),          mHttpResponderID(0),          mLastCameraUpdate(0), @@ -231,7 +228,6 @@ public:  	LLEventPoll* mEventPoll;  	S32 mSeedCapMaxAttempts; -	S32 mSeedCapMaxAttemptsBeforeLogin;  	S32 mSeedCapAttempts;  	S32 mHttpResponderID; @@ -286,19 +282,13 @@ void LLViewerRegionImpl::requestBaseCapabilitiesCoro(U64 regionHandle)          if (url.empty())          {              LL_WARNS("AppInit", "Capabilities") << "Failed to get seed capabilities, and can not determine url!" << LL_ENDL; +            regionp->setCapabilitiesError();              return; // this error condition is not recoverable.          }          // record that we just entered a new region          newRegionEntry(*regionp); -        // After a few attempts, continue login.  But keep trying to get the caps: -        if (impl->mSeedCapAttempts >= impl->mSeedCapMaxAttemptsBeforeLogin && -            STATE_SEED_GRANTED_WAIT == LLStartUp::getStartupState()) -        { -            LLStartUp::setStartupState(STATE_SEED_CAP_GRANTED); -        } -          if (impl->mSeedCapAttempts > impl->mSeedCapMaxAttempts)          {              // *TODO: Give a user pop-up about this error? @@ -394,11 +384,6 @@ void LLViewerRegionImpl::requestBaseCapabilitiesCoro(U64 regionHandle)  														 << " region name " << regionp->getName() << LL_ENDL;          regionp->setCapabilitiesReceived(true); -        if (STATE_SEED_GRANTED_WAIT == LLStartUp::getStartupState()) -        { -            LLStartUp::setStartupState(STATE_SEED_CAP_GRANTED); -        } -          break;      }       while (true); @@ -442,6 +427,11 @@ void LLViewerRegionImpl::requestBaseCapabilitiesCompleteCoro(U64 regionHandle)          if (url.empty())          {              LL_WARNS("AppInit", "Capabilities") << "Failed to get seed capabilities, and can not determine url!" << LL_ENDL; +            if (regionp->getCapability("Seed").empty()) +            { +                // initial attempt failed to get this cap as well +                regionp->setCapabilitiesError(); +            }              break; // this error condition is not recoverable.          } @@ -643,7 +633,7 @@ LLViewerRegion::LLViewerRegion(const U64 &handle,  	mCacheLoaded(FALSE),  	mCacheDirty(FALSE),  	mReleaseNotesRequested(FALSE), -	mCapabilitiesReceived(false), +	mCapabilitiesState(CAPABILITIES_STATE_INIT),  	mSimulatorFeaturesReceived(false),  	mBitsReceived(0.f),  	mPacketsReceived(0.f), @@ -1818,13 +1808,8 @@ LLViewerObject* LLViewerRegion::addNewObject(LLVOCacheEntry* entry)  //update object cache if the object receives a full-update or terse update  //update_type == EObjectUpdateType::OUT_TERSE_IMPROVED or EObjectUpdateType::OUT_FULL -LLViewerObject* LLViewerRegion::updateCacheEntry(U32 local_id, LLViewerObject* objectp, U32 update_type) +LLViewerObject* LLViewerRegion::updateCacheEntry(U32 local_id, LLViewerObject* objectp)  { -	if(objectp && update_type != (U32)OUT_TERSE_IMPROVED) -	{ -		return objectp; //no need to access cache -	} -  	LLVOCacheEntry* entry = getCacheEntry(local_id);  	if (!entry)  	{ @@ -1836,11 +1821,8 @@ LLViewerObject* LLViewerRegion::updateCacheEntry(U32 local_id, LLViewerObject* o  		objectp = addNewObject(entry);  	} -	//remove from cache if terse update -	if(update_type == (U32)OUT_TERSE_IMPROVED) -	{ -		killCacheEntry(entry, true); -	} +    //remove from cache. +    killCacheEntry(entry, true);  	return objectp;  } @@ -2300,6 +2282,11 @@ void LLViewerRegion::requestSimulatorFeatures()          std::string coroname =              LLCoros::instance().launch("LLViewerRegionImpl::requestSimulatorFeatureCoro",                                         boost::bind(&LLViewerRegionImpl::requestSimulatorFeatureCoro, url, getHandle())); + +        // requestSimulatorFeatures can be called from other coros, +        // launch() acts like a suspend() +        // Make sure we are still good to do +        LLCoros::checkStop();          LL_INFOS("AppInit", "SimulatorFeatures") << "Launching " << coroname << " requesting simulator features from " << url << " for region " << getRegionID() << LL_ENDL;      } @@ -3121,6 +3108,12 @@ void LLViewerRegion::setSeedCapability(const std::string& url)          std::string coroname =              LLCoros::instance().launch("LLEnvironmentRequest::requestBaseCapabilitiesCompleteCoro",              boost::bind(&LLViewerRegionImpl::requestBaseCapabilitiesCompleteCoro, getHandle())); + +        // setSeedCapability can be called from other coros, +        // launch() acts like a suspend() +        // Make sure we are still good to do +        LLCoros::checkStop(); +  		return;      } @@ -3134,6 +3127,11 @@ void LLViewerRegion::setSeedCapability(const std::string& url)          LLCoros::instance().launch("LLViewerRegionImpl::requestBaseCapabilitiesCoro",          boost::bind(&LLViewerRegionImpl::requestBaseCapabilitiesCoro, getHandle())); +    // setSeedCapability can be called from other coros, +    // launch() acts like a suspend() +    // Make sure we are still good to do +    LLCoros::checkStop(); +      LL_INFOS("AppInit", "Capabilities") << "Launching " << coroname << " requesting seed capabilities from " << url << " for region " << getRegionID() << LL_ENDL;  } @@ -3255,12 +3253,17 @@ bool LLViewerRegion::isCapabilityAvailable(const std::string& name) const  bool LLViewerRegion::capabilitiesReceived() const  { -	return mCapabilitiesReceived; +	return mCapabilitiesState == CAPABILITIES_STATE_RECEIVED; +} + +bool LLViewerRegion::capabilitiesError() const +{ +    return mCapabilitiesState == CAPABILITIES_STATE_ERROR;  }  void LLViewerRegion::setCapabilitiesReceived(bool received)  { -	mCapabilitiesReceived = received; +	mCapabilitiesState = received ? CAPABILITIES_STATE_RECEIVED : CAPABILITIES_STATE_INIT;  	// Tell interested parties that we've received capabilities,  	// so that they can safely use getCapability(). @@ -3275,6 +3278,11 @@ void LLViewerRegion::setCapabilitiesReceived(bool received)  	}  } +void LLViewerRegion::setCapabilitiesError() +{ +    mCapabilitiesState = CAPABILITIES_STATE_ERROR; +} +  boost::signals2::connection LLViewerRegion::setCapabilitiesReceivedCallback(const caps_received_signal_t::slot_type& cb)  {  	return mCapabilitiesReceivedSignal.connect(cb); diff --git a/indra/newview/llviewerregion.h b/indra/newview/llviewerregion.h index fcbf56c81f..d0fa9fea01 100644 --- a/indra/newview/llviewerregion.h +++ b/indra/newview/llviewerregion.h @@ -268,7 +268,9 @@ public:  	// has region received its final (not seed) capability list?  	bool capabilitiesReceived() const; +    bool capabilitiesError() const;  	void setCapabilitiesReceived(bool received); +	void setCapabilitiesError();  	boost::signals2::connection setCapabilitiesReceivedCallback(const caps_received_signal_t::slot_type& cb);  	static bool isSpecialCapabilityName(const std::string &name); @@ -352,7 +354,7 @@ public:  	void requestCacheMisses();  	void addCacheMissFull(const U32 local_id);  	//update object cache if the object receives a full-update or terse update -	LLViewerObject* updateCacheEntry(U32 local_id, LLViewerObject* objectp, U32 update_type); +	LLViewerObject* updateCacheEntry(U32 local_id, LLViewerObject* objectp);  	void findOrphans(U32 parent_id);  	void clearCachedVisibleObjects();  	void dumpCache(); @@ -527,12 +529,20 @@ private:  	BOOL									mCacheLoaded;  	BOOL                                    mCacheDirty;  	BOOL	mAlive;					// can become false if circuit disconnects -	BOOL	mCapabilitiesReceived;  	BOOL	mSimulatorFeaturesReceived;  	BOOL    mReleaseNotesRequested;  	BOOL    mDead;  //if true, this region is in the process of deleting.  	BOOL    mPaused; //pause processing the objects in the region +    typedef enum +    { +        CAPABILITIES_STATE_INIT = 0, +        CAPABILITIES_STATE_ERROR, +        CAPABILITIES_STATE_RECEIVED +    } eCababilitiesState; + +    eCababilitiesState	mCapabilitiesState; +  	typedef std::map<U32, std::vector<U32> > orphan_list_t;  	orphan_list_t mOrphanMap; diff --git a/indra/newview/llviewerstats.cpp b/indra/newview/llviewerstats.cpp index 3385d317e6..a4fbbb3e78 100644 --- a/indra/newview/llviewerstats.cpp +++ b/indra/newview/llviewerstats.cpp @@ -506,6 +506,7 @@ void send_viewer_stats(bool include_preferences)  	system["ram"] = (S32) gSysMemory.getPhysicalMemoryKB().value();  	system["os"] = LLOSInfo::instance().getOSStringSimple();  	system["cpu"] = gSysCPU.getCPUString(); +    system["cpu_sse"] = gSysCPU.getSSEVersions();  	system["address_size"] = ADDRESS_SIZE;  	system["os_bitness"] = LLOSInfo::instance().getOSBitness();  	unsigned char MACAddress[MAC_ADDRESS_BYTES]; diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index 119859a4ac..5ce46b143a 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -772,6 +772,12 @@ public:  				ypos += y_inc;  				addText(xpos, ypos, llformat("%.3f/%.3f MB Mesh Cache Read/Write ", LLMeshRepository::sCacheBytesRead/(1024.f*1024.f), LLMeshRepository::sCacheBytesWritten/(1024.f*1024.f))); +                ypos += y_inc; + +                addText(xpos, ypos, llformat("%.3f/%.3f MB Mesh Skins/Decompositions Memory", LLMeshRepository::sCacheBytesSkins / (1024.f*1024.f), LLMeshRepository::sCacheBytesDecomps / (1024.f*1024.f))); +                ypos += y_inc; + +                addText(xpos, ypos, llformat("%.3f MB Mesh Headers Memory", LLMeshRepository::sCacheBytesHeaders / (1024.f*1024.f)));  				ypos += y_inc;  			} @@ -1567,9 +1573,11 @@ void LLViewerWindow::handleFocusLost(LLWindow *window)  	showCursor();  	getWindow()->setMouseClipping(FALSE); -	// If losing focus while keys are down, reset them. +	// If losing focus while keys are down, handle them as +    // an 'up' to correctly release states, then reset states  	if (gKeyboard)  	{ +        gKeyboard->resetKeyDownAndHandle();  		gKeyboard->resetKeys();  	} diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index 5c76f7b392..6543081bd8 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -1,4 +1,4 @@ -/**  +/**   * @File llvoavatar.cpp   * @brief Implementation of LLVOAvatar class which is a derivation of LLViewerObject   * @@ -183,8 +183,6 @@ const F32 MAX_STANDOFF_DISTANCE_CHANGE = 32;  // Should probably be 4 or 3, but didn't want to change it while change other logic - SJB  const S32 SWITCH_TO_BAKED_DISCARD = 5; -const F32 FOOT_COLLIDE_FUDGE = 0.04f; -  const F32 HOVER_EFFECT_MAX_SPEED = 3.f;  const F32 HOVER_EFFECT_STRENGTH = 0.f;  const F32 UNDERWATER_EFFECT_STRENGTH = 0.1f; @@ -585,7 +583,6 @@ private:  //-----------------------------------------------------------------------------  // Static Data  //----------------------------------------------------------------------------- -S32 LLVOAvatar::sFreezeCounter = 0;  U32 LLVOAvatar::sMaxNonImpostors = 12; // Set from RenderAvatarMaxNonImpostors  bool LLVOAvatar::sLimitNonImpostors = false; // True unless RenderAvatarMaxNonImpostors is 0 (unlimited)  F32 LLVOAvatar::sRenderDistance = 256.f; @@ -610,7 +607,6 @@ S32 LLVOAvatar::sNumVisibleChatBubbles = 0;  BOOL LLVOAvatar::sDebugInvisible = FALSE;  BOOL LLVOAvatar::sShowAttachmentPoints = FALSE;  BOOL LLVOAvatar::sShowAnimationDebug = FALSE; -BOOL LLVOAvatar::sShowFootPlane = FALSE;  BOOL LLVOAvatar::sVisibleInFirstPerson = FALSE;  F32 LLVOAvatar::sLODFactor = 1.f;  F32 LLVOAvatar::sPhysicsLODFactor = 1.f; @@ -779,6 +775,13 @@ std::string LLVOAvatar::avString() const  void LLVOAvatar::debugAvatarRezTime(std::string notification_name, std::string comment)  { +    if (gDisconnected) +    { +        // If we disconected, these values are likely to be invalid and +        // avString() might crash due to a dead sAvatarDictionary +        return; +    } +  	LL_INFOS("Avatar") << "REZTIME: [ " << (U32)mDebugExistenceTimer.getElapsedTimeF32()  					   << "sec ]"  					   << avString()  @@ -4105,8 +4108,7 @@ void LLVOAvatar::computeUpdatePeriod()          && (!isSelf() || visually_muted)          && !isUIAvatar()          && (sLimitNonImpostors || visually_muted) -        && !mNeedsAnimUpdate  -        && !sFreezeCounter) +        && !mNeedsAnimUpdate)  	{  		const LLVector4a* ext = mDrawable->getSpatialExtents();  		LLVector4a size; @@ -5079,42 +5081,6 @@ U32 LLVOAvatar::renderSkinned()  		return num_indices;  	} -	// render collision normal -	// *NOTE: this is disabled (there is no UI for enabling sShowFootPlane) due -	// to DEV-14477.  the code is left here to aid in tracking down the cause -	// of the crash in the future. -brad -	if (sShowFootPlane && mDrawable.notNull()) -	{ -		LLVector3 slaved_pos = mDrawable->getPositionAgent(); -		LLVector3 foot_plane_normal(mFootPlane.mV[VX], mFootPlane.mV[VY], mFootPlane.mV[VZ]); -		F32 dist_from_plane = (slaved_pos * foot_plane_normal) - mFootPlane.mV[VW]; -		LLVector3 collide_point = slaved_pos; -		collide_point.mV[VZ] -= foot_plane_normal.mV[VZ] * (dist_from_plane + COLLISION_TOLERANCE - FOOT_COLLIDE_FUDGE); - -		gGL.begin(LLRender::LINES); -		{ -			F32 SQUARE_SIZE = 0.2f; -			gGL.color4f(1.f, 0.f, 0.f, 1.f); -			 -			gGL.vertex3f(collide_point.mV[VX] - SQUARE_SIZE, collide_point.mV[VY] - SQUARE_SIZE, collide_point.mV[VZ]); -			gGL.vertex3f(collide_point.mV[VX] + SQUARE_SIZE, collide_point.mV[VY] - SQUARE_SIZE, collide_point.mV[VZ]); - -			gGL.vertex3f(collide_point.mV[VX] + SQUARE_SIZE, collide_point.mV[VY] - SQUARE_SIZE, collide_point.mV[VZ]); -			gGL.vertex3f(collide_point.mV[VX] + SQUARE_SIZE, collide_point.mV[VY] + SQUARE_SIZE, collide_point.mV[VZ]); -			 -			gGL.vertex3f(collide_point.mV[VX] + SQUARE_SIZE, collide_point.mV[VY] + SQUARE_SIZE, collide_point.mV[VZ]); -			gGL.vertex3f(collide_point.mV[VX] - SQUARE_SIZE, collide_point.mV[VY] + SQUARE_SIZE, collide_point.mV[VZ]); -			 -			gGL.vertex3f(collide_point.mV[VX] - SQUARE_SIZE, collide_point.mV[VY] + SQUARE_SIZE, collide_point.mV[VZ]); -			gGL.vertex3f(collide_point.mV[VX] - SQUARE_SIZE, collide_point.mV[VY] - SQUARE_SIZE, collide_point.mV[VZ]); -			 -			gGL.vertex3f(collide_point.mV[VX], collide_point.mV[VY], collide_point.mV[VZ]); -			gGL.vertex3f(collide_point.mV[VX] + mFootPlane.mV[VX], collide_point.mV[VY] + mFootPlane.mV[VY], collide_point.mV[VZ] + mFootPlane.mV[VZ]); - -		} -		gGL.end(); -		gGL.flush(); -	}  	//--------------------------------------------------------------------  	// render all geometry attached to the skeleton  	//-------------------------------------------------------------------- @@ -7241,6 +7207,14 @@ LLViewerJoint*	LLVOAvatar::getViewerJoint(S32 idx)  }  //----------------------------------------------------------------------------- +// hideHair() +//----------------------------------------------------------------------------- +void LLVOAvatar::hideHair() +{ +    mMeshLOD[MESH_ID_HAIR]->setVisible(FALSE, TRUE); +} + +//-----------------------------------------------------------------------------  // hideSkirt()  //-----------------------------------------------------------------------------  void LLVOAvatar::hideSkirt() @@ -10245,23 +10219,6 @@ LLHost LLVOAvatar::getObjectHost() const  	}  } -//static -void LLVOAvatar::updateFreezeCounter(S32 counter) -{ -	if(counter) -	{ -		sFreezeCounter = counter; -	} -	else if(sFreezeCounter > 0) -	{ -		sFreezeCounter--; -	} -	else -	{ -		sFreezeCounter = 0; -	} -} -  BOOL LLVOAvatar::updateLOD()  {      if (mDrawable.isNull()) diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h index 3c3decaad6..8d1dcbcda2 100644 --- a/indra/newview/llvoavatar.h +++ b/indra/newview/llvoavatar.h @@ -326,7 +326,6 @@ public:  	static bool		sLimitNonImpostors; // use impostors for far away avatars  	static F32		sRenderDistance; // distance at which avatars will render.  	static BOOL		sShowAnimationDebug; // show animation debug info -	static BOOL		sShowFootPlane;	// show foot collision plane reported by server  	static BOOL		sShowCollisionVolumes;	// show skeletal collision volumes  	static BOOL		sVisibleInFirstPerson;  	static S32		sNumLODChangesThisFrame; @@ -618,14 +617,6 @@ private:  	BOOL		mCulled;  	//-------------------------------------------------------------------- -	// Freeze counter -	//-------------------------------------------------------------------- -public: -	static void updateFreezeCounter(S32 counter = 0); -private: -	static S32  sFreezeCounter; - -	//--------------------------------------------------------------------  	// Constants  	//--------------------------------------------------------------------  public: @@ -808,6 +799,7 @@ public:  	void 			parseAppearanceMessage(LLMessageSystem* mesgsys, LLAppearanceMessageContents& msg);  	void 			processAvatarAppearance(LLMessageSystem* mesgsys);      void            applyParsedAppearanceMessage(LLAppearanceMessageContents& contents, bool slam_params); +    void 			hideHair();  	void 			hideSkirt();  	void			startAppearanceAnimation(); diff --git a/indra/newview/llvoicechannel.cpp b/indra/newview/llvoicechannel.cpp index f971554c9d..b0eb8d962c 100644 --- a/indra/newview/llvoicechannel.cpp +++ b/indra/newview/llvoicechannel.cpp @@ -770,8 +770,6 @@ LLVoiceChannelP2P::LLVoiceChannelP2P(const LLUUID& session_id, const std::string  		mReceivedCall(FALSE)  {  	// make sure URI reflects encoded version of other user's agent id -	// *NOTE: in case of Avaline call generated SIP URL will be incorrect. -	// But it will be overridden in LLVoiceChannelP2P::setSessionHandle() called when agent accepts call  	setURI(LLVoiceClient::getInstance()->sipURIFromID(other_user_id));  } @@ -911,8 +909,6 @@ void LLVoiceChannelP2P::setSessionHandle(const std::string& handle, const std::s  	else  	{  		LL_WARNS("Voice") << "incoming SIP URL is not provided. Channel may not work properly." << LL_ENDL; -		// In the case of an incoming AvaLine call, the generated URI will be different from the -		// original one. This is because the P2P URI is based on avatar UUID but Avaline is not.  		// See LLVoiceClient::sessionAddedEvent()  		setURI(LLVoiceClient::getInstance()->sipURIFromID(mOtherUserID));  	} @@ -947,22 +943,5 @@ void LLVoiceChannelP2P::setState(EState state)  void LLVoiceChannelP2P::addToTheRecentPeopleList()  { -	bool avaline_call = LLIMModel::getInstance()->findIMSession(mSessionID)->isAvalineSessionType(); -	 -	if (avaline_call) -	{ -		LLSD call_data; -		std::string call_number = LLVoiceChannel::getSessionName(); -		 -		call_data["avaline_call"]	= true; -		call_data["session_id"]		= mSessionID; -		call_data["call_number"]	= call_number; -		call_data["date"]			= LLDate::now(); -		 -		LLRecentPeople::instance().add(mOtherUserID, call_data); -	} -	else -	{ -		LLRecentPeople::instance().add(mOtherUserID); -	} +	LLRecentPeople::instance().add(mOtherUserID);  } diff --git a/indra/newview/llvoiceclient.cpp b/indra/newview/llvoiceclient.cpp index e2bd1a39c7..d8b8b8749f 100644 --- a/indra/newview/llvoiceclient.cpp +++ b/indra/newview/llvoiceclient.cpp @@ -200,6 +200,7 @@ const LLVoiceVersionInfo LLVoiceClient::getVersion()  		LLVoiceVersionInfo result;  		result.serverVersion = std::string();  		result.serverType = std::string(); +		result.mBuildVersion = std::string();  		return result;  	}  } diff --git a/indra/newview/llvoiceclient.h b/indra/newview/llvoiceclient.h index cf527a4464..246883b611 100644 --- a/indra/newview/llvoiceclient.h +++ b/indra/newview/llvoiceclient.h @@ -95,6 +95,7 @@ struct LLVoiceVersionInfo  {  	std::string serverType;  	std::string serverVersion; +	std::string mBuildVersion;  };  ////////////////////////////////// diff --git a/indra/newview/llvoicevivox.cpp b/indra/newview/llvoicevivox.cpp index 19036a3f77..735bb4ad94 100644 --- a/indra/newview/llvoicevivox.cpp +++ b/indra/newview/llvoicevivox.cpp @@ -690,6 +690,10 @@ void LLVivoxVoiceClient::voiceControlCoro()          // surviving longer than LLVivoxVoiceClient          voiceControlStateMachine(state);      } +    catch (const LLCoros::Stop&) +    { +        LL_DEBUGS("LLVivoxVoiceClient") << "Received a shutdown exception" << LL_ENDL; +    }      catch (const LLContinueError&)      {          LOG_UNHANDLED_EXCEPTION("LLVivoxVoiceClient"); @@ -4572,6 +4576,23 @@ void LLVivoxVoiceClient::sessionNotificationEvent(std::string &sessionHandle, st  	}  } +void LLVivoxVoiceClient::voiceServiceConnectionStateChangedEvent(int statusCode, std::string &statusString, std::string &build_id) +{ +	// We don't generally need to process this. However, one occurence is when we first connect, and so it is the +	// earliest opportunity to learn what we're connected to. +	if (statusCode) +	{ +		LL_WARNS("Voice") << "VoiceServiceConnectionStateChangedEvent statusCode: " << statusCode << +			"statusString: " << statusString << LL_ENDL; +		return; +	} +	if (build_id.empty()) +	{ +		return; +	} +	mVoiceVersion.mBuildVersion = build_id; +} +  void LLVivoxVoiceClient::auxAudioPropertiesEvent(F32 energy)  {  	LL_DEBUGS("VoiceEnergy") << "got energy " << energy << LL_ENDL; @@ -4758,7 +4779,7 @@ void LLVivoxVoiceClient::sessionState::VerifySessions()          if ((*it).expired())          {              LL_WARNS("Voice") << "Expired session found! removing" << LL_ENDL; -            mSession.erase(it++); +            it = mSession.erase(it);          }          else              ++it; @@ -6815,7 +6836,7 @@ void LLVivoxVoiceClient::deleteVoiceFont(const LLUUID& id)  		if (list_iter->second == id)  		{  			LL_DEBUGS("VoiceFont") << "Removing " << id << " from the voice font list." << LL_ENDL; -			mVoiceFontList.erase(list_iter++); +            list_iter = mVoiceFontList.erase(list_iter);  			mVoiceFontListDirty = true;  		}  		else @@ -7554,6 +7575,8 @@ void LLVivoxProtocolParser::EndTag(const char *tag)  			connectorHandle = string;  		else if (!stricmp("VersionID", tag))  			versionID = string; +		else if (!stricmp("Version", tag)) +			mBuildID = string;  		else if (!stricmp("AccountHandle", tag))  			accountHandle = string;  		else if (!stricmp("State", tag)) @@ -7856,7 +7879,8 @@ void LLVivoxProtocolParser::processResponse(std::string tag)  			// We don't need to process this, but we also shouldn't warn on it, since that confuses people.  		}  		else if (!stricmp(eventTypeCstr, "VoiceServiceConnectionStateChangedEvent")) -		{	// Yet another ignored event +		{ +			LLVivoxVoiceClient::getInstance()->voiceServiceConnectionStateChangedEvent(statusCode, statusString, mBuildID);  		}  		else if (!stricmp(eventTypeCstr, "AudioDeviceHotSwapEvent"))  		{ diff --git a/indra/newview/llvoicevivox.h b/indra/newview/llvoicevivox.h index cf30a4e86a..ebc3a62c35 100644 --- a/indra/newview/llvoicevivox.h +++ b/indra/newview/llvoicevivox.h @@ -465,6 +465,7 @@ protected:  	void participantAddedEvent(std::string &sessionHandle, std::string &sessionGroupHandle, std::string &uriString, std::string &alias, std::string &nameString, std::string &displayNameString, int participantType);  	void participantRemovedEvent(std::string &sessionHandle, std::string &sessionGroupHandle, std::string &uriString, std::string &alias, std::string &nameString);  	void participantUpdatedEvent(std::string &sessionHandle, std::string &sessionGroupHandle, std::string &uriString, std::string &alias, bool isModeratorMuted, bool isSpeaking, int volume, F32 energy); +	void voiceServiceConnectionStateChangedEvent(int statusCode, std::string &statusString, std::string &build_id);  	void auxAudioPropertiesEvent(F32 energy);  	void messageEvent(std::string &sessionHandle, std::string &uriString, std::string &alias, std::string &messageHeader, std::string &messageBody, std::string &applicationString);  	void sessionNotificationEvent(std::string &sessionHandle, std::string &uriString, std::string ¬ificationType); @@ -969,6 +970,7 @@ protected:  	std::string		actionString;  	std::string		connectorHandle;  	std::string		versionID; +	std::string		mBuildID;  	std::string		accountHandle;  	std::string		sessionHandle;  	std::string		sessionGroupHandle; diff --git a/indra/newview/llxmlrpctransaction.cpp b/indra/newview/llxmlrpctransaction.cpp index 32c8ce66a0..5c56a1d34f 100644 --- a/indra/newview/llxmlrpctransaction.cpp +++ b/indra/newview/llxmlrpctransaction.cpp @@ -40,6 +40,7 @@  #include "httpoptions.h"  #include "httpheaders.h"  #include "bufferarray.h" +#include "llversioninfo.h"  #include "llviewercontrol.h"  // Have to include these last to avoid queue redefinition! @@ -378,6 +379,15 @@ void LLXMLRPCTransaction::Impl::init(XMLRPC_REQUEST request, bool useGzip, const  	httpHeaders->append(HTTP_OUT_HEADER_CONTENT_TYPE, HTTP_CONTENT_TEXT_XML); +    std::string user_agent = llformat("%s %d.%d.%d (%d)", +        LLVersionInfo::instance().getChannel().c_str(), +        LLVersionInfo::instance().getMajor(), +        LLVersionInfo::instance().getMinor(), +        LLVersionInfo::instance().getPatch(), +        LLVersionInfo::instance().getBuild()); + +    httpHeaders->append(HTTP_OUT_HEADER_USER_AGENT, user_agent); +  	///* Setting the DNS cache timeout to -1 disables it completely.  	//This might help with bug #503 */  	//httpOpts->setDNSCacheTimeout(-1); diff --git a/indra/newview/skins/default/textures/icons/avaline_default_icon.jpg b/indra/newview/skins/default/textures/icons/avaline_default_icon.jpgBinary files differ deleted file mode 100644 index 3bb7f7183c..0000000000 --- a/indra/newview/skins/default/textures/icons/avaline_default_icon.jpg +++ /dev/null diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml index 0d0fc5c58e..4429a1677e 100644 --- a/indra/newview/skins/default/textures/textures.xml +++ b/indra/newview/skins/default/textures/textures.xml @@ -67,8 +67,6 @@ with the same filename but different name    <texture name="Audio_Off" file_name="icons/Audio_Off.png" preload="false" />    <texture name="Audio_Press" file_name="icons/Audio_Press.png" preload="false" /> -  <texture name="Avaline_Icon" file_name="icons/avaline_default_icon.jpg" preload="true" /> -    <texture name="BackArrow_Off" file_name="icons/BackArrow_Off.png" preload="false" />    <texture name="BackButton_Off" file_name="icons/back_arrow_off.png" preload="false" scale.left="22" scale.top="12" scale.right="25" scale.bottom="12" /> diff --git a/indra/newview/skins/default/xui/da/panel_region_texture.xml b/indra/newview/skins/default/xui/da/panel_region_texture.xml index 45946fd222..c8a3ad328e 100644 --- a/indra/newview/skins/default/xui/da/panel_region_texture.xml +++ b/indra/newview/skins/default/xui/da/panel_region_texture.xml @@ -7,8 +7,8 @@  		ukendt  	</text>  	<text name="detail_texture_text"> -		Terræn teksturer (kræver 512x512, 24 bit .tga filer) -	</text> +    Terræn teksturer (kræver 1024x1024, 24 bit .tga filer) +  </text>  	<text name="height_text_lbl">  		1 (Lav)  	</text> diff --git a/indra/newview/skins/default/xui/da/strings.xml b/indra/newview/skins/default/xui/da/strings.xml index 5f1bf73f26..e4f99d14e9 100644 --- a/indra/newview/skins/default/xui/da/strings.xml +++ b/indra/newview/skins/default/xui/da/strings.xml @@ -443,9 +443,6 @@ Prøv venligst om lidt igen.  	<string name="GroupNameNone">  		(ingen)  	</string> -	<string name="AvalineCaller"> -		Avaline opkalder [ORDER] -	</string>  	<string name="AssetErrorNone">  		Ingen fejl  	</string> diff --git a/indra/newview/skins/default/xui/de/panel_region_terrain.xml b/indra/newview/skins/default/xui/de/panel_region_terrain.xml index 7801be30e4..42ba5b5269 100644 --- a/indra/newview/skins/default/xui/de/panel_region_terrain.xml +++ b/indra/newview/skins/default/xui/de/panel_region_terrain.xml @@ -10,8 +10,8 @@  	<spinner label="Obere Terraingrenze" name="terrain_raise_spin"/>  	<spinner label="Untere Terraingrenze" name="terrain_lower_spin"/>  	<text name="detail_texture_text"> -		Terraintexturen (erfordert 24-Bit-.tga-Dateien mit einer Größe von 512x512) -	</text> +    Terraintexturen (erfordert 24-Bit-.tga-Dateien mit einer Größe von 1024x1024) +  </text>  	<text name="height_text_lbl">  		1 (niedrig)  	</text> diff --git a/indra/newview/skins/default/xui/de/strings.xml b/indra/newview/skins/default/xui/de/strings.xml index 4625c48714..0120f7e5bd 100644 --- a/indra/newview/skins/default/xui/de/strings.xml +++ b/indra/newview/skins/default/xui/de/strings.xml @@ -691,9 +691,6 @@ nächsten Eigentümer angehängt werden.  	<string name="GroupNameNone">  		(keiner)  	</string> -	<string name="AvalineCaller"> -		Avaline-Anfrufer [ORDER] -	</string>  	<string name="AssetErrorNone">  		Kein Fehler  	</string> diff --git a/indra/newview/skins/default/xui/en/floater_about_land.xml b/indra/newview/skins/default/xui/en/floater_about_land.xml index dee5e29a3c..4678d65b85 100644 --- a/indra/newview/skins/default/xui/en/floater_about_land.xml +++ b/indra/newview/skins/default/xui/en/floater_about_land.xml @@ -1893,7 +1893,29 @@ Only large parcels can be listed in search.               left="110"               name="parcel_enable_voice_channel_local"               width="300" /> -        </panel> +            <text +             type="string" +             length="1" +             follows="left|top" +             height="16" +             layout="topleft" +             left="10" +             mouse_opaque="false" +             name="media" +             top_pad="10" +             width="100"> +                Media: +            </text> +            <check_box +             height="16" +             label="Obscure MOAP" +             layout="topleft" +             left="110" +             left_pad="0" +             name="obscure_moap" +             tool_tip="Media on a prim located outside the parcel should not play automatically for an agent within this parcel and vice versa." +             width="300" /> +            </panel>          <panel           border="true"           follows="all" diff --git a/indra/newview/skins/default/xui/en/floater_report_abuse.xml b/indra/newview/skins/default/xui/en/floater_report_abuse.xml index d07e3cb31b..343e72f057 100644 --- a/indra/newview/skins/default/xui/en/floater_report_abuse.xml +++ b/indra/newview/skins/default/xui/en/floater_report_abuse.xml @@ -11,6 +11,11 @@       name="Screenshot">          Screenshot      </floater.string> +    <floater.string +     name="chat_report_format"> +Time: [MSG_TIME] +Text: [MSG_DESCRIPTION] +    </floater.string>      <texture_picker       allow_no_texture="true"       default_image_name="None" @@ -19,7 +24,7 @@       layout="topleft"       left="60"       name="screenshot" -     top="15" +     top="20"       width="220" />      <text       type="string" diff --git a/indra/newview/skins/default/xui/en/menu_avatar_icon.xml b/indra/newview/skins/default/xui/en/menu_avatar_icon.xml index 05ab4d35a0..9f394a4c74 100644 --- a/indra/newview/skins/default/xui/en/menu_avatar_icon.xml +++ b/indra/newview/skins/default/xui/en/menu_avatar_icon.xml @@ -96,6 +96,13 @@       name="Pay">         <on_click function="AvatarIcon.Action" parameter="pay" />      </menu_item_call> +    <menu_item_call +     label="Report Abuse" +     layout="topleft" +     name="Report Abuse"> +       <on_click function="AvatarIcon.Action" parameter="report_abuse" /> +       <on_enable function="AvatarIcon.Enable" parameter="report_abuse" /> +    </menu_item_call>      <menu_item_check       label="Block Voice"       layout="topleft" diff --git a/indra/newview/skins/default/xui/en/menu_conversation.xml b/indra/newview/skins/default/xui/en/menu_conversation.xml index ed362b36e5..59e6106a28 100644 --- a/indra/newview/skins/default/xui/en/menu_conversation.xml +++ b/indra/newview/skins/default/xui/en/menu_conversation.xml @@ -132,6 +132,13 @@          <on_click function="Avatar.DoToSelected" parameter="pay" />          <on_enable function="Avatar.EnableItem" parameter="can_pay" />      </menu_item_call> +    <menu_item_call +     label="Report Abuse" +     layout="topleft" +     name="report_abuse"> +       <on_click function="Avatar.DoToSelected" parameter="report_abuse" /> +       <on_enable function="Avatar.EnableItem" parameter="report_abuse" /> +    </menu_item_call>      <menu_item_check       label="Block Voice"       layout="topleft" diff --git a/indra/newview/skins/default/xui/en/menu_im_conversation.xml b/indra/newview/skins/default/xui/en/menu_im_conversation.xml index 43287c6ec3..b38fae4404 100644 --- a/indra/newview/skins/default/xui/en/menu_im_conversation.xml +++ b/indra/newview/skins/default/xui/en/menu_im_conversation.xml @@ -79,6 +79,13 @@      </menu_item_call>      <menu_item_separator       layout="topleft"/> +    <menu_item_call +     label="Report Abuse" +     layout="topleft" +     name="Report Abuse"> +       <on_click function="Avatar.GearDoToSelected" parameter="report_abuse" /> +       <on_enable function="Avatar.EnableGearItem" parameter="report_abuse" /> +    </menu_item_call>      <menu_item_check       label="Block Voice"       layout="topleft" diff --git a/indra/newview/skins/default/xui/en/menu_url_agent.xml b/indra/newview/skins/default/xui/en/menu_url_agent.xml index e8b6116026..5ca8be2123 100644 --- a/indra/newview/skins/default/xui/en/menu_url_agent.xml +++ b/indra/newview/skins/default/xui/en/menu_url_agent.xml @@ -29,7 +29,14 @@       name="remove_friend">          <menu_item_call.on_click           function="Url.RemoveFriend" /> -        </menu_item_call> +    </menu_item_call> +    <menu_item_call +     label="Report Abuse" +     layout="topleft" +     name="report_abuse"> +        <menu_item_call.on_click +         function="Url.ReportAbuse" /> +    </menu_item_call>      <menu_item_separator       layout="topleft" />      <menu_item_call diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml index e2d088c697..6c317f9995 100644 --- a/indra/newview/skins/default/xui/en/menu_viewer.xml +++ b/indra/newview/skins/default/xui/en/menu_viewer.xml @@ -422,7 +422,9 @@          </menu_item_call>                 <menu_item_call           label="Stop animations" -         name="Stop Animating My Avatar"> +         name="Stop Animating My Avatar" +         allow_key_repeat="true" +         shortcut="alt|shift|A">            <menu_item_call.on_click             function="Tools.StopAllAnimations" />          </menu_item_call> @@ -2646,6 +2648,12 @@ function="World.EnvPreset"                   function="Advanced.ForceErrorBadMemoryAccess" />              </menu_item_call>              <menu_item_call +             label="Force Bad Memory Access in Coroutine" +             name="Force Bad Memory Access in Coroutine"> +                <menu_item_call.on_click +                 function="Advanced.ForceErrorBadMemoryAccessCoro" /> +            </menu_item_call> +            <menu_item_call               label="Force Infinite Loop"               name="Force Infinite Loop">                  <menu_item_call.on_click diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index 998c7a08d1..1ddec93668 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -1521,7 +1521,7 @@ Delete pick <nolink>[PICK]</nolink>?    <notification     icon="alert.tga"     name="ProfileUnpublishedClassified" -   type="alert"> +   type="alertmodal">      You have unpublished classifieds. They will be lost if you close the window.      <tag>confirm</tag>      <usetemplate @@ -1533,7 +1533,7 @@ Delete pick <nolink>[PICK]</nolink>?    <notification     icon="alert.tga"     name="ProfileUnsavedChanges" -   type="alert"> +   type="alertmodal">      You have usaved changes.      <tag>confirm</tag>      <tag>save</tag> @@ -3945,7 +3945,7 @@ Are you sure you want to return objects owned by [USER_NAME]?  Couldn't set region textures:  Terrain texture [TEXTURE_NUM] has an invalid bit depth of [TEXTURE_BIT_DEPTH]. -Replace texture [TEXTURE_NUM] with a 24-bit 512x512 or smaller image then click "Apply" again. +Replace texture [TEXTURE_NUM] with a 24-bit [MAX_SIZE]x[MAX_SIZE] or smaller image then click "Apply" again.    <tag>fail</tag>    </notification> @@ -3956,7 +3956,7 @@ Replace texture [TEXTURE_NUM] with a 24-bit 512x512 or smaller image then click  Couldn't set region textures:  Terrain texture [TEXTURE_NUM] is too large at [TEXTURE_SIZE_X]x[TEXTURE_SIZE_Y]. -Replace texture [TEXTURE_NUM] with a 24-bit 512x512 or smaller image then click "Apply" again. +Replace texture [TEXTURE_NUM] with a 24-bit [MAX_SIZE]x[MAX_SIZE] or smaller image then click "Apply" again.    </notification>    <notification diff --git a/indra/newview/skins/default/xui/en/panel_region_terrain.xml b/indra/newview/skins/default/xui/en/panel_region_terrain.xml index 8243c2715d..2aaea04a6d 100644 --- a/indra/newview/skins/default/xui/en/panel_region_terrain.xml +++ b/indra/newview/skins/default/xui/en/panel_region_terrain.xml @@ -86,7 +86,7 @@       name="detail_texture_text"       top="110"       width="300"> -        Terrain Textures (requires 512x512, 24 bit .tga files) +        Terrain Textures (requires 1024x1024, 24 bit .tga files)      </text>      <texture_picker       follows="left|top" diff --git a/indra/newview/skins/default/xui/en/panel_tools_texture.xml b/indra/newview/skins/default/xui/en/panel_tools_texture.xml index 0cbd7fe2dd..c7052bb737 100644 --- a/indra/newview/skins/default/xui/en/panel_tools_texture.xml +++ b/indra/newview/skins/default/xui/en/panel_tools_texture.xml @@ -550,10 +550,7 @@  			 top_pad="4"  			 tool_tip="Add Media"  			 label="Choose..." -			 width="85"> -				<button.commit_callback -				function="BuildTool.AddMedia"/> -			</button> +			 width="85"/>  			<button  			 follows="top|left"  			 height="18" @@ -563,10 +560,7 @@  			 tool_tip="Delete this media texture"  			 top_delta="0"  			 label="Remove" -			 width="85"> -				<button.commit_callback -				function="BuildTool.DeleteMedia"/> -			</button> +			 width="85"/>              <button  			 follows="left|top"  			 height="18" diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index 8c2db9bde3..6f95e282ca 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -348,8 +348,6 @@ can be attached to notecards.  	<!-- Group name: text shown for LLUUID::null -->  	<string name="GroupNameNone">(none)</string> -	<string name="AvalineCaller">Avaline Caller [ORDER]</string> -  	<!-- Asset errors. Used in llassetstorage.cpp, translation from error code to error message. -->  	<string name="AssetErrorNone">No error</string>  	<string name="AssetErrorRequestFailed">Asset request: failed</string> @@ -2342,6 +2340,14 @@ The [[MARKETPLACE_CREATE_STORE_URL] Marketplace store] is returning errors.  An error occurred while opening Marketplace Listings.  If you continue to receive this message, please contact Second Life support for assistance at http://support.secondlife.com  	</string> +	<string name="InventoryMarketplaceConnectionError"> +Marketplace Listings failed to connect. +If you continue to receive this message, please contact Second Life support for assistance at http://support.secondlife.com +	</string> +	<string name="InventoryMarketplaceConnectionErrorReason"> +Marketplace Listings failed to connect. Reason: [REASON] +If you continue to receive this message, please contact Second Life support for assistance at http://support.secondlife.com +	</string>  	<string name="InventoryMarketplaceListingsNoItemsTitle">Your Marketplace Listings folder is empty.</string>  	<string name="InventoryMarketplaceListingsNoItemsTooltip"></string>  	<string name="InventoryMarketplaceListingsNoItems"> diff --git a/indra/newview/skins/default/xui/es/panel_region_terrain.xml b/indra/newview/skins/default/xui/es/panel_region_terrain.xml index cb6c03dbb5..9aba5299cb 100644 --- a/indra/newview/skins/default/xui/es/panel_region_terrain.xml +++ b/indra/newview/skins/default/xui/es/panel_region_terrain.xml @@ -12,8 +12,8 @@ del terreno" name="terrain_raise_spin"/>  	<spinner bottom_delta="-34" label="Límite de bajada del   terreno" name="terrain_lower_spin"/>  	<text name="detail_texture_text"> -		Texturas del terreno (requiere archivos .tga de 512x512, 24 bits) -	</text> +    Texturas del terreno (requiere archivos .tga de 1024x1024, 24 bits) +  </text>  	<text name="height_text_lbl">  		1 (bajo)  	</text> diff --git a/indra/newview/skins/default/xui/es/strings.xml b/indra/newview/skins/default/xui/es/strings.xml index 20f7f81962..5a03e65b49 100644 --- a/indra/newview/skins/default/xui/es/strings.xml +++ b/indra/newview/skins/default/xui/es/strings.xml @@ -680,9 +680,6 @@ pueden adjuntarse a las notas.  	<string name="GroupNameNone">  		(ninguno)  	</string> -	<string name="AvalineCaller"> -		Avaline: [ORDER] -	</string>  	<string name="AssetErrorNone">  		No hay ningún error  	</string> diff --git a/indra/newview/skins/default/xui/fr/panel_region_terrain.xml b/indra/newview/skins/default/xui/fr/panel_region_terrain.xml index 97f486d3a3..bbab00ca24 100644 --- a/indra/newview/skins/default/xui/fr/panel_region_terrain.xml +++ b/indra/newview/skins/default/xui/fr/panel_region_terrain.xml @@ -12,8 +12,8 @@ terrain" name="terrain_raise_spin"/>  	<spinner bottom_delta="-34" label="Limite d'abaissement   du terrain" name="terrain_lower_spin"/>  	<text name="detail_texture_text"> -		Textures du terrain (fichiers .tga 512 x 512, 24 bit requis) -	</text> +    Textures du terrain (fichiers .tga 1024 x 1024, 24 bit requis) +  </text>  	<text name="height_text_lbl">  		1 (Bas)  	</text> diff --git a/indra/newview/skins/default/xui/fr/strings.xml b/indra/newview/skins/default/xui/fr/strings.xml index 943d1635cd..21825c6b2f 100644 --- a/indra/newview/skins/default/xui/fr/strings.xml +++ b/indra/newview/skins/default/xui/fr/strings.xml @@ -692,9 +692,6 @@ peuvent être joints aux notes.  	<string name="GroupNameNone">  		(aucun)  	</string> -	<string name="AvalineCaller"> -		Appelant Avaline [ORDER] -	</string>  	<string name="AssetErrorNone">  		Aucune erreur  	</string> diff --git a/indra/newview/skins/default/xui/it/panel_region_terrain.xml b/indra/newview/skins/default/xui/it/panel_region_terrain.xml index c61ac3ecce..e08c55f63b 100644 --- a/indra/newview/skins/default/xui/it/panel_region_terrain.xml +++ b/indra/newview/skins/default/xui/it/panel_region_terrain.xml @@ -12,8 +12,8 @@ terreno" name="terrain_raise_spin"/>  	<spinner bottom_delta="-34" label="Limite di abbassamento   del terreno" name="terrain_lower_spin"/>  	<text name="detail_texture_text"> -		Texture terreno (richiede file 512x512, 24 bit .tga) -	</text> +    Texture terreno (richiede file 1024x1024, 24 bit .tga) +  </text>  	<text name="height_text_lbl">  		1 (basso)  	</text> diff --git a/indra/newview/skins/default/xui/it/strings.xml b/indra/newview/skins/default/xui/it/strings.xml index 52f5f7af18..1ebdadb930 100644 --- a/indra/newview/skins/default/xui/it/strings.xml +++ b/indra/newview/skins/default/xui/it/strings.xml @@ -685,9 +685,6 @@ possono essere allegati ai biglietti.  	<string name="GroupNameNone">  		(nessuno)  	</string> -	<string name="AvalineCaller"> -		Chiamante Avaline [ORDER] -	</string>  	<string name="AssetErrorNone">  		Nessun errore  	</string> diff --git a/indra/newview/skins/default/xui/ja/panel_region_terrain.xml b/indra/newview/skins/default/xui/ja/panel_region_terrain.xml index fb853c1925..c1080a7d7b 100644 --- a/indra/newview/skins/default/xui/ja/panel_region_terrain.xml +++ b/indra/newview/skins/default/xui/ja/panel_region_terrain.xml @@ -10,8 +10,8 @@  	<spinner label="地形の上昇限度" name="terrain_raise_spin"/>  	<spinner label="地形の下降限度" name="terrain_lower_spin"/>  	<text name="detail_texture_text"> -		地形テクスチャ(512x512 の 24 bit .tga ファイル) -	</text> +    地形テクスチャ(1024x1024 の 24 bit .tga ファイル) +  </text>  	<text name="height_text_lbl">  		1(低)  	</text> diff --git a/indra/newview/skins/default/xui/ja/strings.xml b/indra/newview/skins/default/xui/ja/strings.xml index c5bba021ac..d90772ab0a 100644 --- a/indra/newview/skins/default/xui/ja/strings.xml +++ b/indra/newview/skins/default/xui/ja/strings.xml @@ -691,9 +691,6 @@ support@secondlife.com にお問い合わせください。  	<string name="GroupNameNone">  		(なし)  	</string> -	<string name="AvalineCaller"> -		Avaline コール [ORDER] -	</string>  	<string name="AssetErrorNone">  		エラーなし  	</string> diff --git a/indra/newview/skins/default/xui/pl/panel_region_terrain.xml b/indra/newview/skins/default/xui/pl/panel_region_terrain.xml index f086a52dcd..2d4286334f 100644 --- a/indra/newview/skins/default/xui/pl/panel_region_terrain.xml +++ b/indra/newview/skins/default/xui/pl/panel_region_terrain.xml @@ -7,7 +7,7 @@  	<spinner label="Górny limit terenu" name="terrain_raise_spin" />  	<spinner label="Dolny limit terenu" name="terrain_lower_spin" />  	<text name="detail_texture_text"> -		Tekstury terenu (512x512 / 1024x1024, 24 bitowy plik .tga) +		Tekstury terenu (1024x1024, 24 bitowy plik .tga)  	</text>  	<text name="height_text_lbl">  		1 (Nisko) diff --git a/indra/newview/skins/default/xui/pl/strings.xml b/indra/newview/skins/default/xui/pl/strings.xml index 2b182dc3cc..90d2d86c02 100644 --- a/indra/newview/skins/default/xui/pl/strings.xml +++ b/indra/newview/skins/default/xui/pl/strings.xml @@ -596,9 +596,6 @@ Spróbuj zalogować się ponownie za minutę.  	<string name="GroupNameNone">  		(brak danych)  	</string> -	<string name="AvalineCaller"> -		Avaline [ORDER] -	</string>  	<string name="AssetErrorNone">  		Brak błędu  	</string> diff --git a/indra/newview/skins/default/xui/pt/panel_region_terrain.xml b/indra/newview/skins/default/xui/pt/panel_region_terrain.xml index 74330a8946..1d312aeed9 100644 --- a/indra/newview/skins/default/xui/pt/panel_region_terrain.xml +++ b/indra/newview/skins/default/xui/pt/panel_region_terrain.xml @@ -12,8 +12,8 @@ terreno" name="terrain_raise_spin"/>  	<spinner bottom_delta="-34" label="Limite mais baixo do   terreno" name="terrain_lower_spin"/>  	<text name="detail_texture_text"> -		Texturas de terreno (exige arquivos .tga 512x512, 24 bit) -	</text> +    Texturas de terreno (exige arquivos .tga 1024x1024, 24 bit) +  </text>  	<text name="height_text_lbl">  		1 (Baixo)  	</text> diff --git a/indra/newview/skins/default/xui/pt/strings.xml b/indra/newview/skins/default/xui/pt/strings.xml index 7a425a2622..ae452d6a4d 100644 --- a/indra/newview/skins/default/xui/pt/strings.xml +++ b/indra/newview/skins/default/xui/pt/strings.xml @@ -47,7 +47,7 @@ Placa de vídeo: [GRAPHICS_CARD_VENDOR]  Placa gráfica: [GRAPHICS_CARD]  	</string>  	<string name="AboutDriver"> -		Versão do driver de vídeo Windows: [GRAPHICS_CARD_VENDOR] +		Versão do driver de vídeo Windows: [GRAPHICS_DRIVER_VERSION]  	</string>  	<string name="AboutOGL">  		Versão do OpenGL: [OPENGL_VERSION] @@ -645,9 +645,6 @@ ser anexado às anotações.  	<string name="GroupNameNone">  		(nenhum)  	</string> -	<string name="AvalineCaller"> -		Interlocutor Avaline [ORDER] -	</string>  	<string name="AssetErrorNone">  		Nenhum erro  	</string> diff --git a/indra/newview/skins/default/xui/ru/panel_region_terrain.xml b/indra/newview/skins/default/xui/ru/panel_region_terrain.xml index af25565226..76b4f513a8 100644 --- a/indra/newview/skins/default/xui/ru/panel_region_terrain.xml +++ b/indra/newview/skins/default/xui/ru/panel_region_terrain.xml @@ -10,8 +10,8 @@  	<spinner label="Верх. точка ландшафта" name="terrain_raise_spin"/>  	<spinner label="Ниж. точка ландшафта" name="terrain_lower_spin"/>  	<text name="detail_texture_text"> -		Текстуры ландшафта (требования: 512x512, 24-битные, TGA) -	</text> +    Текстуры ландшафта (требования: 1024x1024, 24-битные, TGA) +  </text>  	<text name="height_text_lbl">  		1 (Низ)  	</text> diff --git a/indra/newview/skins/default/xui/ru/strings.xml b/indra/newview/skins/default/xui/ru/strings.xml index c0dc32340a..61d836a2d1 100644 --- a/indra/newview/skins/default/xui/ru/strings.xml +++ b/indra/newview/skins/default/xui/ru/strings.xml @@ -689,9 +689,6 @@ support@secondlife.com.  	<string name="GroupNameNone">  		(нет)  	</string> -	<string name="AvalineCaller"> -		[ORDER] абонента Avaline -	</string>  	<string name="AssetErrorNone">  		Ошибок нет  	</string> diff --git a/indra/newview/skins/default/xui/tr/panel_region_terrain.xml b/indra/newview/skins/default/xui/tr/panel_region_terrain.xml index 3226ee008e..e25047301d 100644 --- a/indra/newview/skins/default/xui/tr/panel_region_terrain.xml +++ b/indra/newview/skins/default/xui/tr/panel_region_terrain.xml @@ -10,8 +10,8 @@  	<spinner label="Yüzey Yükslt. Limiti" name="terrain_raise_spin"/>  	<spinner label="Yüzey Alçatma Limiti" name="terrain_lower_spin"/>  	<text name="detail_texture_text"> -		Yüzey Dokuları (512x512, 24 bit .tga dosyalar gerektirir) -	</text> +    Yüzey Dokuları (1024x1024, 24 bit .tga dosyalar gerektirir) +  </text>  	<text name="height_text_lbl">  		1 (Düşük)  	</text> diff --git a/indra/newview/skins/default/xui/tr/strings.xml b/indra/newview/skins/default/xui/tr/strings.xml index d1076b8b79..e709a4c5d6 100644 --- a/indra/newview/skins/default/xui/tr/strings.xml +++ b/indra/newview/skins/default/xui/tr/strings.xml @@ -689,9 +689,6 @@ kartlarına eklenebilir.  	<string name="GroupNameNone">  		(hiçbiri)  	</string> -	<string name="AvalineCaller"> -		Avaline Arayanı [ORDER] -	</string>  	<string name="AssetErrorNone">  		Hata yok  	</string> diff --git a/indra/newview/skins/default/xui/zh/panel_region_terrain.xml b/indra/newview/skins/default/xui/zh/panel_region_terrain.xml index 85e759e445..81bce46876 100644 --- a/indra/newview/skins/default/xui/zh/panel_region_terrain.xml +++ b/indra/newview/skins/default/xui/zh/panel_region_terrain.xml @@ -10,7 +10,7 @@  	<spinner label="地形提升限制" name="terrain_raise_spin"/>  	<spinner label="地形降低限制" name="terrain_lower_spin"/>  	<text name="detail_texture_text"> -		地形材質(須 512x512,24 位元 .tga 檔格式) +		地形材質(須 1024x1024,24 位元 .tga 檔格式)  	</text>  	<text name="height_text_lbl">  		1(低) diff --git a/indra/newview/skins/default/xui/zh/strings.xml b/indra/newview/skins/default/xui/zh/strings.xml index a4e1b21ce6..bdb16c9bf1 100644 --- a/indra/newview/skins/default/xui/zh/strings.xml +++ b/indra/newview/skins/default/xui/zh/strings.xml @@ -685,9 +685,6 @@ http://secondlife.com/viewer-access-faq  	<string name="GroupNameNone">  		(無)  	</string> -	<string name="AvalineCaller"> -		Avaline 通話者 [ORDER] -	</string>  	<string name="AssetErrorNone">  		無錯誤  	</string> diff --git a/indra/viewer_components/login/lllogin.cpp b/indra/viewer_components/login/lllogin.cpp index 8a7e6407ed..5d50d1e182 100644 --- a/indra/viewer_components/login/lllogin.cpp +++ b/indra/viewer_components/login/lllogin.cpp @@ -257,21 +257,25 @@ void LLLogin::Impl::loginCoro(std::string uri, LLSD login_params)                  if (printable_params["wait_for_updater"].asBoolean())                  {                      std::string reason_response = responses["data"]["reason"].asString(); -                    if (reason_response == "update") // No point waiting if not an update +                    // Timeout should produce the isUndefined() object passed here. +                    if (reason_response == "update")                      { -                        // Timeout should produce the isUndefined() object passed here.                          LL_INFOS("LLLogin") << "Login failure, waiting for sync from updater" << LL_ENDL;                          updater = llcoro::suspendUntilEventOnWithTimeout(sSyncPoint, 10, LLSD()); - -                        if (updater.isUndefined()) -                        { -                            LL_WARNS("LLLogin") << "Failed to hear from updater, proceeding with fail.login" -                                << LL_ENDL; -                        } -                        else -                        { -                            LL_DEBUGS("LLLogin") << "Got responses from updater and login.cgi" << LL_ENDL; -                        } +                    } +                    else +                    { +                        LL_DEBUGS("LLLogin") << "Login failure, waiting for sync from updater" << LL_ENDL; +                        updater = llcoro::suspendUntilEventOnWithTimeout(sSyncPoint, 3, LLSD()); +                    } +                    if (updater.isUndefined()) +                    { +                        LL_WARNS("LLLogin") << "Failed to hear from updater, proceeding with fail.login" +                                            << LL_ENDL; +                    } +                    else +                    { +                        LL_DEBUGS("LLLogin") << "Got responses from updater and login.cgi" << LL_ENDL;                      }                  } | 
