diff options
107 files changed, 2087 insertions, 1339 deletions
| @@ -480,3 +480,4 @@ d076568ff7883b41c149e6afb421f39c29dbfe2b 3.7.4-release  fc066b82343fca51f9c1b8eda0abc6bee9bb4503 3.7.5-release  d029faf69f20a23007f32420a1ac6a3b89a6d441 3.7.6-release  83959480cb986522d07b151a0c778ab7f920d41b 3.7.7-release +bba9b3722eea08949e4ff69591f736bf0f808434 3.7.8-release diff --git a/indra/cmake/FMODEX.cmake b/indra/cmake/FMODEX.cmake index 4981bfb7a6..720933d1b7 100644 --- a/indra/cmake/FMODEX.cmake +++ b/indra/cmake/FMODEX.cmake @@ -39,7 +39,7 @@ if (FMODEX)              optimized fmodex)        endif (WINDOWS)        set(FMODEX_LIBRARIES ${FMODEX_LIBRARY}) -      set(FMODEX_INCLUDE_DIR ${LIBS_PREBUILT_DIR}/include/) +      set(FMODEX_INCLUDE_DIR ${LIBS_PREBUILT_DIR}/include/fmodex)      endif (FMODEX_LIBRARY AND FMODEX_INCLUDE_DIR)    endif (USESYSTEMLIBS)  endif (FMODEX) diff --git a/indra/llaudio/llaudiodecodemgr.cpp b/indra/llaudio/llaudiodecodemgr.cpp index 27add74b26..20a7afc748 100755 --- a/indra/llaudio/llaudiodecodemgr.cpp +++ b/indra/llaudio/llaudiodecodemgr.cpp @@ -572,9 +572,14 @@ void LLAudioDecodeMgr::Impl::processQueue(const F32 num_secs)  				// We had an error when decoding, abort.  				LL_WARNS("AudioEngine") << mCurrentDecodep->getUUID() << " has invalid vorbis data, aborting decode" << LL_ENDL;  				mCurrentDecodep->flushBadFile(); -				LLAudioData *adp = gAudiop->getAudioData(mCurrentDecodep->getUUID()); -				adp->setHasValidData(false); -				adp->setHasCompletedDecode(true); + +				if (gAudiop) +				{ +					LLAudioData *adp = gAudiop->getAudioData(mCurrentDecodep->getUUID()); +					adp->setHasValidData(false); +					adp->setHasCompletedDecode(true); +				} +  				mCurrentDecodep = NULL;  				done = TRUE;  			} @@ -586,7 +591,7 @@ void LLAudioDecodeMgr::Impl::processQueue(const F32 num_secs)  			}  			else if (mCurrentDecodep)  			{ -				if (mCurrentDecodep->finishDecode()) +				if (gAudiop && mCurrentDecodep->finishDecode())  				{  					// We finished!  					LLAudioData *adp = gAudiop->getAudioData(mCurrentDecodep->getUUID()); @@ -628,7 +633,7 @@ void LLAudioDecodeMgr::Impl::processQueue(const F32 num_secs)  				LLUUID uuid;  				uuid = mDecodeQueue.front();  				mDecodeQueue.pop_front(); -				if (gAudiop->hasDecodedFile(uuid)) +				if (!gAudiop || gAudiop->hasDecodedFile(uuid))  				{  					// This file has already been decoded, don't decode it again.  					continue; @@ -674,7 +679,7 @@ void LLAudioDecodeMgr::processQueue(const F32 num_secs)  BOOL LLAudioDecodeMgr::addDecodeRequest(const LLUUID &uuid)  { -	if (gAudiop->hasDecodedFile(uuid)) +	if (gAudiop && gAudiop->hasDecodedFile(uuid))  	{  		// Already have a decoded version, don't need to decode it.  		LL_DEBUGS("AudioEngine") << "addDecodeRequest for " << uuid << " has decoded file already" << LL_ENDL; diff --git a/indra/llaudio/llaudioengine.cpp b/indra/llaudio/llaudioengine.cpp index 5fc5e2ac46..f49028aad5 100755 --- a/indra/llaudio/llaudioengine.cpp +++ b/indra/llaudio/llaudioengine.cpp @@ -674,8 +674,8 @@ void LLAudioEngine::cleanupBuffer(LLAudioBuffer *bufferp)  bool LLAudioEngine::preloadSound(const LLUUID &uuid)  {  	LL_DEBUGS("AudioEngine")<<"( "<<uuid<<" )"<<LL_ENDL; -	 -	gAudiop->getAudioData(uuid);	// We don't care about the return value, this is just to make sure + +	getAudioData(uuid);	// We don't care about the return value, this is just to make sure  									// that we have an entry, which will mean that the audio engine knows about this  	if (gAudioDecodeMgrp->addDecodeRequest(uuid)) @@ -828,7 +828,7 @@ void LLAudioEngine::triggerSound(const LLUUID &audio_uuid, const LLUUID& owner_i  	source_id.generate();  	LLAudioSource *asp = new LLAudioSource(source_id, owner_id, gain, type); -	gAudiop->addAudioSource(asp); +	addAudioSource(asp);  	if (pos_global.isExactlyZero())  	{  		asp->setAmbient(true); @@ -1212,8 +1212,8 @@ void LLAudioEngine::startNextTransfer()  	if (asset_id.notNull())  	{  		LL_INFOS() << "Getting asset data for: " << asset_id << LL_ENDL; -		gAudiop->mCurrentTransfer = asset_id; -		gAudiop->mCurrentTransferTimer.reset(); +		mCurrentTransfer = asset_id; +		mCurrentTransferTimer.reset();  		gAssetStorage->getAssetData(asset_id, LLAssetType::AT_SOUND,  									assetCallback, NULL);  	} @@ -1227,6 +1227,12 @@ void LLAudioEngine::startNextTransfer()  // static  void LLAudioEngine::assetCallback(LLVFS *vfs, const LLUUID &uuid, LLAssetType::EType type, void *user_data, S32 result_code, LLExtStat ext_status)  { +	if (!gAudiop) +	{ +		LL_WARNS("AudioEngine") << "LLAudioEngine instance doesn't exist!" << LL_ENDL; +		return; +	} +  	if (result_code)  	{  		LL_INFOS() << "Boom, error in audio file transfer: " << LLAssetStorage::getErrorString( result_code ) << " (" << result_code << ")" << LL_ENDL; @@ -1351,7 +1357,12 @@ void LLAudioSource::updatePriority()  		// Priority is based on distance  		LLVector3 dist_vec;  		dist_vec.setVec(getPositionGlobal()); -		dist_vec -= gAudiop->getListenerPos(); + +		if (gAudiop) +		{ +			dist_vec -= gAudiop->getListenerPos(); +		} +  		F32 dist_squared = llmax(1.f, dist_vec.magVecSquared());  		mPriority = mGain / dist_squared; @@ -1369,6 +1380,11 @@ bool LLAudioSource::setupChannel()  		return false;  	} +	if (!gAudiop) +	{ +		LL_WARNS("AudioEngine") << "LLAudioEngine instance doesn't exist!" << LL_ENDL; +		return false; +	}  	if (!mChannelp)  	{ @@ -1412,6 +1428,12 @@ bool LLAudioSource::play(const LLUUID &audio_uuid)  	// Reset our age timeout if someone attempts to play the source.  	mAgeTimer.reset(); +	if (!gAudiop) +	{ +		LL_WARNS("AudioEngine") << "LLAudioEngine instance doesn't exist!" << LL_ENDL; +		return false; +	} +  	LLAudioData *adp = gAudiop->getAudioData(audio_uuid);  	addAudioData(adp); @@ -1519,6 +1541,13 @@ void LLAudioSource::addAudioData(LLAudioData *adp, const bool set_current)  {  	// Only handle a single piece of audio data associated with a source right now,  	// until I implement prefetch. + +	if (!gAudiop) +	{ +		LL_WARNS("AudioEngine") << "LLAudioEngine instance doesn't exist!" << LL_ENDL; +		return; +	} +  	if (set_current)  	{  		if (!mCurrentDatap) @@ -1689,6 +1718,12 @@ void LLAudioChannel::setSource(LLAudioSource *sourcep)  bool LLAudioChannel::updateBuffer()  { +	if (!gAudiop) +	{ +		LL_WARNS("AudioEngine") << "LLAudioEngine instance doesn't exist!" << LL_ENDL; +		return false; +	} +  	if (!mCurrentSourcep)  	{  		// This channel isn't associated with any source, nothing @@ -1697,10 +1732,7 @@ bool LLAudioChannel::updateBuffer()  	}  	// Initialize the channel's gain setting for this sound. -	if(gAudiop) -	{ -		setSecondaryGain(gAudiop->getSecondaryGain(mCurrentSourcep->getType())); -	} +	setSecondaryGain(gAudiop->getSecondaryGain(mCurrentSourcep->getType()));  	LLAudioBuffer *bufferp = mCurrentSourcep->getCurrentBuffer();  	if (bufferp == mCurrentBufferp) @@ -1757,8 +1789,14 @@ LLAudioData::LLAudioData(const LLUUID &uuid) :  		// This is a null sound.  		return;  	} + +	if (!gAudiop) +	{ +		LL_WARNS("AudioEngine") << "LLAudioEngine instance doesn't exist!" << LL_ENDL; +		return; +	} -	if (gAudiop && gAudiop->hasDecodedFile(uuid)) +	if (gAudiop->hasDecodedFile(uuid))  	{  		// Already have a decoded version, don't need to decode it.  		setHasLocalData(true); @@ -1781,6 +1819,12 @@ bool LLAudioData::load()  		LL_INFOS() << "Already have a buffer for this sound, don't bother loading!" << LL_ENDL;  		return true;  	} + +	if (!gAudiop) +	{ +		LL_WARNS("AudioEngine") << "LLAudioEngine instance doesn't exist!" << LL_ENDL; +		return false; +	}  	mBufferp = gAudiop->getFreeBuffer();  	if (!mBufferp) diff --git a/indra/llcommon/llinitparam.h b/indra/llcommon/llinitparam.h index 880cd0a370..2532566319 100755 --- a/indra/llcommon/llinitparam.h +++ b/indra/llcommon/llinitparam.h @@ -502,10 +502,10 @@ namespace LLInitParam  			{  				return found_it->second(*this, (void*)¶m);  			} -			 +  			return false;  		} -			 +  		template <typename T> bool readValue(T& param, typename boost::enable_if<boost::is_enum<T> >::type* dummy = 0)  		{  			parser_read_func_map_t::iterator found_it = mParserReadFuncs->find(&typeid(T)); @@ -522,20 +522,20 @@ namespace LLInitParam  					bool parsed = found_it->second(*this, (void*)&int_value);  					param = (T)int_value;  					return parsed; -					}  				} -				return false;  			} +			return false; +		}  		template <typename T> bool writeValue(const T& param, name_stack_t& name_stack) -			{ +		{  			parser_write_func_map_t::iterator found_it = mParserWriteFuncs->find(&typeid(T));  			if (found_it != mParserWriteFuncs->end()) -				{ +			{  				return found_it->second(*this, (const void*)¶m, name_stack); -				} -				return false;  			} +			return false; +		}  		// dispatch inspection to registered inspection functions, for each parameter in a param block  		template <typename T> bool inspectValue(name_stack_t& name_stack, S32 min_count, S32 max_count, const possible_values_t* possible_values) diff --git a/indra/llmessage/llregionflags.h b/indra/llmessage/llregionflags.h index 1cf940918b..40d7b04a90 100755 --- a/indra/llmessage/llregionflags.h +++ b/indra/llmessage/llregionflags.h @@ -76,6 +76,8 @@ const U64 REGION_FLAGS_DENY_ANONYMOUS			= (1 << 23);  const U64 REGION_FLAGS_ALLOW_PARCEL_CHANGES		= (1 << 26); +const U64 REGION_FLAGS_BLOCK_FLYOVER = (1 << 27); +  const U64 REGION_FLAGS_ALLOW_VOICE = (1 << 28);  const U64 REGION_FLAGS_BLOCK_PARCEL_SEARCH = (1 << 29); diff --git a/indra/llprimitive/llmodel.cpp b/indra/llprimitive/llmodel.cpp index c8e4d1018b..57a698b98f 100755 --- a/indra/llprimitive/llmodel.cpp +++ b/indra/llprimitive/llmodel.cpp @@ -170,6 +170,11 @@ LLModel::EModelStatus load_face_from_dom_triangles(std::vector<LLVolumeFace>& fa  		return LLModel::BAD_ELEMENT;  	} +	if (!pos_source) +	{ +		llwarns << "Unable to process mesh without position data; invalid model;  invalid model." << llendl; +		return LLModel::BAD_ELEMENT; +	}  	domPRef p = tri->getP();  	domListOfUInts& idx = p->getValue(); @@ -179,19 +184,22 @@ LLModel::EModelStatus load_face_from_dom_triangles(std::vector<LLVolumeFace>& fa  	domListOfFloats& tc = tc_source ? tc_source->getFloat_array()->getValue() : dummy ;  	domListOfFloats& n = norm_source ? norm_source->getFloat_array()->getValue() : dummy ; -	if (pos_source) -	{ -		face.mExtents[0].set(v[0], v[1], v[2]); -		face.mExtents[1].set(v[0], v[1], v[2]); -	} -	  	LLVolumeFace::VertexMapData::PointMap point_map; -	 +		  	U32 index_count  = idx.getCount();  	U32 vertex_count = pos_source  ? v.getCount()  : 0;  	U32 tc_count     = tc_source   ? tc.getCount() : 0;  	U32 norm_count   = norm_source ? n.getCount()  : 0; +	if (vertex_count == 0) +	{ +		llwarns << "Unable to process mesh with empty position array; invalid model." << llendl; +		return LLModel::BAD_ELEMENT; +	} + +	face.mExtents[0].set(v[0], v[1], v[2]); +	face.mExtents[1].set(v[0], v[1], v[2]); +	  	for (U32 i = 0; i < index_count; i += idx_stride)  	{  		LLVolumeFace::VertexData cv; diff --git a/indra/llui/llfolderview.cpp b/indra/llui/llfolderview.cpp index 53f2e15ed0..b92e298348 100755 --- a/indra/llui/llfolderview.cpp +++ b/indra/llui/llfolderview.cpp @@ -629,6 +629,8 @@ bool LLFolderView::startDrag()  void LLFolderView::commitRename( const LLSD& data )  {  	finishRenamingItem(); +	arrange( NULL, NULL ); +  }  void LLFolderView::draw() @@ -1606,19 +1608,21 @@ void LLFolderView::update()          return;      } -	if (getFolderViewModel()->getFilter().isModified() && getFolderViewModel()->getFilter().isNotDefault()) +	LLFolderViewFilter& filter_object = getFolderViewModel()->getFilter(); + +	if (filter_object.isModified() && filter_object.isNotDefault())  	{  		mNeedsAutoSelect = TRUE;  	}  	// Filter to determine visibility before arranging -	filter(getFolderViewModel()->getFilter()); +	filter(filter_object);  	// Clear the modified setting on the filter only if the filter finished after running the filter process  	// Note: if the filter count has timed out, that means the filter halted before completing the entire set of items -    if (getFolderViewModel()->getFilter().isModified() && (!getFolderViewModel()->getFilter().isTimedOut())) +    if (filter_object.isModified() && (!filter_object.isTimedOut()))  	{ -		getFolderViewModel()->getFilter().clearModified(); +		filter_object.clearModified();  	}  	// automatically show matching items, and select first one if we had a selection @@ -1637,7 +1641,7 @@ void LLFolderView::update()  		// Open filtered folders for folder views with mAutoSelectOverride=TRUE.  		// Used by LLPlacesFolderView. -		if (getFolderViewModel()->getFilter().showAllResults()) +		if (filter_object.showAllResults())  		{  			// these are named variables to get around gcc not binding non-const references to rvalues  			// and functor application is inherently non-const to allow for stateful functors diff --git a/indra/llui/llfolderview.h b/indra/llui/llfolderview.h index f188fdd0dc..08e0a6220a 100755 --- a/indra/llui/llfolderview.h +++ b/indra/llui/llfolderview.h @@ -235,7 +235,7 @@ public:  	virtual S32	notify(const LLSD& info) ;  	bool useLabelSuffix() { return mUseLabelSuffix; } -	void updateMenu(); +	virtual void updateMenu();      // Note: We may eventually have to move that method up the hierarchy to LLFolderViewItem.  	LLHandle<LLFolderView>	getHandle() const { return getDerivedHandle<LLFolderView>(); } diff --git a/indra/llui/llfolderviewmodel.h b/indra/llui/llfolderviewmodel.h index c665dce509..8d98363c5f 100755 --- a/indra/llui/llfolderviewmodel.h +++ b/indra/llui/llfolderviewmodel.h @@ -393,27 +393,36 @@ template <typename SORT_TYPE, typename ITEM_TYPE, typename FOLDER_TYPE, typename  class LLFolderViewModel : public LLFolderViewModelCommon  {  public: -	LLFolderViewModel(){} -	virtual ~LLFolderViewModel() {} -  	typedef SORT_TYPE		SortType;  	typedef ITEM_TYPE		ItemType;  	typedef FOLDER_TYPE		FolderType;  	typedef FILTER_TYPE		FilterType; -	virtual SortType& getSorter()					 { return mSorter; } -	virtual const SortType& getSorter() const 		 { return mSorter; } -	virtual void setSorter(const SortType& sorter) 	 { mSorter = sorter; requestSortAll(); } +	LLFolderViewModel(SortType* sorter, FilterType* filter)  +	:	mSorter(sorter), +		mFilter(filter) +	{} -	virtual FilterType& getFilter() 				 { return mFilter; } -	virtual const FilterType& getFilter() const		 { return mFilter; } -	virtual void setFilter(const FilterType& filter) { mFilter = filter; } +	virtual ~LLFolderViewModel()  +	{ +		delete mSorter; +		mSorter = NULL; +		delete mFilter; +		mFilter = NULL; +	} + +	virtual SortType& getSorter()					 { return *mSorter; } +	virtual const SortType& getSorter() const 		 { return *mSorter; } +	virtual void setSorter(const SortType& sorter) 	 { mSorter = new SortType(sorter); requestSortAll(); } + +	virtual FilterType& getFilter() 				 { return *mFilter; } +	virtual const FilterType& getFilter() const		 { return *mFilter; } +	virtual void setFilter(const FilterType& filter) { mFilter = new FilterType(filter); }  	// By default, we assume the content is available. If a network fetch mechanism is implemented for the model,  	// this method needs to be overloaded and return the relevant fetch status.  	virtual bool contentsReady()					{ return true; } -  	struct ViewModelCompare  	{  		ViewModelCompare(const SortType& sorter) @@ -445,8 +454,8 @@ public:  	}  protected: -	SortType		mSorter; -	FilterType		mFilter; +	SortType*		mSorter; +	FilterType*		mFilter;  };  #endif // LLFOLDERVIEWMODEL_H diff --git a/indra/llui/lltexteditor.cpp b/indra/llui/lltexteditor.cpp index 7818f6e285..a212c5dcd9 100755 --- a/indra/llui/lltexteditor.cpp +++ b/indra/llui/lltexteditor.cpp @@ -2338,7 +2338,8 @@ void LLTextEditor::autoIndent()  	S32 i;  	LLWString text = getWText(); -	while( ' ' == text[line_start] ) +	S32 offset = getLineOffsetFromDocIndex(mCursorPos); +	while(( ' ' == text[line_start] ) && (space_count < offset))  	{  		space_count++;  		line_start++; diff --git a/indra/llwindow/llopenglview-objc.h b/indra/llwindow/llopenglview-objc.h index 1e0e47cd02..f1fab3b2c6 100644 --- a/indra/llwindow/llopenglview-objc.h +++ b/indra/llwindow/llopenglview-objc.h @@ -42,6 +42,7 @@  	unsigned int mMarkedTextLength;      bool mMarkedTextAllowed;      bool mSimulatedRightClick; +    bool mOldResize;  }  - (id) initWithSamples:(NSUInteger)samples;  - (id) initWithSamples:(NSUInteger)samples andVsync:(BOOL)vsync; @@ -49,6 +50,8 @@  - (void)commitCurrentPreedit; +- (void) setOldResize:(bool)oldresize; +  // rebuildContext  // Destroys and recreates a context with the view's internal format set via setPixelFormat;  // Use this in event of needing to rebuild a context for whatever reason, without needing to assign a new pixel format. diff --git a/indra/llwindow/llopenglview-objc.mm b/indra/llwindow/llopenglview-objc.mm index b393a3796d..017ea3769c 100644 --- a/indra/llwindow/llopenglview-objc.mm +++ b/indra/llwindow/llopenglview-objc.mm @@ -94,8 +94,11 @@ attributedStringInfo getSegments(NSAttributedString *str)  // Force a high quality update after live resizing  - (void) viewDidEndLiveResize  { -    NSSize size = [self frame].size; -    callResize(size.width, size.height); +    if (mOldResize)  //Maint-3135 +    { +        NSSize size = [self frame].size; +        callResize(size.width, size.height); +    }  }  - (unsigned long)getVramSize @@ -124,10 +127,18 @@ attributedStringInfo getSegments(NSAttributedString *str)  											   object:[self window]];  } +- (void)setOldResize:(bool)oldresize +{ +    mOldResize = oldresize; +} +  - (void)windowResized:(NSNotification *)notification;  { -	//NSSize size = [self frame].size; -	//callResize(size.width, size.height); +    if (!mOldResize)  //Maint-3288 +    { +        NSSize size = [self frame].size; +        callResize(size.width, size.height); +    }  }  - (void)dealloc @@ -204,6 +215,8 @@ attributedStringInfo getSegments(NSAttributedString *str)  		[glContext setValues:(const GLint*)0 forParameter:NSOpenGLCPSwapInterval];  	} +    mOldResize = false; +      	return self;  } diff --git a/indra/llwindow/llwindow.h b/indra/llwindow/llwindow.h index ee1b0bbffb..0a30f4c807 100755 --- a/indra/llwindow/llwindow.h +++ b/indra/llwindow/llwindow.h @@ -124,7 +124,7 @@ public:  	virtual void swapBuffers() = 0;  	virtual void bringToFront() = 0;  	virtual void focusClient() { };		// this may not have meaning or be required on other platforms, therefore, it's not abstract -	 +	virtual void setOldResize(bool oldresize) { };  	// handy coordinate space conversion routines  	// NB: screen to window and vice verse won't work on width/height coordinate pairs,  	// as the conversion must take into account left AND right border widths, etc. diff --git a/indra/llwindow/llwindowmacosx-objc.h b/indra/llwindow/llwindowmacosx-objc.h index 81b25601a9..d64525fbdd 100755 --- a/indra/llwindow/llwindowmacosx-objc.h +++ b/indra/llwindow/llwindowmacosx-objc.h @@ -74,6 +74,7 @@ void showNSCursor();  void hideNSCursorTillMove(bool hide);  void requestUserAttention();  long showAlert(std::string title, std::string text, int type); +void setResizeMode(bool oldresize, void* glview);  NSWindowRef createNSWindow(int x, int y, int width, int height); diff --git a/indra/llwindow/llwindowmacosx-objc.mm b/indra/llwindow/llwindowmacosx-objc.mm index 0768d0352e..1a21bf8430 100755 --- a/indra/llwindow/llwindowmacosx-objc.mm +++ b/indra/llwindow/llwindowmacosx-objc.mm @@ -91,7 +91,7 @@ const unsigned short *copyFromPBoard()  		NSArray *objToPaste = [pboard readObjectsForClasses:classArray options:[NSDictionary dictionary]];  		str = [objToPaste objectAtIndex:0];  	} -	unichar* temp = (unichar*)calloc([str length], sizeof(unichar)); +	unichar* temp = (unichar*)calloc([str length]+1, sizeof(unichar));  	[str getCharacters:temp];  	[pool release];  	return temp; @@ -222,6 +222,11 @@ GLViewRef createOpenGLView(NSWindowRef window, unsigned int samples, bool vsync)  	return glview;  } +void setResizeMode(bool oldresize, void* glview) +{ +    [(LLOpenGLView *)glview setOldResize:oldresize]; +} +  void glSwapBuffers(void* context)  {  	[(NSOpenGLContext*)context flushBuffer]; diff --git a/indra/llwindow/llwindowmacosx.h b/indra/llwindow/llwindowmacosx.h index 6a6b39e674..825fd05c5f 100755 --- a/indra/llwindow/llwindowmacosx.h +++ b/indra/llwindow/llwindowmacosx.h @@ -152,7 +152,10 @@ protected:  	BOOL	resetDisplayResolution();  	BOOL	shouldPostQuit() { return mPostQuit; } - +     +    //Satisfy MAINT-3135 and MAINT-3288 with a flag. +    /*virtual */ void setOldResize(bool oldresize) {setResizeMode(oldresize, mGLView); } +   protected:  	// diff --git a/indra/lscript/lscript_compile/indra.l b/indra/lscript/lscript_compile/indra.l index 2afa12fe9a..7772c95609 100755 --- a/indra/lscript/lscript_compile/indra.l +++ b/indra/lscript/lscript_compile/indra.l @@ -647,7 +647,8 @@ int yyerror(const char *fmt, ...);  "REGION_FLAG_SANDBOX"		{ count(); yylval.ival = REGION_FLAGS_SANDBOX; return(INTEGER_CONSTANT); }  "REGION_FLAG_DISABLE_COLLISIONS"		{ count(); yylval.ival = REGION_FLAGS_SKIP_COLLISIONS; return(INTEGER_CONSTANT); }  "REGION_FLAG_DISABLE_PHYSICS"		{ count(); yylval.ival = REGION_FLAGS_SKIP_PHYSICS; return(INTEGER_CONSTANT); } -"REGION_FLAG_BLOCK_FLY"		{ count(); yylval.ival = REGION_FLAGS_BLOCK_FLY; return(INTEGER_CONSTANT); } +"REGION_FLAG_BLOCK_FLY"			{ count(); yylval.ival = REGION_FLAGS_BLOCK_FLY; return(INTEGER_CONSTANT); } +"REGION_FLAG_BLOCK_FLYOVER"		{ count(); yylval.ival = REGION_FLAGS_BLOCK_FLYOVER; return(INTEGER_CONSTANT); }  "REGION_FLAG_ALLOW_DIRECT_TELEPORT"		{ count(); yylval.ival = REGION_FLAGS_ALLOW_DIRECT_TELEPORT; return(INTEGER_CONSTANT); }  "REGION_FLAG_RESTRICT_PUSHOBJECT"		{ count(); yylval.ival = REGION_FLAGS_RESTRICT_PUSHOBJECT; return(INTEGER_CONSTANT); } diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index f0b7584312..ddad9c768f 100755 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -664,7 +664,6 @@ set(viewer_SOURCE_FILES      llwearablelist.cpp      llweb.cpp      llwebprofile.cpp -    llwebsharing.cpp      llwind.cpp      llwindowlistener.cpp      llwlanimator.cpp @@ -1248,7 +1247,6 @@ set(viewer_HEADER_FILES      llwearablelist.h      llweb.h      llwebprofile.h -    llwebsharing.h      llwind.h      llwindowlistener.h      llwlanimator.h diff --git a/indra/newview/SecondLife.nib b/indra/newview/SecondLife.nibBinary files differ index 8b99b5a770..c4ddca50dc 100644 --- a/indra/newview/SecondLife.nib +++ b/indra/newview/SecondLife.nib diff --git a/indra/newview/SecondLife.xib b/indra/newview/SecondLife.xib index 370df6bf5f..ef25c648a7 100644 --- a/indra/newview/SecondLife.xib +++ b/indra/newview/SecondLife.xib @@ -120,7 +120,7 @@  								</object>  								<object class="NSMenuItem" id="755159360">  									<reference key="NSMenu" ref="110575045"/> -									<string key="NSTitle">Hide NewApplication</string> +									<string key="NSTitle">Hide Second Life</string>  									<string key="NSKeyEquiv">h</string>  									<int key="NSKeyEquivModMask">1048576</int>  									<int key="NSMnemonicLoc">2147483647</int> diff --git a/indra/newview/VIEWER_VERSION.txt b/indra/newview/VIEWER_VERSION.txt index a0fc9e07cb..c77a7de85c 100644 --- a/indra/newview/VIEWER_VERSION.txt +++ b/indra/newview/VIEWER_VERSION.txt @@ -1 +1 @@ -3.7.8 +3.7.9 diff --git a/indra/newview/app_settings/keys.xml b/indra/newview/app_settings/keys.xml index 6e3673e7d9..a8037fec05 100755 --- a/indra/newview/app_settings/keys.xml +++ b/indra/newview/app_settings/keys.xml @@ -293,11 +293,24 @@      <!--these are for passing controls when sitting on vehicles-->      <binding key="A" mask="SHIFT" command="slide_left"/>      <binding key="D" mask="SHIFT" command="slide_right"/> +    <binding key="W" mask="SHIFT" command="move_forward_sitting"/> +	<binding key="S" mask="SHIFT" command="move_backward_sitting"/> +	<binding key="E" mask="SHIFT" command="spin_over_sitting"/> +	<binding key="C" mask="SHIFT" command="spin_under_sitting"/> +      <binding key="LEFT" mask="SHIFT" command="slide_left"/>      <binding key="RIGHT" mask="SHIFT" command="slide_right"/> +    <binding key="UP" mask="SHIFT" command="move_forward_sitting"/> +	<binding key="DOWN" mask="SHIFT" command="move_backward_sitting"/> +	<binding key="PGUP" mask="SHIFT" command="spin_over_sitting"/> +	<binding key="PGDN" mask="SHIFT" command="spin_under_sitting"/>      <binding key="PAD_LEFT" mask="SHIFT" command="slide_left"/>      <binding key="PAD_RIGHT" mask="SHIFT" command="slide_right"/> +    <binding key="PAD_UP" mask="SHIFT" command="move_forward_sitting"/> +	<binding key="PAD_DOWN" mask="SHIFT" command="move_backward_sitting"/> +	<binding key="PAD_PGUP" mask="SHIFT" command="spin_over_sitting"/> +	<binding key="PAD_PGDN" mask="SHIFT" command="spin_under_sitting"/>       <binding key="PAD_ENTER" mask="SHIFT" command="start_chat"/>      <binding key="PAD_DIVIDE" mask="SHIFT" command="start_gesture"/> diff --git a/indra/newview/app_settings/keywords.ini b/indra/newview/app_settings/keywords.ini new file mode 100755 index 0000000000..17c70ef1c5 --- /dev/null +++ b/indra/newview/app_settings/keywords.ini @@ -0,0 +1,756 @@ +llkeywords version 2 + +# sections +[word .5, .1, .3] +default 		Name of default state that all scripts must have +state 			Keyword to indicate state block or state transition + +# data types +[word .1, .3, .1] +integer			Integer type +float			Floating-point type +string			String type +key				Key type.  Use NULL_KEY to test for empty keys +vector			Vector type of 3 floats.  Used to represent 3D motion, Euler angles, and color.:Access components by .x, .y. or .z +rotation		Rotation type of 4 floats.  Used to represent rotation.:Access components by .x, .y., .z, or .w +list			List of various data types + +# events +[word 0, .3, .5] +state_entry		state_entry():Triggered on any state transition and startup +state_exit		state_exit():Triggered on any state transition +touch_start		touch_start(integer num_detected):Triggered by the start of agent clicking on task +touch			touch(integer num_detected):Triggered while agent is clicking on task +touch_end		touch_end(integer num_detected):Triggered when agent stops clicking on task +collision_start collision_start(integer num_detected):Triggered when task starts colliding with another task +collision		collision(integer num_detected):Triggered while task is colliding with another task +collision_end	collision_end(integer num_detected):Triggered when task stops colliding with another task +land_collision_start	land_collision_start(vector pos):Triggered when task starts colliding with land +land_collision			land_collision(vector pos):Triggered when task is colliding with land +land_collision_end		land_collision_end(vector pos):Triggered when task stops colliding with land +timer			timer():Result of the llSetTimerEvent library function call +listen			listen(integer channel, string name, key id, string message):Result of the llListen library function call +sensor			sensor(integer num_detected):Result of the llSensor library function call +no_sensor		no_sensor():Result of the llSensor library function call +control			control(key id, integer level, integer edge):Result of llTakeControls library function call +at_target		at_target(integer tnum, vector targetpos, vector ourpos):Result of llTarget library function call +not_at_target	not_at_target():Result of llTarget library function call +at_rot_target	at_rot_target(integer tnum, rotation targetrot, rotation ourrot):Result of LLRotTarget library function call +not_at_rot_target	not_at_rot_target():Result of LLRotTarget library function call +money			money(key id, integer amount):Triggered when L$ is given to task +email			email(string time, string address, string subj, string message, integer num_left):Triggered when task receives email +run_time_permissions	run_time_permissions(integer perm):Triggered when an agent grants run time permissions to task +attach			attach(key id):Triggered when task attaches or detaches from agent +dataserver      dataserver(key queryid, string data):Triggered when task receives asynchronous data +moving_start	moving_start():Triggered when task begins moving +moving_end		moving_end():Triggered when task stops moving +on_rez			on_rez(integer start_param):Triggered when task is rezzed in from inventory or another task +object_rez		object_rez(key id):Triggered when task rezzes in another task +link_message	link_message(integer sender_num, integer num, string str, key id):Triggered when task receives a link message via LLMessageLinked library function call +changed			changed( integer change ):Triggered various event change the task:(test change with CHANGED_INVENTORY, CHANGED_COLOR, CHANGED_SHAPE, CHANGED_SCALE, CHANGED_TEXTURE, CHANGED_LINK, CHANGED_ALLOWED_DROP, CHANGED_OWNER, CHANGED_REGION, CHANGED_TELEPORT, CHANGED_REGION_START, CHANGED_MEDIA) +remote_data     remote_data(integer event_type, key channel, key message_id, string sender,integer idata, string sdata):Triggered by various XML-RPC calls (event_type will be one of REMOTE_DATA_CHANNEL, REMOTE_DATA_REQUEST, REMOTE_DATA_REPLY) +http_response   http_response(key request_id, integer status, list metadata, string body):Triggered when task receives a response to one of its llHTTPRequests +http_request	http_request(key id, string method, string body):Triggered when task receives an http request against a public URL + +# integer constants +[word .1, .1, .5] +TRUE			Integer constant for Boolean operations +FALSE			Integer constant for Boolean operations +STATUS_PHYSICS	Passed in the llSetStatus library function.  If TRUE, object moves physically +STATUS_PHANTOM	Passed in the llSetStatus library function.  If TRUE, object doesn't collide with other objects +STATUS_ROTATE_X Passed in the llSetStatus library function.  If FALSE, object doesn't rotate around local X axis +STATUS_ROTATE_Y Passed in the llSetStatus library function.  If FALSE, object doesn't rotate around local Y axis +STATUS_ROTATE_Z Passed in the llSetStatus library function.  If FALSE, object doesn't rotate around local Z axis +STATUS_SANDBOX	Passed in the llSetStatus library function.  If TRUE, object can't cross region boundaries or move more than 10 meters from its start location +STATUS_BLOCK_GRAB Passed in the llSetStatus library function.  If TRUE, root prim of linkset (or unlinked prim) can't be grabbed and physically dragged +STATUS_DIE_AT_EDGE Passed in the llSetStatus library function.  If TRUE, objects that reach the edge of the world just die:rather than teleporting back to the owner +STATUS_RETURN_AT_EDGE Passed in the llSetStatus library function.  If TRUE, script rezzed objects that reach the edge of the world:are returned rather than killed:STATUS_RETURN_AT_EDGE trumps STATUS_DIE_AT_EDGE if both are set +STATUS_CAST_SHADOWS	Passed in the llSetStatus library function.  If TRUE, object casts shadows on other objects +STATUS_BLOCK_GRAB_OBJECT	Passed in the llSetStatus library function.  If TRUE, no prims in linkset can be grabbed or physically dragged + +AGENT			Passed in llSensor library function to look for other Agents +ACTIVE			Passed in llSensor library function to look for moving objects +PASSIVE			Passed in llSensor library function to look for objects that aren't moving +SCRIPTED		Passed in llSensor library function to look for scripted objects +CONTROL_FWD		Passed to llTakeControls library function and used control event handler to test for agent forward control +CONTROL_BACK	Passed to llTakeControls library function and used control event handler to test for agent back control +CONTROL_LEFT	Passed to llTakeControls library function and used control event handler to test for agent left control +CONTROL_RIGHT	Passed to llTakeControls library function and used control event handler to test for agent right control +CONTROL_ROT_LEFT				Passed to llTakeControls library function and used control event handler to test for agent rotate left control +CONTROL_ROT_RIGHT				Passed to llTakeControls library function and used control event handler to test for agent rotate right control +CONTROL_UP						Passed to llTakeControls library function and used control event handler to test for agent up control +CONTROL_DOWN					Passed to llTakeControls library function and used control event handler to test for agent down control +CONTROL_LBUTTON					Passed to llTakeControls library function and used control event handler to test for agent left button control +CONTROL_ML_LBUTTON				Passed to llTakeControls library function and used control event handler to test for agent left button control with the agent in mouse look +PERMISSION_DEBIT				Passed to llRequestPermissions library function to request permission to take L$ from agent's account +PERMISSION_TAKE_CONTROLS		Passed to llRequestPermissions library function to request permission to take agent's controls +# PERMISSION_REMAP_CONTROLS		Passed to llRequestPermissions library function to request permission to remap agent's controls (not implemented yet) +PERMISSION_TRIGGER_ANIMATION	Passed to llRequestPermissions library function to request permission to trigger animation on agent +PERMISSION_ATTACH				Passed to llRequestPermissions library function to request permission to attach/detach from agent +# PERMISSION_RELEASE_OWNERSHIP	Passed to llRequestPermissions library function to request permission to release ownership (not implemented) +PERMISSION_CHANGE_LINKS			Passed to llRequestPermissions library function to request permission to change links +# PERMISSION_CHANGE_JOINTS		Passed to llRequestPermissions library function to request permission to change joints (not implemented) +# PERMISSION_CHANGE_PERMISSIONS Passed to llRequestPermissions library function to request permission to change permissions +PERMISSION_TRACK_CAMERA			Passed to llRequestPermissions library function to request permission to track agent's camera +PERMISSION_CONTROL_CAMERA		Passed to llRequestPermissions library function to request permission to change agent's camera +PERMISSION_TELEPORT				Passed to llRequestPermissions library function to request permission to teleport agent +PERMISSION_SILENT_ESTATE_MANAGEMENT	Passed to llRequestPermissions library function to request permission to silently modify estate access lists +PERMISSION_OVERRIDE_ANIMATIONS	Passed to llRequestPermissions library function to request permission to override animations on agent +PERMISSION_RETURN_OBJECTS		Passed to llRequestPermissions library function to request permission to return objects + +DEBUG_CHANNEL		Chat channel reserved for debug and error messages from scripts +PUBLIC_CHANNEL		Chat channel that broadcasts to all nearby users + +AGENT_FLYING		Returned by llGetAgentInfo if the Agent is flying +AGENT_ATTACHMENTS	Returned by llGetAgentInfo if the Agent has attachments +AGENT_SCRIPTED		Returned by llGetAgentInfo if the Agent has scripted attachments +AGENT_SITTING		Returned by llGetAgentInfo if the Agent is sitting +AGENT_ON_OBJECT		Returned by llGetAgentInfo if the Agent is sitting on an object +AGENT_MOUSELOOK		Returned by llGetAgentInfo if the Agent is in mouselook +AGENT_AWAY			Returned by llGetAgentInfo if the Agent is in away mode +AGENT_WALKING		Returned by llGetAgentInfo if the Agent is walking +AGENT_IN_AIR		Returned by llGetAgentInfo if the Agent is in the air +AGENT_TYPING		Returned by llGetAgentInfo if the Agent is typing +AGENT_CROUCHING		Returned by llGetAgentInfo if the Agent is crouching +AGENT_BUSY			Returned by llGetAgentInfo if the Agent is busy +AGENT_ALWAYS_RUN	Returned by llGetAgentInfo if the Agent has 'Always Run' enabled +AGENT_AUTOPILOT		Returned by llGetAgentInfo if the Agent is under autopilot control + +PSYS_PART_FLAGS +PSYS_PART_START_COLOR +PSYS_PART_START_ALPHA +PSYS_PART_START_SCALE +PSYS_PART_END_COLOR +PSYS_PART_END_ALPHA +PSYS_PART_END_SCALE +PSYS_PART_MAX_AGE + +PSYS_PART_BOUNCE_MASK +PSYS_PART_WIND_MASK +PSYS_PART_INTERP_COLOR_MASK +PSYS_PART_INTERP_SCALE_MASK +PSYS_PART_FOLLOW_SRC_MASK +PSYS_PART_FOLLOW_VELOCITY_MASK +PSYS_PART_TARGET_POS_MASK +PSYS_PART_EMISSIVE_MASK +PSYS_PART_TARGET_LINEAR_MASK +PSYS_PART_RIBBON_MASK + +PSYS_SRC_PATTERN +PSYS_SRC_INNERANGLE	Deprecated -- Use PSYS_SRC_ANGLE_BEGIN +PSYS_SRC_OUTERANGLE	Deprecated -- Use PSYS_SRC_ANGLE_END +PSYS_SRC_ANGLE_BEGIN +PSYS_SRC_ANGLE_END +PSYS_SRC_BURST_RATE +PSYS_SRC_BURST_PART_COUNT +PSYS_SRC_BURST_RADIUS +PSYS_SRC_BURST_SPEED_MIN +PSYS_SRC_BURST_SPEED_MAX +PSYS_SRC_MAX_AGE +PSYS_SRC_ACCEL +PSYS_SRC_TEXTURE +PSYS_SRC_TARGET_KEY +PSYS_SRC_OMEGA +PSYS_PART_BLEND_FUNC_SOURCE +PSYS_PART_BLEND_FUNC_DEST +PSYS_PART_START_GLOW +PSYS_PART_END_GLOW + +PSYS_SRC_PATTERN_DROP +PSYS_SRC_PATTERN_EXPLODE +PSYS_SRC_PATTERN_ANGLE +PSYS_SRC_PATTERN_ANGLE_CONE +PSYS_SRC_PATTERN_ANGLE_CONE_EMPTY +PSYS_PART_BF_ONE +PSYS_PART_BF_ZERO +PSYS_PART_BF_DEST_COLOR +PSYS_PART_BF_SOURCE_COLOR +PSYS_PART_BF_ONE_MINUS_DEST_COLOR +PSYS_PART_BF_ONE_MINUS_SOURCE_COLOR +PSYS_PART_BF_SOURCE_ALPHA +PSYS_PART_BF_ONE_MINUS_SOURCE_ALPHA + +OBJECT_UNKNOWN_DETAIL	Returned by llGetObjectDetails when passed an invalid object parameter type +OBJECT_NAME				Used with llGetObjectDetails to get an object's name +OBJECT_DESC				Used with llGetObjectDetails to get an object's description +OBJECT_POS				Used with llGetObjectDetails to get an object's position +OBJECT_ROT				Used with llGetObjectDetails to get an object's rotation +OBJECT_VELOCITY			Used with llGetObjectDetails to get an object's velocity +OBJECT_OWNER			Used with llGetObjectDetails to get an object's owner's key.  Will be NULL_KEY if group owned +OBJECT_GROUP			Used with llGetObjectDetails to get an object's group's key +OBJECT_CREATOR			Used with llGetObjectDetails to get an object's creator's key +OBJECT_RUNNING_SCRIPT_COUNT		Used with llGetObjectDetails to get the number of running scripts in an object +OBJECT_TOTAL_SCRIPT_COUNT		Used with llGetObjectDetails to get the total number of scripts in an object +OBJECT_SCRIPT_MEMORY		Used with llGetObjectDetails to get the total amount of script memory in an object +OBJECT_SCRIPT_TIME			Used with llGetObjectDetails to get the average script time used by an object +OBJECT_PRIM_EQUIVALENCE		Used with llGetObjectDetails to get the prim equivalence of an object +OBJECT_SERVER_COST			Used with llGetObjectDetails to get the server cost of an object +OBJECT_STREAMING_COST		Used with llGetObjectDetails to get the streaming (download) cost of an object +OBJECT_PHYSICS_COST			Used with llGetObjectDetails to get the physics cost of an object +OBJECT_CHARACTER_TIME		Used with llGetObjectDetails to get the pathfinding time (seconds) for an object +OBJECT_ROOT					Used with llGetObjectDetails to get root ID of an object +OBJECT_ATTACHED_POINT		Used with llGetObjectDetails to get attachent point where an object is attached +OBJECT_PATHFINDING_TYPE		Used with llGetObjectDetails to get the pathfinding setting of an object +OBJECT_PHYSICS				Used with llGetObjectDetails to determine if the object is physical or not +OBJECT_PHANTOM				Used with llGetObjectDetails to determine if the object is phantom or not +OBJECT_TEMP_ON_REZ			Used with llGetObjectDetails to determine if the object is temporary or not +OBJECT_RENDER_WEIGHT		Used with llGetObjectDetails to return an avatar's rendering weight + + +# some vehicle params +VEHICLE_TYPE_NONE +VEHICLE_TYPE_SLED +VEHICLE_TYPE_CAR +VEHICLE_TYPE_BOAT +VEHICLE_TYPE_AIRPLANE +VEHICLE_TYPE_BALLOON + +VEHICLE_REFERENCE_FRAME		Rotation of vehicle axes relative to local frame + +VEHICLE_LINEAR_FRICTION_TIMESCALE 	A vector of timescales for exponential decay of linear velocity along the three vehicle axes +VEHICLE_ANGULAR_FRICTION_TIMESCALE	A vector of timescales for exponential decay of angular velocity about the three vehicle axes +VEHICLE_LINEAR_MOTOR_DIRECTION		The linear velocity that the vehicle will try to achieve +VEHICLE_LINEAR_MOTOR_OFFSET			An offset from the center of mass of the vehicle where the linear motor is applied +VEHICLE_ANGULAR_MOTOR_DIRECTION		The angular velocity that the vehicle will try to achieve + +VEHICLE_HOVER_HEIGHT		The height the vehicle will try to hover +VEHICLE_HOVER_EFFICIENCY	A slider between 0 (bouncy) and 1 (critically damped) hover behavior +VEHICLE_HOVER_TIMESCALE		The period of time for the vehicle to achieve its hover height +VEHICLE_BUOYANCY			A slider between 0 (no anti-gravity) and 1 (full anti-gravity) + +VEHICLE_LINEAR_DEFLECTION_EFFICIENCY	A slider between 0 (no deflection) and 1 (maximum strength) +VEHICLE_LINEAR_DEFLECTION_TIMESCALE		The exponential timescale for the vehicle to redirect its velocity to be along its x-axis + +VEHICLE_LINEAR_MOTOR_TIMESCALE			The exponential timescale for the vehicle to achive its full linear motor velocity +VEHICLE_LINEAR_MOTOR_DECAY_TIMESCALE	The exponential timescale for the linear motor's effectiveness to decay toward zero + +VEHICLE_ANGULAR_DEFLECTION_EFFICIENCY	A slider between 0 (no deflection) and 1 (maximum strength) +VEHICLE_ANGULAR_DEFLECTION_TIMESCALE	The exponential timescale for the vehicle to achieve full angular deflection + +VEHICLE_ANGULAR_MOTOR_TIMESCALE			The exponential timescale for the vehicle to achive its full angular motor velocity +VEHICLE_ANGULAR_MOTOR_DECAY_TIMESCALE	The exponential timescale for the angular motor's effectiveness to decay toward zero + +VEHICLE_VERTICAL_ATTRACTION_EFFICIENCY	A slider between 0 (bouncy) and 1 (critically damped) attraction of vehicle z-axis to world z-axis (vertical) +VEHICLE_VERTICAL_ATTRACTION_TIMESCALE	The exponential timescale for the vehicle to align its z-axis to the world z-axis (vertical) + +VEHICLE_BANKING_EFFICIENCY	A slider between -1 (leans out of turns), 0 (no banking), and +1 (leans into turns) +VEHICLE_BANKING_MIX			A slider between 0 (static banking) and 1 (dynamic banking) +VEHICLE_BANKING_TIMESCALE	The exponential timescale for the banking behavior to take full effect + +VEHICLE_FLAG_NO_DEFLECTION_UP	Prevents linear deflection along world-z axis +VEHICLE_FLAG_LIMIT_ROLL_ONLY	Removes vertical attraction for changes in vehicle pitch +VEHICLE_FLAG_HOVER_WATER_ONLY	Hover only pays attention to water level +VEHICLE_FLAG_HOVER_TERRAIN_ONLY	Hover only pays attention to terrain height +VEHICLE_FLAG_HOVER_GLOBAL_HEIGHT Hover only pays attention to global height +VEHICLE_FLAG_HOVER_UP_ONLY 		Hover only pushes up +VEHICLE_FLAG_LIMIT_MOTOR_UP		Prevents ground vehicles from motoring into the sky +VEHICLE_FLAG_MOUSELOOK_STEER	Makes vehicle try to turn toward mouselook direction +VEHICLE_FLAG_MOUSELOOK_BANK		Makes vehicle try to turn toward mouselook direction assuming banking is enabled +VEHICLE_FLAG_CAMERA_DECOUPLED 	Causes the camera look-at axis to NOT move when the vehicle rotates + +CAMERA_PITCH				(-45 to 80) (Adjusts the angular amount that the camera aims straight ahead vs. straight down, maintaining the same distance. Analogous to 'incidence'.") +CAMERA_FOCUS_OFFSET			(-10 to 10) A vector that adjusts the position of the camera focus position relative to the subject +CAMERA_POSITION_LAG			(0.0 to 3.0)  How much the camera lags as it tries to move towards its 'ideal' position +CAMERA_FOCUS_LAG			(0.0 to 3.0) How much the camera lags as it tries to aim towards the subject +CAMERA_DISTANCE				(0.5 to 10) Sets how far away the camera wants to be from its subject +CAMERA_BEHINDNESS_ANGLE		(0 to 180) Sets the angle in degrees within which the camera is not constrained by changes in subject rotation +CAMERA_BEHINDNESS_LAG		(0.0 to 3.0) Sets how strongly the camera is forced to stay behind the target if outside of behindness angle +CAMERA_POSITION_THRESHOLD	(0.0 to 4.0) Sets the radius of a sphere around the camera's ideal position within which it is not affected by subject motion +CAMERA_FOCUS_THRESHOLD		(0.0 to 4.0) Sets the radius of a sphere around the camera's subject position within which its focus is not affected by subject motion +CAMERA_ACTIVE				(0 or 1) Turns on or off scripted control of the camera +CAMERA_POSITION				Sets the position of the camera +CAMERA_FOCUS				Sets the focus (target position) of the camera +CAMERA_POSITION_LOCKED		(0 or 1) Locks the camera position so it will not move +CAMERA_FOCUS_LOCKED			(0 or 1) Locks the camera focus so it will not move + +INVENTORY_TEXTURE	Passed to task inventory library functions to reference textures +INVENTORY_SOUND		Passed to task inventory library functions to reference sounds +INVENTORY_OBJECT	Passed to task inventory library functions to reference objects +INVENTORY_SCRIPT	Passed to task inventory library functions to reference scripts +INVENTORY_LANDMARK	Passed to task inventory library functions to reference landmarks +INVENTORY_CLOTHING	Passed to task inventory library functions to reference clothing +INVENTORY_NOTECARD	Passed to task inventory library functions to reference notecards +INVENTORY_BODYPART	Passed to task inventory library functions to reference body parts +INVENTORY_ANIMATION	Passed to task inventory library functions to reference animations +INVENTORY_GESTURE	Passed to task inventory library functions to reference gestures +INVENTORY_ALL		Passed to task inventory library functions to reference all inventory items +INVENTORY_NONE		Returned by llGetInventoryType when no item is found + +ATTACH_CHEST		Passed to llAttachToAvatar to attach task to chest +ATTACH_HEAD			Passed to llAttachToAvatar to attach task to head +ATTACH_LSHOULDER	Passed to llAttachToAvatar to attach task to left shoulder +ATTACH_RSHOULDER	Passed to llAttachToAvatar to attach task to right shoulder +ATTACH_LHAND		Passed to llAttachToAvatar to attach task to left hand +ATTACH_RHAND		Passed to llAttachToAvatar to attach task to right hand +ATTACH_LFOOT		Passed to llAttachToAvatar to attach task to left foot +ATTACH_RFOOT		Passed to llAttachToAvatar to attach task to right foot +ATTACH_BACK			Passed to llAttachToAvatar to attach task to back +ATTACH_PELVIS		Passed to llAttachToAvatar to attach task to pelvis +ATTACH_MOUTH		Passed to llAttachToAvatar to attach task to mouth +ATTACH_CHIN			Passed to llAttachToAvatar to attach task to chin +ATTACH_LEAR			Passed to llAttachToAvatar to attach task to left ear +ATTACH_REAR			Passed to llAttachToAvatar to attach task to right ear +ATTACH_LEYE			Passed to llAttachToAvatar to attach task to left eye +ATTACH_REYE			Passed to llAttachToAvatar to attach task to right eye +ATTACH_NOSE			Passed to llAttachToAvatar to attach task to nose +ATTACH_RUARM		Passed to llAttachToAvatar to attach task to right upper arm +ATTACH_RLARM		Passed to llAttachToAvatar to attach task to right lower arm +ATTACH_LUARM		Passed to llAttachToAvatar to attach task to left upper arm +ATTACH_LLARM		Passed to llAttachToAvatar to attach task to left lower arm +ATTACH_RHIP			Passed to llAttachToAvatar to attach task to right hip +ATTACH_RULEG		Passed to llAttachToAvatar to attach task to right upper leg +ATTACH_RLLEG		Passed to llAttachToAvatar to attach task to right lower leg +ATTACH_LHIP			Passed to llAttachToAvatar to attach task to left hip +ATTACH_LULEG		Passed to llAttachToAvatar to attach task to left upper leg +ATTACH_LLLEG		Passed to llAttachToAvatar to attach task to left lower leg +ATTACH_BELLY		Passed to llAttachToAvatar to attach task to belly +ATTACH_LEFT_PEC		Passed to llAttachToAvatar to attach task to left pectoral +ATTACH_RIGHT_PEC	Passed to llAttachToAvatar to attach task to right pectoral +ATTACH_NECK			Passed to llAttachToAvatar to attach task to neck +ATTACH_AVATAR_CENTER	Passed to llAttachToAvatar to attach task to avatar center +LAND_LEVEL			Passed to llModifyLand to level terrain +LAND_RAISE			Passed to llModifyLand to raise terrain +LAND_LOWER			Passed to llModifyLand to lower terrain +LAND_SMOOTH			Passed to llModifyLand to smooth terrain +LAND_NOISE			Passed to llModifyLand to randomize terrain +LAND_REVERT			Passed to llModifyLand to revert terrain toward original state +LAND_SMALL_BRUSH	Passed to llModifyLand to modify small land areas +LAND_MEDIUM_BRUSH	Passed to llModifyLand to modify medium land areas +LAND_LARGE_BRUSH	Passed to llModifyLand to modify large land areas + +DATA_PAYINFO		Passed to llRequestAgentData to get payment status of an agent +DATA_ONLINE			Passed to llRequestAgentData to determine if agent is online +DATA_NAME			Passed to llRequestAgentData to get full agent name +DATA_BORN			Passed to llRequestAgentData to get born on date as a string +DATA_RATING			Passed to llRequestAgentData to get a comma separated sting of integer ratings +DATA_SIM_POS		Passed to llRequestSimulatorData to get a string (cast to vector) of a simulator's global position +DATA_SIM_STATUS		Passed to llRequestSimulatorData to get the status of a simulator +DATA_SIM_RATING		Passed to llRequestSimulatorData to get the rating of a simulator + +PAYMENT_INFO_ON_FILE		Used with llRequestAgentData to tell if Agent is of "Payment Info On File" status +PAYMENT_INFO_USED	Used with llRequestAgentData to tell if Agent is of "Payment Info Used" status + +ANIM_ON				Enable texture animation +LOOP				Loop when animating textures +REVERSE				Animate in the reverse direction +PING_PONG			Animate forward, then reverse +SMOOTH				Textures slides, instead of stepping +ROTATE				Rotates the texture, instead of using frames +SCALE				Scales the texture, instead of using frames + +ALL_SIDES			Passed to various texture and color library functions to modify all sides + +LINK_SET			Passed to various link functions to modify all blocks in the object +LINK_ROOT			Passed to various link functions to modify only the root block (no effect on single block objects) +LINK_ALL_OTHERS		Passed to various link functions to modify all other blocks in the object +LINK_ALL_CHILDREN	Passed to various link functions to modify all child blocks in the object +LINK_THIS			Passed to various link functions to modify only the calling block + +CHANGED_INVENTORY	Parameter of changed event handler used to indicate change to task's inventory +CHANGED_COLOR		Parameter of changed event handler used to indicate change to task's color +CHANGED_SHAPE		Parameter of changed event handler used to indicate change to task's shape parameters +CHANGED_SCALE		Parameter of changed event handler used to indicate change to task's scale +CHANGED_TEXTURE		Parameter of changed event handler used to indicate change to task's texture +CHANGED_LINK		Parameter of changed event handler used to indicate change to task's link status +CHANGED_ALLOWED_DROP Parameter of changed event handler used to indicate a user dropped an inventory item:onto task that was allowed only by llAllowInventoryDrop function call +CHANGED_OWNER		Parameter of changed event handler used to indicate change to task's owner ONLY when an object is sold as original or deeded to group +CHANGED_REGION		Parameter of changed event handler used to indicate the region has changed +CHANGED_TELEPORT	Parameter of changed event handler used to indicate teleport has completed +CHANGED_REGION_START	Parameter of changed event handler used to indicate the region has been restarted +CHANGED_MEDIA       Parameter of changed event handler used to indicate that media has changed on a face of the task + +TYPE_INTEGER		Indicates that the list entry is holding an integer +TYPE_FLOAT			Indicates that the list entry is holding an float +TYPE_STRING			Indicates that the list entry is holding an string +TYPE_KEY			Indicates that the list entry is holding an key +TYPE_VECTOR			Indicates that the list entry is holding an vector +TYPE_ROTATION		Indicates that the list entry is holding an rotation +TYPE_INVALID		Indicates that this wasn't a valid list entry + + +REMOTE_DATA_CHANNEL	Value of event_type in remote_event after successful llOpenRemoteDataChannel +REMOTE_DATA_REQUEST	Value of event_type in remote_event if XML-RPC request is received +REMOTE_DATA_REPLY	Value of event_type in remote_event if XML-RPC reply is received + + +PRIM_TYPE			Followed by PRIM_TYPE_BOX, PRIM_TYPE_CYLINDER, PRIM_TYPE_PRISM, PRIM_TYPE_SPHERE, PRIM_TYPE_TORUS, PRIM_TYPE_TUBE, or PRIM_TYPE_SCULPT and their arguments +PRIM_MATERIAL		Followed by PRIM_MATERIAL_STONE, PRIM_MATERIAL_METAL, PRIM_MATERIAL_GLASS, PRIM_MATERIAL_WOOD, PRIM_MATERIAL_FLESH, PRIM_MATERIAL_PLASTIC, or PRIM_MATERIAL_RUBBER +PRIM_PHYSICS		Sets physics to TRUE or FALSE +PRIM_FLEXIBLE		Followed by TRUE or FALSE, integer softness, float gravity, float friction, float wind, float tension, and vector force +PRIM_POINT_LIGHT	Followed by TRUE or FALSE, vector color, float intensity, float radius, float falloff +PRIM_TEMP_ON_REZ	Sets temporary on rez to TRUE or FALSE +PRIM_PHANTOM		Sets phantom to TRUE or FALSE +PRIM_CAST_SHADOWS	DEPRECATED. Takes 1 parameter, an integer, but has no effect when set and always returns 0 if used in llGetPrimitiveParams +PRIM_POSITION		Sets primitive position to a vector position +PRIM_SIZE			Sets primitive size to a vector size +PRIM_ROTATION		Sets primitive rotation +PRIM_TEXTURE		Followed by an integer face, key id, vector repeats, vector offsets,:and float rotation in radians +PRIM_COLOR			Followed by an integer face, vector color, and float alpha +PRIM_BUMP_SHINY		Followed by an integer face, one of PRIM_SHINY_NONE, PRIM_SHINY_LOW,:PRIM_SHINY_MEDIUM, or PRIM_SHINY_HIGH,:and one of PRIM_BUMP_NONE, PRIM_BUMP_BRIGHT, PRIM_BUMP_DARK, etc +PRIM_FULLBRIGHT		Followed by an integer face, and TRUE or FALSE +PRIM_TEXGEN			Followed by an integer face, and one of PRIM_TEXGEN_DEFAULT or PRIM_TEXGEN_PLANAR +PRIM_GLOW			Followed by an integer face, and a float from 0.0 to 1.0 specifying glow amount +PRIM_TEXT			Followed by string text, vector color, and float alpha +PRIM_NAME			Followed by string name +PRIM_DESC			Followed by string description +PRIM_ROT_LOCAL		Followed by rotation rot +PRIM_PHYSICS_SHAPE_TYPE	Followed by PRIM_PHYSICS_SHAPE_PRIM, PRIM_PHYSICS_SHAPE_NONE, or PRIM_PHYSICS_SHAPE_CONVEX +PRIM_OMEGA			Followed by vector axis, float spinrate, and float gain +PRIM_POS_LOCAL		Followed by vector position +PRIM_LINK_TARGET	Followed by integer link_target, then additional prim parameter flags +PRIM_SLICE			Followed by vector slice + +PRIM_PHYSICS_SHAPE_PRIM	Use the default physics shape +PRIM_PHYSICS_SHAPE_CONVEX	Use the convex hull of the prim shape for physics +PRIM_PHYSICS_SHAPE_NONE	Ignore this prim in the physics shape + +PRIM_TYPE_BOX		Followed by integer hole shape, vector cut, float hollow, vector twist,:vector top size, and vector top shear +PRIM_TYPE_CYLINDER	Followed by integer hole shape, vector cut, float hollow, vector twist,:vector top size, and vector top shear +PRIM_TYPE_PRISM		Followed by integer hole shape, vector cut, float hollow, vector twist,:vector top size, and vector top shear +PRIM_TYPE_SPHERE	Followed by integer hole shape, vector cut, float hollow, vector twist,:and vector dimple +PRIM_TYPE_TORUS		Followed by integer hole shape, vector cut, float hollow, vector twist,:vector hole size, vector top shear, vector advanced cut, vector taper,:float revolutions, float radius offset, and float skew +PRIM_TYPE_TUBE		Followed by integer hole shape, vector cut, float hollow, vector twist,:vector hole size, vector top shear, vector advanced cut, vector taper,:float revolutions, float radius offset, and float skew +PRIM_TYPE_RING		Followed by integer hole shape, vector cut, float hollow, vector twist,:vector hole size, vector top shear, vector advanced cut, vector taper,:float revolutions, float radius offset, and float skew +PRIM_TYPE_SCULPT	Followed by a key/string texture uuid, and one of PRIM_SCULPT_TYPE_SPHERE, PRIM_SCULPT_TYPE_TORUS, PRIM_SCULPT_TYPE_PLANE, or PRIM_SCULPT_TYPE_CYLINDER + +PRIM_HOLE_DEFAULT	Sets hole type to match the prim type +PRIM_HOLE_SQUARE	Sets hole type to square +PRIM_HOLE_CIRCLE	Sets hole type to circle +PRIM_HOLE_TRIANGLE	Sets hole type to triangle + +PRIM_MATERIAL_STONE		Sets material to stone +PRIM_MATERIAL_METAL		Sets material to metal +PRIM_MATERIAL_GLASS		Sets material to glass +PRIM_MATERIAL_WOOD		Sets material to wood +PRIM_MATERIAL_FLESH		Sets material to flesh +PRIM_MATERIAL_PLASTIC	Sets material to plastic +PRIM_MATERIAL_RUBBER	Sets material to rubber +PRIM_MATERIAL_LIGHT		Sets material to light + +PRIM_SHINY_NONE			No shininess +PRIM_SHINY_LOW			Low shininess +PRIM_SHINY_MEDIUM		Medium shininess +PRIM_SHINY_HIGH			High shininess + +PRIM_BUMP_NONE			No bump map +PRIM_BUMP_BRIGHT		Generate bump map from highlights +PRIM_BUMP_DARK			Generate bump map from lowlights +PRIM_BUMP_WOOD			Wood bump map +PRIM_BUMP_BARK			Bark bump map +PRIM_BUMP_BRICKS		Brick bump map +PRIM_BUMP_CHECKER		Checker bump map +PRIM_BUMP_CONCRETE		Concrete bump map +PRIM_BUMP_TILE			Tile bump map +PRIM_BUMP_STONE			Stone bump map +PRIM_BUMP_DISKS			Disk bump map +PRIM_BUMP_GRAVEL		Gravel bump map +PRIM_BUMP_BLOBS			Blob bump map +PRIM_BUMP_SIDING		Siding bump map +PRIM_BUMP_LARGETILE		Large tile bump map +PRIM_BUMP_STUCCO		Stucco bump map +PRIM_BUMP_SUCTION		Suction cup bump map +PRIM_BUMP_WEAVE			Weave bump map + +PRIM_TEXGEN_DEFAULT		Default texture mapping +PRIM_TEXGEN_PLANAR		Planar texture mapping + +PRIM_SCULPT_TYPE_SPHERE		Stitch edges in a sphere-like way +PRIM_SCULPT_TYPE_TORUS		Stitch edges in a torus-like way +PRIM_SCULPT_TYPE_PLANE		Do not stitch edges +PRIM_SCULPT_TYPE_CYLINDER	Stitch edges in a cylinder-like way +PRIM_SCULPT_TYPE_MASK		Mask used to determine stitching type +PRIM_SCULPT_FLAG_INVERT     Flag to specify that the surface normals should be inverted +PRIM_SCULPT_FLAG_MIRROR     Flag to specify that the prim should be reflected along X axis + +MASK_BASE				Base permissions +MASK_OWNER				Owner permissions +MASK_GROUP				Group permissions +MASK_EVERYONE			Everyone permissions +MASK_NEXT				Next owner permissions + +PERM_TRANSFER			Transfer permission +PERM_MODIFY				Modify permission +PERM_COPY				Copy permission +PERM_MOVE				Move permission +PERM_ALL				Move/Modify/Copy/Transfer permissions + +PARCEL_MEDIA_COMMAND_STOP  Stop media stream +PARCEL_MEDIA_COMMAND_PAUSE Pause media stream +PARCEL_MEDIA_COMMAND_PLAY  Play media stream +PARCEL_MEDIA_COMMAND_LOOP  Loop media stream +PARCEL_MEDIA_COMMAND_TEXTURE  Get or set the parcel's media texture +PARCEL_MEDIA_COMMAND_URL  Get or set the parcel's media url +PARCEL_MEDIA_COMMAND_TYPE Get or set the parcel's media mimetype +PARCEL_MEDIA_COMMAND_DESC Get or set the parcel's media description +PARCEL_MEDIA_COMMAND_TIME Set media stream to specific time +PARCEL_MEDIA_COMMAND_SIZE Get or set the parcel's media pixel resolution +PARCEL_MEDIA_COMMAND_AGENT Allows media stream commands to apply to only one agent +PARCEL_MEDIA_COMMAND_UNLOAD Unloads the media stream +PARCEL_MEDIA_COMMAND_AUTO_ALIGN Auto aligns the media stream to the texture size.  May cause a performance hit and loss of some visual quality + +PAY_HIDE			Used with llSetPayPrice to hide a button +PAY_DEFAULT			Used with llSetPayPrice to use the default price for a button + +LIST_STAT_MAX			Used with llListStatistics to find the largest number in a list +LIST_STAT_MIN			Used with llListStatistics to find the smallest number in a list +LIST_STAT_MEAN			Used with llListStatistics to find the mean of the numbers in a list +LIST_STAT_MEDIAN			Used with llListStatistics to find the median of the numbers in a list +LIST_STAT_STD_DEV		Used with llListStatistics to find the standard deviation of the numbers in a list +LIST_STAT_SUM			Used with llListStatistics to find the sum of the numbers in a list +LIST_STAT_SUM_SQUARES	Used with llListStatistics to find the sum of the squares of the numbers in a list +LIST_STAT_NUM_COUNT		Used with llListStatistics to find how many numbers are in a list +LIST_STAT_GEOMETRIC_MEAN	Used with llListStatistics to find the geometric mean of the numbers in a list (all numbers must be > 0) +LIST_STAT_RANGE			Used with llListStatistics to find the range of the numbers in a list + +PARCEL_FLAG_ALLOW_FLY				Used with llGetParcelFlags to find if a parcel allows flying +PARCEL_FLAG_ALLOW_GROUP_SCRIPTS		Used with llGetParcelFlags to find if a parcel allows group scripts +PARCEL_FLAG_ALLOW_SCRIPTS			Used with llGetParcelFlags to find if a parcel allows outside scripts +PARCEL_FLAG_ALLOW_LANDMARK			Used with llGetParcelFlags to find if a parcel allows landmarks to be created +PARCEL_FLAG_ALLOW_TERRAFORM			Used with llGetParcelFlags to find if a parcel allows anyone to terraform the land +PARCEL_FLAG_ALLOW_DAMAGE			Used with llGetParcelFlags to find if a parcel allows damage +PARCEL_FLAG_ALLOW_CREATE_OBJECTS	Used with llGetParcelFlags to find if a parcel allows anyone to create objects +PARCEL_FLAG_ALLOW_CREATE_GROUP_OBJECTS	Used with llGetParcelFlags to find if a parcel allows group members or objects to create objects +PARCEL_FLAG_USE_ACCESS_GROUP		Used with llGetParcelFlags to find if a parcel limits access to a group +PARCEL_FLAG_USE_ACCESS_LIST			Used with llGetParcelFlags to find if a parcel limits access to a list of residents +PARCEL_FLAG_USE_BAN_LIST			Used with llGetParcelFlags to find if a parcel uses a ban list +PARCEL_FLAG_USE_LAND_PASS_LIST		Used with llGetParcelFlags to find if a parcel allows passes to be purchased +PARCEL_FLAG_LOCAL_SOUND_ONLY		Used with llGetParcelFlags to find if a parcel restricts spacialized sound to the parcel +PARCEL_FLAG_RESTRICT_PUSHOBJECT		Used with llGetParcelFlags to find if a parcel restricts llPushObject() calls +PARCEL_FLAG_ALLOW_ALL_OBJECT_ENTRY		Used with llGetParcelFlags to find if a parcel allows all objects to enter +PARCEL_FLAG_ALLOW_GROUP_OBJECT_ENTRY	Used with llGetParcelFlags to find if a parcel only allows group (and owner) objects to enter + +REGION_FLAG_ALLOW_DAMAGE			Used with llGetRegionFlags to find if a region is entirely damage enabled +REGION_FLAG_FIXED_SUN				Used with llGetRegionFlags to find if a region has a fixed sun position +REGION_FLAG_BLOCK_TERRAFORM			Used with llGetRegionFlags to find if a region terraforming disabled +REGION_FLAG_SANDBOX					Used with llGetRegionFlags to find if a region is a sandbox +REGION_FLAG_DISABLE_COLLISIONS		Used with llGetRegionFlags to find if a region has disabled collisions +REGION_FLAG_DISABLE_PHYSICS			Used with llGetRegionFlags to find if a region has disabled physics +REGION_FLAG_BLOCK_FLY				Used with llGetRegionFlags to find if a region blocks flying +REGION_FLAG_BLOCK_FLYOVER			Used with llGetRegionFlags to find if a region enforces higher altitude parcel access rules +REGION_FLAG_ALLOW_DIRECT_TELEPORT	Used with llGetRegionFlags to find if a region allows direct teleports +REGION_FLAG_RESTRICT_PUSHOBJECT		Used with llGetRegionFlags to find if a region restricts llPushObject() calls + +HTTP_METHOD                         Used with llHTTPRequest to specify the method, such as "GET" or "POST" +HTTP_MIMETYPE                       Used with llHTTPRequest to specify the MIME type, defaults to "text/plain" +HTTP_BODY_MAXLENGTH                 Used with llHTTPRequest to specify the maximum response body to return +HTTP_VERIFY_CERT                    Used with llHTTPRequest to specify SSL certificate verification +HTTP_BODY_TRUNCATED                 Used with http_response to indicate truncation point in bytes + +PARCEL_COUNT_TOTAL		Used with llGetParcelPrimCount to get the total number of prims on the parcel +PARCEL_COUNT_OWNER		Used with llGetParcelPrimCount to get the number of prims on the parcel owned by the owner +PARCEL_COUNT_GROUP		Used with llGetParcelPrimCount to get the number of prims on the parcel owned by the group +PARCEL_COUNT_OTHER		Used with llGetParcelPrimCount to get the number of prims on the parcel owned by others +PARCEL_COUNT_SELECTED	Used with llGetParcelPrimCount to get the number of prims on the parcel currently selected or sat upon +PARCEL_COUNT_TEMP		Used with llGetParcelPrimCount to get the number of prims on the parcel that are temp on rez + +PARCEL_DETAILS_NAME		Used with llGetParcelDetails to get the parcel name +PARCEL_DETAILS_DESC		Used with llGetParcelDetails to get the parcel description +PARCEL_DETAILS_OWNER	Used with llGetParcelDetails to get the parcel owner id +PARCEL_DETAILS_GROUP	Used with llGetParcelDetails to get the parcel group id +PARCEL_DETAILS_AREA		Used with llGetParcelDetails to get the parcel area in square meters +PARCEL_DETAILS_ID		Used with llGetParcelDetails to get the parcel id +PARCEL_DETAILS_SEE_AVATARS	Used with llGetParcelDetails to get the avatars visibility setting + +STRING_TRIM_HEAD		Used with llStringTrim to trim leading spaces from a string +STRING_TRIM_TAIL		Used with llStringTrim to trim trailing spaces from a string +STRING_TRIM				Used with llStringTrim to trim both leading and trailing spaces from a string + +CLICK_ACTION_NONE       Used with llSetClickAction to disable the click action +CLICK_ACTION_TOUCH      Used with llSetClickAction to set touch as the default action when object is clicked +CLICK_ACTION_SIT        Used with llSetClickAction to set sit as the default action when object is clicked +CLICK_ACTION_BUY        Used with llSetClickAction to set buy as the default action when object is clicked +CLICK_ACTION_PAY        Used with llSetClickAction to set pay as the default action when object is clicked +CLICK_ACTION_OPEN       Used with llSetClickAction to set open as the default action when object is clicked +CLICK_ACTION_PLAY       Used with llSetClickAction to set play as the default action when object is clicked +CLICK_ACTION_OPEN_MEDIA Used with llSetClickAction to set open-media as the default action when object is clicked +CLICK_ACTION_ZOOM       Used with llSetClickAction to set zoom in as the default action when object is clicked + +TOUCH_INVALID_TEXCOORD  Value returned by llDetectedTouchUV() and llDetectedTouchST() when the touch position is not valid +TOUCH_INVALID_VECTOR    Value returned by llDetectedTouchPos(), llDetectedTouchNormal(), and llDetectedTouchBinormal() when the touch position is not valid +TOUCH_INVALID_FACE      Value returned by llDetectedTouchFace() when the touch position is not valid + +PRIM_MEDIA_ALT_IMAGE_ENABLE            Used with ll{Get,Set}PrimMediaParams to enable the default alt image for media  +PRIM_MEDIA_CONTROLS                    Used with ll{Get,Set}PrimMediaParams to determine the controls shown for media +PRIM_MEDIA_CURRENT_URL                 Used with ll{Get,Set}PrimMediaParams to navigate/access the current URL +PRIM_MEDIA_HOME_URL                    Used with ll{Get,Set}PrimMediaParams to access the home URL +PRIM_MEDIA_AUTO_LOOP                   Used with ll{Get,Set}PrimMediaParams to determine if media should auto-loop (if applicable) +PRIM_MEDIA_AUTO_PLAY                   Used with ll{Get,Set}PrimMediaParams to determine if media should start playing as soon as it is created +PRIM_MEDIA_AUTO_SCALE                  Used with ll{Get,Set}PrimMediaParams to determine if media should scale to fit the face it is on  +PRIM_MEDIA_AUTO_ZOOM                   Used with ll{Get,Set}PrimMediaParams to determine if the user would zoom in when viewing media +PRIM_MEDIA_FIRST_CLICK_INTERACT        Used with ll{Get,Set}PrimMediaParams to determine whether the user interacts with media or not when she first clicks it (versus selection) +PRIM_MEDIA_WIDTH_PIXELS                Used with ll{Get,Set}PrimMediaParams to access the media's width in pixels +PRIM_MEDIA_HEIGHT_PIXELS               Used with ll{Get,Set}PrimMediaParams to access the media's height in pixels +PRIM_MEDIA_WHITELIST_ENABLE            Used with ll{Get,Set}PrimMediaParams to determine if the domain whitelist is enabled +PRIM_MEDIA_WHITELIST                   Used with ll{Get,Set}PrimMediaParams to access the media's list of allowable URL prefixes to navigate to +PRIM_MEDIA_PERMS_INTERACT              Used with ll{Get,Set}PrimMediaParams to determine the permissions for who can interact with the media +PRIM_MEDIA_PERMS_CONTROL               Used with ll{Get,Set}PrimMediaParams to determine the permissions for who has controls +PRIM_MEDIA_PARAM_MAX                   The value of the largest media param + +PRIM_MEDIA_CONTROLS_STANDARD           Used with ll{Get,Set}PrimMediaParams, a PRIM_MEDIA_CONTROLS value meaning "standard controls" +PRIM_MEDIA_CONTROLS_MINI               Used with ll{Get,Set}PrimMediaParams, a PRIM_MEDIA_CONTROLS value meaning "mini controls"               + +PRIM_MEDIA_PERM_NONE                   Used with ll{Get,Set}PrimMediaParams, a PRIM_MEDIA_PERMS_INTERACT or PRIM_MEDIA_PERMS_CONTROL bit, no permissions +PRIM_MEDIA_PERM_OWNER                  Used with ll{Get,Set}PrimMediaParams, a PRIM_MEDIA_PERMS_INTERACT or PRIM_MEDIA_PERMS_CONTROL bit, owner permissions +PRIM_MEDIA_PERM_GROUP                  Used with ll{Get,Set}PrimMediaParams, a PRIM_MEDIA_PERMS_INTERACT or PRIM_MEDIA_PERMS_CONTROL bit, group permissions +PRIM_MEDIA_PERM_ANYONE                 Used with ll{Get,Set}PrimMediaParams, a PRIM_MEDIA_PERMS_INTERACT or PRIM_MEDIA_PERMS_CONTROL bit, anyone has permissions + +PRIM_MEDIA_MAX_URL_LENGTH              Used with ll{Get,Set}PrimMediaParams, the maximum length of PRIM_MEDIA_CURRENT_URL or PRIM_MEDIA_HOME_URL +PRIM_MEDIA_MAX_WHITELIST_SIZE          Used with ll{Get,Set}PrimMediaParams, the maximum length, in bytes, of PRIM_MEDIA_WHITELIST +PRIM_MEDIA_MAX_WHITELIST_COUNT         Used with ll{Get,Set}PrimMediaParams, the maximum number of items allowed in PRIM_MEDIA_WHITELIST +PRIM_MEDIA_MAX_WIDTH_PIXELS            Used with ll{Get,Set}PrimMediaParams, the maximum width allowed in PRIM_MEDIA_WIDTH_PIXELS +PRIM_MEDIA_MAX_HEIGHT_PIXELS           Used with ll{Get,Set}PrimMediaParams, the maximum width allowed in PRIM_MEDIA_HEIGHT_PIXELS + +STATUS_OK                              Result of function call was success +STATUS_MALFORMED_PARAMS                Function was called with malformed params +STATUS_TYPE_MISMATCH                   Argument(s) passed to function had a type mismatch +STATUS_BOUNDS_ERROR                    Argument(s) passed to function had a bounds error  +STATUS_NOT_FOUND                       Object or other item was not found +STATUS_NOT_SUPPORTED                   Feature not supported +STATUS_INTERNAL_ERROR                  An internal error occurred +STATUS_WHITELIST_FAILED                URL failed to pass whitelist + +PROFILE_NONE               Disables profiling +PROFILE_SCRIPT_MEMORY      Enables memory profiling + +RC_DATA_FLAGS          TODO: add documentation +RC_DETECT_PHANTOM      TODO: add documentation +RC_GET_LINK_NUM        TODO: add documentation +RC_GET_NORMAL          TODO: add documentation +RC_GET_ROOT_KEY        TODO: add documentation +RC_MAX_HITS            TODO: add documentation +RC_REJECT_TYPES			Optional parameter set in llCastRay() to reject hit against certain object types. +RC_REJECT_AGENTS		Bit mask for RC_REJECT_TYPES, rejects hits against avatars. +RC_REJECT_PHYSICAL		Bit mask for RC_REJECT_TYPES, rejects hits against moving objects. +RC_REJECT_NONPHYSICAL	Bit mask for RC_REJECT_TYPES, rejects hits against non-moving objects. +RC_REJECT_LAND			Bit mask for RC_REJECT_TYPES, rejects hits against the terrian. + +RCERR_CAST_TIME_EXCEEDED    TODO: add documentation +RCERR_SIM_PERF_LOW          TODO: add documentation +RCERR_UNKNOWN               TODO: add documentation + +ESTATE_ACCESS_ALLOWED_AGENT_ADD    TODO: add documentation +ESTATE_ACCESS_ALLOWED_AGENT_REMOVE TODO: add documentation +ESTATE_ACCESS_ALLOWED_GROUP_ADD    TODO: add documentation +ESTATE_ACCESS_ALLOWED_GROUP_REMOVE TODO: add documentation +ESTATE_ACCESS_BANNED_AGENT_ADD     TODO: add documentation +ESTATE_ACCESS_BANNED_AGENT_REMOVE  TODO: add documentation + +DENSITY 			TODO: add documentation +FRICTION 			TODO: add documentation +RESTITUTION 		TODO: add documentation +GRAVITY_MULTIPLIER 	TODO: add documentation + +KFM_COMMAND			TODO: add documentation +KFM_CMD_PLAY		TODO: add documentation +KFM_CMD_STOP		TODO: add documentation +KFM_CMD_PAUSE		TODO: add documentation +KFM_CMD_SET_MODE	TODO: add documentation +KFM_MODE			TODO: add documentation +KFM_FORWARD			TODO: add documentation +KFM_LOOP			TODO: add documentation +KFM_PING_PONG		TODO: add documentation +KFM_REVERSE			TODO: add documentation +KFM_DATA			TODO: add documentation +KFM_ROTATION		TODO: add documentation +KFM_TRANSLATION		TODO: add documentation + +CHARACTER_CMD_STOP	TODO: add documentation +CHARACTER_CMD_JUMP	TODO: add documentation + +CHARACTER_DESIRED_SPEED		TODO: add documentation +CHARACTER_RADIUS			TODO: add documentation +CHARACTER_LENGTH			TODO: add documentation +CHARACTER_ORIENTATION		TODO: add documentation +CHARACTER_AVOIDANCE_MODE	TODO: add documentation +PURSUIT_OFFSET				TODO: add documentation +REQUIRE_LINE_OF_SIGHT		TODO: add documentation +PURSUIT_FUZZ_FACTOR			TODO: add documentation +PURSUIT_INTERCEPT			TODO: add documentation +FORCE_DIRECT_PATH			TODO: add documentation +VERTICAL					TODO: add documentation +HORIZONTAL					TODO: add documentation +AVOID_CHARACTERS			TODO: add documentation +AVOID_DYNAMIC_OBSTACLES		TODO: add documentation + +PU_EVADE_HIDDEN                  Triggered when an llEvade character thinks it has hidden from its pursuer. +PU_EVADE_SPOTTED                 Triggered when an llEvade character switches from hiding to running +PU_FAILURE_INVALID_GOAL          Goal is not on the navigation-mesh and cannot be reached. +PU_FAILURE_INVALID_START         Character cannot navigate from the current location - e.g., the character is off the navmesh or too high above it. +PU_FAILURE_NO_VALID_DESTINATION  There's no good place for the character to go - e.g., it is patrolling and all the patrol points are now unreachable. +PU_FAILURE_OTHER			     Unknown failure +PU_FAILURE_TARGET_GONE           Target (for llPursue or llEvade) can no longer be tracked - e.g., it left the region or is an avatar that is now more than about 30m outside the region. +PU_FAILURE_UNREACHABLE           Goal is no longer reachable for some reason - e.g., an obstacle blocks the path. +PU_GOAL_REACHED                  Character has reached the goal and will stop or choose a new goal (if wandering). +PU_SLOWDOWN_DISTANCE_REACHED     Character is near current goal. + +CHARACTER_TYPE			TODO: add documentation +CHARACTER_TYPE_A		TODO: add documentation +CHARACTER_TYPE_B		TODO: add documentation +CHARACTER_TYPE_C		TODO: add documentation +CHARACTER_TYPE_D		TODO: add documentation +CHARACTER_TYPE_NONE		TODO: add documentation + +TRAVERSAL_TYPE			TODO: add documentation +TRAVERSAL_TYPE_SLOW		TODO: add documentation +TRAVERSAL_TYPE_FAST		TODO: add documentation +TRAVERSAL_TYPE_NONE		TODO: add documentation + +CHARACTER_MAX_ACCEL				TODO: add documentation +CHARACTER_MAX_DECEL				TODO: add documentation +CHARACTER_MAX_ANGULAR_SPEED		TODO: add documentation +CHARACTER_MAX_ANGULAR_ACCEL		TODO: add documentation +CHARACTER_TURN_SPEED_MULTIPLIER	TODO: add documentation + +# string constants +[word .1, .3, .5] +NULL_KEY			Indicates an empty key +EOF					Indicates the last line of a notecard was read +TEXTURE_BLANK			UUID for the "Blank" texture +TEXTURE_DEFAULT			Alias for TEXTURE_PLYWOOD +TEXTURE_MEDIA			UUID for the "Default Media" texture +TEXTURE_PLYWOOD			UUID for the default "Plywood" texture +TEXTURE_TRANSPARENT		UUID for the "White - Transparent" texture + +URL_REQUEST_GRANTED		Used with http_request when a public URL is successfully granted +URL_REQUEST_DENIED		Used with http_request when a public URL is not available + +# float constants +[word .3, .1, .5] +PI					3.1415926535897932384626433832795 +TWO_PI				6.283185307179586476925286766559 +PI_BY_TWO			1.5707963267948966192313216916398 +DEG_TO_RAD			To convert from degrees to radians +RAD_TO_DEG			To convert from radians to degrees +SQRT2				1.4142135623730950488016887242097 + +# compound constants +[word .4, .2, .4] +ZERO_VECTOR			<0.0, 0.0, 0.0> +ZERO_ROTATION		<0.0, 0.0, 0.0, 1.0> + + +# flow control keywords +[word 0, 0, .8] +for					for loop:for (initializer; test; iteration):{:   statements:} +do					do loop:do:{:   statements:} while (test); +while				while loop:while (test):{    statements:} +if					if statement:if (test):{    statements:} +else				else clause:if (test):{    statements:}:else:{    statements:} +jump				jump statement:jump label;: +return				Leave current function or event handler + +# flow control label +[line 0, 0, .8] +@					Label:Target for jump statement + +# Comment +[one_sided_delimiter .8, .3, .15] +//					Comment:Non-functional commentary or disabled code +[two_sided_delimiter .8, .3, .15] +/* */				Comment:Non-functional commentary or disabled code + +# String literals +[double_quotation_marks 0, .2, 0] +"					String literal + +#functions are supplied by the program now diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index fd7eb4d9da..be6478d26f 100755 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -11462,28 +11462,6 @@        <key>Value</key>        <integer>75</integer>      </map> -    <key>SnapshotSharingEnabled</key> -    <map> -      <key>Comment</key> -      <string>Enable uploading of snapshots to a web service.</string> -      <key>Persist</key> -      <integer>1</integer> -      <key>Type</key> -      <string>Boolean</string> -      <key>Value</key> -      <integer>0</integer> -    </map> -    <key>SnapshotConfigURL</key> -    <map> -      <key>Comment</key> -      <string>URL to fetch Snapshot Sharing configuration data from.</string> -      <key>Persist</key> -      <integer>1</integer> -      <key>Type</key> -      <string>String</string> -      <key>Value</key> -      <string>http://photos.apps.staging.avatarsunited.com/viewer_config</string> -    </map>      <key>SpeedTest</key>      <map>        <key>Comment</key> @@ -15417,18 +15395,6 @@      <key>Value</key>      <integer>7000</integer>    </map> -  <key>DisablePrecacheDelayAfterTeleporting</key> -  <map> -    <key>Comment</key> -    <string>Disables the artificial delay in the viewer that precaches some incoming assets</string> -    <key>Persist</key> -    <integer>0</integer> -    <key>Type</key> -    <string>Boolean</string> -    <key>Value</key> -    <integer>0</integer> -  </map> -    <key>VersionChannelName</key>      <map>        <key>Comment</key> diff --git a/indra/newview/app_settings/shaders/class1/deferred/diffuseSkinnedV.glsl b/indra/newview/app_settings/shaders/class1/deferred/diffuseSkinnedV.glsl index a74290bfcd..2487110624 100755 --- a/indra/newview/app_settings/shaders/class1/deferred/diffuseSkinnedV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/diffuseSkinnedV.glsl @@ -40,7 +40,7 @@ mat4 getObjectSkinnedTransform();  void main()  {  	vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy; -	 +		  	mat4 mat = getObjectSkinnedTransform();  	mat = modelview_matrix * mat; diff --git a/indra/newview/character/avatar_lad.xml b/indra/newview/character/avatar_lad.xml index 5268498d56..6de5b18c3c 100755 --- a/indra/newview/character/avatar_lad.xml +++ b/indra/newview/character/avatar_lad.xml @@ -3825,7 +3825,7 @@          <volume_morph            name="BELLY"            scale="0.075 0.04 0.03" -          pos="0.07 0 -0.02"/> +          pos="0.07 0 -0.07"/>          <volume_morph            name="PELVIS"            scale="0.075 0.04 0.03" @@ -4269,7 +4269,7 @@       label_min="Big Pectorals"       label_max="Sunken Chest"       value_default="0" -     value_min="-1.0" +     value_min="-0.5"       value_max="1.1"       camera_elevation=".3"       camera_distance="1.2"> diff --git a/indra/newview/gpu_table.txt b/indra/newview/gpu_table.txt index 8efc4ee87d..badbe486b9 100755 --- a/indra/newview/gpu_table.txt +++ b/indra/newview/gpu_table.txt @@ -327,7 +327,8 @@ Intel HD Graphics 4600					.*Intel.*HD Graphics 46.*							3	1	0	4.2  Intel HD Graphics 4000					.*Intel.*HD Graphics 4.*							3	1	1	4.2  Intel Intel Iris Pro Graphics 5200		.*Intel.*Iris Pro Graphics 52.*						4	1	0	4  Intel Intel Iris Graphics 5100			.*Intel.*Iris Graphics 51.*							4	1	0	4 -Intel Intel Iris OpenGL Engine			.*Intel.*Iris (Pro )*OpenGL.*							4	1	0	4 +Intel Intel Iris OpenGL Engine			.*Intel.*Iris OpenGL.*							4	1	0	4 +Intel Intel Iris Pro OpenGL Engine			.*Intel.*Iris Pro OpenGL.*							5	1	0	4  Intel HD Graphics 5000					.*Intel.*HD Graphics 5.*							4	1	0	4  Intel HD Graphics						.*Intel.*HD Graphics.*								2	1	1	4  Intel Mobile 4 Series					.*Intel.*Mobile.* 4 Series.*						0	1	1	2.1 diff --git a/indra/newview/installers/windows/installer_template.nsi b/indra/newview/installers/windows/installer_template.nsi index 8b3a9a8372..65581a6781 100755 --- a/indra/newview/installers/windows/installer_template.nsi +++ b/indra/newview/installers/windows/installer_template.nsi @@ -106,6 +106,7 @@ Var COMMANDLINE         ; command line passed to this installer, set in .onInit  Var SHORTCUT_LANG_PARAM ; "--set InstallLanguage de", passes language to viewer
  Var SKIP_DIALOGS        ; set from command line in  .onInit. autoinstall 
                          ; GUI and the defaults.
 +Var SKIP_AUTORUN		; skip automatic launch of viewer after install
  Var DO_UNINSTALL_V2     ; If non-null, path to a previous Viewer 2 installation that will be uninstalled.
  ;;; Function definitions should go before file includes, because calls to
 @@ -125,24 +126,9 @@ Var DO_UNINSTALL_V2     ; If non-null, path to a previous Viewer 2 installation  Function .onInstSuccess
  Call CheckWindowsServPack				; Warn if not on the latest SP before asking to launch.
      Push $R0	# Option value, unused
 -
 -    StrCmp $SKIP_DIALOGS "true" label_launch 
 -
 -    ${GetOptions} $COMMANDLINE "/AUTOSTART" $R0
 -    # If parameter was there (no error) just launch
 -    # Otherwise ask
 -    IfErrors label_ask_launch label_launch
 -    
 -label_ask_launch:
 -    # Don't launch by default when silent
 -    IfSilent label_no_launch
 -	MessageBox MB_YESNO $(InstSuccesssQuestion) \
 -        IDYES label_launch IDNO label_no_launch
 -        
 -label_launch:
 +	StrCmp $SKIP_AUTORUN "true" +2;
  	# Assumes SetOutPath $INSTDIR
  	Exec '"$INSTDIR\$INSTEXE" $SHORTCUT_LANG_PARAM'
 -label_no_launch:
  	Pop $R0
  FunctionEnd
 @@ -822,7 +808,12 @@ Call CheckWindowsVersion		; Don't install On unsupported systems      IfErrors +2 0 ; If error jump past setting SKIP_DIALOGS
          StrCpy $SKIP_DIALOGS "true"
 +	${GetOptions} $COMMANDLINE "/SKIP_AUTORUN" $0
 +    IfErrors +2 0 ; If error jump past setting SKIP_AUTORUN
 +		StrCpy $SKIP_AUTORUN "true"
 +
      ${GetOptions} $COMMANDLINE "/LANGID=" $0   ; /LANGID=1033 implies US English
 +
      ; If no language (error), then proceed
      IfErrors lbl_configure_default_lang
      ; No error means we got a language, so use it
 diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index ab76ea95dd..eaba9e2c55 100755 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -3181,6 +3181,13 @@ bool LLAppViewer::initWindow()  	LLNotificationsUI::LLNotificationManager::getInstance(); +     +#ifdef LL_DARWIN +    //Satisfy both MAINT-3135 (OSX 10.6 and earlier) MAINT-3288 (OSX 10.7 and later) +   if (getOSInfo().mMajorVer == 10 && getOSInfo().mMinorVer < 7) +       gViewerWindow->getWindow()->setOldResize(true); +#endif +      	if (gSavedSettings.getBOOL("WindowMaximized"))  	{  		gViewerWindow->getWindow()->maximize(); diff --git a/indra/newview/llchannelmanager.cpp b/indra/newview/llchannelmanager.cpp index 928c3baafa..b0537a83f1 100755 --- a/indra/newview/llchannelmanager.cpp +++ b/indra/newview/llchannelmanager.cpp @@ -113,33 +113,29 @@ void LLChannelManager::onLoginCompleted()  	}  	else  	{ -		// TODO: Seems this code leads to MAINT-3536 new crash in XML_ParserFree. -		// Need to investigate this and fix possible problems with notifications in startup time -		// Viewer can normally receive and show of postponed notifications about purchasing in marketplace on startup time. -		// Other types of postponed notifications did not tested. -		//// create a channel for the StartUp Toast -		//LLScreenChannelBase::Params p; -		//p.id = LLUUID(gSavedSettings.getString("StartUpChannelUUID")); -		//p.channel_align = CA_RIGHT; -		//mStartUpChannel = createChannel(p); - -		//if(!mStartUpChannel) -		//{ -		//	onStartUpToastClose(); -		//} -		//else -		//{ -		//	gViewerWindow->getRootView()->addChild(mStartUpChannel); - -		//	// init channel's position and size -		//	S32 channel_right_bound = gViewerWindow->getWorldViewRectScaled().mRight - gSavedSettings.getS32("NotificationChannelRightMargin");  -		//	S32 channel_width = gSavedSettings.getS32("NotifyBoxWidth"); -		//	mStartUpChannel->init(channel_right_bound - channel_width, channel_right_bound); -		//	mStartUpChannel->setMouseDownCallback(boost::bind(&LLNotificationWellWindow::onStartUpToastClick, LLNotificationWellWindow::getInstance(), _2, _3, _4)); - -		//	mStartUpChannel->setCommitCallback(boost::bind(&LLChannelManager::onStartUpToastClose, this)); -		//	mStartUpChannel->createStartUpToast(away_notifications, gSavedSettings.getS32("StartUpToastLifeTime")); -		//} +		// create a channel for the StartUp Toast +		LLScreenChannelBase::Params p; +		p.id = LLUUID(gSavedSettings.getString("StartUpChannelUUID")); +		p.channel_align = CA_RIGHT; +		mStartUpChannel = createChannel(p); + +		if(!mStartUpChannel) +		{ +			onStartUpToastClose(); +		} +		else +		{ +			gViewerWindow->getRootView()->addChild(mStartUpChannel); + +			// init channel's position and size +			S32 channel_right_bound = gViewerWindow->getWorldViewRectScaled().mRight - gSavedSettings.getS32("NotificationChannelRightMargin");  +			S32 channel_width = gSavedSettings.getS32("NotifyBoxWidth"); +			mStartUpChannel->init(channel_right_bound - channel_width, channel_right_bound); +			mStartUpChannel->setMouseDownCallback(boost::bind(&LLNotificationWellWindow::onStartUpToastClick, LLNotificationWellWindow::getInstance(), _2, _3, _4)); + +			mStartUpChannel->setCommitCallback(boost::bind(&LLChannelManager::onStartUpToastClose, this)); +			mStartUpChannel->createStartUpToast(away_notifications, gSavedSettings.getS32("StartUpToastLifeTime")); +		}  	}  	LLPersistentNotificationStorage::getInstance()->loadNotifications(); diff --git a/indra/newview/llconversationmodel.h b/indra/newview/llconversationmodel.h index d8cdcdfc97..dc74506c53 100644 --- a/indra/newview/llconversationmodel.h +++ b/indra/newview/llconversationmodel.h @@ -291,6 +291,9 @@ class LLConversationViewModel  {  public:  	typedef LLFolderViewModel<LLConversationSort, LLConversationItem, LLConversationItem, LLConversationFilter> base_t; +	LLConversationViewModel()  +	:	base_t(new LLConversationSort(), new LLConversationFilter()) +	{}  	void sort(LLFolderViewFolder* folder);  	bool contentsReady() { return true; }	// *TODO : we need to check that participants names are available somewhat diff --git a/indra/newview/lldeferredsounds.cpp b/indra/newview/lldeferredsounds.cpp index 9416e7cd29..e1613e4719 100755 --- a/indra/newview/lldeferredsounds.cpp +++ b/indra/newview/lldeferredsounds.cpp @@ -39,7 +39,10 @@ void LLDeferredSounds::playdeferredSounds()  {  	while(soundVector.size())  	{ -		gAudiop->triggerSound(soundVector.back()); +		if (gAudiop) +		{ +			gAudiop->triggerSound(soundVector.back()); +		}  		soundVector.pop_back();  	}  } diff --git a/indra/newview/lldrawpoolavatar.cpp b/indra/newview/lldrawpoolavatar.cpp index 0ecdabbbe9..90e6dfe351 100755 --- a/indra/newview/lldrawpoolavatar.cpp +++ b/indra/newview/lldrawpoolavatar.cpp @@ -1518,6 +1518,18 @@ void LLDrawPoolAvatar::getRiggedGeometry(LLFace* face, LLPointer<LLVertexBuffer>  	}  	//LL_INFOS() << "Rebuilt face " << face->getTEOffset() << " of " << face->getDrawable() << " at " << gFrameTimeSeconds << LL_ENDL; + +	// Let getGeometryVolume know if a texture matrix is in play +	if (face->mTextureMatrix) +	{ +		face->setState(LLFace::TEXTURE_ANIM); +	} +	else +	{ +		face->clearState(LLFace::TEXTURE_ANIM); +	} + +  	face->getGeometryVolume(*volume, face->getTEOffset(), mat_vert, mat_normal, offset, true);  	buffer->flush(); diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp index 0b080cbdd7..32b510b21a 100755 --- a/indra/newview/llface.cpp +++ b/indra/newview/llface.cpp @@ -1638,7 +1638,7 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,  					do_xform = false;  				} -				if (getVirtualSize() >= MIN_TEX_ANIM_SIZE) +				if (getVirtualSize() >= MIN_TEX_ANIM_SIZE || isState(LLFace::RIGGED))  				{ //don't override texture transform during tc bake  					tex_mode = 0;  				} diff --git a/indra/newview/llfilepicker.cpp b/indra/newview/llfilepicker.cpp index 4698f2da1a..8402148a46 100755 --- a/indra/newview/llfilepicker.cpp +++ b/indra/newview/llfilepicker.cpp @@ -570,6 +570,7 @@ std::vector<std::string>* LLFilePicker::navOpenFilterProc(ELoadFilter filter) //              allowedv->push_back("lsl");              allowedv->push_back("dic");              allowedv->push_back("xcu"); +            allowedv->push_back("gif");          case FFLOAD_IMAGE:              allowedv->push_back("jpg");              allowedv->push_back("jpeg"); @@ -661,7 +662,7 @@ bool	LLFilePicker::doNavSaveDialog(ESaveFilter filter, const std::string& filena  		case FFSAVE_TGAPNG:  			type = "PNG";  			creator = "prvw"; -			extension = "png"; +			extension = "png,tga";  			break;  		case FFSAVE_BMP:  			type = "BMPf"; @@ -779,7 +780,7 @@ BOOL LLFilePicker::getOpenFile(ELoadFilter filter, bool blocking)  	if(filter == FFLOAD_ALL)	// allow application bundles etc. to be traversed; important for DEV-16869, but generally useful  	{ -        mPickOptions &= F_NAV_SUPPORT; +        mPickOptions |= F_NAV_SUPPORT;  	}  	if (blocking) diff --git a/indra/newview/llfilepicker_mac.mm b/indra/newview/llfilepicker_mac.mm index 13757904e3..1438e4dc0a 100644 --- a/indra/newview/llfilepicker_mac.mm +++ b/indra/newview/llfilepicker_mac.mm @@ -107,7 +107,7 @@ std::string* doSaveDialog(const std::string* file,      NSSavePanel *panel = [NSSavePanel savePanel];       NSString *extensionns = [NSString stringWithCString:extension->c_str() encoding:[NSString defaultCStringEncoding]]; -    NSArray *fileType = [[NSArray alloc] initWithObjects:extensionns,nil]; +    NSArray *fileType = [extensionns componentsSeparatedByString:@","];      //[panel setMessage:@"Save Image File"];       [panel setTreatsFilePackagesAsDirectories: ( flags & F_NAV_SUPPORT ) ]; diff --git a/indra/newview/llfloaterconversationpreview.cpp b/indra/newview/llfloaterconversationpreview.cpp index a303c2c6b3..a358b7c10b 100755 --- a/indra/newview/llfloaterconversationpreview.cpp +++ b/indra/newview/llfloaterconversationpreview.cpp @@ -32,6 +32,7 @@  #include "llfloaterimnearbychat.h"  #include "llspinctrl.h"  #include "lltrans.h" +#include "llnotificationsutil.h"  const std::string LL_FCP_COMPLETE_NAME("complete_name");  const std::string LL_FCP_ACCOUNT_NAME("user_name"); @@ -45,14 +46,20 @@ LLFloaterConversationPreview::LLFloaterConversationPreview(const LLSD& session_i  	mAccountName(session_id[LL_FCP_ACCOUNT_NAME]),  	mCompleteName(session_id[LL_FCP_COMPLETE_NAME]),  	mMutex(NULL), -	mShowHistory(false) +	mShowHistory(false), +	mMessages(NULL), +	mHistoryThreadsBusy(false), +	mOpened(false) +{ +} + +LLFloaterConversationPreview::~LLFloaterConversationPreview()  {  }  BOOL LLFloaterConversationPreview::postBuild()  {  	mChatHistory = getChild<LLChatHistory>("chat_history"); -	LLLoadHistoryThread::setLoadEndSignal(boost::bind(&LLFloaterConversationPreview::setPages, this, _1, _2));  	const LLConversation* conv = LLConversationLog::instance().getConversation(mSessionID);  	std::string name; @@ -79,31 +86,21 @@ BOOL LLFloaterConversationPreview::postBuild()  	std::string title = getString("Title", args);  	setTitle(title); -	LLSD load_params; -	load_params["load_all_history"] = true; -	load_params["cut_off_todays_date"] = false; - - -	LLSD loading; -	loading[LL_IM_TEXT] = LLTrans::getString("loading_chat_logs"); -	mMessages.push_back(loading); -	mPageSpinner = getChild<LLSpinCtrl>("history_page_spin"); -	mPageSpinner->setCommitCallback(boost::bind(&LLFloaterConversationPreview::onMoreHistoryBtnClick, this)); -	mPageSpinner->setMinValue(1); -	mPageSpinner->set(1); -	mPageSpinner->setEnabled(false); -	LLLogChat::startChatHistoryThread(file, load_params);  	return LLFloater::postBuild();  } -void LLFloaterConversationPreview::setPages(std::list<LLSD>& messages,const std::string& file_name) +void LLFloaterConversationPreview::setPages(std::list<LLSD>* messages, const std::string& file_name)  { -	if(file_name == mChatHistoryFileName) +	if(file_name == mChatHistoryFileName && messages)  	{  		// additional protection to avoid changes of mMessages in setPages()  		LLMutexLock lock(&mMutex); +		if (mMessages) +		{ +			delete mMessages; // Clean up temporary message list with "Loading..." text +		}  		mMessages = messages; -		mCurrentPage = (mMessages.size() ? (mMessages.size() - 1) / mPageSize : 0); +		mCurrentPage = (mMessages->size() ? (mMessages->size() - 1) / mPageSize : 0);  		mPageSpinner->setEnabled(true);  		mPageSpinner->setMaxValue(mCurrentPage+1); @@ -113,6 +110,11 @@ void LLFloaterConversationPreview::setPages(std::list<LLSD>& messages,const std:  		getChild<LLTextBox>("page_num_label")->setValue(total_page_num);  		mShowHistory = true;  	} +	LLLoadHistoryThread* loadThread = LLLogChat::getLoadHistoryThread(mSessionID); +	if (loadThread) +	{ +		loadThread->removeLoadEndSignal(boost::bind(&LLFloaterConversationPreview::setPages, this, _1, _2)); +	}  }  void LLFloaterConversationPreview::draw() @@ -127,24 +129,82 @@ void LLFloaterConversationPreview::draw()  void LLFloaterConversationPreview::onOpen(const LLSD& key)  { +	if (mOpened) +	{ +		return; +	} +	mOpened = true; +	if (!LLLogChat::historyThreadsFinished(mSessionID)) +	{ +		LLNotificationsUtil::add("ChatHistoryIsBusyAlert"); +		mHistoryThreadsBusy = true; +		closeFloater(); +		return; +	} +	LLSD load_params; +	load_params["load_all_history"] = true; +	load_params["cut_off_todays_date"] = false; + +	// The temporary message list with "Loading..." text +	// Will be deleted upon loading completion in setPages() method +	mMessages = new std::list<LLSD>(); + + +	LLSD loading; +	loading[LL_IM_TEXT] = LLTrans::getString("loading_chat_logs"); +	mMessages->push_back(loading); +	mPageSpinner = getChild<LLSpinCtrl>("history_page_spin"); +	mPageSpinner->setCommitCallback(boost::bind(&LLFloaterConversationPreview::onMoreHistoryBtnClick, this)); +	mPageSpinner->setMinValue(1); +	mPageSpinner->set(1); +	mPageSpinner->setEnabled(false); + +	// The actual message list to load from file +	// Will be deleted in a separate thread LLDeleteHistoryThread not to freeze UI +	// LLDeleteHistoryThread is started in destructor +	std::list<LLSD>* messages = new std::list<LLSD>(); + +	LLLogChat::cleanupHistoryThreads(); +	 +	LLLoadHistoryThread* loadThread = new LLLoadHistoryThread(mChatHistoryFileName, messages, load_params); +	loadThread->setLoadEndSignal(boost::bind(&LLFloaterConversationPreview::setPages, this, _1, _2)); +	loadThread->start(); +	LLLogChat::addLoadHistoryThread(mSessionID, loadThread); + +	LLDeleteHistoryThread* deleteThread = new LLDeleteHistoryThread(messages, loadThread); +	LLLogChat::addDeleteHistoryThread(mSessionID, deleteThread); +  	mShowHistory = true;  } +void LLFloaterConversationPreview::onClose(bool app_quitting) +{ +	mOpened = false; +	if (!mHistoryThreadsBusy) +	{ +		LLDeleteHistoryThread* deleteThread = LLLogChat::getDeleteHistoryThread(mSessionID); +		if (deleteThread) +		{ +			deleteThread->start(); +		} +	} +} +  void LLFloaterConversationPreview::showHistory()  {  	// additional protection to avoid changes of mMessages in setPages  	LLMutexLock lock(&mMutex); -	if (!mMessages.size() || mCurrentPage * mPageSize >= mMessages.size()) +	if(mMessages == NULL || !mMessages->size() || mCurrentPage * mPageSize >= mMessages->size())  	{  		return;  	}  	mChatHistory->clear();  	std::ostringstream message; -	std::list<LLSD>::const_iterator iter = mMessages.begin(); +	std::list<LLSD>::const_iterator iter = mMessages->begin();  	std::advance(iter, mCurrentPage * mPageSize); -	for (int msg_num = 0; iter != mMessages.end() && msg_num < mPageSize; ++iter, ++msg_num) +	for (int msg_num = 0; iter != mMessages->end() && msg_num < mPageSize; ++iter, ++msg_num)  	{  		LLSD msg = *iter; diff --git a/indra/newview/llfloaterconversationpreview.h b/indra/newview/llfloaterconversationpreview.h index b0488f4ff1..a8dbbc9ffe 100755 --- a/indra/newview/llfloaterconversationpreview.h +++ b/indra/newview/llfloaterconversationpreview.h @@ -39,13 +39,14 @@ class LLFloaterConversationPreview : public LLFloater  public:  	LLFloaterConversationPreview(const LLSD& session_id); -	virtual ~LLFloaterConversationPreview(){}; +	virtual ~LLFloaterConversationPreview();  	virtual BOOL postBuild(); -	void setPages(std::list<LLSD>& messages,const std::string& file_name); +	void setPages(std::list<LLSD>* messages,const std::string& file_name);  	virtual void draw();  	virtual void onOpen(const LLSD& key); +	virtual void onClose(bool app_quitting);  private:  	void onMoreHistoryBtnClick(); @@ -58,11 +59,13 @@ private:  	int				mCurrentPage;  	int				mPageSize; -	std::list<LLSD> mMessages; +	std::list<LLSD>*	mMessages;  	std::string		mAccountName;  	std::string		mCompleteName; -	std::string     mChatHistoryFileName; +	std::string		mChatHistoryFileName;  	bool			mShowHistory; +	bool			mHistoryThreadsBusy; +	bool			mOpened;  };  #endif /* LLFLOATERCONVERSATIONPREVIEW_H_ */ diff --git a/indra/newview/llfloaterimcontainer.cpp b/indra/newview/llfloaterimcontainer.cpp index bb39a54f76..ebb44561da 100755 --- a/indra/newview/llfloaterimcontainer.cpp +++ b/indra/newview/llfloaterimcontainer.cpp @@ -1318,7 +1318,12 @@ bool LLFloaterIMContainer::enableContextMenuItem(const std::string& item, uuid_v  	// Extract the single select info  	bool is_single_select = (uuids.size() == 1);  	const LLUUID& single_id = uuids.front(); -	 + +	if ("can_chat_history" == item && is_single_select) +	{ +		return LLLogChat::isTranscriptExist(uuids.front(),false); +	} +  	// Handle options that are applicable to all including the user agent      if ("can_view_profile" == item)      { diff --git a/indra/newview/llfloaterimsession.cpp b/indra/newview/llfloaterimsession.cpp index ec506d1c7e..f61359f87a 100644 --- a/indra/newview/llfloaterimsession.cpp +++ b/indra/newview/llfloaterimsession.cpp @@ -716,7 +716,7 @@ void LLFloaterIMSession::setVisible(BOOL visible)  	if (visible && isInVisibleChain())  	{  		sIMFloaterShowedSignal(mSessionID); -         +        updateMessages();  	}  } diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp index e30bff1edf..7213064746 100755 --- a/indra/newview/llfloaterland.cpp +++ b/indra/newview/llfloaterland.cpp @@ -2336,7 +2336,7 @@ BOOL LLPanelLandAccess::postBuild()  	childSetCommitCallback("public_access", onCommitPublicAccess, this);  	childSetCommitCallback("limit_payment", onCommitAny, this);  	childSetCommitCallback("limit_age_verified", onCommitAny, this); -	childSetCommitCallback("GroupCheck", onCommitAny, this); +	childSetCommitCallback("GroupCheck", onCommitGroupCheck, this);  	childSetCommitCallback("PassCheck", onCommitAny, this);  	childSetCommitCallback("pass_combo", onCommitAny, this);  	childSetCommitCallback("PriceSpin", onCommitAny, this); @@ -2501,11 +2501,11 @@ void LLPanelLandAccess::refresh()  		}  		BOOL use_pass = parcel->getParcelFlag(PF_USE_PASS_LIST); -		getChild<LLUICtrl>("PassCheck")->setValue(use_pass ); +		getChild<LLUICtrl>("PassCheck")->setValue(use_pass);  		LLCtrlSelectionInterface* passcombo = childGetSelectionInterface("pass_combo");  		if (passcombo)  		{ -			if (public_access || !use_pass || !use_group) +			if (public_access || !use_pass)  			{  				passcombo->selectByValue("anyone");  			} @@ -2598,12 +2598,11 @@ void LLPanelLandAccess::refresh_ui()  			getChildView("limit_age_verified")->setEnabled(FALSE); -			BOOL group_access = getChild<LLUICtrl>("GroupCheck")->getValue().asBoolean();  			BOOL sell_passes = getChild<LLUICtrl>("PassCheck")->getValue().asBoolean();  			getChildView("PassCheck")->setEnabled(can_manage_allowed);  			if (sell_passes)  			{ -				getChildView("pass_combo")->setEnabled(group_access && can_manage_allowed); +				getChildView("pass_combo")->setEnabled(can_manage_allowed);  				getChildView("PriceSpin")->setEnabled(can_manage_allowed);  				getChildView("HoursSpin")->setEnabled(can_manage_allowed);  			} @@ -2662,6 +2661,32 @@ void LLPanelLandAccess::onCommitPublicAccess(LLUICtrl *ctrl, void *userdata)  	onCommitAny(ctrl, userdata);  } +void LLPanelLandAccess::onCommitGroupCheck(LLUICtrl *ctrl, void *userdata) +{ +	LLPanelLandAccess *self = (LLPanelLandAccess *)userdata; +	LLParcel* parcel = self->mParcel->getParcel(); +	if (!parcel) +	{ +		return; +	} + +	BOOL use_pass_list = !self->getChild<LLUICtrl>("public_access")->getValue().asBoolean(); +	BOOL use_access_group = self->getChild<LLUICtrl>("GroupCheck")->getValue().asBoolean(); +	LLCtrlSelectionInterface* passcombo = self->childGetSelectionInterface("pass_combo"); +	if (passcombo) +	{ +		if (use_access_group && use_pass_list) +		{ +			if (passcombo->getSelectedValue().asString() == "group") +			{ +				passcombo->selectByValue("anyone"); +			} +		} +	} + +	onCommitAny(ctrl, userdata); +} +  // static  void LLPanelLandAccess::onCommitAny(LLUICtrl *ctrl, void *userdata)  { @@ -2699,14 +2724,14 @@ void LLPanelLandAccess::onCommitAny(LLUICtrl *ctrl, void *userdata)  	{  		use_access_list = TRUE;  		use_pass_list = self->getChild<LLUICtrl>("PassCheck")->getValue().asBoolean(); -		if (use_access_group && use_pass_list) +		LLCtrlSelectionInterface* passcombo = self->childGetSelectionInterface("pass_combo"); +		if (passcombo)  		{ -			LLCtrlSelectionInterface* passcombo = self->childGetSelectionInterface("pass_combo"); -			if (passcombo) +			if (use_access_group && use_pass_list)  			{  				if (passcombo->getSelectedValue().asString() == "group")  				{ -					use_access_list = FALSE; +					use_access_group = FALSE;  				}  			}  		} diff --git a/indra/newview/llfloaterland.h b/indra/newview/llfloaterland.h index dccdfc9acb..1d9bd33720 100755 --- a/indra/newview/llfloaterland.h +++ b/indra/newview/llfloaterland.h @@ -366,6 +366,7 @@ public:  	static void onCommitPublicAccess(LLUICtrl* ctrl, void *userdata);  	static void onCommitAny(LLUICtrl* ctrl, void *userdata); +	static void onCommitGroupCheck(LLUICtrl* ctrl, void *userdata);  	static void onClickRemoveAccess(void*);  	static void onClickRemoveBanned(void*); diff --git a/indra/newview/llfloaterregioninfo.cpp b/indra/newview/llfloaterregioninfo.cpp index 8d1114e056..d67089ff85 100755 --- a/indra/newview/llfloaterregioninfo.cpp +++ b/indra/newview/llfloaterregioninfo.cpp @@ -366,6 +366,7 @@ void LLFloaterRegionInfo::processRegionInfo(LLMessageSystem* msg)  	panel->getChild<LLUICtrl>("block_terraform_check")->setValue((region_flags & REGION_FLAGS_BLOCK_TERRAFORM) ? TRUE : FALSE );  	panel->getChild<LLUICtrl>("block_fly_check")->setValue((region_flags & REGION_FLAGS_BLOCK_FLY) ? TRUE : FALSE ); +	panel->getChild<LLUICtrl>("block_fly_over_check")->setValue((region_flags & REGION_FLAGS_BLOCK_FLYOVER) ? TRUE : FALSE );  	panel->getChild<LLUICtrl>("allow_damage_check")->setValue((region_flags & REGION_FLAGS_ALLOW_DAMAGE) ? TRUE : FALSE );  	panel->getChild<LLUICtrl>("restrict_pushobject")->setValue((region_flags & REGION_FLAGS_RESTRICT_PUSHOBJECT) ? TRUE : FALSE );  	panel->getChild<LLUICtrl>("allow_land_resell_check")->setValue((region_flags & REGION_FLAGS_BLOCK_LAND_RESELL) ? FALSE : TRUE ); @@ -635,6 +636,7 @@ BOOL LLPanelRegionGeneralInfo::postBuild()  	// Enable the "Apply" button if something is changed. JC  	initCtrl("block_terraform_check");  	initCtrl("block_fly_check"); +	initCtrl("block_fly_over_check");  	initCtrl("allow_damage_check");  	initCtrl("allow_land_resell_check");  	initCtrl("allow_parcel_changes_check"); @@ -816,6 +818,7 @@ BOOL LLPanelRegionGeneralInfo::sendUpdate()  	{  		body["block_terraform"] = getChild<LLUICtrl>("block_terraform_check")->getValue();  		body["block_fly"] = getChild<LLUICtrl>("block_fly_check")->getValue(); +		body["block_fly_over"] = getChild<LLUICtrl>("block_fly_over_check")->getValue();  		body["allow_damage"] = getChild<LLUICtrl>("allow_damage_check")->getValue();  		body["allow_land_resell"] = getChild<LLUICtrl>("allow_land_resell_check")->getValue();  		body["agent_limit"] = getChild<LLUICtrl>("agent_limit_spin")->getValue(); @@ -891,6 +894,7 @@ BOOL LLPanelRegionDebugInfo::postBuild()  	childSetAction("top_scripts_btn", onClickTopScripts, this);  	childSetAction("restart_btn", onClickRestart, this);  	childSetAction("cancel_restart_btn", onClickCancelRestart, this); +	childSetAction("region_debug_console_btn", onClickDebugConsole, this);  	return TRUE;  } @@ -912,6 +916,7 @@ bool LLPanelRegionDebugInfo::refreshFromRegion(LLViewerRegion* region)  	getChildView("top_scripts_btn")->setEnabled(allow_modify);  	getChildView("restart_btn")->setEnabled(allow_modify);  	getChildView("cancel_restart_btn")->setEnabled(allow_modify); +	getChildView("region_debug_console_btn")->setEnabled(allow_modify);  	return LLPanelRegionInfo::refreshFromRegion(region);  } @@ -1074,6 +1079,11 @@ void LLPanelRegionDebugInfo::onClickCancelRestart(void* data)  	self->sendEstateOwnerMessage(gMessageSystem, "restart", invoice, strings);  } +// static +void LLPanelRegionDebugInfo::onClickDebugConsole(void* data) +{ +	LLFloaterReg::showInstance("region_debug_console"); +}  BOOL LLPanelRegionTerrainInfo::validateTextureSizes()  { diff --git a/indra/newview/llfloaterregioninfo.h b/indra/newview/llfloaterregioninfo.h index dd961e21b2..5bc4273d5f 100755 --- a/indra/newview/llfloaterregioninfo.h +++ b/indra/newview/llfloaterregioninfo.h @@ -209,6 +209,7 @@ protected:  	static void onClickRestart(void* data);  	bool callbackRestart(const LLSD& notification, const LLSD& response);  	static void onClickCancelRestart(void* data); +	static void onClickDebugConsole(void* data);  private:  	LLUUID mTargetAvatar; diff --git a/indra/newview/llfloatersnapshot.cpp b/indra/newview/llfloatersnapshot.cpp index 8e92821aac..3d5b297fbe 100755 --- a/indra/newview/llfloatersnapshot.cpp +++ b/indra/newview/llfloatersnapshot.cpp @@ -44,7 +44,6 @@  #include "lltoolfocus.h"  #include "lltoolmgr.h"  #include "llwebprofile.h" -#include "llwebsharing.h"  ///----------------------------------------------------------------------------  /// Local function declarations, constants, enums, and typedefs @@ -360,10 +359,6 @@ void LLFloaterSnapshot::Impl::updateControls(LLFloaterSnapshot* floater)  	ESnapshotFormat shot_format = (ESnapshotFormat)gSavedSettings.getS32("SnapshotFormat");  	LLViewerWindow::ESnapshotType layer_type = getLayerType(floater); -#if 0 -	floater->getChildView("share_to_web")->setVisible( gSavedSettings.getBOOL("SnapshotSharingEnabled")); -#endif -  	floater->getChild<LLComboBox>("local_format_combo")->selectNthItem(gSavedSettings.getS32("SnapshotFormat"));  	enableAspectRatioCheckbox(floater, !floater->impl.mAspectRatioCheckOff);  	setAspectRatioCheckboxValue(floater, gSavedSettings.getBOOL("KeepAspectForSnapshot")); @@ -1032,12 +1027,6 @@ LLFloaterSnapshot::~LLFloaterSnapshot()  BOOL LLFloaterSnapshot::postBuild()  { -	// Kick start Web Sharing, to fetch its config data if it needs to. -	if (gSavedSettings.getBOOL("SnapshotSharingEnabled")) -	{ -		LLWebSharing::instance().init(); -	} -  	mRefreshBtn = getChild<LLUICtrl>("new_snapshot_btn");  	childSetAction("new_snapshot_btn", Impl::onClickNewSnapshot, this);  	mRefreshLabel = getChild<LLUICtrl>("refresh_lbl"); @@ -1263,7 +1252,7 @@ S32 LLFloaterSnapshot::notify(const LLSD& info)  //static   void LLFloaterSnapshot::update()  { -	LLFloaterSnapshot* inst = LLFloaterReg::findTypedInstance<LLFloaterSnapshot>("snapshot"); +	LLFloaterSnapshot* inst = findInstance();  	LLFloaterSocial* floater_social  = LLFloaterReg::findTypedInstance<LLFloaterSocial>("social");   	if (!inst && !floater_social) @@ -1291,12 +1280,18 @@ LLFloaterSnapshot* LLFloaterSnapshot::getInstance()  }  // static +LLFloaterSnapshot* LLFloaterSnapshot::findInstance() +{ +	return LLFloaterReg::findTypedInstance<LLFloaterSnapshot>("snapshot"); +} + +// static  void LLFloaterSnapshot::saveTexture()  {  	LL_DEBUGS() << "saveTexture" << LL_ENDL;  	// FIXME: duplicated code -	LLFloaterSnapshot* instance = LLFloaterReg::findTypedInstance<LLFloaterSnapshot>("snapshot"); +	LLFloaterSnapshot* instance = findInstance();  	if (!instance)  	{  		llassert(instance != NULL); @@ -1317,7 +1312,7 @@ BOOL LLFloaterSnapshot::saveLocal()  {  	LL_DEBUGS() << "saveLocal" << LL_ENDL;  	// FIXME: duplicated code -	LLFloaterSnapshot* instance = LLFloaterReg::findTypedInstance<LLFloaterSnapshot>("snapshot"); +	LLFloaterSnapshot* instance = findInstance();  	if (!instance)  	{  		llassert(instance != NULL); @@ -1337,7 +1332,7 @@ BOOL LLFloaterSnapshot::saveLocal()  void LLFloaterSnapshot::preUpdate()  {  	// FIXME: duplicated code -	LLFloaterSnapshot* instance = LLFloaterReg::findTypedInstance<LLFloaterSnapshot>("snapshot"); +	LLFloaterSnapshot* instance = findInstance();  	if (instance)  	{  		// Disable the send/post/save buttons until snapshot is ready. @@ -1352,7 +1347,7 @@ void LLFloaterSnapshot::preUpdate()  void LLFloaterSnapshot::postUpdate()  {  	// FIXME: duplicated code -	LLFloaterSnapshot* instance = LLFloaterReg::findTypedInstance<LLFloaterSnapshot>("snapshot"); +	LLFloaterSnapshot* instance = findInstance();  	if (instance)  	{  		// Enable the send/post/save buttons. @@ -1373,7 +1368,7 @@ void LLFloaterSnapshot::postUpdate()  // static  void LLFloaterSnapshot::postSave()  { -	LLFloaterSnapshot* instance = LLFloaterReg::findTypedInstance<LLFloaterSnapshot>("snapshot"); +	LLFloaterSnapshot* instance = findInstance();  	if (!instance)  	{  		llassert(instance != NULL); @@ -1399,7 +1394,7 @@ LLPointer<LLImageFormatted> LLFloaterSnapshot::getImageData()  {  	// FIXME: May not work for textures. -	LLFloaterSnapshot* instance = LLFloaterReg::findTypedInstance<LLFloaterSnapshot>("snapshot"); +	LLFloaterSnapshot* instance = findInstance();  	if (!instance)  	{  		llassert(instance != NULL); @@ -1426,7 +1421,7 @@ LLPointer<LLImageFormatted> LLFloaterSnapshot::getImageData()  // static  const LLVector3d& LLFloaterSnapshot::getPosTakenGlobal()  { -	LLFloaterSnapshot* instance = LLFloaterReg::findTypedInstance<LLFloaterSnapshot>("snapshot"); +	LLFloaterSnapshot* instance = findInstance();  	if (!instance)  	{  		llassert(instance != NULL); @@ -1446,7 +1441,7 @@ const LLVector3d& LLFloaterSnapshot::getPosTakenGlobal()  // static  void LLFloaterSnapshot::setAgentEmail(const std::string& email)  { -	LLFloaterSnapshot* instance = LLFloaterReg::findTypedInstance<LLFloaterSnapshot>("snapshot"); +	LLFloaterSnapshot* instance = findInstance();  	if (instance)  	{  		LLSideTrayPanelContainer* panel_container = instance->getChild<LLSideTrayPanelContainer>("panel_container"); diff --git a/indra/newview/llfloatersnapshot.h b/indra/newview/llfloatersnapshot.h index 82af8c7a9d..c757bf21c2 100755 --- a/indra/newview/llfloatersnapshot.h +++ b/indra/newview/llfloatersnapshot.h @@ -56,6 +56,7 @@ public:  	// TODO: create a snapshot model instead  	static LLFloaterSnapshot* getInstance(); +	static LLFloaterSnapshot* findInstance();  	static void saveTexture();  	static BOOL saveLocal();  	static void preUpdate(); diff --git a/indra/newview/llfolderviewmodelinventory.h b/indra/newview/llfolderviewmodelinventory.h index 9dcfdfa185..8772185ad0 100755 --- a/indra/newview/llfolderviewmodelinventory.h +++ b/indra/newview/llfolderviewmodelinventory.h @@ -105,6 +105,10 @@ class LLFolderViewModelInventory  public:  	typedef LLFolderViewModel<LLInventorySort,   LLFolderViewModelItemInventory, LLFolderViewModelItemInventory,   LLInventoryFilter> base_t; +	LLFolderViewModelInventory(const std::string& name) +	:	base_t(new LLInventorySort(), new LLInventoryFilter(LLInventoryFilter::Params().name(name))) +	{} +  	void setTaskID(const LLUUID& id) {mTaskID = id;}  	void sort(LLFolderViewFolder* folder); diff --git a/indra/newview/llgesturemgr.cpp b/indra/newview/llgesturemgr.cpp index 9fa40bc6b9..ffddeeb129 100755 --- a/indra/newview/llgesturemgr.cpp +++ b/indra/newview/llgesturemgr.cpp @@ -1337,6 +1337,7 @@ BOOL LLGestureMgr::matchPrefix(const std::string& in_str, std::string* out_str)  {  	S32 in_len = in_str.length(); +	//return whole trigger, if received text equals to it  	item_map_t::iterator it;  	for (it = mActive.begin(); it != mActive.end(); ++it)  	{ @@ -1344,7 +1345,24 @@ BOOL LLGestureMgr::matchPrefix(const std::string& in_str, std::string* out_str)  		if (gesture)  		{  			const std::string& trigger = gesture->getTrigger(); -			 +			if (!LLStringUtil::compareInsensitive(in_str, trigger)) +			{ +				*out_str = trigger; +				return TRUE; +			} +		} +	} + +	//return common chars, if more than one trigger matches the prefix +	std::string rest_of_match = ""; +	std::string buf = ""; +	for (it = mActive.begin(); it != mActive.end(); ++it) +	{ +		LLMultiGesture* gesture = (*it).second; +		if (gesture) +		{ +			const std::string& trigger = gesture->getTrigger(); +  			if (in_len > (S32)trigger.length())  			{  				// too short, bail out @@ -1355,11 +1373,49 @@ BOOL LLGestureMgr::matchPrefix(const std::string& in_str, std::string* out_str)  			LLStringUtil::truncate(trigger_trunc, in_len);  			if (!LLStringUtil::compareInsensitive(in_str, trigger_trunc))  			{ -				*out_str = trigger; -				return TRUE; +				if (rest_of_match.compare("") == 0) +				{ +					rest_of_match = trigger.substr(in_str.size()); +				} +				std::string cur_rest_of_match = trigger.substr(in_str.size()); +				buf = ""; +				S32 i=0; + +				while (i<rest_of_match.length() && i<cur_rest_of_match.length()) +				{ +					if (rest_of_match[i]==cur_rest_of_match[i]) +				    { +						buf.push_back(rest_of_match[i]); +				    } +				    else +				    { +				    	if(i==0) +				    	{ +				    		rest_of_match = ""; +				    	} +				    	break; +				    } +					i++; +				} +				if (rest_of_match.compare("") == 0) +				{ +					return FALSE; +				} +				if (buf.compare("") != 0) +				{ +					rest_of_match = buf; +				} +  			}  		}  	} + +	if (rest_of_match.compare("") != 0) +	{ +		*out_str = in_str+rest_of_match; +		return TRUE; +	} +  	return FALSE;  } diff --git a/indra/newview/llgiveinventory.cpp b/indra/newview/llgiveinventory.cpp index 493dea62ff..813d2081ce 100755 --- a/indra/newview/llgiveinventory.cpp +++ b/indra/newview/llgiveinventory.cpp @@ -139,7 +139,7 @@ bool LLGiveInventory::isInventoryGiveAcceptable(const LLInventoryItem* item)  			BOOL copyable = false;  			if (item->getPermissions().allowCopyBy(gAgentID)) copyable = true; -			if (!copyable && get_is_item_worn(item->getUUID())) +			if (!copyable || get_is_item_worn(item->getUUID()))  			{  				acceptable = false;  			} diff --git a/indra/newview/llglsandbox.cpp b/indra/newview/llglsandbox.cpp index bede9b1e6c..c386030329 100755 --- a/indra/newview/llglsandbox.cpp +++ b/indra/newview/llglsandbox.cpp @@ -624,7 +624,8 @@ void LLViewerParcelMgr::renderCollisionSegments(U8* segments, BOOL use_pass, LLV  	LLGLDepthTest gls_depth(GL_TRUE, GL_FALSE);  	LLGLDisable cull(GL_CULL_FACE); -	if (mCollisionBanned == BA_BANNED) +	if (mCollisionBanned == BA_BANNED || +		regionp->getRegionFlag(REGION_FLAGS_BLOCK_FLYOVER))  	{  		collision_height = BAN_HEIGHT;  	} diff --git a/indra/newview/llgroupmgr.cpp b/indra/newview/llgroupmgr.cpp index 18cdc6ec6d..b2ad737a1d 100755 --- a/indra/newview/llgroupmgr.cpp +++ b/indra/newview/llgroupmgr.cpp @@ -611,6 +611,11 @@ void LLGroupMgrGroupData::recalcAgentPowers(const LLUUID& agent_id)  	}  } +bool LLGroupMgrGroupData::isSingleMemberNotOwner() +{ +	return mMembers.size() == 1 && !mMembers.begin()->second->isOwner(); +} +  bool packRoleUpdateMessageBlock(LLMessageSystem* msg,   								const LLUUID& group_id,  								const LLUUID& role_id,  diff --git a/indra/newview/llgroupmgr.h b/indra/newview/llgroupmgr.h index d107fceb49..9b62ecac48 100755 --- a/indra/newview/llgroupmgr.h +++ b/indra/newview/llgroupmgr.h @@ -243,6 +243,8 @@ public:  	BOOL isRoleDataComplete() { return mRoleDataComplete; }  	BOOL isRoleMemberDataComplete() { return mRoleMemberDataComplete; }  	BOOL isGroupPropertiesDataComplete() { return mGroupPropertiesDataComplete; } +	 +	bool isSingleMemberNotOwner();  	F32 getAccessTime() const { return mAccessTime; }  	void setAccessed(); diff --git a/indra/newview/llinventoryfilter.cpp b/indra/newview/llinventoryfilter.cpp index 55904eb028..000eee3317 100755 --- a/indra/newview/llinventoryfilter.cpp +++ b/indra/newview/llinventoryfilter.cpp @@ -938,7 +938,10 @@ void LLInventoryFilter::toParams(Params& params) const  {  	params.filter_ops.types = getFilterObjectTypes();  	params.filter_ops.category_types = getFilterCategoryTypes(); -	params.filter_ops.wearable_types = getFilterWearableTypes(); +	if (getFilterObjectTypes() & FILTERTYPE_WEARABLE) +	{ +		params.filter_ops.wearable_types = getFilterWearableTypes(); +	}  	params.filter_ops.date_range.min_date = getMinDate();  	params.filter_ops.date_range.max_date = getMaxDate();  	params.filter_ops.hours_ago = getHoursAgo(); @@ -957,7 +960,10 @@ void LLInventoryFilter::fromParams(const Params& params)  	setFilterObjectTypes(params.filter_ops.types);  	setFilterCategoryTypes(params.filter_ops.category_types); -	setFilterWearableTypes(params.filter_ops.wearable_types); +	if (params.filter_ops.wearable_types.isProvided()) +	{ +		setFilterWearableTypes(params.filter_ops.wearable_types); +	}  	setDateRange(params.filter_ops.date_range.min_date,   params.filter_ops.date_range.max_date);  	setHoursAgo(params.filter_ops.hours_ago);  	setShowFolderState(params.filter_ops.show_folder_state); diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp index 2e592f731a..e74e58015a 100755 --- a/indra/newview/llinventorypanel.cpp +++ b/indra/newview/llinventorypanel.cpp @@ -145,7 +145,8 @@ LLInventoryPanel::LLInventoryPanel(const LLInventoryPanel::Params& p) :  	mShowItemLinkOverlays(p.show_item_link_overlays),  	mShowEmptyMessage(p.show_empty_message),  	mViewsInitialized(false), -	mInvFVBridgeBuilder(NULL) +	mInvFVBridgeBuilder(NULL), +	mInventoryViewModel(p.name)  {  	mInvFVBridgeBuilder = &INVENTORY_BRIDGE_BUILDER; diff --git a/indra/newview/lllogchat.cpp b/indra/newview/lllogchat.cpp index 92974b9cef..06e517a861 100755 --- a/indra/newview/lllogchat.cpp +++ b/indra/newview/lllogchat.cpp @@ -206,7 +206,11 @@ private:  };  LLLogChat::save_history_signal_t * LLLogChat::sSaveHistorySignal = NULL; -LLLoadHistoryThread::load_end_signal_t * LLLoadHistoryThread::mLoadEndSignal = NULL; + +std::map<LLUUID,LLLoadHistoryThread *> LLLogChat::sLoadHistoryThreads; +std::map<LLUUID,LLDeleteHistoryThread *> LLLogChat::sDeleteHistoryThreads; +LLMutex* LLLogChat::sHistoryThreadsMutex = NULL; +  //static  std::string LLLogChat::makeLogFileName(std::string filename) @@ -337,83 +341,179 @@ void LLLogChat::saveHistory(const std::string& filename,  void LLLogChat::loadChatHistory(const std::string& file_name, std::list<LLSD>& messages, const LLSD& load_params)  {  	if (file_name.empty()) -				{ -					LL_WARNS("LLLogChat::loadChatHistory") << "Session name is Empty!" << LL_ENDL; -					return ; -				} +	{ +		LL_WARNS("LLLogChat::loadChatHistory") << "Session name is Empty!" << LL_ENDL; +		return ; +	} -				bool load_all_history = load_params.has("load_all_history") ? load_params["load_all_history"].asBoolean() : false; +	bool load_all_history = load_params.has("load_all_history") ? load_params["load_all_history"].asBoolean() : false; -				LLFILE* fptr = LLFile::fopen(LLLogChat::makeLogFileName(file_name), "r");/*Flawfinder: ignore*/ -				if (!fptr) -				{ -					fptr = LLFile::fopen(LLLogChat::oldLogFileName(file_name), "r");/*Flawfinder: ignore*/ -					if (!fptr) -					{ -						return;						//No previous conversation with this name. -					} -				} +	LLFILE* fptr = LLFile::fopen(LLLogChat::makeLogFileName(file_name), "r");/*Flawfinder: ignore*/ +	if (!fptr) +	{ +		fptr = LLFile::fopen(LLLogChat::oldLogFileName(file_name), "r");/*Flawfinder: ignore*/ +		if (!fptr) +		{ +			return;						//No previous conversation with this name. +		} +	} -				char buffer[LOG_RECALL_SIZE];		/*Flawfinder: ignore*/ -				char *bptr; -				S32 len; -				bool firstline = TRUE; - -				if (load_all_history || fseek(fptr, (LOG_RECALL_SIZE - 1) * -1  , SEEK_END)) -				{	//We need to load the whole historyFile or it's smaller than recall size, so get it all. -					firstline = FALSE; -					if (fseek(fptr, 0, SEEK_SET)) -					{ -						fclose(fptr); -						return; -					} -				} -			while (fgets(buffer, LOG_RECALL_SIZE, fptr)  && !feof(fptr)) -				{ -					len = strlen(buffer) - 1;		/*Flawfinder: ignore*/ -					for (bptr = (buffer + len); (*bptr == '\n' || *bptr == '\r') && bptr>buffer; bptr--)	*bptr='\0'; - -					if (firstline) -					{ -						firstline = FALSE; -						continue; -					} - -					std::string line(buffer); - -					//updated 1.23 plain text log format requires a space added before subsequent lines in a multilined message -					if (' ' == line[0]) -					{ -						line.erase(0, MULTI_LINE_PREFIX.length()); -						append_to_last_message(messages, '\n' + line); -					} -					else if (0 == len && ('\n' == line[0] || '\r' == line[0])) -					{ -						//to support old format's multilined messages with new lines used to divide paragraphs -						append_to_last_message(messages, line); -					} -					else -					{ -						LLSD item; -						if (!LLChatLogParser::parse(line, item, load_params)) -						{ -							item[LL_IM_TEXT] = line; -						} -						messages.push_back(item); -					} -				} -				fclose(fptr); +	char buffer[LOG_RECALL_SIZE];		/*Flawfinder: ignore*/ +	char *bptr; +	S32 len; +	bool firstline = TRUE; + +	if (load_all_history || fseek(fptr, (LOG_RECALL_SIZE - 1) * -1  , SEEK_END)) +	{	//We need to load the whole historyFile or it's smaller than recall size, so get it all. +		firstline = FALSE; +		if (fseek(fptr, 0, SEEK_SET)) +		{ +			fclose(fptr); +			return; +		} +	} +	while (fgets(buffer, LOG_RECALL_SIZE, fptr)  && !feof(fptr)) +	{ +		len = strlen(buffer) - 1;		/*Flawfinder: ignore*/ +		for (bptr = (buffer + len); (*bptr == '\n' || *bptr == '\r') && bptr>buffer; bptr--)	*bptr='\0'; + +		if (firstline) +		{ +			firstline = FALSE; +			continue; +		} + +		std::string line(buffer); + +		//updated 1.23 plain text log format requires a space added before subsequent lines in a multilined message +		if (' ' == line[0]) +		{ +			line.erase(0, MULTI_LINE_PREFIX.length()); +			append_to_last_message(messages, '\n' + line); +		} +		else if (0 == len && ('\n' == line[0] || '\r' == line[0])) +		{ +			//to support old format's multilined messages with new lines used to divide paragraphs +			append_to_last_message(messages, line); +		} +		else +		{ +			LLSD item; +			if (!LLChatLogParser::parse(line, item, load_params)) +			{ +				item[LL_IM_TEXT] = line; +			} +			messages.push_back(item); +		} +	} +	fclose(fptr); +} + +// static +bool LLLogChat::historyThreadsFinished(LLUUID session_id) +{ +	LLMutexLock lock(historyThreadsMutex()); +	bool finished = true; +	std::map<LLUUID,LLLoadHistoryThread *>::iterator it = sLoadHistoryThreads.find(session_id); +	if (it != sLoadHistoryThreads.end()) +	{ +		finished = it->second->isFinished(); +	} +	if (!finished) +	{ +		return false; +	} +	std::map<LLUUID,LLDeleteHistoryThread *>::iterator dit = sDeleteHistoryThreads.find(session_id); +	if (dit != sDeleteHistoryThreads.end()) +	{ +		finished = finished && dit->second->isFinished(); +	} +	return finished; +} + +// static +LLLoadHistoryThread* LLLogChat::getLoadHistoryThread(LLUUID session_id) +{ +	LLMutexLock lock(historyThreadsMutex()); +	std::map<LLUUID,LLLoadHistoryThread *>::iterator it = sLoadHistoryThreads.find(session_id); +	if (it != sLoadHistoryThreads.end()) +	{ +		return it->second; +	} +	return NULL; +} +// static +LLDeleteHistoryThread* LLLogChat::getDeleteHistoryThread(LLUUID session_id) +{ +	LLMutexLock lock(historyThreadsMutex()); +	std::map<LLUUID,LLDeleteHistoryThread *>::iterator it = sDeleteHistoryThreads.find(session_id); +	if (it != sDeleteHistoryThreads.end()) +	{ +		return it->second; +	} +	return NULL; +} +// static +bool LLLogChat::addLoadHistoryThread(LLUUID& session_id, LLLoadHistoryThread* lthread) +{ +	LLMutexLock lock(historyThreadsMutex()); +	std::map<LLUUID,LLLoadHistoryThread *>::const_iterator it = sLoadHistoryThreads.find(session_id); +	if (it != sLoadHistoryThreads.end()) +	{ +		return false; +	} +	sLoadHistoryThreads[session_id] = lthread; +	return true; +} + +// static +bool LLLogChat::addDeleteHistoryThread(LLUUID& session_id, LLDeleteHistoryThread* dthread) +{ +	LLMutexLock lock(historyThreadsMutex()); +	std::map<LLUUID,LLDeleteHistoryThread *>::const_iterator it = sDeleteHistoryThreads.find(session_id); +	if (it != sDeleteHistoryThreads.end()) +	{ +		return false; +	} +	sDeleteHistoryThreads[session_id] = dthread; +	return true;  } -void LLLogChat::startChatHistoryThread(const std::string& file_name, const LLSD& load_params) +// static +void LLLogChat::cleanupHistoryThreads()  { +	LLMutexLock lock(historyThreadsMutex()); +	std::vector<LLUUID> uuids; +	std::map<LLUUID,LLLoadHistoryThread *>::iterator lit = sLoadHistoryThreads.begin(); +	for (; lit != sLoadHistoryThreads.end(); lit++) +	{ +		if (lit->second->isFinished() && sDeleteHistoryThreads[lit->first]->isFinished()) +		{ +			delete lit->second; +			delete sDeleteHistoryThreads[lit->first]; +			uuids.push_back(lit->first); +		} +	} +	std::vector<LLUUID>::iterator uuid_it = uuids.begin(); +	for ( ;uuid_it != uuids.end(); uuid_it++) +	{ +		sLoadHistoryThreads.erase(*uuid_it); +		sDeleteHistoryThreads.erase(*uuid_it); +	} +} -	LLLoadHistoryThread* mThread = new LLLoadHistoryThread(); -	mThread->start(); -	mThread->setHistoryParams(file_name, load_params); +//static +LLMutex* LLLogChat::historyThreadsMutex() +{ +	if (sHistoryThreadsMutex == NULL) +	{ +		sHistoryThreadsMutex = new LLMutex(NULL); +	} +	return sHistoryThreadsMutex;  } +  // static  std::string LLLogChat::oldLogFileName(std::string filename)  { @@ -475,7 +575,7 @@ void LLLogChat::findTranscriptFiles(std::string pattern, std::vector<std::string  				//Add Nearby chat history to the list of transcriptions  				list_of_transcriptions.push_back(gDirUtilp->add(dirname, filename));  				LLFile::close(filep); -				return; +				continue;  			}  			char buffer[LOG_RECALL_SIZE]; @@ -845,31 +945,89 @@ bool LLChatLogParser::parse(std::string& raw, LLSD& im, const LLSD& parse_params  	return true;  //parsed name and message text, maybe have a timestamp too  } -LLLoadHistoryThread::LLLoadHistoryThread() : LLThread("load chat history") +LLDeleteHistoryThread::LLDeleteHistoryThread(std::list<LLSD>* messages, LLLoadHistoryThread* loadThread) +	: LLActionThread("delete chat history"), +	mMessages(messages), +	mLoadThread(loadThread)  { -	mNewLoad = false; +} +LLDeleteHistoryThread::~LLDeleteHistoryThread() +{ +} +void LLDeleteHistoryThread::run() +{ +	if (mLoadThread != NULL) +	{ +		mLoadThread->waitFinished(); +	} +	if (NULL != mMessages) +	{ +		delete mMessages; +	} +	mMessages = NULL; +	setFinished();  } -void LLLoadHistoryThread::run() +LLActionThread::LLActionThread(const std::string& name) +	: LLThread(name), +	mMutex(NULL), +	mRunCondition(NULL), +	mFinished(false)  { -	while (!LLApp::isQuitting()) +} + +LLActionThread::~LLActionThread() +{ +} + +void LLActionThread::waitFinished() +{ +	mMutex.lock(); +	if (!mFinished)  	{ -		if(mNewLoad) -		{ -			loadHistory(mFileName,mMessages,mLoadParams); -			break; -		} +		mMutex.unlock(); +		mRunCondition.wait(); +	} +	else +	{ +		mMutex.unlock();	  	}  } -void LLLoadHistoryThread::setHistoryParams(const std::string& file_name, const LLSD& load_params) +void LLActionThread::setFinished()  { -	mFileName   = file_name; -	mLoadParams = load_params; -	mNewLoad    = true; +	mMutex.lock(); +	mFinished = true; +	mMutex.unlock(); +	mRunCondition.signal();  } -void LLLoadHistoryThread::loadHistory(const std::string& file_name, std::list<LLSD>& messages, const LLSD& load_params) +LLLoadHistoryThread::LLLoadHistoryThread(const std::string& file_name, std::list<LLSD>* messages, const LLSD& load_params) +	: LLActionThread("load chat history"), +	mMessages(messages), +	mFileName(file_name), +	mLoadParams(load_params), +	mNewLoad(true), +	mLoadEndSignal(NULL) +{ +} + +LLLoadHistoryThread::~LLLoadHistoryThread() +{ +} + +void LLLoadHistoryThread::run() +{ +	if(mNewLoad) +	{ +		loadHistory(mFileName, mMessages, mLoadParams); +		int count = mMessages->size(); +		llinfos << "mMessages->size(): " << count << llendl; +		setFinished(); +	} +} + +void LLLoadHistoryThread::loadHistory(const std::string& file_name, std::list<LLSD>* messages, const LLSD& load_params)  {  	if (file_name.empty())  	{ @@ -878,8 +1036,8 @@ void LLLoadHistoryThread::loadHistory(const std::string& file_name, std::list<LL  	}  	bool load_all_history = load_params.has("load_all_history") ? load_params["load_all_history"].asBoolean() : false; -  	LLFILE* fptr = LLFile::fopen(LLLogChat::makeLogFileName(file_name), "r");/*Flawfinder: ignore*/ +  	if (!fptr)  	{  		fptr = LLFile::fopen(LLLogChat::oldLogFileName(file_name), "r");/*Flawfinder: ignore*/ @@ -892,6 +1050,7 @@ void LLLoadHistoryThread::loadHistory(const std::string& file_name, std::list<LL  	}  	char buffer[LOG_RECALL_SIZE];		/*Flawfinder: ignore*/ +  	char *bptr;  	S32 len;  	bool firstline = TRUE; @@ -908,29 +1067,31 @@ void LLLoadHistoryThread::loadHistory(const std::string& file_name, std::list<LL  		}  	} -	while (fgets(buffer, LOG_RECALL_SIZE, fptr) && !feof(fptr)) + +	while (fgets(buffer, LOG_RECALL_SIZE, fptr)  && !feof(fptr))  	{  		len = strlen(buffer) - 1;		/*Flawfinder: ignore*/ +  		for (bptr = (buffer + len); (*bptr == '\n' || *bptr == '\r') && bptr>buffer; bptr--)	*bptr='\0'; +  		if (firstline)  		{  			firstline = FALSE;  			continue;  		} -  		std::string line(buffer);  		//updated 1.23 plaint text log format requires a space added before subsequent lines in a multilined message  		if (' ' == line[0])  		{  			line.erase(0, MULTI_LINE_PREFIX.length()); -			append_to_last_message(messages, '\n' + line); +			append_to_last_message(*messages, '\n' + line);  		}  		else if (0 == len && ('\n' == line[0] || '\r' == line[0]))  		{  			//to support old format's multilined messages with new lines used to divide paragraphs -			append_to_last_message(messages, line); +			append_to_last_message(*messages, line);  		}  		else  		{ @@ -939,15 +1100,15 @@ void LLLoadHistoryThread::loadHistory(const std::string& file_name, std::list<LL  			{  				item[LL_IM_TEXT] = line;  			} -			messages.push_back(item); +			messages->push_back(item);  		}  	} +  	fclose(fptr);  	mNewLoad = false;  	(*mLoadEndSignal)(messages, file_name);  } - -//static +	  boost::signals2::connection LLLoadHistoryThread::setLoadEndSignal(const load_end_signal_t::slot_type& cb)  {  	if (NULL == mLoadEndSignal) @@ -957,3 +1118,13 @@ boost::signals2::connection LLLoadHistoryThread::setLoadEndSignal(const load_end  	return mLoadEndSignal->connect(cb);  } + +void LLLoadHistoryThread::removeLoadEndSignal(const load_end_signal_t::slot_type& cb) +{ +	if (NULL != mLoadEndSignal) +	{ +		mLoadEndSignal->disconnect_all_slots(); +		delete mLoadEndSignal; +	} +	mLoadEndSignal = NULL; +} diff --git a/indra/newview/lllogchat.h b/indra/newview/lllogchat.h index 86610f99b3..ca597599dd 100755 --- a/indra/newview/lllogchat.h +++ b/indra/newview/lllogchat.h @@ -29,23 +29,54 @@  #include "llthread.h"  class LLChat; -class LLLoadHistoryThread : public LLThread + +class LLActionThread : public LLThread  { +public: +	LLActionThread(const std::string& name); +	~LLActionThread(); + +	void waitFinished(); +	bool isFinished() { return mFinished; } +protected: +	void setFinished();  private: -	std::string mFileName; -	std::list<LLSD> mMessages; +	bool mFinished; +	LLMutex	mMutex; +	LLCondition mRunCondition; +}; + +class LLLoadHistoryThread : public LLActionThread +{ +private: +	const std::string& mFileName; +	std::list<LLSD>* mMessages;  	LLSD mLoadParams;  	bool mNewLoad;  public: -	LLLoadHistoryThread(); - -	void setHistoryParams(const std::string& file_name, const LLSD& load_params); -	virtual void loadHistory(const std::string& file_name, std::list<LLSD>& messages, const LLSD& load_params); +	LLLoadHistoryThread(const std::string& file_name, std::list<LLSD>* messages, const LLSD& load_params); +	~LLLoadHistoryThread(); +	//void setHistoryParams(const std::string& file_name, const LLSD& load_params); +	virtual void loadHistory(const std::string& file_name, std::list<LLSD>* messages, const LLSD& load_params);      virtual void run(); -   typedef boost::signals2::signal<void (std::list<LLSD>& messages,const std::string& file_name)> load_end_signal_t; -   static load_end_signal_t * mLoadEndSignal; -   static boost::signals2::connection setLoadEndSignal(const load_end_signal_t::slot_type& cb); +	typedef boost::signals2::signal<void (std::list<LLSD>* messages,const std::string& file_name)> load_end_signal_t; +	load_end_signal_t * mLoadEndSignal; +	boost::signals2::connection setLoadEndSignal(const load_end_signal_t::slot_type& cb); +	void removeLoadEndSignal(const load_end_signal_t::slot_type& cb); +}; + +class LLDeleteHistoryThread : public LLActionThread +{ +private: +	std::list<LLSD>* mMessages; +	LLLoadHistoryThread* mLoadThread; +public: +	LLDeleteHistoryThread(std::list<LLSD>* messages, LLLoadHistoryThread* loadThread); +	~LLDeleteHistoryThread(); + +	virtual void run(); +	static void deleteHistory();  };  class LLLogChat @@ -74,7 +105,6 @@ public:  	static void getListOfTranscriptBackupFiles(std::vector<std::string>& list_of_transcriptions);  	static void loadChatHistory(const std::string& file_name, std::list<LLSD>& messages, const LLSD& load_params = LLSD()); -	static void startChatHistoryThread(const std::string& file_name, const LLSD& load_params);  	typedef boost::signals2::signal<void ()> save_history_signal_t;  	static boost::signals2::connection setSaveHistorySignal(const save_history_signal_t::slot_type& cb); @@ -91,9 +121,21 @@ public:  	static bool isTranscriptExist(const LLUUID& avatar_id, bool is_group=false);  	static bool isNearbyTranscriptExist(); +	static bool historyThreadsFinished(LLUUID session_id); +	static LLLoadHistoryThread* getLoadHistoryThread(LLUUID session_id); +	static LLDeleteHistoryThread* getDeleteHistoryThread(LLUUID session_id); +	static bool addLoadHistoryThread(LLUUID& session_id, LLLoadHistoryThread* lthread); +	static bool addDeleteHistoryThread(LLUUID& session_id, LLDeleteHistoryThread* dthread); +	static void cleanupHistoryThreads(); +  private:  	static std::string cleanFileName(std::string filename);  	static save_history_signal_t * sSaveHistorySignal; + +	static std::map<LLUUID,LLLoadHistoryThread *> sLoadHistoryThreads; +	static std::map<LLUUID,LLDeleteHistoryThread *> sDeleteHistoryThreads; +	static LLMutex* sHistoryThreadsMutex; +	static LLMutex* historyThreadsMutex();  };  /** diff --git a/indra/newview/llmanipscale.cpp b/indra/newview/llmanipscale.cpp index bf6874e445..109d6b31b2 100755 --- a/indra/newview/llmanipscale.cpp +++ b/indra/newview/llmanipscale.cpp @@ -522,7 +522,7 @@ void LLManipScale::highlightManipulators(S32 x, S32 y)  				manip2d.set(manipulator->mPosition.mV[VX] * half_width, manipulator->mPosition.mV[VY] * half_height);  				delta = manip2d - mousePos; -				if (delta.magVecSquared() < MAX_MANIP_SELECT_DISTANCE_SQUARED) +				if (delta.lengthSquared() < MAX_MANIP_SELECT_DISTANCE_SQUARED)  				{  					mHighlightedPart = manipulator->mManipID; @@ -849,7 +849,6 @@ void LLManipScale::dragCorner( S32 x, S32 y )  	{  		return;  	} -  	mLastMouseX = x;  	mLastMouseY = y; @@ -861,7 +860,6 @@ void LLManipScale::dragCorner( S32 x, S32 y )  	F32 s = 0;  	F32 t = 0; -  	nearestPointOnLineFromMouse(x, y,  								drag_start_center_agent,  								drag_start_point_agent, @@ -901,7 +899,7 @@ void LLManipScale::dragCorner( S32 x, S32 y )  		F32 relative_snap_dist = fmodf(drag_dist + snap_dist, mScaleSnapUnit1 / cur_subdivisions);  		mScaleSnappedValue = llclamp((drag_dist - (relative_snap_dist - snap_dist)), min_scale, max_scale); -		scale_factor  =  mScaleSnappedValue / dist_vec(drag_start_point_agent, drag_start_center_agent); +		scale_factor = mScaleSnappedValue / dist_vec(drag_start_point_agent, drag_start_center_agent);  		mScaleSnappedValue /= mScaleSnapUnit1 * 2.f;  		mSnapRegime = SNAP_REGIME_UPPER; diff --git a/indra/newview/llpanelgroup.cpp b/indra/newview/llpanelgroup.cpp index bf332d1ca7..f4aab6bd4e 100755 --- a/indra/newview/llpanelgroup.cpp +++ b/indra/newview/llpanelgroup.cpp @@ -49,6 +49,7 @@  #include "llpanelgroupnotices.h"  #include "llpanelgroupgeneral.h" +#include "llpanelgrouproles.h"  #include "llaccordionctrltab.h"  #include "llaccordionctrl.h" @@ -275,6 +276,7 @@ void LLPanelGroup::onBtnApply(void* user_data)  {  	LLPanelGroup* self = static_cast<LLPanelGroup*>(user_data);  	self->apply(); +	self->refreshData();  }  void LLPanelGroup::onBtnGroupCallClicked(void* user_data) @@ -497,6 +499,22 @@ bool LLPanelGroup::apply(LLPanelGroupTab* tab)  	{  		//we skip refreshing group after ew manually apply changes since its very annoying  		//for those who are editing group + +		LLPanelGroupRoles * roles_tab = dynamic_cast<LLPanelGroupRoles*>(tab); +		if (roles_tab) +		{ +			LLGroupMgr* gmgrp = LLGroupMgr::getInstance(); +			LLGroupMgrGroupData* gdatap = gmgrp->getGroupData(roles_tab->getGroupID()); + +			// allow refresh only for one specific case: +			// there is only one member in group and it is not owner +			// it's a wrong situation and need refresh panels from server +			if (gdatap && gdatap->isSingleMemberNotOwner()) +			{ +				return true; +			} +		} +  		mSkipRefresh = TRUE;  		return true;  	} diff --git a/indra/newview/llpanellandmarks.cpp b/indra/newview/llpanellandmarks.cpp index b941ee1f1b..343f2b413f 100755 --- a/indra/newview/llpanellandmarks.cpp +++ b/indra/newview/llpanellandmarks.cpp @@ -716,6 +716,11 @@ void LLLandmarksPanel::updateListCommands()  	mListCommands->getChildView(TRASH_BUTTON_NAME)->setEnabled(trash_enabled);  } +void LLLandmarksPanel::updateMenuVisibility(LLUICtrl* menu) +{ +	onMenuVisibilityChange(menu, LLSD().with("visibility", true)); +} +  void LLLandmarksPanel::onActionsButtonClick()  {  	LLToggleableMenu* menu = mGearFolderMenu; diff --git a/indra/newview/llpanellandmarks.h b/indra/newview/llpanellandmarks.h index 8fae0f0b67..80310d1524 100755 --- a/indra/newview/llpanellandmarks.h +++ b/indra/newview/llpanellandmarks.h @@ -80,6 +80,8 @@ public:  	LLPlacesInventoryPanel* getLibraryInventoryPanel() { return mLibraryInventoryPanel; } +	void updateMenuVisibility(LLUICtrl* menu); +  protected:  	/**  	 * @return true - if current selected panel is not null and selected item is a landmark diff --git a/indra/newview/llpanelnearbymedia.cpp b/indra/newview/llpanelnearbymedia.cpp index 74c810ea79..1cdd1b664e 100755 --- a/indra/newview/llpanelnearbymedia.cpp +++ b/indra/newview/llpanelnearbymedia.cpp @@ -876,7 +876,10 @@ void LLPanelNearByMedia::onClickParcelAudioPlay()  	// playing and updated as they cross to other parcels etc.  	mParcelAudioAutoStart = true;  	if (!gAudiop) +	{ +		LL_WARNS("AudioEngine") << "LLAudioEngine instance doesn't exist!" << LL_ENDL;  		return; +	}  	if (LLAudioEngine::AUDIO_PAUSED == gAudiop->isInternetStreamPlaying())  	{ @@ -896,7 +899,10 @@ void LLPanelNearByMedia::onClickParcelAudioStop()  	// they explicitly start it again.  	mParcelAudioAutoStart = false;  	if (!gAudiop) +	{ +		LL_WARNS("AudioEngine") << "LLAudioEngine instance doesn't exist!" << LL_ENDL;  		return; +	}  	LLViewerAudio::getInstance()->stopInternetStreamWithAutoFade();  } @@ -904,7 +910,10 @@ void LLPanelNearByMedia::onClickParcelAudioStop()  void LLPanelNearByMedia::onClickParcelAudioPause()  {  	if (!gAudiop) +	{ +		LL_WARNS("AudioEngine") << "LLAudioEngine instance doesn't exist!" << LL_ENDL;  		return; +	}  	// 'true' means pause  	gAudiop->pauseInternetStream(true); diff --git a/indra/newview/llpanelobjectinventory.cpp b/indra/newview/llpanelobjectinventory.cpp index 77bfcec4e0..665b9ab294 100755 --- a/indra/newview/llpanelobjectinventory.cpp +++ b/indra/newview/llpanelobjectinventory.cpp @@ -1491,7 +1491,8 @@ LLPanelObjectInventory::LLPanelObjectInventory(const LLPanelObjectInventory::Par  	mFolders(NULL),  	mHaveInventory(FALSE),  	mIsInventoryEmpty(TRUE), -	mInventoryNeedsUpdate(FALSE) +	mInventoryNeedsUpdate(FALSE), +	mInventoryViewModel(p.name)  {  	// Setup context menu callbacks  	mCommitCallbackRegistrar.add("Inventory.DoToSelected", boost::bind(&LLPanelObjectInventory::doToSelected, this, _2)); @@ -2010,3 +2011,46 @@ void LLPanelObjectInventory::clearItemIDs()  	mItemMap.clear();  } +BOOL LLPanelObjectInventory::handleKeyHere( KEY key, MASK mask ) +{ +	BOOL handled = FALSE; +	switch (key) +	{ +	case KEY_DELETE: +	case KEY_BACKSPACE: +		// Delete selected items if delete or backspace key hit on the inventory panel +		// Note: on Mac laptop keyboards, backspace and delete are one and the same +		if (isSelectionRemovable() && mask == MASK_NONE) +		{ +			LLInventoryAction::doToSelected(&gInventory, mFolders, "delete"); +			handled = TRUE; +		} +		break; +	} +	return handled; +} + +BOOL LLPanelObjectInventory::isSelectionRemovable() +{ +	if (!mFolders || !mFolders->getRoot()) +	{ +		return FALSE; +	} +	std::set<LLFolderViewItem*> selection_set = mFolders->getRoot()->getSelectionList(); +	if (selection_set.empty()) +	{ +		return FALSE; +	} +	for (std::set<LLFolderViewItem*>::iterator iter = selection_set.begin(); +		iter != selection_set.end(); +		++iter) +	{ +		LLFolderViewItem *item = *iter; +		const LLFolderViewModelItemInventory *listener = dynamic_cast<const LLFolderViewModelItemInventory*>(item->getViewModelItem()); +		if (!listener || !listener->isItemRemovable() || listener->isItemInTrash()) +		{ +			return FALSE; +		} +	} +	return TRUE; +} diff --git a/indra/newview/llpanelobjectinventory.h b/indra/newview/llpanelobjectinventory.h index f497c695b3..9559f7e886 100755 --- a/indra/newview/llpanelobjectinventory.h +++ b/indra/newview/llpanelobjectinventory.h @@ -94,6 +94,9 @@ protected:  	void removeItemID(const LLUUID& id);  	void clearItemIDs(); +	BOOL			handleKeyHere( KEY key, MASK mask ); +	BOOL			isSelectionRemovable(); +  private:  	std::map<LLUUID, LLFolderViewItem*> mItemMap; diff --git a/indra/newview/llplacesfolderview.cpp b/indra/newview/llplacesfolderview.cpp index 9e1b75b7e9..fe89c1e314 100755 --- a/indra/newview/llplacesfolderview.cpp +++ b/indra/newview/llplacesfolderview.cpp @@ -31,6 +31,7 @@  #include "llplacesinventorypanel.h"  #include "llpanellandmarks.h" +#include "llmenugl.h"  LLPlacesFolderView::LLPlacesFolderView(const LLFolderView::Params& p)      : LLFolderView(p) @@ -67,6 +68,16 @@ BOOL LLPlacesFolderView::handleRightMouseDown(S32 x, S32 y, MASK mask)      return LLFolderView::handleRightMouseDown(x, y, mask);  } +void LLPlacesFolderView::updateMenu() +{ +	LLFolderView::updateMenu(); +	LLMenuGL* menu = (LLMenuGL*)mPopupMenuHandle.get(); +	if (menu && menu->getVisible()) +	{ +		mParentLandmarksPanel->updateMenuVisibility(menu); +	} +} +  void LLPlacesFolderView::setupMenuHandle(LLInventoryType::EType asset_type, LLHandle<LLView> menu_handle)  {      mMenuHandlesByInventoryType[asset_type] = menu_handle; diff --git a/indra/newview/llplacesfolderview.h b/indra/newview/llplacesfolderview.h index 8c5be39b5e..65fe76007a 100755 --- a/indra/newview/llplacesfolderview.h +++ b/indra/newview/llplacesfolderview.h @@ -51,6 +51,8 @@ public:  	 */  	/*virtual*/ BOOL handleRightMouseDown( S32 x, S32 y, MASK mask ); +	/*virtual*/ void updateMenu(); +  	void setupMenuHandle(LLInventoryType::EType asset_type, LLHandle<LLView> menu_handle);  	void setParentLandmarksPanel(LLLandmarksPanel* panel) diff --git a/indra/newview/llpreviewscript.cpp b/indra/newview/llpreviewscript.cpp index 5e7b148101..76cb1c1ebc 100755 --- a/indra/newview/llpreviewscript.cpp +++ b/indra/newview/llpreviewscript.cpp @@ -191,11 +191,11 @@ public:  private:  	LLScriptEdCore* mEditorCore; -  	static LLFloaterScriptSearch*	sInstance;  protected:  	LLLineEditor*			mSearchBox; +	LLLineEditor*			mReplaceBox;          void onSearchBoxCommit();  }; @@ -204,6 +204,7 @@ LLFloaterScriptSearch* LLFloaterScriptSearch::sInstance = NULL;  LLFloaterScriptSearch::LLFloaterScriptSearch(LLScriptEdCore* editor_core)  :	LLFloater(LLSD()),  	mSearchBox(NULL), +	mReplaceBox(NULL),  	mEditorCore(editor_core)  {  	buildFromFile("floater_script_search.xml"); @@ -226,6 +227,7 @@ LLFloaterScriptSearch::LLFloaterScriptSearch(LLScriptEdCore* editor_core)  BOOL LLFloaterScriptSearch::postBuild()  { +	mReplaceBox = getChild<LLLineEditor>("replace_text");  	mSearchBox = getChild<LLLineEditor>("search_text");  	mSearchBox->setCommitCallback(boost::bind(&LLFloaterScriptSearch::onSearchBoxCommit, this));  	mSearchBox->setCommitOnFocusLost(FALSE); @@ -241,8 +243,12 @@ BOOL LLFloaterScriptSearch::postBuild()  //static   void LLFloaterScriptSearch::show(LLScriptEdCore* editor_core)  { +	LLSD::String search_text; +	LLSD::String replace_text;  	if (sInstance && sInstance->mEditorCore && sInstance->mEditorCore != editor_core)  	{ +		search_text=sInstance->mSearchBox->getValue().asString(); +		replace_text=sInstance->mReplaceBox->getValue().asString();  		sInstance->closeFloater();  		delete sInstance;  	} @@ -251,6 +257,8 @@ void LLFloaterScriptSearch::show(LLScriptEdCore* editor_core)  	{  		// sInstance will be assigned in the constructor.  		new LLFloaterScriptSearch(editor_core); +		sInstance->mSearchBox->setValue(search_text); +		sInstance->mReplaceBox->setValue(replace_text);  	}  	sInstance->openFloater(); @@ -271,7 +279,7 @@ void LLFloaterScriptSearch::onBtnSearch(void *userdata)  void LLFloaterScriptSearch::handleBtnSearch()  {  	LLCheckBoxCtrl* caseChk = getChild<LLCheckBoxCtrl>("case_text"); -	mEditorCore->mEditor->selectNext(getChild<LLUICtrl>("search_text")->getValue().asString(), caseChk->get()); +	mEditorCore->mEditor->selectNext(mSearchBox->getValue().asString(), caseChk->get());  }  // static  @@ -284,7 +292,7 @@ void LLFloaterScriptSearch::onBtnReplace(void *userdata)  void LLFloaterScriptSearch::handleBtnReplace()  {  	LLCheckBoxCtrl* caseChk = getChild<LLCheckBoxCtrl>("case_text"); -	mEditorCore->mEditor->replaceText(getChild<LLUICtrl>("search_text")->getValue().asString(), getChild<LLUICtrl>("replace_text")->getValue().asString(), caseChk->get()); +	mEditorCore->mEditor->replaceText(mSearchBox->getValue().asString(), mReplaceBox->getValue().asString(), caseChk->get());  }  // static  @@ -297,7 +305,7 @@ void LLFloaterScriptSearch::onBtnReplaceAll(void *userdata)  void LLFloaterScriptSearch::handleBtnReplaceAll()  {  	LLCheckBoxCtrl* caseChk = getChild<LLCheckBoxCtrl>("case_text"); -	mEditorCore->mEditor->replaceTextAll(getChild<LLUICtrl>("search_text")->getValue().asString(), getChild<LLUICtrl>("replace_text")->getValue().asString(), caseChk->get()); +	mEditorCore->mEditor->replaceTextAll(mSearchBox->getValue().asString(), mReplaceBox->getValue().asString(), caseChk->get());  }  bool LLFloaterScriptSearch::hasAccelerators() const @@ -328,7 +336,7 @@ void LLFloaterScriptSearch::onSearchBoxCommit()  	if (mEditorCore && mEditorCore->mEditor)  	{  		LLCheckBoxCtrl* caseChk = getChild<LLCheckBoxCtrl>("case_text"); -		mEditorCore->mEditor->selectNext(getChild<LLUICtrl>("search_text")->getValue().asString(), caseChk->get()); +		mEditorCore->mEditor->selectNext(mSearchBox->getValue().asString(), caseChk->get());  	}  } @@ -529,6 +537,10 @@ void LLScriptEdCore::initMenu()  	menuItem->setClickCallback(boost::bind(&LLTextEditor::selectAll, mEditor));  	menuItem->setEnableCallback(boost::bind(&LLTextEditor::canSelectAll, mEditor)); +	menuItem = getChild<LLMenuItemCallGL>("Deselect"); +	menuItem->setClickCallback(boost::bind(&LLTextEditor::deselect, mEditor)); +	menuItem->setEnableCallback(boost::bind(&LLTextEditor::canDeselect, mEditor)); +  	menuItem = getChild<LLMenuItemCallGL>("Search / Replace...");  	menuItem->setClickCallback(boost::bind(&LLFloaterScriptSearch::show, this)); @@ -1874,7 +1886,7 @@ void LLLiveLSLEditor::loadAsset()  			mIsModifiable = item && gAgent.allowOperation(PERM_MODIFY,   										item->getPermissions(),  				   						GP_OBJECT_MANIPULATE); -			 +			refreshFromItem();  			// This is commented out, because we don't completely  			// handle script exports yet.  			/* diff --git a/indra/newview/llpreviewsound.cpp b/indra/newview/llpreviewsound.cpp index 33d2d015ad..11b81a58fc 100755 --- a/indra/newview/llpreviewsound.cpp +++ b/indra/newview/llpreviewsound.cpp @@ -55,7 +55,9 @@ BOOL	LLPreviewSound::postBuild()  	{  		getChild<LLUICtrl>("desc")->setValue(item->getDescription());  		if (gAudiop) +		{  			gAudiop->preloadSound(item->getAssetUUID()); // preload the sound +		}  	}  	childSetAction("Sound play btn",&LLPreviewSound::playSound,this); @@ -94,6 +96,6 @@ void LLPreviewSound::auditionSound( void *userdata )  	if(item && gAudiop)  	{  		LLVector3d lpos_global = gAgent.getPositionGlobal(); -		gAudiop->triggerSound(item->getAssetUUID(), gAgent.getID(), SOUND_GAIN, LLAudioEngine::AUDIO_TYPE_UI, lpos_global); +		gAudiop->triggerSound(item->getAssetUUID(), gAgent.getID(), SOUND_GAIN, LLAudioEngine::AUDIO_TYPE_SFX, lpos_global);  	}  } diff --git a/indra/newview/llpreviewtexture.cpp b/indra/newview/llpreviewtexture.cpp index 1ed48a978f..5c41c5ad97 100755 --- a/indra/newview/llpreviewtexture.cpp +++ b/indra/newview/llpreviewtexture.cpp @@ -127,9 +127,28 @@ BOOL LLPreviewTexture::postBuild()  			getChild<LLLineEditor>("desc")->setPrevalidate(&LLTextValidate::validateASCIIPrintableNoPipe);  		}  	} + +	// Fill in ratios list with common aspect ratio values +	mRatiosList.clear(); +	mRatiosList.push_back(LLTrans::getString("Unconstrained")); +	mRatiosList.push_back("1:1"); +	mRatiosList.push_back("4:3"); +	mRatiosList.push_back("10:7"); +	mRatiosList.push_back("3:2"); +	mRatiosList.push_back("16:10"); +	mRatiosList.push_back("16:9"); +	mRatiosList.push_back("2:1"); -	childSetCommitCallback("combo_aspect_ratio", onAspectRatioCommit, this); +	// Now fill combo box with provided list  	LLComboBox* combo = getChild<LLComboBox>("combo_aspect_ratio"); +	combo->removeall(); + +	for (std::vector<std::string>::const_iterator it = mRatiosList.begin(); it != mRatiosList.end(); ++it) +	{ +		combo->add(*it); +	} + +	childSetCommitCallback("combo_aspect_ratio", onAspectRatioCommit, this);  	combo->setCurrentByIndex(0);  	return LLPreview::postBuild(); @@ -414,6 +433,13 @@ void LLPreviewTexture::updateDimensions()  	{  		return;  	} + +	if (mAssetStatus != PREVIEW_ASSET_LOADED) +	{ +		mAssetStatus = PREVIEW_ASSET_LOADED; +		// Asset has been fully loaded, adjust aspect ratio +		adjustAspectRatio(); +	}  	// Update the width/height display every time  	getChild<LLUICtrl>("dimensions")->setTextArg("[WIDTH]",  llformat("%d", mImage->getFullWidth())); @@ -501,6 +527,46 @@ LLPreview::EAssetStatus LLPreviewTexture::getAssetStatus()  	return mAssetStatus;  } +void LLPreviewTexture::adjustAspectRatio() +{ +	S32 w = mImage->getFullWidth(); +    S32 h = mImage->getFullHeight(); + +	// Determine aspect ratio of the image +	S32 tmp; +    while (h != 0) +    { +        tmp = w % h; +        w = h; +        h = tmp; +    } +	S32 divisor = w; +	S32 num = mImage->getFullWidth() / divisor; +	S32 denom = mImage->getFullHeight() / divisor; + +	if (setAspectRatio(num, denom)) +	{ +		// Select corresponding ratio entry in the combo list +		LLComboBox* combo = getChild<LLComboBox>("combo_aspect_ratio"); +		if (combo) +		{ +			std::ostringstream ratio; +			ratio << num << ":" << denom; +			std::vector<std::string>::const_iterator found = std::find(mRatiosList.begin(), mRatiosList.end(), ratio.str()); +			if (found == mRatiosList.end()) +			{ +				combo->setCurrentByIndex(0); +			} +			else +			{ +				combo->setCurrentByIndex(found - mRatiosList.begin()); +			} +		} +	} + +	mUpdateDimensions = TRUE; +} +  void LLPreviewTexture::updateImageID()  {  	const LLViewerInventoryItem *item = static_cast<const LLViewerInventoryItem*>(getItem()); diff --git a/indra/newview/llpreviewtexture.h b/indra/newview/llpreviewtexture.h index cd16bacde2..97e74706cc 100755 --- a/indra/newview/llpreviewtexture.h +++ b/indra/newview/llpreviewtexture.h @@ -70,6 +70,7 @@ protected:  	/* virtual */ BOOL	postBuild();  	bool				setAspectRatio(const F32 width, const F32 height);  	static void			onAspectRatioCommit(LLUICtrl*,void* userdata); +	void				adjustAspectRatio();  private:  	void				updateImageID(); // set what image is being uploaded. @@ -95,5 +96,6 @@ private:  	F32 mAspectRatio;	  	LLLoadedCallbackEntry::source_callback_list_t mCallbackTextureList ;  +	std::vector<std::string>		mRatiosList;  };  #endif  // LL_LLPREVIEWTEXTURE_H diff --git a/indra/newview/llsidepanelinventory.cpp b/indra/newview/llsidepanelinventory.cpp index 243d4cf910..2556714792 100755 --- a/indra/newview/llsidepanelinventory.cpp +++ b/indra/newview/llsidepanelinventory.cpp @@ -710,13 +710,13 @@ void LLSidepanelInventory::clearSelections(bool clearMain, bool clearInbox)  		if (inv_panel)  		{ -			inv_panel->clearSelection(); +			inv_panel->getRootFolder()->clearSelection();  		}  	}  	if (clearInbox && mInboxEnabled && mInventoryPanelInbox.get())  	{ -		mInventoryPanelInbox.get()->clearSelection(); +		mInventoryPanelInbox.get()->getRootFolder()->clearSelection();  	}  	updateVerbs(); diff --git a/indra/newview/llsnapshotlivepreview.cpp b/indra/newview/llsnapshotlivepreview.cpp index 5b22c51321..2c40c54c12 100644 --- a/indra/newview/llsnapshotlivepreview.cpp +++ b/indra/newview/llsnapshotlivepreview.cpp @@ -50,7 +50,6 @@  #include "llviewerstats.h"  #include "llvfile.h"  #include "llvfs.h" -#include "llwebsharing.h"  #include "llwindow.h"  #include "llworld.h" @@ -845,30 +844,3 @@ BOOL LLSnapshotLivePreview::saveLocal()  	}  	return success;  } - -void LLSnapshotLivePreview::saveWeb() -{ -	// *FIX: Will break if the window closes because of CloseSnapshotOnKeep! -	// Needs to pass on ownership of the image. -	LLImageJPEG* jpg = dynamic_cast<LLImageJPEG*>(mFormattedImage.get()); -	if(!jpg) -	{ -		LL_WARNS() << "Formatted image not a JPEG" << LL_ENDL; -		return; -	} - -	LLSD metadata; -	metadata["description"] = getChild<LLLineEditor>("description")->getText(); - -	LLLandmarkActions::getRegionNameAndCoordsFromPosGlobal(gAgentCamera.getCameraPositionGlobal(), -		boost::bind(&LLSnapshotLivePreview::regionNameCallback, this, jpg, metadata, _1, _2, _3, _4)); - -	gViewerWindow->playSnapshotAnimAndSound(); -} - -void LLSnapshotLivePreview::regionNameCallback(LLImageJPEG* snapshot, LLSD& metadata, const std::string& name, S32 x, S32 y, S32 z) -{ -	metadata["slurl"] = LLSLURL(name, LLVector3d(x, y, z)).getSLURLString(); - -	LLWebSharing::instance().shareSnapshot(snapshot, metadata); -} diff --git a/indra/newview/llsnapshotlivepreview.h b/indra/newview/llsnapshotlivepreview.h index fe3d257b02..0f09ef214a 100644 --- a/indra/newview/llsnapshotlivepreview.h +++ b/indra/newview/llsnapshotlivepreview.h @@ -96,7 +96,6 @@ public:  	void setSnapshotQuality(S32 quality);  	void setSnapshotBufferType(LLViewerWindow::ESnapshotType type) { mSnapshotBufferType = type; }  	void updateSnapshot(BOOL new_snapshot, BOOL new_thumbnail = FALSE, F32 delay = 0.f); -	void saveWeb();  	void saveTexture();  	BOOL saveLocal(); @@ -113,9 +112,6 @@ public:  	// Returns TRUE when snapshot generated, FALSE otherwise.  	static BOOL onIdle( void* snapshot_preview ); -	// callback for region name resolve -	void regionNameCallback(LLImageJPEG* snapshot, LLSD& metadata, const std::string& name, S32 x, S32 y, S32 z); -  private:  	LLColor4					mColor;  	LLPointer<LLViewerTexture>	mViewerImage[2]; //used to represent the scene when the frame is frozen. diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index a72b93e84e..a76b4bbe09 100755 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -622,25 +622,22 @@ bool idle_startup()  		if (FALSE == gSavedSettings.getBOOL("NoAudio"))  		{ +			delete gAudiop;  			gAudiop = NULL;  #ifdef LL_FMODEX		 -			if (!gAudiop  #if !LL_WINDOWS -			    && NULL == getenv("LL_BAD_FMODEX_DRIVER") +			if (NULL == getenv("LL_BAD_FMODEX_DRIVER"))  #endif // !LL_WINDOWS -			    )  			{  				gAudiop = (LLAudioEngine *) new LLAudioEngine_FMODEX(gSavedSettings.getBOOL("FMODExProfilerEnable"));  			}  #endif  #ifdef LL_OPENAL -			if (!gAudiop  #if !LL_WINDOWS -			    && NULL == getenv("LL_BAD_OPENAL_DRIVER") +			if (NULL == getenv("LL_BAD_OPENAL_DRIVER"))  #endif // !LL_WINDOWS -			    )  			{  				gAudiop = (LLAudioEngine *) new LLAudioEngine_OpenAL();  			} diff --git a/indra/newview/lltexturectrl.cpp b/indra/newview/lltexturectrl.cpp index 9d1290b86d..c12753acb0 100755 --- a/indra/newview/lltexturectrl.cpp +++ b/indra/newview/lltexturectrl.cpp @@ -242,7 +242,7 @@ void LLFloaterTexturePicker::setImageID(const LLUUID& image_id)  		LLUUID item_id = findItemID(mImageAssetID, FALSE);  		if (item_id.isNull())  		{ -			mInventoryPanel->clearSelection(); +			mInventoryPanel->getRootFolder()->clearSelection();  		}  		else  		{ diff --git a/indra/newview/lltooldraganddrop.cpp b/indra/newview/lltooldraganddrop.cpp index 12086dad5f..d307a31843 100755 --- a/indra/newview/lltooldraganddrop.cpp +++ b/indra/newview/lltooldraganddrop.cpp @@ -1611,16 +1611,19 @@ static void show_item_sharing_confirmation(const std::string name,  		llassert(NULL != inv_item);  		return;  	} - -	LLSD substitutions; -	substitutions["RESIDENTS"] = name; -	substitutions["ITEMS"] = inv_item->getName(); -	LLSD payload; -	payload["agent_id"] = dest_agent; -	payload["item_id"] = inv_item->getUUID(); -	payload["session_id"] = session_id; -	payload["d&d_dest"] = dest.asString(); -	LLNotificationsUtil::add("ShareItemsConfirmation", substitutions, payload, &give_inventory_cb); +	if(gInventory.getItem(inv_item->getUUID()) +		&& LLGiveInventory::isInventoryGiveAcceptable(inv_item)) +	{ +		LLSD substitutions; +		substitutions["RESIDENTS"] = name; +		substitutions["ITEMS"] = inv_item->getName(); +		LLSD payload; +		payload["agent_id"] = dest_agent; +		payload["item_id"] = inv_item->getUUID(); +		payload["session_id"] = session_id; +		payload["d&d_dest"] = dest.asString(); +		LLNotificationsUtil::add("ShareItemsConfirmation", substitutions, payload, &give_inventory_cb); +	}  }  static void get_name_cb(const LLUUID& id, diff --git a/indra/newview/llurldispatcher.cpp b/indra/newview/llurldispatcher.cpp index b905ea2684..615064c782 100755 --- a/indra/newview/llurldispatcher.cpp +++ b/indra/newview/llurldispatcher.cpp @@ -34,6 +34,7 @@  #include "llfloaterreg.h"  #include "llfloatersidepanelcontainer.h"  #include "llfloaterworldmap.h" +#include "llnotifications.h"  #include "llpanellogin.h"  #include "llregionhandle.h"  #include "llslurl.h" @@ -253,13 +254,15 @@ void LLURLDispatcherImpl::regionHandleCallback(U64 region_handle, const LLSLURL&  //---------------------------------------------------------------------------  // Teleportation links are handled here because they are tightly coupled  // to SLURL parsing and sim-fragment parsing +  class LLTeleportHandler : public LLCommandHandler  {  public:  	// Teleport requests *must* come from a trusted browser  	// inside the app, otherwise a malicious web page could  	// cause a constant teleport loop.  JC -	LLTeleportHandler() : LLCommandHandler("teleport", UNTRUSTED_BLOCK) { } +	LLTeleportHandler() : LLCommandHandler("teleport", UNTRUSTED_THROTTLE) { } +  	bool handle(const LLSD& tokens, const LLSD& query_map,  				LLMediaCtrl* web) @@ -276,18 +279,50 @@ public:  							   tokens[3].asReal());  		} +		LLSD args; +		args["LOCATION"] = tokens[0]; +  		// Region names may be %20 escaped. -		  		std::string region_name = LLURI::unescape(tokens[0]); +		LLSD payload; +		payload["region_name"] = region_name; +		payload["callback_url"] = LLSLURL(region_name, coords).getSLURLString(); + +		LLNotificationsUtil::add("TeleportViaSLAPP", args, payload); +		return true; +	} + +	static void teleport_via_slapp(std::string region_name, std::string callback_url) +	{ +  		LLWorldMapMessage::getInstance()->sendNamedRegionRequest(region_name,  			LLURLDispatcherImpl::regionHandleCallback, -			LLSLURL(region_name, coords).getSLURLString(), +			callback_url,  			true);	// teleport -		return true;  	} + +	static bool teleport_via_slapp_callback(const LLSD& notification, const LLSD& response) +	{ +		S32 option = LLNotificationsUtil::getSelectedOption(notification, response); + +		std::string region_name = notification["payload"]["region_name"].asString(); +		std::string callback_url = notification["payload"]["callback_url"].asString(); + +		if (option == 0) +		{ +			teleport_via_slapp(region_name, callback_url); +			return true; +		} + +		return false; +	} +  };  LLTeleportHandler gTeleportHandler; +static LLNotificationFunctorRegistration open_landmark_callback_reg("TeleportViaSLAPP", LLTeleportHandler::teleport_via_slapp_callback); + +  //--------------------------------------------------------------------------- diff --git a/indra/newview/llvieweraudio.cpp b/indra/newview/llvieweraudio.cpp index e27ebe8663..7ce9d858dd 100755 --- a/indra/newview/llvieweraudio.cpp +++ b/indra/newview/llvieweraudio.cpp @@ -94,7 +94,12 @@ void LLViewerAudio::startInternetStreamWithAutoFade(std::string streamURI)  	switch (mFadeState)  	{ -		case FADE_IDLE: +	case FADE_IDLE: +		if (!gAudiop) +		{ +			LL_WARNS("AudioEngine") << "LLAudioEngine instance doesn't exist!" << LL_ENDL; +			break; +		}  		// If a stream is playing fade it out first  		if (!gAudiop->getInternetStreamURL().empty())  		{ @@ -116,18 +121,18 @@ void LLViewerAudio::startInternetStreamWithAutoFade(std::string streamURI)  			break;  		} -		case FADE_OUT: -			startFading(); -			registerIdleListener(); -			break; +	case FADE_OUT: +		startFading(); +		registerIdleListener(); +		break; -		case FADE_IN: -			registerIdleListener(); -			break; +	case FADE_IN: +		registerIdleListener(); +		break; -		default: -			LL_WARNS() << "Unknown fading state: " << mFadeState << LL_ENDL; -			break; +	default: +		LL_WARNS() << "Unknown fading state: " << mFadeState << LL_ENDL; +		break;  	}  } @@ -158,19 +163,26 @@ bool LLViewerAudio::onIdleUpdate()  		// we have finished the current fade operation  		if (mFadeState == FADE_OUT)  		{ -			// Clear URI -			gAudiop->startInternetStream(LLStringUtil::null); -			gAudiop->stopInternetStream(); +			if (gAudiop) +			{ +				// Clear URI +				gAudiop->startInternetStream(LLStringUtil::null); +				gAudiop->stopInternetStream(); +			}  			if (!mNextStreamURI.empty())  			{  				mFadeState = FADE_IN; -				LLStreamingAudioInterface *stream = gAudiop->getStreamingAudioImpl(); -				if(stream && stream->supportsAdjustableBufferSizes()) -					stream->setBufferSizes(gSavedSettings.getU32("FMODExStreamBufferSize"),gSavedSettings.getU32("FMODExDecodeBufferSize")); +				if (gAudiop) +				{ +					LLStreamingAudioInterface *stream = gAudiop->getStreamingAudioImpl(); +					if(stream && stream->supportsAdjustableBufferSizes()) +						stream->setBufferSizes(gSavedSettings.getU32("FMODExStreamBufferSize"),gSavedSettings.getU32("FMODExDecodeBufferSize")); + +					gAudiop->startInternetStream(mNextStreamURI); +				} -				gAudiop->startInternetStream(mNextStreamURI);  				startFading();  			}  			else @@ -182,7 +194,7 @@ bool LLViewerAudio::onIdleUpdate()  		}  		else if (mFadeState == FADE_IN)  		{ -			if (mNextStreamURI != gAudiop->getInternetStreamURL()) +			if (gAudiop && mNextStreamURI != gAudiop->getInternetStreamURL())  			{  				mFadeState = FADE_OUT;  				startFading(); @@ -204,9 +216,12 @@ void LLViewerAudio::stopInternetStreamWithAutoFade()  	mFadeState = FADE_IDLE;  	mNextStreamURI = LLStringUtil::null;  	mDone = true; - -	gAudiop->startInternetStream(LLStringUtil::null); -	gAudiop->stopInternetStream(); +	 +	if (gAudiop) +	{ +		gAudiop->startInternetStream(LLStringUtil::null); +		gAudiop->stopInternetStream(); +	}  }  void LLViewerAudio::startFading() @@ -268,7 +283,7 @@ F32 LLViewerAudio::getFadeVolume()  void LLViewerAudio::onTeleportStarted()  { -	if (!LLViewerAudio::getInstance()->getForcedTeleportFade()) +	if (gAudiop && !LLViewerAudio::getInstance()->getForcedTeleportFade())  	{  		// Even though the music was turned off it was starting up (with autoplay disabled) occasionally  		// after a failed teleport or after an intra-parcel teleport.  Also, the music sometimes was not @@ -394,9 +409,10 @@ void audio_update_volume(bool force_update)  	}  	F32 mute_volume = mute_audio ? 0.0f : 1.0f; -	// Sound Effects  	if (gAudiop)   	{ +		// Sound Effects +  		gAudiop->setMasterGain ( master_volume );  		gAudiop->setDopplerFactor(gSavedSettings.getF32("AudioLevelDoppler")); @@ -426,11 +442,9 @@ void audio_update_volume(bool force_update)  								  gSavedSettings.getBOOL("MuteUI") ? 0.f : gSavedSettings.getF32("AudioLevelUI"));  		gAudiop->setSecondaryGain(LLAudioEngine::AUDIO_TYPE_AMBIENT,  								  gSavedSettings.getBOOL("MuteAmbient") ? 0.f : gSavedSettings.getF32("AudioLevelAmbient")); -	} -	// Streaming Music -	if (gAudiop)  -	{ +		// Streaming Music +  		if (!progress_view_visible && LLViewerAudio::getInstance()->getForcedTeleportFade())  		{  			LLViewerAudio::getInstance()->setWasPlaying(!gAudiop->getInternetStreamURL().empty()); @@ -528,6 +542,12 @@ void audio_update_wind(bool force_update)  			volume_delta = 1.f;  		} +		if (!gAudiop) +		{ +			LL_WARNS("AudioEngine") << "LLAudioEngine instance doesn't exist!" << LL_ENDL; +			return; +		} +  		// mute wind when not flying  		if (gAgent.getFlying())  		{ diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp index f404f0c433..e53e191ab8 100755 --- a/indra/newview/llviewermedia.cpp +++ b/indra/newview/llviewermedia.cpp @@ -67,7 +67,6 @@  #include "llvoavatarself.h"  #include "llvovolume.h"  #include "llwebprofile.h" -#include "llwebsharing.h"	// For LLWebSharing::setOpenIDCookie(), *TODO: find a better way to do this!  #include "llwindow.h"  #include "llvieweraudio.h" @@ -1426,9 +1425,6 @@ void LLViewerMedia::setOpenIDCookie()  		getCookieStore()->setCookiesFromHost(sOpenIDCookie, authority.substr(host_start, host_end - host_start)); -		// *HACK: Doing this here is nasty, find a better way. -		LLWebSharing::instance().setOpenIDCookie(sOpenIDCookie); -  		// Do a web profile get so we can store the cookie   		LLSD headers = LLSD::emptyMap();  		headers["Accept"] = "*/*"; diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index 88f1dd14ff..9c08ec7e77 100755 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -8225,6 +8225,45 @@ class LLWorldEnvSettings : public view_listener_t  	}  }; +class LLWorldEnableEnvSettings : public view_listener_t +{ +	bool handleEvent(const LLSD& userdata) +	{ +		bool result = false; +		std::string tod = userdata.asString(); + +		if (tod == "region") +		{ +			return LLEnvManagerNew::instance().getUseRegionSettings(); +		} + +		if (LLEnvManagerNew::instance().getUseFixedSky()) +		{ +			if (tod == "sunrise") +			{ +				result = (LLEnvManagerNew::instance().getSkyPresetName() == "Sunrise"); +			} +			else if (tod == "noon") +			{ +				result = (LLEnvManagerNew::instance().getSkyPresetName() == "Midday"); +			} +			else if (tod == "sunset") +			{ +				result = (LLEnvManagerNew::instance().getSkyPresetName() == "Sunset"); +			} +			else if (tod == "midnight") +			{ +				result = (LLEnvManagerNew::instance().getSkyPresetName() == "Midnight"); +			} +			else +			{ +				llwarns << "Unknown item" << llendl; +			} +		} +		return result; +	} +}; +  class LLWorldEnvPreset : public view_listener_t  {  	bool handleEvent(const LLSD& userdata) @@ -8563,6 +8602,7 @@ void initialize_menus()  	view_listener_t::addMenu(new LLWorldCheckAlwaysRun(), "World.CheckAlwaysRun");  	view_listener_t::addMenu(new LLWorldEnvSettings(), "World.EnvSettings"); +	view_listener_t::addMenu(new LLWorldEnableEnvSettings(), "World.EnableEnvSettings");  	view_listener_t::addMenu(new LLWorldEnvPreset(), "World.EnvPreset");  	view_listener_t::addMenu(new LLWorldEnableEnvPreset(), "World.EnableEnvPreset");  	view_listener_t::addMenu(new LLWorldPostProcess(), "World.PostProcess"); diff --git a/indra/newview/llviewermenufile.cpp b/indra/newview/llviewermenufile.cpp index e1c59fdfe9..58f85c770c 100755 --- a/indra/newview/llviewermenufile.cpp +++ b/indra/newview/llviewermenufile.cpp @@ -494,7 +494,9 @@ class LLFileEnableCloseAllWindows : public view_listener_t  {  	bool handleEvent(const LLSD& userdata)  	{ -		bool open_children = gFloaterView->allChildrenClosed() && !LLFloaterSnapshot::getInstance()->isInVisibleChain(); +		LLFloaterSnapshot* floater_snapshot = LLFloaterSnapshot::findInstance(); +		bool is_floater_snapshot_opened = floater_snapshot && floater_snapshot->isInVisibleChain(); +		bool open_children = gFloaterView->allChildrenClosed() && !is_floater_snapshot_opened;  		return !open_children;  	}  }; diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index 92fd2c0d73..8761b8cfb0 100755 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -3566,6 +3566,12 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data)  	}  	else  	{ +		// make sure that we don't have an empty or all-whitespace name +		LLStringUtil::trim(from_name); +		if (from_name.empty()) +		{ +			from_name = LLTrans::getString("Unnamed"); +		}  		chat.mFromName = from_name;  	} @@ -4701,7 +4707,11 @@ void process_time_synch(LLMessageSystem *mesgsys, void **user_data)  void process_sound_trigger(LLMessageSystem *msg, void **)  { -	if (!gAudiop) return; +	if (!gAudiop) +	{ +		LL_WARNS("AudioEngine") << "LLAudioEngine instance doesn't exist!" << LL_ENDL; +		return; +	}  	U64		region_handle = 0;  	F32		gain = 0; @@ -4761,6 +4771,7 @@ void process_preload_sound(LLMessageSystem *msg, void **user_data)  {  	if (!gAudiop)  	{ +		LL_WARNS("AudioEngine") << "LLAudioEngine instance doesn't exist!" << LL_ENDL;  		return;  	} @@ -4791,9 +4802,9 @@ void process_preload_sound(LLMessageSystem *msg, void **user_data)  	LLVector3d pos_global = objectp->getPositionGlobal();  	if (gAgent.canAccessMaturityAtGlobal(pos_global))  	{ -	// Add audioData starts a transfer internally. -	sourcep->addAudioData(datap, FALSE); -} +		// Add audioData starts a transfer internally. +		sourcep->addAudioData(datap, FALSE); +	}  }  void process_attached_sound(LLMessageSystem *msg, void **user_data) diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index 602c0cfb13..b1858df008 100755 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -5177,6 +5177,7 @@ void LLViewerObject::setAttachedSound(const LLUUID &audio_uuid, const LLUUID& ow  {  	if (!gAudiop)  	{ +		LL_WARNS("AudioEngine") << "LLAudioEngine instance doesn't exist!" << LL_ENDL;  		return;  	} @@ -5259,7 +5260,10 @@ LLAudioSource *LLViewerObject::getAudioSource(const LLUUID& owner_id)  		LLAudioSourceVO *asvop = new LLAudioSourceVO(mID, owner_id, 0.01f, this);  		mAudioSourcep = asvop; -		if(gAudiop) gAudiop->addAudioSource(asvop); +		if(gAudiop) +		{ +			gAudiop->addAudioSource(asvop); +		}  	}  	return mAudioSourcep; @@ -5267,10 +5271,6 @@ LLAudioSource *LLViewerObject::getAudioSource(const LLUUID& owner_id)  void LLViewerObject::adjustAudioGain(const F32 gain)  { -	if (!gAudiop) -	{ -		return; -	}  	if (mAudioSourcep)  	{  		mAudioGain = gain; diff --git a/indra/newview/llviewerregion.h b/indra/newview/llviewerregion.h index 7f6a8186a5..00d3900a88 100755 --- a/indra/newview/llviewerregion.h +++ b/indra/newview/llviewerregion.h @@ -117,7 +117,7 @@ public:  	void setAllowSetHome(BOOL b) { setRegionFlag(REGION_FLAGS_ALLOW_SET_HOME, b); }  	void setResetHomeOnTeleport(BOOL b) { setRegionFlag(REGION_FLAGS_RESET_HOME_ON_TELEPORT, b); }  	void setSunFixed(BOOL b) { setRegionFlag(REGION_FLAGS_SUN_FIXED, b); } -	void setBlockFly(BOOL b) { setRegionFlag(REGION_FLAGS_BLOCK_FLY, b); } +	//void setBlockFly(BOOL b) { setRegionFlag(REGION_FLAGS_BLOCK_FLY, b); }		Never used  	void setAllowDirectTeleport(BOOL b) { setRegionFlag(REGION_FLAGS_ALLOW_DIRECT_TELEPORT, b); } diff --git a/indra/newview/llviewertexteditor.cpp b/indra/newview/llviewertexteditor.cpp index 69f9bbdff8..0c4f55d704 100755 --- a/indra/newview/llviewertexteditor.cpp +++ b/indra/newview/llviewertexteditor.cpp @@ -542,8 +542,8 @@ LLUIImagePtr LLEmbeddedItems::getItemImage(llwchar ext_char) const  			case LLAssetType::AT_BODYPART:		img_name = "Inv_Skin";		break;  			case LLAssetType::AT_ANIMATION:		img_name = "Inv_Animation";	break;  			case LLAssetType::AT_GESTURE:		img_name = "Inv_Gesture";	break; -			case LLAssetType::AT_MESH:          img_name = "Inv_Mesh";	    break; -			default: llassert(0); +			case LLAssetType::AT_MESH:      	img_name = "Inv_Mesh";	    break; +			default:                        	img_name = "Inv_Invalid";   break; // use the Inv_Invalid icon for undefined object types (see MAINT-3981)  		}  		return LLUI::getUIImage(img_name); diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index aa75bae712..ec794e527d 100755 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -443,10 +443,7 @@ public:  		}  		if (gDisplayWindInfo)  		{ -			if (gAudiop) -			{ -				audio_text= llformat("Audio for wind: %d", gAudiop->isWindEnabled()); -			} +			audio_text = llformat("Audio for wind: %d", gAudiop ? gAudiop->isWindEnabled() : -1);  			addText(xpos, ypos, audio_text);  ypos += y_inc;  		}  		if (gDisplayFOV) @@ -3246,6 +3243,8 @@ void LLViewerWindow::updateUI()  	updateLayout(); +	saveLastMouse(mCurrentMousePoint); +  	// cleanup unused selections when no modal dialogs are open  	if (LLModalDialog::activeCount() == 0)  	{ diff --git a/indra/newview/llwebsharing.cpp b/indra/newview/llwebsharing.cpp deleted file mode 100755 index 3a80051b9b..0000000000 --- a/indra/newview/llwebsharing.cpp +++ /dev/null @@ -1,603 +0,0 @@ -/**  - * @file llwebsharing.cpp - * @author Aimee - * @brief Web Snapshot Sharing - * - * $LicenseInfo:firstyear=2010&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2010, Linden Research, Inc. - *  - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License only. - *  - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU - * Lesser General Public License for more details. - *  - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA - *  - * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA - * $/LicenseInfo$ - */ - -#include "llviewerprecompiledheaders.h" - -#include "llwebsharing.h" - -#include "llagentui.h" -#include "llbufferstream.h" -#include "llhttpclient.h" -#include "llhttpstatuscodes.h" -#include "llsdserialize.h" -#include "llsdutil.h" -#include "llurl.h" -#include "llviewercontrol.h" - -#include <boost/regex.hpp> -#include <boost/algorithm/string/replace.hpp> - - - -/////////////////////////////////////////////////////////////////////////////// -// -class LLWebSharingConfigResponder : public LLHTTPClient::Responder -{ -	LOG_CLASS(LLWebSharingConfigResponder); -public: -	/// Overrides the default LLSD parsing behaviour, to allow parsing a JSON response. -	virtual void completedRaw(U32 status, const std::string& reason, -							  const LLChannelDescriptors& channels, -							  const LLIOPipe::buffer_ptr_t& buffer) -	{ -		LLSD content; -		LLBufferStream istr(channels, buffer.get()); -		LLPointer<LLSDParser> parser = new LLSDNotationParser(); - -		if (parser->parse(istr, content, LLSDSerialize::SIZE_UNLIMITED) == LLSDParser::PARSE_FAILURE) -		{ -			LL_WARNS("WebSharing") << "Failed to deserialize LLSD from JSON response. " << " [" << status << "]: " << reason << LL_ENDL; -		} -		else -		{ -			completed(status, reason, content); -		} -	} - -	virtual void errorWithContent(U32 status, const std::string& reason, const LLSD& content) -	{ -		LL_WARNS("WebSharing") << "Error [status:" << status << "]: " << content << LL_ENDL; -	} - -	virtual void result(const LLSD& content) -	{ -		LLWebSharing::instance().receiveConfig(content); -	} -}; - - - -/////////////////////////////////////////////////////////////////////////////// -// -class LLWebSharingOpenIDAuthResponder : public LLHTTPClient::Responder -{ -	LOG_CLASS(LLWebSharingOpenIDAuthResponder); -public: -	/* virtual */ void completedHeader(U32 status, const std::string& reason, const LLSD& content) -	{ -		completed(status, reason, content); -	} - -	/* virtual */ void completedRaw(U32 status, const std::string& reason, -									const LLChannelDescriptors& channels, -									const LLIOPipe::buffer_ptr_t& buffer) -	{ -		/// Left empty to override the default LLSD parsing behaviour. -	} - -	virtual void errorWithContent(U32 status, const std::string& reason, const LLSD& content) -	{ -		if (HTTP_UNAUTHORIZED == status) -		{ -			LL_WARNS("WebSharing") << "AU account not authenticated." << LL_ENDL; -			// *TODO: No account found on AU, so start the account creation process here. -		} -		else -		{ -			LL_WARNS("WebSharing") << "Error [status:" << status << "]: " << content << LL_ENDL; -			LLWebSharing::instance().retryOpenIDAuth(); -		} - -	} - -	virtual void result(const LLSD& content) -	{ -		if (content.has("set-cookie")) -		{ -			// OpenID request succeeded and returned a session cookie. -			LLWebSharing::instance().receiveSessionCookie(content["set-cookie"].asString()); -		} -	} -}; - - - -/////////////////////////////////////////////////////////////////////////////// -// -class LLWebSharingSecurityTokenResponder : public LLHTTPClient::Responder -{ -	LOG_CLASS(LLWebSharingSecurityTokenResponder); -public: -	/// Overrides the default LLSD parsing behaviour, to allow parsing a JSON response. -	virtual void completedRaw(U32 status, const std::string& reason, -							  const LLChannelDescriptors& channels, -							  const LLIOPipe::buffer_ptr_t& buffer) -	{ -		LLSD content; -		LLBufferStream istr(channels, buffer.get()); -		LLPointer<LLSDParser> parser = new LLSDNotationParser(); - -		if (parser->parse(istr, content, LLSDSerialize::SIZE_UNLIMITED) == LLSDParser::PARSE_FAILURE) -		{ -			LL_WARNS("WebSharing") << "Failed to deserialize LLSD from JSON response. " << " [" << status << "]: " << reason << LL_ENDL; -			LLWebSharing::instance().retryOpenIDAuth(); -		} -		else -		{ -			completed(status, reason, content); -		} -	} - -	virtual void errorWithContent(U32 status, const std::string& reason, const LLSD& content) -	{ -		LL_WARNS("WebSharing") << "Error [status:" << status << "]: " << content << LL_ENDL; -		LLWebSharing::instance().retryOpenIDAuth(); -	} - -	virtual void result(const LLSD& content) -	{ -		if (content[0].has("st") && content[0].has("expires")) -		{ -			const std::string& token   = content[0]["st"].asString(); -			const std::string& expires = content[0]["expires"].asString(); -			if (LLWebSharing::instance().receiveSecurityToken(token, expires)) -			{ -				// Sucessfully received a valid security token. -				return; -			} -		} -		else -		{ -			LL_WARNS("WebSharing") << "No security token received." << LL_ENDL; -		} - -		LLWebSharing::instance().retryOpenIDAuth(); -	} -}; - - - -/////////////////////////////////////////////////////////////////////////////// -// -class LLWebSharingUploadResponder : public LLHTTPClient::Responder -{ -	LOG_CLASS(LLWebSharingUploadResponder); -public: -	/// Overrides the default LLSD parsing behaviour, to allow parsing a JSON response. -	virtual void completedRaw(U32 status, const std::string& reason, -							  const LLChannelDescriptors& channels, -							  const LLIOPipe::buffer_ptr_t& buffer) -	{ -/* -		 // Dump the body, for debugging. - -		 LLBufferStream istr1(channels, buffer.get()); -		 std::ostringstream ostr; -		 std::string body; - -		 while (istr1.good()) -		 { -			char buf[1024]; -			istr1.read(buf, sizeof(buf)); -			body.append(buf, istr1.gcount()); -		 } -		 LL_DEBUGS("WebSharing") << body << LL_ENDL; -*/ -		LLSD content; -		LLBufferStream istr(channels, buffer.get()); -		LLPointer<LLSDParser> parser = new LLSDNotationParser(); - -		if (parser->parse(istr, content, LLSDSerialize::SIZE_UNLIMITED) == LLSDParser::PARSE_FAILURE) -		{ -			LL_WARNS("WebSharing") << "Failed to deserialize LLSD from JSON response. " << " [" << status << "]: " << reason << LL_ENDL; -		} -		else -		{ -			completed(status, reason, content); -		} -	} - -	virtual void errorWithContent(U32 status, const std::string& reason, const LLSD& content) -	{ -		LL_WARNS("WebSharing") << "Error [status:" << status << "]: " << content << LL_ENDL; -	} - -	virtual void result(const LLSD& content) -	{ -		if (content[0].has("result") && content[0].has("id") && -			content[0]["id"].asString() == "newMediaItem") -		{ -			// *TODO: Upload successful, continue from here to post metadata and create AU activity. -		} -		else -		{ -			LL_WARNS("WebSharing") << "Error [" << content[0]["code"].asString() -								   << "]: " << content[0]["message"].asString() << LL_ENDL; -		} -	} -}; - - - -/////////////////////////////////////////////////////////////////////////////// -// -LLWebSharing::LLWebSharing() -:	mConfig(), -	mSecurityToken(LLSD::emptyMap()), -	mEnabled(false), -	mRetries(0), -	mImage(NULL), -	mMetadata(LLSD::emptyMap()) -{ -} - -void LLWebSharing::init() -{ -	if (!mEnabled) -	{ -		sendConfigRequest(); -	} -} - -bool LLWebSharing::shareSnapshot(LLImageJPEG* snapshot, LLSD& metadata) -{ -	LL_INFOS("WebSharing") << metadata << LL_ENDL; - -	if (mImage) -	{ -		// *TODO: Handle this possibility properly, queue them up? -		LL_WARNS("WebSharing") << "Snapshot upload already in progress." << LL_ENDL; -		return false; -	} - -	mImage = snapshot; -	mMetadata = metadata; - -	// *TODO: Check whether we have a valid security token already and re-use it. -	sendOpenIDAuthRequest(); -	return true; -} - -bool LLWebSharing::setOpenIDCookie(const std::string& cookie) -{ -	LL_DEBUGS("WebSharing") << "Setting OpenID cookie " << cookie << LL_ENDL; -	mOpenIDCookie = cookie; -	return validateConfig(); -} - -bool LLWebSharing::receiveConfig(const LLSD& config) -{ -	LL_DEBUGS("WebSharing") << "Received config data: " << config << LL_ENDL; -	mConfig = config; -	return validateConfig(); -} - -bool LLWebSharing::receiveSessionCookie(const std::string& cookie) -{ -	LL_DEBUGS("WebSharing") << "Received AU session cookie: " << cookie << LL_ENDL; -	mSessionCookie = cookie; - -	// Fetch a security token using the new session cookie. -	LLWebSharing::instance().sendSecurityTokenRequest(); - -	return (!mSessionCookie.empty()); -} - -bool LLWebSharing::receiveSecurityToken(const std::string& token, const std::string& expires) -{ -	mSecurityToken["st"] = token; -	mSecurityToken["expires"] = LLDate(expires); - -	if (!securityTokenIsValid(mSecurityToken)) -	{ -		LL_WARNS("WebSharing") << "Invalid security token received: \"" << token << "\" Expires: " << expires << LL_ENDL; -		return false; -	} - -	LL_DEBUGS("WebSharing") << "Received security token: \"" << token << "\" Expires: " << expires << LL_ENDL; -	mRetries = 0; - -	// Continue the upload process now that we have a security token. -	sendUploadRequest(); - -	return true; -} - -void LLWebSharing::sendConfigRequest() -{ -	std::string config_url = gSavedSettings.getString("SnapshotConfigURL"); -	LL_DEBUGS("WebSharing") << "Requesting Snapshot Sharing config data from: " << config_url << LL_ENDL; - -	LLSD headers = LLSD::emptyMap(); -	headers["Accept"] = "application/json"; - -	LLHTTPClient::get(config_url, new LLWebSharingConfigResponder(), headers); -} - -void LLWebSharing::sendOpenIDAuthRequest() -{ -	std::string auth_url = mConfig["openIdAuthUrl"]; -	LL_DEBUGS("WebSharing") << "Starting OpenID Auth: " << auth_url << LL_ENDL; - -	LLSD headers = LLSD::emptyMap(); -	headers["Cookie"] = mOpenIDCookie; -	headers["Accept"] = "*/*"; - -	// Send request, successful login will trigger fetching a security token. -	LLHTTPClient::get(auth_url, new LLWebSharingOpenIDAuthResponder(), headers); -} - -bool LLWebSharing::retryOpenIDAuth() -{ -	if (mRetries++ >= MAX_AUTH_RETRIES) -	{ -		LL_WARNS("WebSharing") << "Exceeded maximum number of authorization attempts, aborting." << LL_ENDL; -		mRetries = 0; -		return false; -	} - -	LL_WARNS("WebSharing") << "Authorization failed, retrying (" << mRetries << "/" << MAX_AUTH_RETRIES << ")" << LL_ENDL; -	sendOpenIDAuthRequest(); -	return true; -} - -void LLWebSharing::sendSecurityTokenRequest() -{ -	std::string token_url = mConfig["securityTokenUrl"]; -	LL_DEBUGS("WebSharing") << "Fetching security token from: " << token_url << LL_ENDL; - -	LLSD headers = LLSD::emptyMap(); -	headers["Cookie"] = mSessionCookie; - -	headers["Accept"] = "application/json"; -	headers["Content-Type"] = "application/json"; - -	std::ostringstream body; -	body << "{ \"gadgets\": [{ \"url\":\"" -		 << mConfig["gadgetSpecUrl"].asString() -		 << "\" }] }"; - -	// postRaw() takes ownership of the buffer and releases it later. -	size_t size = body.str().size(); -	U8 *data = new U8[size]; -	memcpy(data, body.str().data(), size); - -	// Send request, receiving a valid token will trigger snapshot upload. -	LLHTTPClient::postRaw(token_url, data, size, new LLWebSharingSecurityTokenResponder(), headers); -} - -void LLWebSharing::sendUploadRequest() -{ -	LLUriTemplate upload_template(mConfig["openSocialRpcUrlTemplate"].asString()); -	std::string upload_url(upload_template.buildURI(mSecurityToken)); - -	LL_DEBUGS("WebSharing") << "Posting upload to: " << upload_url << LL_ENDL; - -	static const std::string BOUNDARY("------------abcdef012345xyZ"); - -	LLSD headers = LLSD::emptyMap(); -	headers["Cookie"] = mSessionCookie; - -	headers["Accept"] = "application/json"; -	headers["Content-Type"] = "multipart/form-data; boundary=" + BOUNDARY; - -	std::ostringstream body; -	body << "--" << BOUNDARY << "\r\n" -		 << "Content-Disposition: form-data; name=\"request\"\r\n\r\n" -		 << "[{" -		 <<	  "\"method\":\"mediaItems.create\"," -		 <<	  "\"params\": {" -		 <<	    "\"userId\":[\"@me\"]," -		 <<	    "\"groupId\":\"@self\"," -		 <<	    "\"mediaItem\": {" -		 <<	      "\"mimeType\":\"image/jpeg\"," -		 <<	      "\"type\":\"image\"," -		 <<       "\"url\":\"@field:image1\"" -		 <<	    "}" -		 <<	  "}," -		 <<	  "\"id\":\"newMediaItem\"" -		 <<	"}]" -		 <<	"--" << BOUNDARY << "\r\n" -		 <<	"Content-Disposition: form-data; name=\"image1\"\r\n\r\n"; - -	// Insert the image data. -	// *FIX: Treating this as a string will probably screw it up ... -	U8* image_data = mImage->getData(); -	for (S32 i = 0; i < mImage->getDataSize(); ++i) -	{ -		body << image_data[i]; -	} - -	body <<	"\r\n--" << BOUNDARY << "--\r\n"; - -	// postRaw() takes ownership of the buffer and releases it later. -	size_t size = body.str().size(); -	U8 *data = new U8[size]; -	memcpy(data, body.str().data(), size); - -	// Send request, successful upload will trigger posting metadata. -	LLHTTPClient::postRaw(upload_url, data, size, new LLWebSharingUploadResponder(), headers); -} - -bool LLWebSharing::validateConfig() -{ -	// Check the OpenID Cookie has been set. -	if (mOpenIDCookie.empty()) -	{ -		mEnabled = false; -		return mEnabled; -	} - -	if (!mConfig.isMap()) -	{ -		mEnabled = false; -		return mEnabled; -	} - -	// Template to match the received config against. -	LLSD required(LLSD::emptyMap()); -	required["gadgetSpecUrl"] = ""; -	required["loginTokenUrl"] = ""; -	required["openIdAuthUrl"] = ""; -	required["photoPageUrlTemplate"] = ""; -	required["openSocialRpcUrlTemplate"] = ""; -	required["securityTokenUrl"] = ""; -	required["tokenBasedLoginUrlTemplate"] = ""; -	required["viewerIdUrl"] = ""; - -	std::string mismatch(llsd_matches(required, mConfig)); -	if (!mismatch.empty()) -	{ -		LL_WARNS("WebSharing") << "Malformed config data response: " << mismatch << LL_ENDL; -		mEnabled = false; -		return mEnabled; -	} - -	mEnabled = true; -	return mEnabled; -} - -// static -bool LLWebSharing::securityTokenIsValid(LLSD& token) -{ -	return (token.has("st") && -			token.has("expires") && -			(token["st"].asString() != "") && -			(token["expires"].asDate() > LLDate::now())); -} - - - -/////////////////////////////////////////////////////////////////////////////// -// -LLUriTemplate::LLUriTemplate(const std::string& uri_template) -	: -	mTemplate(uri_template) -{ -} - -std::string LLUriTemplate::buildURI(const LLSD& vars) -{ -	// *TODO: Separate parsing the template from building the URI. -	// Parsing only needs to happen on construction/assignnment. - -	static const std::string VAR_NAME_REGEX("[[:alpha:]][[:alnum:]\\._-]*"); -	// Capture var name with and without surrounding {} -	static const std::string VAR_REGEX("\\{(" + VAR_NAME_REGEX + ")\\}"); -	// Capture delimiter and comma separated list of var names. -	static const std::string JOIN_REGEX("\\{-join\\|(&)\\|(" + VAR_NAME_REGEX + "(?:," + VAR_NAME_REGEX + ")*)\\}"); - -	std::string uri = mTemplate; -	boost::smatch results; - -	// Validate and expand join operators : {-join|&|var1,var2,...} - -	boost::regex join_regex(JOIN_REGEX); - -	while (boost::regex_search(uri, results, join_regex)) -	{ -		// Extract the list of var names from the results. -		std::string delim = results[1].str(); -		std::string var_list = results[2].str(); - -		// Expand the list of vars into a query string with their values -		std::string query = expandJoin(delim, var_list, vars); - -		// Substitute the query string into the template. -		uri = boost::regex_replace(uri, join_regex, query, boost::format_first_only); -	} - -	// Expand vars : {var1} - -	boost::regex var_regex(VAR_REGEX); - -	std::set<std::string> var_names; -	std::string::const_iterator start = uri.begin(); -	std::string::const_iterator end = uri.end(); - -	// Extract the var names used. -	while (boost::regex_search(start, end, results, var_regex)) -	{ -		var_names.insert(results[1].str()); -		start = results[0].second; -	} - -	// Replace each var with its value. -	for (std::set<std::string>::const_iterator it = var_names.begin(); it != var_names.end(); ++it) -	{ -		std::string var = *it; -		if (vars.has(var)) -		{ -			boost::replace_all(uri, "{" + var + "}", vars[var].asString()); -		} -	} - -	return uri; -} - -std::string LLUriTemplate::expandJoin(const std::string& delim, const std::string& var_list, const LLSD& vars) -{ -	std::ostringstream query; - -	typedef boost::tokenizer<boost::char_separator<char> > tokenizer; -	boost::char_separator<char> sep(","); -	tokenizer var_names(var_list, sep); -	tokenizer::const_iterator it = var_names.begin(); - -	// First var does not need a delimiter -	if (it != var_names.end()) -	{ -		const std::string& name = *it; -		if (vars.has(name)) -		{ -			// URL encode the value before appending the name=value pair. -			query << name << "=" << escapeURL(vars[name].asString()); -		} -	} - -	for (++it; it != var_names.end(); ++it) -	{ -		const std::string& name = *it; -		if (vars.has(name)) -		{ -			// URL encode the value before appending the name=value pair. -			query << delim << name << "=" << escapeURL(vars[name].asString()); -		} -	} - -	return query.str(); -} - -// static -std::string LLUriTemplate::escapeURL(const std::string& unescaped) -{ -	char* escaped = curl_escape(unescaped.c_str(), unescaped.size()); -	std::string result = escaped; -	curl_free(escaped); -	return result; -} - diff --git a/indra/newview/llwebsharing.h b/indra/newview/llwebsharing.h deleted file mode 100755 index ad9c99c224..0000000000 --- a/indra/newview/llwebsharing.h +++ /dev/null @@ -1,224 +0,0 @@ -/**  - * @file llwebsharing.h - * @author Aimee - * @brief Web Snapshot Sharing - * - * $LicenseInfo:firstyear=2010&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2010, Linden Research, Inc. - *  - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License only. - *  - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU - * Lesser General Public License for more details. - *  - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA - *  - * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA - * $/LicenseInfo$ - */ - -#ifndef LL_LLWEBSHARING_H -#define LL_LLWEBSHARING_H - -#include "llimagejpeg.h" -#include "llsingleton.h" - - - -/** - * @class LLWebSharing - * - * Manages authentication to, and interaction with, a web service allowing the - * upload of snapshot images taken within the viewer, using OpenID and the - * OpenSocial APIs. - * http://www.opensocial.org/Technical-Resources/opensocial-spec-v09/RPC-Protocol.html - */ -class LLWebSharing : public LLSingleton<LLWebSharing> -{ -	LOG_CLASS(LLWebSharing); -public: -	/* -	 * Performs initial setup, by requesting config data from the web service if -	 * it has not already been received. -	 */ -	void init(); - -	/* -	 * @return true if both the OpenID cookie and config data have been received. -	 */ -	bool enabled() const { return mEnabled; }; - -	/* -	 * Sets the OpenID cookie to use for login to the web service. -	 * -	 * @param cookie a string containing the OpenID cookie. -	 * -	 * @return true if both the OpenID cookie and config data have been received. -	 */ -	bool setOpenIDCookie(const std::string& cookie); - -	/* -	 * Receive config data used to connect to the web service. -	 * -	 * @param config an LLSD map of URL templates for the web service end-points. -	 * -	 * @return true if both the OpenID cookie and config data have been received. -	 * -	 * @see sendConfigRequest() -	 */ -	bool receiveConfig(const LLSD& config); - -	/* -	 * Receive the session cookie from the web service, which is the result of -	 * the OpenID login process. -	 * -	 * @see sendOpenIDAuthRequest() -	 */ -	bool receiveSessionCookie(const std::string& cookie); - -	/* -	 * Receive a security token for the upload service. -	 * -	 * @see sendSecurityTokenRequest() -	 */ -	bool receiveSecurityToken(const std::string& token, const std::string& expires); - -	/* -	 * Restarts the authentication process if the maximum number of retries has -	 * not been exceeded. -	 * -	 * @return true if retrying, false if LLWebSharing::MAX_AUTH_RETRIES has been exceeded. -	 */ -	bool retryOpenIDAuth(); - -	/* -	 * Post a snapshot to the upload service. -	 * -	 * @return true if accepted for upload, false if already uploading another image. -	 */ -	bool shareSnapshot(LLImageJPEG* snapshot, LLSD& metadata); - -private: -	static const S32 MAX_AUTH_RETRIES = 4; - -	friend class LLSingleton<LLWebSharing>; - -	LLWebSharing(); -	~LLWebSharing() {}; - -	/* -	 * Request a map of URLs and URL templates to the web service end-points. -	 * -	 * @see receiveConfig() -	 */ -	void sendConfigRequest(); - -	/* -	 * Initiate the OpenID login process. -	 * -	 * @see receiveSessionCookie() -	 */ -	void sendOpenIDAuthRequest(); - -	/* -	 * Request a security token for the upload service. -	 * -	 * @see receiveSecurityToken() -	 */ -	void sendSecurityTokenRequest(); - -	/* -	 * Request a security token for the upload service. -	 * -	 * @see receiveSecurityToken() -	 */ -	void sendUploadRequest(); - -	/* -	 * Checks all necessary config information has been received, and sets mEnabled. -	 * -	 * @return true if both the OpenID cookie and config data have been received. -	 */ -	bool validateConfig(); - -	/* -	 * Checks the security token is present and has not expired. -	 * -	 * @param token an LLSD map containing the token string and the time it expires. -	 * -	 * @return true if the token is not empty and has not expired. -	 */ -	static bool securityTokenIsValid(LLSD& token); - -	std::string mOpenIDCookie; -	std::string mSessionCookie; -	LLSD mSecurityToken; - -	LLSD mConfig; -	bool mEnabled; - -	LLPointer<LLImageJPEG> mImage; -	LLSD mMetadata; - -	S32 mRetries; -}; - -/** - * @class LLUriTemplate - * - * @brief Builds complete URIs, given URI template and a map of keys and values - *        to use for substition. - *        Note: This is only a partial implementation of a draft standard required - *        by the web API used by LLWebSharing. - *        See: http://tools.ietf.org/html/draft-gregorio-uritemplate-03 - * - * @see LLWebSharing - */ -class LLUriTemplate -{ -	LOG_CLASS(LLUriTemplate); -public: -	LLUriTemplate(const std::string& uri_template); -	~LLUriTemplate() {}; - -	/* -	 * Builds a complete URI from the template. -	 * -	 * @param vars an LLSD map of keys and values for substitution. -	 * -	 * @return a string containing the complete URI. -	 */ -	std::string buildURI(const LLSD& vars); - -private: -	/* -	 * Builds a URL query string. -	 * -	 * @param delim    a string containing the separator to use between name=value pairs. -	 * @param var_list a string containing a comma separated list of variable names. -	 * @param vars     an LLSD map of keys and values for substitution. -	 * -	 * @return a URL query string. -	 */ -	std::string expandJoin(const std::string& delim, const std::string& var_list, const LLSD& vars); - -	/* -	 * URL escape the given string. -	 * LLWeb::escapeURL() only does a partial escape, so this uses curl_escape() instead. -	 */ -	static std::string escapeURL(const std::string& unescaped); - -	std::string mTemplate; -}; - - - -#endif // LL_LLWEBSHARING_H diff --git a/indra/newview/skins/default/xui/da/strings.xml b/indra/newview/skins/default/xui/da/strings.xml index 11d100eeff..74d160dfae 100755 --- a/indra/newview/skins/default/xui/da/strings.xml +++ b/indra/newview/skins/default/xui/da/strings.xml @@ -1172,7 +1172,8 @@ Prøv venligst om lidt igen.  	<string name="InventoryNoTexture">  		Du har ikke en kopi af denne tekstur i din beholdning  	</string> -	<string name="no_transfer" value=" (ikke overdragbar)"/> +  <string name="Unconstrained">Ikke låst</string> +  <string name="no_transfer" value=" (ikke overdragbar)"/>  	<string name="no_modify" value=" (ikke redigere)"/>  	<string name="no_copy" value=" (ikke kopiere)"/>  	<string name="worn" value=" (båret)"/> diff --git a/indra/newview/skins/default/xui/de/strings.xml b/indra/newview/skins/default/xui/de/strings.xml index 4268b95370..082febd709 100755 --- a/indra/newview/skins/default/xui/de/strings.xml +++ b/indra/newview/skins/default/xui/de/strings.xml @@ -1267,7 +1267,8 @@ Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.  	<string name="InventoryNoTexture">  		Sie haben keine Kopie dieser Textur in Ihrem Inventar.  	</string> -	<string name="InventoryInboxNoItems"> +  <string name="Unconstrained">keines</string> +  <string name="InventoryInboxNoItems">  		Einkäufe aus dem Marktplatz erscheinen hier. Sie können diese dann zur Verwendung in Ihr Inventar ziehen.  	</string>  	<string name="MarketplaceURL"> diff --git a/indra/newview/skins/default/xui/en/floater_places.xml b/indra/newview/skins/default/xui/en/floater_places.xml index b241e265a9..31dd6d2c64 100755 --- a/indra/newview/skins/default/xui/en/floater_places.xml +++ b/indra/newview/skins/default/xui/en/floater_places.xml @@ -2,6 +2,7 @@  <floater    positioning="cascading" +  default_tab_group="1"    legacy_header_height="18"    can_resize="true"    height="588" @@ -16,6 +17,7 @@    width="333">      <panel        top="18" +      tab_group="1"        class="panel_places"        name="main_panel"        filename="panel_places.xml" diff --git a/indra/newview/skins/default/xui/en/floater_preview_texture.xml b/indra/newview/skins/default/xui/en/floater_preview_texture.xml index 137e278ddc..e1e7e1c8c8 100755 --- a/indra/newview/skins/default/xui/en/floater_preview_texture.xml +++ b/indra/newview/skins/default/xui/en/floater_preview_texture.xml @@ -79,30 +79,6 @@       width="108"       name="combo_aspect_ratio"       tool_tip="Preview at a fixed aspect ratio"> -    	<combo_item name="Unconstrained" value="Unconstrained"> -    		Unconstrained -    	</combo_item> -   	<combo_item name="1:1" value="1:1" tool_tip="Group insignia or Real World profile"> -		1:1 -	</combo_item> -	<combo_item name="4:3" value="4:3" tool_tip="[SECOND_LIFE] profile"> -		4:3 -	</combo_item> -	<combo_item name="10:7" value="10:7" tool_tip="Classifieds and search listings, landmarks"> -		10:7 -	</combo_item> -	<combo_item name="3:2" value="3:2" tool_tip="About land"> -		3:2 -	</combo_item> -	<combo_item name="16:10" value="16:10"> -		16:10 -	</combo_item> -	<combo_item name="16:9" value="16:9" tool_tip="Profile picks"> -		16:9 -	</combo_item> -	<combo_item name="2:1" value="2:1"> -		2:1 -	</combo_item>  	</combo_box>      <button       follows="right|bottom" diff --git a/indra/newview/skins/default/xui/en/menu_login.xml b/indra/newview/skins/default/xui/en/menu_login.xml index 52c4fb1613..e91eea04d1 100755 --- a/indra/newview/skins/default/xui/en/menu_login.xml +++ b/indra/newview/skins/default/xui/en/menu_login.xml @@ -35,14 +35,72 @@       tear_off="true"       name="Help">          <menu_item_call -         label="[SECOND_LIFE] Help" -         name="Second Life Help" +         label="How to..." +         name="How To"           shortcut="F1">              <menu_item_call.on_click -             function="ShowHelp" -             parameter="f1_help" /> +             function="Help.ToggleHowTo" +             parameter="" />          </menu_item_call> -        <menu_item_separator /> +        <menu_item_call +           label="Quickstart" +           name="Quickstart"> +            <menu_item_call.on_click +            function="Advanced.ShowURL" +            parameter="http://community.secondlife.com/t5/English-Knowledge-Base/Second-Life-Quickstart/ta-p/1087919"/> +        </menu_item_call> +		<menu_item_separator/> +        <menu_item_call +             label="Knowledge Base" +             name="Knowledge Base"> +             <menu_item_call.on_click +                 function="Advanced.ShowURL" +            parameter="http://community.secondlife.com/t5/English-Knowledge-Base/Second-Life-User-s-Guide/ta-p/1244857"/> +        </menu_item_call> +        <menu_item_call +             label="Wiki" +             name="Wiki"> +             <menu_item_call.on_click +                 function="Advanced.ShowURL" +                 parameter="http://wiki.secondlife.com"/> +        </menu_item_call> +        <menu_item_call +             label="Community Forums" +             name="Community Forums"> +             <menu_item_call.on_click +                 function="Advanced.ShowURL" +                 parameter="http://community.secondlife.com/t5/Forums/ct-p/Forums"/> +        </menu_item_call>          +        <menu_item_call +             label="Support portal" +             name="Support portal"> +             <menu_item_call.on_click +                 function="Advanced.ShowURL" +                 parameter="https://support.secondlife.com/"/>          +        </menu_item_call> +        <menu_item_separator/> +        <menu_item_call +             label="[SECOND_LIFE] News" +             name="Second Life News"> +             <menu_item_call.on_click +                 function="Advanced.ShowURL" +                 parameter="http://community.secondlife.com/t5/Featured-News/bg-p/blog_feature_news"/>   +        </menu_item_call> +        <menu_item_call +             label="[SECOND_LIFE] Blogs" +             name="Second Life Blogs"> +             <menu_item_call.on_click +                 function="Advanced.ShowURL" +                 parameter="http://community.secondlife.com/t5/Blogs/ct-p/Blogs"/> +        </menu_item_call> +        <menu_item_separator/>        +        <menu_item_call +             label="Report Bug" +             name="Report Bug"> +                <menu_item_call.on_click +                 function="Advanced.ReportBug"/> +            </menu_item_call> +        <menu_item_separator/>          <menu_item_call           label="About [APP_NAME]"           name="About Second Life"> diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml index 7428a1cf37..767acd1d74 100755 --- a/indra/newview/skins/default/xui/en/menu_viewer.xml +++ b/indra/newview/skins/default/xui/en/menu_viewer.xml @@ -606,44 +606,59 @@           label="Sun"           name="Sun"           tear_off="true"> -            <menu_item_call +            <menu_item_check               label="Sunrise"               name="Sunrise"> -                <menu_item_call.on_click +                <menu_item_check.on_click                   function="World.EnvSettings"                   parameter="sunrise" /> -            </menu_item_call> -            <menu_item_call +                <menu_item_check.on_check +                 function="World.EnableEnvSettings"  +                 parameter="sunrise" /> +            </menu_item_check> +            <menu_item_check               label="Midday"               name="Noon"               shortcut="control|shift|Y"> -                <menu_item_call.on_click +                <menu_item_check.on_click                   function="World.EnvSettings"                   parameter="noon" /> -            </menu_item_call> -            <menu_item_call +                <menu_item_check.on_check +                 function="World.EnableEnvSettings"  +                 parameter="noon" /> +            </menu_item_check> +            <menu_item_check               label="Sunset"               name="Sunset"               shortcut="control|shift|N"> -                <menu_item_call.on_click +                <menu_item_check.on_click                   function="World.EnvSettings"                   parameter="sunset" /> -            </menu_item_call> -            <menu_item_call +                <menu_item_check.on_check +                 function="World.EnableEnvSettings"  +                 parameter="sunset" /> +            </menu_item_check> +            <menu_item_check               label="Midnight"               name="Midnight"> -                <menu_item_call.on_click +                <menu_item_check.on_click                   function="World.EnvSettings"                   parameter="midnight" /> -            </menu_item_call> +                <menu_item_check.on_check +                 function="World.EnableEnvSettings"  +                 parameter="midnight" /> +            </menu_item_check>              <menu_item_separator/> -            <menu_item_call +            <menu_item_check               label="Use Region Settings"               name="Use Region Settings"> -                <menu_item_call.on_click +                <menu_item_check.on_click                   function="World.EnvSettings"                   parameter="region" /> -            </menu_item_call> +                <menu_item_check.on_check +                 function="World.EnableEnvSettings"  +                 parameter="region" /> +            </menu_item_check>          </menu> @@ -1551,7 +1566,8 @@              <menu_item_check               label="Highlight Transparent"               name="Highlight Transparent" -             shortcut="control|alt|T"> +             shortcut="control|alt|T" +             use_mac_ctrl="true">                  <menu_item_check.on_check                   function="View.CheckHighlightTransparent" />                  <menu_item_check.on_click @@ -3175,18 +3191,6 @@                  <menu_item_call.on_click                   function="Advanced.PrintAgentInfo" />              </menu_item_call> -            <menu_item_check -             label="Region Debug Console" -             name="Region Debug Console" -             shortcut="control|shift|`" -             use_mac_ctrl="true"> -                <menu_item_check.on_check -                 function="Floater.Visible" -                 parameter="region_debug_console" /> -                <menu_item_check.on_click -                 function="Floater.Toggle" -                 parameter="region_debug_console" /> -            </menu_item_check>              <menu_item_separator />              <menu_item_check diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index 9af80a23a7..ba6bbd0eed 100755 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -4137,6 +4137,19 @@ Are you sure you want to teleport to <nolink>[LOCATION]</nolink>?       notext="Cancel"       yestext="Teleport"/>    </notification> +   +  <notification +   icon="alertmodal.tga" +   name="TeleportViaSLAPP" +   type="alertmodal"> +Are you sure you want to teleport to <nolink>[LOCATION]</nolink>? +    <tag>confirm</tag> +    <usetemplate +     ignoretext="Confirm that I want to teleport via SLAPP" +     name="okcancelignore" +     notext="Cancel" +     yestext="Teleport"/> +  </notification>	    <notification     icon="alertmodal.tga" @@ -7634,7 +7647,7 @@ Are you sure you want to share the following items:  With the following Residents: -[RESIDENTS] +<nolink>[RESIDENTS]</nolink>    <tag>confirm</tag>  	<usetemplate       name="okcancelbuttons" @@ -7654,7 +7667,7 @@ Are you sure you want to share the following items:  With the following Residents: -[RESIDENTS] +<nolink>[RESIDENTS]</nolink>    <tag>confirm</tag>  	<usetemplate       name="okcancelbuttons" @@ -10235,4 +10248,14 @@ Cannot create large prims that intersect other players.  Please re-try when othe       yestext="OK"/>    </notification> +  <notification +   icon="alert.tga" +   name="ChatHistoryIsBusyAlert" +   type="alertmodal"> +   Chat history file is busy with previous operation. Please try again in a few minutes or choose chat with another person. +    <usetemplate +     name="okbutton" +     yestext="OK"/> +  </notification> +    </notifications> diff --git a/indra/newview/skins/default/xui/en/panel_places.xml b/indra/newview/skins/default/xui/en/panel_places.xml index f169dbb702..7d171490e8 100755 --- a/indra/newview/skins/default/xui/en/panel_places.xml +++ b/indra/newview/skins/default/xui/en/panel_places.xml @@ -27,6 +27,7 @@ background_visible="true"       label="Filter My Places"       max_length_chars="300"       name="Filter" +     tab_group="1"       top="3"       width="303" />      <tab_container @@ -39,7 +40,7 @@ background_visible="true"       tab_min_width="80"       tab_max_width="157"       tab_height="30" -     tab_group="1" +     tab_group="2"       tab_position="top"       top_pad="10"       width="315" /> diff --git a/indra/newview/skins/default/xui/en/panel_region_debug.xml b/indra/newview/skins/default/xui/en/panel_region_debug.xml index 81b2281adb..fea5f1b19f 100755 --- a/indra/newview/skins/default/xui/en/panel_region_debug.xml +++ b/indra/newview/skins/default/xui/en/panel_region_debug.xml @@ -201,4 +201,14 @@       tool_tip="Cancel region restart"       top_delta="0"       width="150" /> +    <button +     follows="left|top" +     height="20" +     label="Region Debug Console" +     layout="topleft" +     left="10" +     name="region_debug_console_btn" +     tool_tip="Open Region Debug Console" +     top_pad="5" +     width="150" />  </panel> diff --git a/indra/newview/skins/default/xui/en/panel_region_general.xml b/indra/newview/skins/default/xui/en/panel_region_general.xml index 44c84e69a1..489d286e67 100755 --- a/indra/newview/skins/default/xui/en/panel_region_general.xml +++ b/indra/newview/skins/default/xui/en/panel_region_general.xml @@ -94,11 +94,20 @@       width="80" />      <check_box       height="20" +     label="Block Parcel Fly Over" +     layout="topleft" +     left="10" +     name="block_fly_over_check" +     tool_tip="Extend access checks upwards to prevent flying over a parcel" +     top="110" +     width="90" /> +  <check_box +     height="20"       label="Allow Damage"       layout="topleft"       left="10"       name="allow_damage_check" -     top="110" +     top="130"       width="80" />      <check_box       height="20" @@ -106,7 +115,7 @@       layout="topleft"       left="10"       name="restrict_pushobject" -     top="130" +     top="150"       width="80" />      <check_box       height="20" @@ -114,7 +123,7 @@       layout="topleft"       left="10"       name="allow_land_resell_check" -     top="150" +     top="170"       width="80" />      <check_box       height="20" @@ -122,7 +131,7 @@       layout="topleft"       left="10"       name="allow_parcel_changes_check" -     top="170" +     top="190"       width="80" />      <check_box       height="20" @@ -131,7 +140,7 @@       left="10"       name="block_parcel_search_check"       tool_tip="Let people see this region and its parcels in search results" -     top="190" +     top="210"       width="80" />  	<spinner       decimal_digits="0" @@ -145,7 +154,7 @@       max_val="100"       min_val="1"       name="agent_limit_spin" -     top="240" +     top="260"       width="170" />      <spinner       follows="left|top" @@ -158,7 +167,7 @@       max_val="10"       min_val="1"       name="object_bonus_spin" -     top="260" +     top="280"       width="170" />      <text       follows="left|top" @@ -167,7 +176,7 @@       layout="topleft"       left="10"       name="access_text" -     top="290" +     top="310"       width="100">          Rating:      </text> @@ -224,7 +233,7 @@       layout="topleft"       left="108"       name="apply_btn" -     top="320" +     top="340"       width="100"/>       <button       follows="left|top" diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index b85541461a..9043872871 100755 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -2269,6 +2269,7 @@ The [[MARKETPLACE_CREATE_STORE_URL] Marketplace store] is returning errors.  	<string name="Marketplace Error Internal Import">Error: There was a problem with this item.  Try again later.</string>  	<string name="Open landmarks">Open landmarks</string> +  <string name="Unconstrained">Unconstrained</string>  	<!-- use value="" because they have preceding spaces -->  	<string name="no_transfer" value=" (no transfer)" /> diff --git a/indra/newview/skins/default/xui/es/strings.xml b/indra/newview/skins/default/xui/es/strings.xml index 484511a08b..2b91c542ad 100755 --- a/indra/newview/skins/default/xui/es/strings.xml +++ b/indra/newview/skins/default/xui/es/strings.xml @@ -1252,7 +1252,8 @@ Intenta iniciar sesión de nuevo en unos instantes.  	<string name="InventoryInboxNoItems">  		Aquí aparecerán algunos de los objetos que recibas, como los regalos Premium. Después puedes arrastrarlos a tu inventario.  	</string> -	<string name="MarketplaceURL"> +  <string name="Unconstrained">Sin restricciones</string> +  <string name="MarketplaceURL">  		https://marketplace.[MARKETPLACE_DOMAIN_NAME]/  	</string>  	<string name="MarketplaceURL_CreateStore"> diff --git a/indra/newview/skins/default/xui/fr/strings.xml b/indra/newview/skins/default/xui/fr/strings.xml index 78d846ff4f..b8721420cb 100755 --- a/indra/newview/skins/default/xui/fr/strings.xml +++ b/indra/newview/skins/default/xui/fr/strings.xml @@ -1270,7 +1270,8 @@ Veuillez réessayer de vous connecter dans une minute.  	<string name="InventoryInboxNoItems">  		Les achats que vous avez effectués sur la Place du marché s'affichent ici. Vous pouvez alors les faire glisser vers votre inventaire afin de les utiliser.  	</string> -	<string name="MarketplaceURL"> +  <string name="Unconstrained">Sans contraintes</string> +  <string name="MarketplaceURL">  		https://marketplace.[MARKETPLACE_DOMAIN_NAME]/  	</string>  	<string name="MarketplaceURL_CreateStore"> diff --git a/indra/newview/skins/default/xui/it/strings.xml b/indra/newview/skins/default/xui/it/strings.xml index 60ed2b0929..86d7f75b83 100755 --- a/indra/newview/skins/default/xui/it/strings.xml +++ b/indra/newview/skins/default/xui/it/strings.xml @@ -1261,7 +1261,8 @@ Prova ad accedere nuovamente tra un minuto.  	<string name="InventoryInboxNoItems">  		Gli acquissti dal mercato verranno mostrati qui. Potrai quindi trascinarli nel tuo inventario per usarli.  	</string> -	<string name="MarketplaceURL"> +  <string name="Unconstrained">Libero</string> +  <string name="MarketplaceURL">  		https://marketplace.[MARKETPLACE_DOMAIN_NAME]/  	</string>  	<string name="MarketplaceURL_CreateStore"> diff --git a/indra/newview/skins/default/xui/ja/strings.xml b/indra/newview/skins/default/xui/ja/strings.xml index a0f45e5a55..36966d6825 100755 --- a/indra/newview/skins/default/xui/ja/strings.xml +++ b/indra/newview/skins/default/xui/ja/strings.xml @@ -1270,7 +1270,8 @@ support@secondlife.com にお問い合わせください。  	<string name="InventoryInboxNoItems">  		マーケットプレイスで購入した商品はここに表示されます。その後、アイテムをインベントリにドラッグすれば、それらのアイテムを使用できます。  	</string> -	<string name="MarketplaceURL"> +  <string name="Unconstrained">非拘束</string> +  <string name="MarketplaceURL">  		https://marketplace.[MARKETPLACE_DOMAIN_NAME]/  	</string>  	<string name="MarketplaceURL_CreateStore"> diff --git a/indra/newview/skins/default/xui/pl/strings.xml b/indra/newview/skins/default/xui/pl/strings.xml index f6dec8536b..f86e393646 100755 --- a/indra/newview/skins/default/xui/pl/strings.xml +++ b/indra/newview/skins/default/xui/pl/strings.xml @@ -1035,6 +1035,7 @@  	<string name="InventoryNoTexture">  		Nie posiadasz kopii tej tekstury w Twojej Szafie.  	</string> +  <string name="Unconstrained">Swobodny</string>  	<string name="no_transfer" value=" (brak oddawania)"/>  	<string name="no_modify" value=" (brak modyfikowania)"/>  	<string name="no_copy" value=" (brak kopiowania)"/> diff --git a/indra/newview/skins/default/xui/pt/strings.xml b/indra/newview/skins/default/xui/pt/strings.xml index 2eb4c0a02e..8436452228 100755 --- a/indra/newview/skins/default/xui/pt/strings.xml +++ b/indra/newview/skins/default/xui/pt/strings.xml @@ -1216,7 +1216,8 @@ Pessoas com contas gratuitas não poderão acessar o Second Life no momento para  	<string name="InventoryInboxNoItems">  		Suas compras do Marketplace aparecerão aqui. Depois, você poderá arrastá-las para seu inventário para usá-las.  	</string> -	<string name="MarketplaceURL"> +  <string name="Unconstrained">Sem limites</string> +  <string name="MarketplaceURL">  		https://marketplace.[MARKETPLACE_DOMAIN_NAME]/  	</string>  	<string name="MarketplaceURL_CreateStore"> diff --git a/indra/newview/skins/default/xui/ru/strings.xml b/indra/newview/skins/default/xui/ru/strings.xml index 0f71edcee0..8faf834f8f 100755 --- a/indra/newview/skins/default/xui/ru/strings.xml +++ b/indra/newview/skins/default/xui/ru/strings.xml @@ -1267,7 +1267,8 @@ support@secondlife.com.  	<string name="InventoryInboxNoItems">  		Здесь будут показаны ваши покупки из торгового центра. Их можно будет перетащить в ваш инвентарь для использования.  	</string> -	<string name="MarketplaceURL"> +  <string name="Unconstrained">Без ограничения</string> +  <string name="MarketplaceURL">  		https://marketplace.[MARKETPLACE_DOMAIN_NAME]/  	</string>  	<string name="MarketplaceURL_CreateStore"> diff --git a/indra/newview/skins/default/xui/tr/strings.xml b/indra/newview/skins/default/xui/tr/strings.xml index c4b1530b2b..31c5d2d310 100755 --- a/indra/newview/skins/default/xui/tr/strings.xml +++ b/indra/newview/skins/default/xui/tr/strings.xml @@ -1267,7 +1267,8 @@ Lütfen bir dakika içerisinde tekrar oturum açmayı deneyin.  	<string name="InventoryInboxNoItems">  		Pazaryerinda satın aldıklarınız burada görünecektir. Bunları kullanmak için envanterinize sürükleyebilirsiniz.  	</string> -	<string name="MarketplaceURL"> +  <string name="Unconstrained">Kısıtsız</string> +  <string name="MarketplaceURL">  		https://marketplace.[MARKETPLACE_DOMAIN_NAME]/  	</string>  	<string name="MarketplaceURL_CreateStore"> | 
