diff options
Diffstat (limited to 'indra')
118 files changed, 999 insertions, 752 deletions
| diff --git a/indra/CMakeLists.txt b/indra/CMakeLists.txt index 310e6cbdd4..d1042d6e86 100644 --- a/indra/CMakeLists.txt +++ b/indra/CMakeLists.txt @@ -35,8 +35,10 @@ endif (NOT CMAKE_BUILD_TYPE)  # For the library installation process;  # see cmake/Prebuild.cmake for the counterpart code. -file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/temp) -file(WRITE ${CMAKE_BINARY_DIR}/temp/sentinel_installed "0") +if ("${CMAKE_SOURCE_DIR}/../autobuild.xml" IS_NEWER_THAN "${CMAKE_BINARY_DIR}/temp/sentinel_installed") +  file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/temp) +  file(WRITE ${CMAKE_BINARY_DIR}/temp/sentinel_installed "0") +endif ("${CMAKE_SOURCE_DIR}/../autobuild.xml" IS_NEWER_THAN "${CMAKE_BINARY_DIR}/temp/sentinel_installed")  add_subdirectory(cmake)  add_subdirectory(${LIBS_OPEN_PREFIX}llaudio) diff --git a/indra/cmake/00-Common.cmake b/indra/cmake/00-Common.cmake index 15b827b217..faffdc8ccd 100644 --- a/indra/cmake/00-Common.cmake +++ b/indra/cmake/00-Common.cmake @@ -36,6 +36,13 @@ if (WINDOWS)    # Don't build DLLs.    set(BUILD_SHARED_LIBS OFF) +  # for "backwards compatibility", cmake sneaks in the Zm1000 option which royally +  # screws incredibuild. this hack disables it. +  # for details see: http://connect.microsoft.com/VisualStudio/feedback/details/368107/clxx-fatal-error-c1027-inconsistent-values-for-ym-between-creation-and-use-of-precompiled-headers +  # http://www.ogre3d.org/forums/viewtopic.php?f=2&t=60015 +  # http://www.cmake.org/pipermail/cmake/2009-September/032143.html +  string(REPLACE "/Zm1000" " " CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS}) +    set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /Od /Zi /MDd /MP -D_SCL_SECURE_NO_WARNINGS=1"        CACHE STRING "C++ compiler debug options" FORCE)    set(CMAKE_CXX_FLAGS_RELWITHDEBINFO  diff --git a/indra/cmake/LLAddBuildTest.cmake b/indra/cmake/LLAddBuildTest.cmake index 3f259f6382..08feab6e36 100644 --- a/indra/cmake/LLAddBuildTest.cmake +++ b/indra/cmake/LLAddBuildTest.cmake @@ -95,7 +95,7 @@ INCLUDE(GoogleMock)      IF(${name}_test_additional_INCLUDE_DIRS MATCHES NOTFOUND)        SET(${name}_test_additional_INCLUDE_DIRS "")      ENDIF(${name}_test_additional_INCLUDE_DIRS MATCHES NOTFOUND) -    INCLUDE_DIRECTORIES(${alltest_INCLUDE_DIRS} ${name}_test_additional_INCLUDE_DIRS ) +    INCLUDE_DIRECTORIES(${alltest_INCLUDE_DIRS} ${${name}_test_additional_INCLUDE_DIRS} )      IF(LL_TEST_VERBOSE)        MESSAGE("LL_ADD_PROJECT_UNIT_TESTS ${name}_test_additional_INCLUDE_DIRS ${${name}_test_additional_INCLUDE_DIRS}")      ENDIF(LL_TEST_VERBOSE) diff --git a/indra/cmake/Prebuilt.cmake b/indra/cmake/Prebuilt.cmake index 1b60d176f1..dbb4dfc46c 100644 --- a/indra/cmake/Prebuilt.cmake +++ b/indra/cmake/Prebuilt.cmake @@ -1,35 +1,49 @@  # -*- cmake -*-  include(FindAutobuild) +if(INSTALL_PROPRIETARY) +  include(FindSCP) +endif(INSTALL_PROPRIETARY) +# The use_prebuilt_binary macro handles automated installation of package +# dependencies using autobuild.  The goal is that 'autobuild install' should +# only be run when we know we need to install a new package.  This should be +# the case in a clean checkout, or if autobuild.xml has been updated since the +# last run (encapsulated by the file ${CMAKE_BINARY_DIR}/temp/sentinel_installed), +# or if a previous attempt to install the package has failed (the exit status +# of previous attempts is serialized in the file +# ${CMAKE_BINARY_DIR}/temp/${_binary}_installed)  macro (use_prebuilt_binary _binary)    if (NOT DEFINED STANDALONE_${_binary})      set(STANDALONE_${_binary} ${STANDALONE})    endif (NOT DEFINED STANDALONE_${_binary})    if (NOT STANDALONE_${_binary}) -    if(${CMAKE_BINARY_DIR}/temp/sentinel_installed IS_NEWER_THAN ${CMAKE_BINARY_DIR}/temp/${_binary}_installed) -      if(INSTALL_PROPRIETARY) -        include(FindSCP) -      endif(INSTALL_PROPRIETARY) -	  if(DEBUG_PREBUILT) -		message("cd ${CMAKE_SOURCE_DIR} && ${AUTOBUILD_EXECUTABLE} install -		--install-dir=${AUTOBUILD_INSTALL_DIR} -		--skip-license-check -		${_binary} ") -	  endif(DEBUG_PREBUILT) -	  execute_process(COMMAND "${AUTOBUILD_EXECUTABLE}" -		install -		--install-dir=${AUTOBUILD_INSTALL_DIR} -		--skip-license-check -		${_binary} -		WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" -		RESULT_VARIABLE ${_binary}_installed -		) +    if("${${_binary}_installed}" STREQUAL "" AND EXISTS "${CMAKE_BINARY_DIR}/temp/${_binary}_installed") +      file(READ ${CMAKE_BINARY_DIR}/temp/${_binary}_installed "${_binary}_installed") +      if(DEBUG_PREBUILT) +        message(STATUS "${_binary}_installed: \"${${_binary}_installed}\"") +      endif(DEBUG_PREBUILT) +    endif("${${_binary}_installed}" STREQUAL "" AND EXISTS "${CMAKE_BINARY_DIR}/temp/${_binary}_installed") + +    if(${CMAKE_BINARY_DIR}/temp/sentinel_installed IS_NEWER_THAN ${CMAKE_BINARY_DIR}/temp/${_binary}_installed OR NOT ${${_binary}_installed} EQUAL 0) +      if(DEBUG_PREBUILT) +        message("cd ${CMAKE_SOURCE_DIR} && ${AUTOBUILD_EXECUTABLE} install +        --install-dir=${AUTOBUILD_INSTALL_DIR} +        --skip-license-check +        ${_binary} ") +      endif(DEBUG_PREBUILT) +      execute_process(COMMAND "${AUTOBUILD_EXECUTABLE}" +        install +        --install-dir=${AUTOBUILD_INSTALL_DIR} +        --skip-license-check +        ${_binary} +        WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" +        RESULT_VARIABLE ${_binary}_installed +        )        file(WRITE ${CMAKE_BINARY_DIR}/temp/${_binary}_installed "${${_binary}_installed}") -    else(${CMAKE_BINARY_DIR}/temp/sentinel_installed IS_NEWER_THAN ${CMAKE_BINARY_DIR}/temp/${_binary}_installed) -      set(${_binary}_installed 0) -    endif(${CMAKE_BINARY_DIR}/temp/sentinel_installed IS_NEWER_THAN ${CMAKE_BINARY_DIR}/temp/${_binary}_installed) +    endif(${CMAKE_BINARY_DIR}/temp/sentinel_installed IS_NEWER_THAN ${CMAKE_BINARY_DIR}/temp/${_binary}_installed OR NOT ${${_binary}_installed} EQUAL 0) +      if(NOT ${_binary}_installed EQUAL 0)        message(FATAL_ERROR                "Failed to download or unpack prebuilt '${_binary}'." diff --git a/indra/cmake/Variables.cmake b/indra/cmake/Variables.cmake index 03428691cf..2f23e7c307 100644 --- a/indra/cmake/Variables.cmake +++ b/indra/cmake/Variables.cmake @@ -151,7 +151,7 @@ For more information, please see JIRA DEV-14943 - Cmake Linux cannot build both  endif (LINUX AND SERVER AND VIEWER) -set(USE_PRECOMPILED_HEADERS OFF CACHE BOOL "Enable use of precompiled header directives where supported.") +set(USE_PRECOMPILED_HEADERS ON CACHE BOOL "Enable use of precompiled header directives where supported.")  source_group("CMake Rules" FILES CMakeLists.txt) diff --git a/indra/integration_tests/llimage_libtest/llimage_libtest.cpp b/indra/integration_tests/llimage_libtest/llimage_libtest.cpp index 60ddf63b21..976aae08bb 100644 --- a/indra/integration_tests/llimage_libtest/llimage_libtest.cpp +++ b/indra/integration_tests/llimage_libtest/llimage_libtest.cpp @@ -70,6 +70,10 @@ static const char USAGE[] = "\n"  "        be used. Blocks must be smaller than precincts. Like precincts, this option adds\n"  "        PLT, tile markers and uses RPCL.\n"  "        Only valid for output j2c images. Default is 64.\n" +" -l, --levels <n>\n" +"        Number of decomposition levels (aka discard levels) in the output image.\n" +"        The maximum number of levels authorized is 32.\n" +"        Only valid for output j2c images. Default is 5.\n"  " -rev, --reversible\n"  "        Set the compression to be lossless (reversible in j2c parlance).\n"  "        Only valid for output j2c images.\n" @@ -147,7 +151,7 @@ LLPointer<LLImageRaw> load_image(const std::string &src_filename, int discard_le  }  // Save a raw image instance into a file -bool save_image(const std::string &dest_filename, LLPointer<LLImageRaw> raw_image, int blocks_size, int precincts_size, bool reversible, bool output_stats) +bool save_image(const std::string &dest_filename, LLPointer<LLImageRaw> raw_image, int blocks_size, int precincts_size, int levels, bool reversible, bool output_stats)  {  	LLPointer<LLImageFormatted> image = create_image(dest_filename); @@ -156,9 +160,9 @@ bool save_image(const std::string &dest_filename, LLPointer<LLImageRaw> raw_imag  	{  		// That method doesn't exist (and likely, doesn't make sense) for any other image file format  		// hence the required cryptic cast. -		if ((blocks_size != -1) || (precincts_size != -1)) +		if ((blocks_size != -1) || (precincts_size != -1) || (levels != 0))  		{ -			((LLImageJ2C*)(image.get()))->initEncode(*raw_image, blocks_size, precincts_size); +			((LLImageJ2C*)(image.get()))->initEncode(*raw_image, blocks_size, precincts_size, levels);  		}  		((LLImageJ2C*)(image.get()))->setReversible(reversible);  	} @@ -306,6 +310,7 @@ int main(int argc, char** argv)  	int discard_level = -1;  	int precincts_size = -1;  	int blocks_size = -1; +	int levels = 0;  	bool reversible = false;  	// Init whatever is necessary @@ -403,7 +408,6 @@ int main(int argc, char** argv)  			else  			{  				precincts_size = atoi(value_str.c_str()); -				// *TODO: make sure precincts_size is a power of 2  			}  		}  		else if (!strcmp(argv[arg], "--blocks") || !strcmp(argv[arg], "-b")) @@ -420,7 +424,22 @@ int main(int argc, char** argv)  			else  			{  				blocks_size = atoi(value_str.c_str()); -				// *TODO: make sure blocks_size is a power of 2 +			} +		} +		else if (!strcmp(argv[arg], "--levels") || !strcmp(argv[arg], "-l")) +		{ +			std::string value_str; +			if ((arg + 1) < argc) +			{ +				value_str = argv[arg+1]; +			} +			if (((arg + 1) >= argc) || (value_str[0] == '-')) +			{ +				std::cout << "No valid --levels argument given, default (5) will be used" << std::endl; +			} +			else +			{ +				levels = atoi(value_str.c_str());  			}  		}  		else if (!strcmp(argv[arg], "--reversible") || !strcmp(argv[arg], "-rev")) @@ -499,7 +518,7 @@ int main(int argc, char** argv)  		// Save file  		if (out_file != out_end)  		{ -			if (!save_image(*out_file, raw_image, blocks_size, precincts_size, reversible, image_stats)) +			if (!save_image(*out_file, raw_image, blocks_size, precincts_size, levels, reversible, image_stats))  			{  				std::cout << "Error: Image " << *out_file << " could not be saved" << std::endl;  			} diff --git a/indra/integration_tests/llui_libtest/llui_libtest.cpp b/indra/integration_tests/llui_libtest/llui_libtest.cpp index c34115ee80..217e26c3ca 100644 --- a/indra/integration_tests/llui_libtest/llui_libtest.cpp +++ b/indra/integration_tests/llui_libtest/llui_libtest.cpp @@ -33,6 +33,7 @@  // linden library includes  #include "llcontrol.h"		// LLControlGroup  #include "lldir.h" +#include "lldiriterator.h"  #include "llerrorcontrol.h"  #include "llfloater.h"  #include "llfontfreetype.h" @@ -174,7 +175,9 @@ void export_test_floaters()  	std::string delim = gDirUtilp->getDirDelimiter();  	std::string xui_dir = get_xui_dir() + "en" + delim;  	std::string filename; -	while (gDirUtilp->getNextFileInDir(xui_dir, "floater_test_*.xml", filename)) + +	LLDirIterator iter(xui_dir, "floater_test_*.xml"); +	while (iter.next(filename))  	{  		if (filename.find("_new.xml") != std::string::npos)  		{ diff --git a/indra/linux_updater/linux_updater.cpp b/indra/linux_updater/linux_updater.cpp index a81de0223c..eed00ac06e 100644 --- a/indra/linux_updater/linux_updater.cpp +++ b/indra/linux_updater/linux_updater.cpp @@ -33,6 +33,7 @@  #include "llerrorcontrol.h"  #include "llfile.h"  #include "lldir.h" +#include "lldiriterator.h"  #include "llxmlnode.h"  #include "lltrans.h" @@ -55,6 +56,8 @@ typedef struct _updater_app_state {  	std::string strings_dirs;  	std::string strings_file; +	LLDirIterator *image_dir_iter; +  	GtkWidget *window;  	GtkWidget *progress_bar;  	GtkWidget *image; @@ -115,7 +118,7 @@ bool translate_init(std::string comma_delim_path_list,  void updater_app_ui_init(void);  void updater_app_quit(UpdaterAppState *app_state);  void parse_args_and_init(int argc, char **argv, UpdaterAppState *app_state); -std::string next_image_filename(std::string& image_path); +std::string next_image_filename(std::string& image_path, LLDirIterator& iter);  void display_error(GtkWidget *parent, std::string title, std::string message);  BOOL install_package(std::string package_file, std::string destination);  BOOL spawn_viewer(UpdaterAppState *app_state); @@ -181,7 +184,7 @@ void updater_app_ui_init(UpdaterAppState *app_state)  		// load the first image  		app_state->image = gtk_image_new_from_file -			(next_image_filename(app_state->image_dir).c_str()); +			(next_image_filename(app_state->image_dir, *app_state->image_dir_iter).c_str());  		gtk_widget_set_size_request(app_state->image, 340, 310);  		gtk_container_add(GTK_CONTAINER(frame), app_state->image); @@ -212,7 +215,7 @@ gboolean rotate_image_cb(gpointer data)  	llassert(data != NULL);  	app_state = (UpdaterAppState *) data; -	filename = next_image_filename(app_state->image_dir); +	filename = next_image_filename(app_state->image_dir, *app_state->image_dir_iter);  	gdk_threads_enter();  	gtk_image_set_from_file(GTK_IMAGE(app_state->image), filename.c_str()); @@ -221,10 +224,10 @@ gboolean rotate_image_cb(gpointer data)  	return TRUE;  } -std::string next_image_filename(std::string& image_path) +std::string next_image_filename(std::string& image_path, LLDirIterator& iter)  {  	std::string image_filename; -	gDirUtilp->getNextFileInDir(image_path, "/*.jpg", image_filename); +	iter.next(image_filename);  	return image_path + "/" + image_filename;  } @@ -748,6 +751,7 @@ void parse_args_and_init(int argc, char **argv, UpdaterAppState *app_state)  		else if ((!strcmp(argv[i], "--image-dir")) && (++i < argc))  		{  			app_state->image_dir = argv[i]; +			app_state->image_dir_iter = new LLDirIterator(argv[i], "/*.jpg");  		}  		else if ((!strcmp(argv[i], "--dest")) && (++i < argc))  		{ @@ -832,6 +836,7 @@ int main(int argc, char **argv)  	}  	bool success = !app_state->failure; +	delete app_state->image_dir_iter;  	delete app_state;  	return success ? 0 : 1;  } diff --git a/indra/llcommon/llapp.cpp b/indra/llcommon/llapp.cpp index 39daefd1ad..ed192a9975 100644 --- a/indra/llcommon/llapp.cpp +++ b/indra/llcommon/llapp.cpp @@ -24,6 +24,10 @@   * $/LicenseInfo$   */ +#include "linden_common.h" + +#include "llapp.h" +  #include <cstdlib>  #ifdef LL_DARWIN @@ -32,9 +36,6 @@  #include <sys/sysctl.h>  #endif -#include "linden_common.h" -#include "llapp.h" -  #include "llcommon.h"  #include "llapr.h"  #include "llerrorcontrol.h" diff --git a/indra/llimage/llimage.h b/indra/llimage/llimage.h index 18444f3934..c464c3b2b6 100644 --- a/indra/llimage/llimage.h +++ b/indra/llimage/llimage.h @@ -35,8 +35,21 @@  const S32 MIN_IMAGE_MIP =  2; // 4x4, only used for expand/contract power of 2  const S32 MAX_IMAGE_MIP = 11; // 2048x2048 + +// *TODO : Use MAX_IMAGE_MIP as max discard level and modify j2c management so that the number  +// of levels is read from the header's file, not inferred from its size.  const S32 MAX_DISCARD_LEVEL = 5; +// JPEG2000 size constraints +// Those are declared here as they are germane to other image constraints used in the viewer +// and declared right here. Some come from the JPEG2000 spec, some conventions specific to SL. +const S32 MAX_DECOMPOSITION_LEVELS = 32;	// Number of decomposition levels cannot exceed 32 according to jpeg2000 spec +const S32 MIN_DECOMPOSITION_LEVELS = 5;		// the SL viewer will *crash* trying to decode images with fewer than 5 decomposition levels (unless image is small that is) +const S32 MAX_PRECINCT_SIZE = 2048;			// No reason to be bigger than MAX_IMAGE_SIZE  +const S32 MIN_PRECINCT_SIZE = 4;			// Can't be smaller than MIN_BLOCK_SIZE +const S32 MAX_BLOCK_SIZE = 64;				// Max total block size is 4096, hence 64x64 when using square blocks +const S32 MIN_BLOCK_SIZE = 4;				// Min block dim is 4 according to jpeg2000 spec +  const S32 MIN_IMAGE_SIZE = (1<<MIN_IMAGE_MIP); // 4, only used for expand/contract power of 2  const S32 MAX_IMAGE_SIZE = (1<<MAX_IMAGE_MIP); // 2048  const S32 MIN_IMAGE_AREA = MIN_IMAGE_SIZE * MIN_IMAGE_SIZE; diff --git a/indra/llimage/llimagej2c.cpp b/indra/llimage/llimagej2c.cpp index a90df0f1c1..44e6b89dd3 100644 --- a/indra/llimage/llimagej2c.cpp +++ b/indra/llimage/llimagej2c.cpp @@ -144,9 +144,9 @@ BOOL LLImageJ2C::initDecode(LLImageRaw &raw_image, int discard_level, int* regio  	return mImpl->initDecode(*this,raw_image,discard_level,region);  } -BOOL LLImageJ2C::initEncode(LLImageRaw &raw_image, int blocks_size, int precincts_size) +BOOL LLImageJ2C::initEncode(LLImageRaw &raw_image, int blocks_size, int precincts_size, int levels)  { -	return mImpl->initEncode(*this,raw_image,blocks_size,precincts_size); +	return mImpl->initEncode(*this,raw_image,blocks_size,precincts_size,levels);  }  BOOL LLImageJ2C::decode(LLImageRaw *raw_imagep, F32 decode_time) diff --git a/indra/llimage/llimagej2c.h b/indra/llimage/llimagej2c.h index 6bba81aab5..914174fc57 100644 --- a/indra/llimage/llimagej2c.h +++ b/indra/llimage/llimagej2c.h @@ -57,7 +57,7 @@ public:  	/*virtual*/ void setLastError(const std::string& message, const std::string& filename = std::string());  	BOOL initDecode(LLImageRaw &raw_image, int discard_level, int* region); -	BOOL initEncode(LLImageRaw &raw_image, int blocks_size, int precincts_size); +	BOOL initEncode(LLImageRaw &raw_image, int blocks_size, int precincts_size, int levels);  	// Encode with comment text   	BOOL encode(const LLImageRaw *raw_imagep, const char* comment_text, F32 encode_time=0.0); @@ -120,7 +120,7 @@ protected:  	virtual BOOL encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, const char* comment_text, F32 encode_time=0.0,  							BOOL reversible=FALSE) = 0;  	virtual BOOL initDecode(LLImageJ2C &base, LLImageRaw &raw_image, int discard_level = -1, int* region = NULL) = 0; -	virtual BOOL initEncode(LLImageJ2C &base, LLImageRaw &raw_image, int blocks_size = -1, int precincts_size = -1) = 0; +	virtual BOOL initEncode(LLImageJ2C &base, LLImageRaw &raw_image, int blocks_size = -1, int precincts_size = -1, int levels = 0) = 0;  	friend class LLImageJ2C;  }; diff --git a/indra/llimagej2coj/llimagej2coj.cpp b/indra/llimagej2coj/llimagej2coj.cpp index 8288fa1f5c..d15824ce5a 100644 --- a/indra/llimagej2coj/llimagej2coj.cpp +++ b/indra/llimagej2coj/llimagej2coj.cpp @@ -113,7 +113,7 @@ BOOL LLImageJ2COJ::initDecode(LLImageJ2C &base, LLImageRaw &raw_image, int disca  	return FALSE;  } -BOOL LLImageJ2COJ::initEncode(LLImageJ2C &base, LLImageRaw &raw_image, int blocks_size, int precincts_size) +BOOL LLImageJ2COJ::initEncode(LLImageJ2C &base, LLImageRaw &raw_image, int blocks_size, int precincts_size, int levels)  {  	// No specific implementation for this method in the OpenJpeg case  	return FALSE; diff --git a/indra/llimagej2coj/llimagej2coj.h b/indra/llimagej2coj/llimagej2coj.h index 9c7cc09fcb..40ad4edb00 100644 --- a/indra/llimagej2coj/llimagej2coj.h +++ b/indra/llimagej2coj/llimagej2coj.h @@ -40,7 +40,7 @@ protected:  	/*virtual*/ BOOL encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, const char* comment_text, F32 encode_time=0.0,  								BOOL reversible = FALSE);  	/*virtual*/ BOOL initDecode(LLImageJ2C &base, LLImageRaw &raw_image, int discard_level = -1, int* region = NULL); -	/*virtual*/ BOOL initEncode(LLImageJ2C &base, LLImageRaw &raw_image, int blocks_size = -1, int precincts_size = -1); +	/*virtual*/ BOOL initEncode(LLImageJ2C &base, LLImageRaw &raw_image, int blocks_size = -1, int precincts_size = -1, int levels = 0);  };  #endif diff --git a/indra/llkdu/llimagej2ckdu.cpp b/indra/llkdu/llimagej2ckdu.cpp index ae456a48be..39ae09650e 100644 --- a/indra/llkdu/llimagej2ckdu.cpp +++ b/indra/llkdu/llimagej2ckdu.cpp @@ -29,6 +29,7 @@  #include "lltimer.h"  #include "llpointer.h" +#include "llmath.h"  #include "llkdumem.h" @@ -192,7 +193,8 @@ mTileIndicesp(NULL),  mRawImagep(NULL),  mDecodeState(NULL),  mBlocksSize(-1), -mPrecinctsSize(-1) +mPrecinctsSize(-1), +mLevels(0)  {  } @@ -328,10 +330,29 @@ BOOL LLImageJ2CKDU::initDecode(LLImageJ2C &base, LLImageRaw &raw_image, int disc  	return initDecode(base,raw_image,0.0f,MODE_FAST,0,4,discard_level,region);  } -BOOL LLImageJ2CKDU::initEncode(LLImageJ2C &base, LLImageRaw &raw_image, int blocks_size, int precincts_size) +BOOL LLImageJ2CKDU::initEncode(LLImageJ2C &base, LLImageRaw &raw_image, int blocks_size, int precincts_size, int levels)  { -	mBlocksSize = blocks_size;  	mPrecinctsSize = precincts_size; +	if (mPrecinctsSize != -1) +	{ +		mPrecinctsSize = get_lower_power_two(mPrecinctsSize,MAX_PRECINCT_SIZE); +		mPrecinctsSize = llmax(mPrecinctsSize,MIN_PRECINCT_SIZE); +	} +	mBlocksSize = blocks_size; +	if (mBlocksSize != -1) +	{ +		mBlocksSize = get_lower_power_two(mBlocksSize,MAX_BLOCK_SIZE); +		mBlocksSize = llmax(mBlocksSize,MIN_BLOCK_SIZE); +		if (mPrecinctsSize != -1) +		{ +			mBlocksSize = llmin(mBlocksSize,mPrecinctsSize);	// blocks *must* be smaller than precincts +		} +	} +	mLevels = levels; +	if (mLevels != 0) +	{ +		mLevels = llclamp(mLevels,MIN_DECOMPOSITION_LEVELS,MIN_DECOMPOSITION_LEVELS);		 +	}  	return TRUE;  } @@ -373,10 +394,12 @@ BOOL LLImageJ2CKDU::initDecode(LLImageJ2C &base, LLImageRaw &raw_image, F32 deco  		// Resize raw_image according to the image to be decoded  		kdu_dims dims; mCodeStreamp->get_dims(0,dims); +		// *TODO: Use the real number of levels read from the file throughout the code instead of relying on an infered value from dimensions +		//S32 levels = mCodeStreamp->get_min_dwt_levels();  		S32 channels = base.getComponents() - first_channel;  		channels = llmin(channels,max_channel_count);  		raw_image.resize(dims.size.x, dims.size.y, channels); -		//	llinfos << "Resizing raw_image to " << dims.size.x << ":" << dims.size.y << llendl; +		//llinfos << "j2c image dimension: width = " << dims.size.x << ", height = " << dims.size.y << ", channels = " << channels << ", levels = " << levels << llendl;  		if (!mTileIndicesp)  		{ @@ -653,6 +676,11 @@ BOOL LLImageJ2CKDU::encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, co  			std::string Parts_string = llformat("ORGtparts=R");  			codestream.access_siz()->parse_string(Parts_string.c_str());  		} +		if (mLevels != 0) +		{ +			std::string levels_string = llformat("Clevels=%d",mLevels); +			codestream.access_siz()->parse_string(levels_string.c_str()); +		}  		codestream.access_siz()->finalize_all();  		codestream.change_appearance(transpose,vflip,hflip); diff --git a/indra/llkdu/llimagej2ckdu.h b/indra/llkdu/llimagej2ckdu.h index 9fce58b762..1489dbf704 100644 --- a/indra/llkdu/llimagej2ckdu.h +++ b/indra/llkdu/llimagej2ckdu.h @@ -59,7 +59,7 @@ protected:  	/*virtual*/ BOOL encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, const char* comment_text, F32 encode_time=0.0,  								BOOL reversible=FALSE);  	/*virtual*/ BOOL initDecode(LLImageJ2C &base, LLImageRaw &raw_image, int discard_level = -1, int* region = NULL); -	/*virtual*/ BOOL initEncode(LLImageJ2C &base, LLImageRaw &raw_image, int blocks_size = -1, int precincts_size = -1); +	/*virtual*/ BOOL initEncode(LLImageJ2C &base, LLImageRaw &raw_image, int blocks_size = -1, int precincts_size = -1, int levels = 0);  private:  	BOOL initDecode(LLImageJ2C &base, LLImageRaw &raw_image, F32 decode_time, ECodeStreamMode mode, S32 first_channel, S32 max_channel_count, int discard_level = -1, int* region = NULL); @@ -73,6 +73,7 @@ private:  	kdu_dims *mTileIndicesp;  	int mBlocksSize;  	int mPrecinctsSize; +	int mLevels;  	// Temporary variables for in-progress decodes...  	LLImageRaw *mRawImagep; diff --git a/indra/llkdu/tests/llimagej2ckdu_test.cpp b/indra/llkdu/tests/llimagej2ckdu_test.cpp index 7ac24a969a..ab60ab6d50 100644 --- a/indra/llkdu/tests/llimagej2ckdu_test.cpp +++ b/indra/llkdu/tests/llimagej2ckdu_test.cpp @@ -134,6 +134,7 @@ kdu_params* kdu_params::access_cluster(const char*) { return NULL; }  void kdu_codestream::set_fast() { }  void kdu_codestream::set_fussy() { }  void kdu_codestream::get_dims(int, kdu_dims&, bool ) { } +int kdu_codestream::get_min_dwt_levels() { return 5; }  void kdu_codestream::change_appearance(bool, bool, bool) { }  void kdu_codestream::get_tile_dims(kdu_coords, int, kdu_dims&, bool ) { }  void kdu_codestream::destroy() { } diff --git a/indra/llmessage/tests/commtest.h b/indra/llmessage/tests/commtest.h index 32035783e2..0fef596df2 100644 --- a/indra/llmessage/tests/commtest.h +++ b/indra/llmessage/tests/commtest.h @@ -35,6 +35,13 @@  #include "llhost.h"  #include "stringize.h"  #include <string> +#include <stdexcept> +#include <boost/lexical_cast.hpp> + +struct CommtestError: public std::runtime_error +{ +    CommtestError(const std::string& what): std::runtime_error(what) {} +};  /**   * This struct is shared by a couple of standalone comm tests (ADD_COMM_BUILD_TEST). @@ -55,13 +62,24 @@ struct commtest_data          replyPump("reply"),          errorPump("error"),          success(false), -        host("127.0.0.1", 8000), +        host("127.0.0.1", getport("PORT")),          server(STRINGIZE("http://" << host.getString() << "/"))      {          replyPump.listen("self", boost::bind(&commtest_data::outcome, this, _1, true));          errorPump.listen("self", boost::bind(&commtest_data::outcome, this, _1, false));      } +    static int getport(const std::string& var) +    { +        const char* port = getenv(var.c_str()); +        if (! port) +        { +            throw CommtestError("missing $PORT environment variable"); +        } +        // This will throw, too, if the value of PORT isn't numeric. +        return boost::lexical_cast<int>(port); +    } +      bool outcome(const LLSD& _result, bool _success)      {  //      std::cout << "commtest_data::outcome(" << _result << ", " << _success << ")\n"; diff --git a/indra/llmessage/tests/test_llsdmessage_peer.py b/indra/llmessage/tests/test_llsdmessage_peer.py index 580ee7f8b4..cea5032111 100644 --- a/indra/llmessage/tests/test_llsdmessage_peer.py +++ b/indra/llmessage/tests/test_llsdmessage_peer.py @@ -38,7 +38,7 @@ mydir = os.path.dirname(__file__)       # expected to be .../indra/llmessage/tes  sys.path.insert(0, os.path.join(mydir, os.pardir, os.pardir, "lib", "python"))  from indra.util.fastest_elementtree import parse as xml_parse  from indra.base import llsd -from testrunner import run, debug +from testrunner import freeport, run, debug  class TestHTTPRequestHandler(BaseHTTPRequestHandler):      """This subclass of BaseHTTPRequestHandler is to receive and echo @@ -97,6 +97,10 @@ class TestHTTPRequestHandler(BaseHTTPRequestHandler):              self.wfile.write(response)          else:                           # fail requested              status = data.get("status", 500) +            # self.responses maps an int status to a (short, long) pair of +            # strings. We want the longer string. That's why we pass a string +            # pair to get(): the [1] will select the second string, whether it +            # came from self.responses or from our default pair.              reason = data.get("reason",                                 self.responses.get(status,                                                    ("fail requested", @@ -113,11 +117,17 @@ class TestHTTPRequestHandler(BaseHTTPRequestHandler):          # Suppress error output as well          pass -class TestHTTPServer(Thread): -    def run(self): -        httpd = HTTPServer(('127.0.0.1', 8000), TestHTTPRequestHandler) -        debug("Starting HTTP server...\n") -        httpd.serve_forever() -  if __name__ == "__main__": -    sys.exit(run(server=TestHTTPServer(name="httpd"), *sys.argv[1:])) +    # Instantiate an HTTPServer(TestHTTPRequestHandler) on the first free port +    # in the specified port range. Doing this inline is better than in a +    # daemon thread: if it blows up here, we'll get a traceback. If it blew up +    # in some other thread, the traceback would get eaten and we'd run the +    # subject test program anyway. +    httpd, port = freeport(xrange(8000, 8020), +                           lambda port: HTTPServer(('127.0.0.1', port), TestHTTPRequestHandler)) +    # Pass the selected port number to the subject test program via the +    # environment. We don't want to impose requirements on the test program's +    # command-line parsing -- and anyway, for C++ integration tests, that's +    # performed in TUT code rather than our own. +    os.environ["PORT"] = str(port) +    sys.exit(run(server=Thread(name="httpd", target=httpd.serve_forever), *sys.argv[1:])) diff --git a/indra/llmessage/tests/testrunner.py b/indra/llmessage/tests/testrunner.py index b70ce91ee7..8ff13e0426 100644 --- a/indra/llmessage/tests/testrunner.py +++ b/indra/llmessage/tests/testrunner.py @@ -29,6 +29,8 @@ $/LicenseInfo$  import os  import sys +import errno +import socket  def debug(*args):      sys.stdout.writelines(args) @@ -36,6 +38,85 @@ def debug(*args):  # comment out the line below to enable debug output  debug = lambda *args: None +def freeport(portlist, expr): +    """ +    Find a free server port to use. Specifically, evaluate 'expr' (a +    callable(port)) until it stops raising EADDRINUSE exception. + +    Pass: + +    portlist: an iterable (e.g. xrange()) of ports to try. If you exhaust the +    range, freeport() lets the socket.error exception propagate. If you want +    unbounded, you could pass itertools.count(baseport), though of course in +    practice the ceiling is 2^16-1 anyway. But it seems prudent to constrain +    the range much more sharply: if we're iterating an absurd number of times, +    probably something else is wrong. + +    expr: a callable accepting a port number, specifically one of the items +    from portlist. If calling that callable raises socket.error with +    EADDRINUSE, freeport() retrieves the next item from portlist and retries. + +    Returns: (expr(port), port) + +    port: the value from portlist for which expr(port) succeeded + +    Raises: + +    Any exception raised by expr(port) other than EADDRINUSE. + +    socket.error if, for every item from portlist, expr(port) raises +    socket.error. The exception you see is the one from the last item in +    portlist. + +    StopIteration if portlist is completely empty. + +    Example: + +    server, port = freeport(xrange(8000, 8010), +                            lambda port: HTTPServer(("localhost", port), +                                                    MyRequestHandler)) +    # pass 'port' to client code +    # call server.serve_forever() +    """ +    # If portlist is completely empty, let StopIteration propagate: that's an +    # error because we can't return meaningful values. We have no 'port', +    # therefore no 'expr(port)'. +    portiter = iter(portlist) +    port = portiter.next() + +    while True: +        try: +            # If this value of port works, return as promised. +            return expr(port), port + +        except socket.error, err: +            # Anything other than 'Address already in use', propagate +            if err.args[0] != errno.EADDRINUSE: +                raise + +            # Here we want the next port from portiter. But on StopIteration, +            # we want to raise the original exception rather than +            # StopIteration. So save the original exc_info(). +            type, value, tb = sys.exc_info() +            try: +                try: +                    port = portiter.next() +                except StopIteration: +                    raise type, value, tb +            finally: +                # Clean up local traceback, see docs for sys.exc_info() +                del tb + +        # Recap of the control flow above: +        # If expr(port) doesn't raise, return as promised. +        # If expr(port) raises anything but EADDRINUSE, propagate that +        # exception. +        # If portiter.next() raises StopIteration -- that is, if the port +        # value we just passed to expr(port) was the last available -- reraise +        # the EADDRINUSE exception. +        # If we've actually arrived at this point, portiter.next() delivered a +        # new port value. Loop back to pass that to expr(port). +  def run(*args, **kwds):      """All positional arguments collectively form a command line, executed as      a synchronous child process. diff --git a/indra/llui/llbutton.h b/indra/llui/llbutton.h index 16aa49b653..0cfc393e05 100644 --- a/indra/llui/llbutton.h +++ b/indra/llui/llbutton.h @@ -27,7 +27,6 @@  #ifndef LL_LLBUTTON_H  #define LL_LLBUTTON_H -#include "lluuid.h"  #include "llcontrol.h"  #include "lluictrl.h"  #include "v4color.h" @@ -53,6 +52,8 @@ S32 round_up(S32 grid, S32 value);  class LLUICtrlFactory; +class LLUIImage; +class LLUUID;  //  // Classes diff --git a/indra/llui/llfloaterreg.h b/indra/llui/llfloaterreg.h index 94387fb41a..8414b92113 100644 --- a/indra/llui/llfloaterreg.h +++ b/indra/llui/llfloaterreg.h @@ -27,14 +27,9 @@  #define LLFLOATERREG_H  /// llcommon -#include "llboost.h"  #include "llrect.h" -#include "llstl.h"  #include "llsd.h" -/// llui -#include "lluictrl.h" -  #include <boost/function.hpp>  //******************************************************* @@ -43,6 +38,7 @@  //  class LLFloater; +class LLUICtrl;  typedef boost::function<LLFloater* (const LLSD& key)> LLFloaterBuildFunc; diff --git a/indra/llui/llfocusmgr.cpp b/indra/llui/llfocusmgr.cpp index 43e5f6b051..724d190307 100644 --- a/indra/llui/llfocusmgr.cpp +++ b/indra/llui/llfocusmgr.cpp @@ -113,6 +113,16 @@ boost::signals2::connection	LLFocusableElement::setTopLostCallback(const focus_s +typedef std::list<LLHandle<LLView> > view_handle_list_t; +typedef std::map<LLHandle<LLView>, LLHandle<LLView> > focus_history_map_t; +struct LLFocusMgr::Impl +{ +	// caching list of keyboard focus ancestors for calling onFocusReceived and onFocusLost +	view_handle_list_t mCachedKeyboardFocusList; + +	focus_history_map_t mFocusHistory; +}; +  LLFocusMgr gFocusMgr;  LLFocusMgr::LLFocusMgr() @@ -123,10 +133,17 @@ LLFocusMgr::LLFocusMgr()  	mDefaultKeyboardFocus( NULL ),  	mKeystrokesOnly(FALSE),  	mTopCtrl( NULL ), -	mAppHasFocus(TRUE)   // Macs don't seem to notify us that we've gotten focus, so default to true +	mAppHasFocus(TRUE),   // Macs don't seem to notify us that we've gotten focus, so default to true +	mImpl(new LLFocusMgr::Impl)  {  } +LLFocusMgr::~LLFocusMgr() +{ +	mImpl->mFocusHistory.clear(); +	delete mImpl; +	mImpl = NULL; +}  void LLFocusMgr::releaseFocusIfNeeded( LLView* view )  { @@ -179,7 +196,7 @@ void LLFocusMgr::setKeyboardFocus(LLFocusableElement* new_focus, BOOL lock, BOOL  		mKeyboardFocus = new_focus;  		// list of the focus and it's ancestors -		view_handle_list_t old_focus_list = mCachedKeyboardFocusList; +		view_handle_list_t old_focus_list = mImpl->mCachedKeyboardFocusList;  		view_handle_list_t new_focus_list;  		// walk up the tree to root and add all views to the new_focus_list @@ -206,7 +223,7 @@ void LLFocusMgr::setKeyboardFocus(LLFocusableElement* new_focus, BOOL lock, BOOL  			LLView* old_focus_view = old_focus_iter->get();  			if (old_focus_view)  			{ -				mCachedKeyboardFocusList.pop_front(); +				mImpl->mCachedKeyboardFocusList.pop_front();  				old_focus_view->onFocusLost();  			}  		} @@ -219,7 +236,7 @@ void LLFocusMgr::setKeyboardFocus(LLFocusableElement* new_focus, BOOL lock, BOOL  			LLView* new_focus_view = new_focus_riter->get();  			if (new_focus_view)  			{ -                mCachedKeyboardFocusList.push_front(new_focus_view->getHandle()); +                mImpl->mCachedKeyboardFocusList.push_front(new_focus_view->getHandle());  				new_focus_view->onFocusReceived();  			}  		} @@ -254,7 +271,7 @@ void LLFocusMgr::setKeyboardFocus(LLFocusableElement* new_focus, BOOL lock, BOOL  		if (focus_subtree)  		{  			LLView* focused_view = dynamic_cast<LLView*>(mKeyboardFocus); -			mFocusHistory[focus_subtree->getHandle()] = focused_view ? focused_view->getHandle() : LLHandle<LLView>();  +			mImpl->mFocusHistory[focus_subtree->getHandle()] = focused_view ? focused_view->getHandle() : LLHandle<LLView>();   		}  	} @@ -456,8 +473,8 @@ LLUICtrl* LLFocusMgr::getLastFocusForGroup(LLView* subtree_root) const  {  	if (subtree_root)  	{ -		focus_history_map_t::const_iterator found_it = mFocusHistory.find(subtree_root->getHandle()); -		if (found_it != mFocusHistory.end()) +		focus_history_map_t::const_iterator found_it = mImpl->mFocusHistory.find(subtree_root->getHandle()); +		if (found_it != mImpl->mFocusHistory.end())  		{  			// found last focus for this subtree  			return static_cast<LLUICtrl*>(found_it->second.get()); @@ -470,6 +487,6 @@ void LLFocusMgr::clearLastFocusForGroup(LLView* subtree_root)  {  	if (subtree_root)  	{ -		mFocusHistory.erase(subtree_root->getHandle()); +		mImpl->mFocusHistory.erase(subtree_root->getHandle());  	}  } diff --git a/indra/llui/llfocusmgr.h b/indra/llui/llfocusmgr.h index 22c1895075..25ae1d2579 100644 --- a/indra/llui/llfocusmgr.h +++ b/indra/llui/llfocusmgr.h @@ -74,7 +74,7 @@ class LLFocusMgr  {  public:  	LLFocusMgr(); -	~LLFocusMgr() { mFocusHistory.clear(); } +	~LLFocusMgr();  	// Mouse Captor  	void			setMouseCapture(LLMouseHandler* new_captor);	// new_captor = NULL to release the mouse. @@ -120,6 +120,8 @@ public:  	bool			keyboardFocusHasAccelerators() const; +	struct Impl; +  private:  	LLUICtrl*			mLockedView; @@ -132,10 +134,6 @@ private:  	LLFocusableElement*	mDefaultKeyboardFocus;  	BOOL				mKeystrokesOnly; -	// caching list of keyboard focus ancestors for calling onFocusReceived and onFocusLost -	typedef std::list<LLHandle<LLView> > view_handle_list_t; -	view_handle_list_t mCachedKeyboardFocusList; -  	// Top View  	LLUICtrl*			mTopCtrl; @@ -143,8 +141,7 @@ private:  	BOOL				mAppHasFocus; -	typedef std::map<LLHandle<LLView>, LLHandle<LLView> > focus_history_map_t; -	focus_history_map_t mFocusHistory; +	Impl * mImpl;  };  extern LLFocusMgr gFocusMgr; diff --git a/indra/llui/lliconctrl.h b/indra/llui/lliconctrl.h index 669e126266..efa0925a4a 100644 --- a/indra/llui/lliconctrl.h +++ b/indra/llui/lliconctrl.h @@ -30,6 +30,7 @@  #include "lluuid.h"  #include "v4color.h"  #include "lluictrl.h" +#include "lluiimage.h"  #include "stdenums.h"  class LLTextBox; diff --git a/indra/llui/lllineeditor.h b/indra/llui/lllineeditor.h index 7b5fa218f2..fe191e5971 100644 --- a/indra/llui/lllineeditor.h +++ b/indra/llui/lllineeditor.h @@ -41,6 +41,7 @@  #include "lleditmenuhandler.h"  #include "lluictrl.h" +#include "lluiimage.h"  #include "lluistring.h"  #include "llviewborder.h" diff --git a/indra/llui/llloadingindicator.h b/indra/llui/llloadingindicator.h index c0cb1cc74a..4c47cc267c 100644 --- a/indra/llui/llloadingindicator.h +++ b/indra/llui/llloadingindicator.h @@ -28,6 +28,7 @@  #define LL_LLLOADINGINDICATOR_H  #include "lluictrl.h" +#include "lluiimage.h"  ///////////////////////////////////////////////////////////////////////////////  // class LLLoadingIndicator diff --git a/indra/llui/llmultislider.cpp b/indra/llui/llmultislider.cpp index d4e6091ee0..f744e9db41 100644 --- a/indra/llui/llmultislider.cpp +++ b/indra/llui/llmultislider.cpp @@ -35,6 +35,7 @@  #include "llkeyboard.h"			// for the MASK constants  #include "llcontrol.h"  #include "lluictrlfactory.h" +#include "lluiimage.h"  #include <sstream> diff --git a/indra/llui/llpanel.h b/indra/llui/llpanel.h index c1a1a06f39..7bbbeaf709 100644 --- a/indra/llui/llpanel.h +++ b/indra/llui/llpanel.h @@ -32,6 +32,7 @@  #include "llcallbackmap.h"  #include "lluictrl.h"  #include "llviewborder.h" +#include "lluiimage.h"  #include "lluistring.h"  #include "v4color.h"  #include <list> diff --git a/indra/llui/llprogressbar.cpp b/indra/llui/llprogressbar.cpp index ead22686bc..84a890edfa 100644 --- a/indra/llui/llprogressbar.cpp +++ b/indra/llui/llprogressbar.cpp @@ -38,6 +38,7 @@  #include "llfocusmgr.h"  #include "lluictrlfactory.h" +#include "lluiimage.h"  static LLDefaultChildRegistry::Register<LLProgressBar> r("progress_bar"); diff --git a/indra/llui/llprogressbar.h b/indra/llui/llprogressbar.h index 3f308e7496..a8ec83ea00 100644 --- a/indra/llui/llprogressbar.h +++ b/indra/llui/llprogressbar.h @@ -27,8 +27,9 @@  #ifndef LL_LLPROGRESSBAR_H  #define LL_LLPROGRESSBAR_H -#include "lluictrl.h"  #include "llframetimer.h" +#include "lluictrl.h" +#include "lluiimage.h"  class LLProgressBar  	: public LLUICtrl diff --git a/indra/llui/llslider.h b/indra/llui/llslider.h index 68823ed68e..700c17ea3e 100644 --- a/indra/llui/llslider.h +++ b/indra/llui/llslider.h @@ -29,6 +29,7 @@  #include "llf32uictrl.h"  #include "v4color.h" +#include "lluiimage.h"  class LLSlider : public LLF32UICtrl  { diff --git a/indra/llui/llstyle.cpp b/indra/llui/llstyle.cpp index 28a064e6b6..bb731f4f7e 100644 --- a/indra/llui/llstyle.cpp +++ b/indra/llui/llstyle.cpp @@ -88,7 +88,7 @@ void LLStyle::setVisible(BOOL is_visible)  	mVisible = is_visible;  } -LLUIImagePtr LLStyle::getImage() const +LLPointer<LLUIImage> LLStyle::getImage() const  {  	return mImagep;  } diff --git a/indra/llui/llstyle.h b/indra/llui/llstyle.h index 322edc343c..9f1eba79d8 100644 --- a/indra/llui/llstyle.h +++ b/indra/llui/llstyle.h @@ -30,6 +30,7 @@  #include "v4color.h"  #include "llui.h"  #include "llinitparam.h" +#include "lluiimage.h"  class LLFontGL; @@ -72,7 +73,7 @@ public:  	void setLinkHREF(const std::string& href);  	BOOL isLink() const; -	LLUIImagePtr getImage() const; +	LLPointer<LLUIImage> getImage() const;  	void setImage(const LLUUID& src);  	void setImage(const std::string& name); @@ -108,7 +109,7 @@ private:  	const LLFontGL*		mFont;  	std::string			mLink;  	bool				mIsLink; -	LLUIImagePtr		mImagep; +	LLPointer<LLUIImage> mImagep;  };  typedef LLPointer<LLStyle> LLStyleSP; diff --git a/indra/llui/lltransutil.cpp b/indra/llui/lltransutil.cpp index 9d0ff9d5cb..58fa8a0828 100644 --- a/indra/llui/lltransutil.cpp +++ b/indra/llui/lltransutil.cpp @@ -26,10 +26,11 @@  #include "linden_common.h" +#include "lltransutil.h" +  #include "lltrans.h"  #include "lluictrlfactory.h" - -#include "lltransutil.h" +#include "llxmlnode.h"  bool LLTransUtil::parseStrings(const std::string& xml_filename, const std::set<std::string>& default_args) diff --git a/indra/llui/llui.h b/indra/llui/llui.h index 6a43477693..c583d58d5a 100644 --- a/indra/llui/llui.h +++ b/indra/llui/llui.h @@ -33,15 +33,12 @@  #include "llrect.h"  #include "llcontrol.h"  #include "llcoord.h" -#include "lluiimage.h"		// *TODO: break this dependency, need to add #include "lluiimage.h" to all widgets that hold an Optional<LLUIImage*> in their paramblocks  #include "llinitparam.h"  #include "llregistry.h"  #include "lluicolor.h"  #include "lluicolortable.h"  #include <boost/signals2.hpp>  #include "lllazyvalue.h" -#include "llhandle.h"		// *TODO: remove this dependency, added as a  -							// convenience when LLHandle moved to llhandle.h  #include "llframetimer.h"  // LLUIFactory @@ -265,8 +262,6 @@ private:  // Moved LLLocalClipRect to lllocalcliprect.h -// Moved all LLHandle-related code to llhandle.h -  //RN: maybe this needs to moved elsewhere?  class LLImageProviderInterface  { diff --git a/indra/llui/llview.h b/indra/llui/llview.h index 61dc4b8030..8f167959b9 100644 --- a/indra/llui/llview.h +++ b/indra/llui/llview.h @@ -34,6 +34,7 @@  #include "stdtypes.h"  #include "llcoord.h"  #include "llfontgl.h" +#include "llhandle.h"  #include "llmortician.h"  #include "llmousehandler.h"  #include "llstring.h" diff --git a/indra/llui/llviewborder.cpp b/indra/llui/llviewborder.cpp index 89cd34c37c..32d7ea7c25 100644 --- a/indra/llui/llviewborder.cpp +++ b/indra/llui/llviewborder.cpp @@ -28,6 +28,7 @@  #include "llrender.h"  #include "llfocusmgr.h"  #include "lluictrlfactory.h" +#include "lluiimage.h"  static LLDefaultChildRegistry::Register<LLViewBorder> r("view_border"); diff --git a/indra/llui/llwindowshade.h b/indra/llui/llwindowshade.h index 0047195929..09ffc2cd54 100644 --- a/indra/llui/llwindowshade.h +++ b/indra/llui/llwindowshade.h @@ -29,6 +29,7 @@  #include "lluictrl.h"  #include "llnotifications.h" +#include "lluiimage.h"  class LLWindowShade : public LLUICtrl  { diff --git a/indra/llvfs/CMakeLists.txt b/indra/llvfs/CMakeLists.txt index 722f4e2bfd..a3782d824b 100644 --- a/indra/llvfs/CMakeLists.txt +++ b/indra/llvfs/CMakeLists.txt @@ -12,6 +12,7 @@ include_directories(  set(llvfs_SOURCE_FILES      lldir.cpp +    lldiriterator.cpp      lllfsthread.cpp      llpidlock.cpp      llvfile.cpp @@ -24,6 +25,7 @@ set(llvfs_HEADER_FILES      lldir.h      lldirguard.h +    lldiriterator.h      lllfsthread.h      llpidlock.h      llvfile.h @@ -60,6 +62,11 @@ list(APPEND llvfs_SOURCE_FILES ${llvfs_HEADER_FILES})  add_library (llvfs ${llvfs_SOURCE_FILES}) +target_link_libraries(llvfs +    ${BOOST_FILESYSTEM_LIBRARY} +    ${BOOST_SYSTEM_LIBRARY} +    ) +  if (DARWIN)    include(CMakeFindFrameworks)    find_library(CARBON_LIBRARY Carbon) diff --git a/indra/llvfs/lldir.cpp b/indra/llvfs/lldir.cpp index 341c96f6ea..f3ac17d612 100644 --- a/indra/llvfs/lldir.cpp +++ b/indra/llvfs/lldir.cpp @@ -40,6 +40,8 @@  #include "lltimer.h"	// ms_sleep()  #include "lluuid.h" +#include "lldiriterator.h" +  #if LL_WINDOWS  #include "lldir_win32.h"  LLDir_Win32 gDirUtil; @@ -83,7 +85,9 @@ S32 LLDir::deleteFilesInDir(const std::string &dirname, const std::string &mask)  	std::string filename;   	std::string fullpath;  	S32 result; -	while (getNextFileInDir(dirname, mask, filename)) + +	LLDirIterator iter(dirname, mask); +	while (iter.next(filename))  	{  		fullpath = dirname;  		fullpath += getDirDelimiter(); diff --git a/indra/llvfs/lldir.h b/indra/llvfs/lldir.h index 42996fd051..5ee8bdb542 100644 --- a/indra/llvfs/lldir.h +++ b/indra/llvfs/lldir.h @@ -75,31 +75,6 @@ class LLDir  // pure virtual functions  	virtual U32 countFilesInDir(const std::string &dirname, const std::string &mask) = 0; -    /// Walk the files in a directory, with file pattern matching -	virtual BOOL getNextFileInDir(const std::string& dirname, ///< directory path - must end in trailing slash! -                                  const std::string& mask,    ///< file pattern string (use "*" for all) -                                  std::string& fname          ///< output: found file name -                                  ) = 0; -    /**< -     * @returns true if a file was found, false if the entire directory has been scanned. -     * -     * @note that this function is NOT thread safe -     * -     * This function may not be used to scan part of a directory, then start a new search of a different -     * directory, and then restart the first search where it left off; the entire search must run to -     * completion or be abandoned - there is no restart. -     * -     * @bug: See http://jira.secondlife.com/browse/VWR-23697 -     *       and/or the tests in test/lldir_test.cpp -     *       This is known to fail with patterns that have both: -     *       a wildcard left of a . and more than one sequential ? right of a . -     *       the pattern foo.??x appears to work -     *       but *.??x or foo?.??x do not -     * -     * @todo this really should be rewritten as an iterator object, and the -     *       filtering should be done in a platform-independent way. -     */ -  	virtual std::string getCurPath() = 0;  	virtual BOOL fileExists(const std::string &filename) const = 0; diff --git a/indra/llvfs/lldir_linux.cpp b/indra/llvfs/lldir_linux.cpp index 72b54f5380..407f3b93fb 100644 --- a/indra/llvfs/lldir_linux.cpp +++ b/indra/llvfs/lldir_linux.cpp @@ -242,68 +242,6 @@ U32 LLDir_Linux::countFilesInDir(const std::string &dirname, const std::string &  	return (file_count);  } -// get the next file in the directory -BOOL LLDir_Linux::getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname) -{ -	glob_t g; -	BOOL result = FALSE; -	fname = ""; -	 -	if(!(dirname == mCurrentDir)) -	{ -		// different dir specified, close old search -		mCurrentDirIndex = -1; -		mCurrentDirCount = -1; -		mCurrentDir = dirname; -	} -	 -	std::string tmp_str; -	tmp_str = dirname; -	tmp_str += mask; - -	if(glob(tmp_str.c_str(), GLOB_NOSORT, NULL, &g) == 0) -	{ -		if(g.gl_pathc > 0) -		{ -			if((int)g.gl_pathc != mCurrentDirCount) -			{ -				// Number of matches has changed since the last search, meaning a file has been added or deleted. -				// Reset the index. -				mCurrentDirIndex = -1; -				mCurrentDirCount = g.gl_pathc; -			} -	 -			mCurrentDirIndex++; -	 -			if(mCurrentDirIndex < (int)g.gl_pathc) -			{ -//				llinfos << "getNextFileInDir: returning number " << mCurrentDirIndex << ", path is " << g.gl_pathv[mCurrentDirIndex] << llendl; - -				// The API wants just the filename, not the full path. -				//fname = g.gl_pathv[mCurrentDirIndex]; - -				char *s = strrchr(g.gl_pathv[mCurrentDirIndex], '/'); -				 -				if(s == NULL) -					s = g.gl_pathv[mCurrentDirIndex]; -				else if(s[0] == '/') -					s++; -					 -				fname = s; -				 -				result = TRUE; -			} -		} -		 -		globfree(&g); -	} -	 -	return(result); -} - - - -  std::string LLDir_Linux::getCurPath()  {  	char tmp_str[LL_MAX_PATH];	/* Flawfinder: ignore */  diff --git a/indra/llvfs/lldir_linux.h b/indra/llvfs/lldir_linux.h index a34de1241d..7603239867 100644 --- a/indra/llvfs/lldir_linux.h +++ b/indra/llvfs/lldir_linux.h @@ -47,7 +47,6 @@ public:  	virtual std::string getCurPath();  	virtual U32 countFilesInDir(const std::string &dirname, const std::string &mask); -	virtual BOOL getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname);  	/*virtual*/ BOOL fileExists(const std::string &filename) const;  	/*virtual*/ std::string getLLPluginLauncher(); diff --git a/indra/llvfs/lldir_mac.cpp b/indra/llvfs/lldir_mac.cpp index f9369b043e..8f48f92e2a 100644 --- a/indra/llvfs/lldir_mac.cpp +++ b/indra/llvfs/lldir_mac.cpp @@ -258,67 +258,6 @@ U32 LLDir_Mac::countFilesInDir(const std::string &dirname, const std::string &ma  	return (file_count);  } -// get the next file in the directory -BOOL LLDir_Mac::getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname) -{ -	glob_t g; -	BOOL result = FALSE; -	fname = ""; -	 -	if(!(dirname == mCurrentDir)) -	{ -		// different dir specified, close old search -		mCurrentDirIndex = -1; -		mCurrentDirCount = -1; -		mCurrentDir = dirname; -	} -	 -	std::string tmp_str; -	tmp_str = dirname; -	tmp_str += mask; - -	if(glob(tmp_str.c_str(), GLOB_NOSORT, NULL, &g) == 0) -	{ -		if(g.gl_pathc > 0) -		{ -			if(g.gl_pathc != mCurrentDirCount) -			{ -				// Number of matches has changed since the last search, meaning a file has been added or deleted. -				// Reset the index. -				mCurrentDirIndex = -1; -				mCurrentDirCount = g.gl_pathc; -			} -	 -			mCurrentDirIndex++; -	 -			if(mCurrentDirIndex < g.gl_pathc) -			{ -//				llinfos << "getNextFileInDir: returning number " << mCurrentDirIndex << ", path is " << g.gl_pathv[mCurrentDirIndex] << llendl; - -				// The API wants just the filename, not the full path. -				//fname = g.gl_pathv[mCurrentDirIndex]; - -				char *s = strrchr(g.gl_pathv[mCurrentDirIndex], '/'); -				 -				if(s == NULL) -					s = g.gl_pathv[mCurrentDirIndex]; -				else if(s[0] == '/') -					s++; -					 -				fname = s; -				 -				result = TRUE; -			} -		} -		 -		globfree(&g); -	} -	 -	return(result); -} - - -  S32 LLDir_Mac::deleteFilesInDir(const std::string &dirname, const std::string &mask)  {  	glob_t g; diff --git a/indra/llvfs/lldir_mac.h b/indra/llvfs/lldir_mac.h index b456d3afca..bc3f0fac00 100644 --- a/indra/llvfs/lldir_mac.h +++ b/indra/llvfs/lldir_mac.h @@ -47,7 +47,6 @@ public:  	virtual S32 deleteFilesInDir(const std::string &dirname, const std::string &mask);  	virtual std::string getCurPath();  	virtual U32 countFilesInDir(const std::string &dirname, const std::string &mask); -	virtual BOOL getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname);  	virtual BOOL fileExists(const std::string &filename) const;  	/*virtual*/ std::string getLLPluginLauncher(); diff --git a/indra/llvfs/lldir_solaris.cpp b/indra/llvfs/lldir_solaris.cpp index 515fd66b6e..21f8c3acdb 100644 --- a/indra/llvfs/lldir_solaris.cpp +++ b/indra/llvfs/lldir_solaris.cpp @@ -260,68 +260,6 @@ U32 LLDir_Solaris::countFilesInDir(const std::string &dirname, const std::string  	return (file_count);  } -// get the next file in the directory -BOOL LLDir_Solaris::getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname) -{ -	glob_t g; -	BOOL result = FALSE; -	fname = ""; -	 -	if(!(dirname == mCurrentDir)) -	{ -		// different dir specified, close old search -		mCurrentDirIndex = -1; -		mCurrentDirCount = -1; -		mCurrentDir = dirname; -	} -	 -	std::string tmp_str; -	tmp_str = dirname; -	tmp_str += mask; - -	if(glob(tmp_str.c_str(), GLOB_NOSORT, NULL, &g) == 0) -	{ -		if(g.gl_pathc > 0) -		{ -			if((int)g.gl_pathc != mCurrentDirCount) -			{ -				// Number of matches has changed since the last search, meaning a file has been added or deleted. -				// Reset the index. -				mCurrentDirIndex = -1; -				mCurrentDirCount = g.gl_pathc; -			} -	 -			mCurrentDirIndex++; -	 -			if(mCurrentDirIndex < (int)g.gl_pathc) -			{ -//				llinfos << "getNextFileInDir: returning number " << mCurrentDirIndex << ", path is " << g.gl_pathv[mCurrentDirIndex] << llendl; - -				// The API wants just the filename, not the full path. -				//fname = g.gl_pathv[mCurrentDirIndex]; - -				char *s = strrchr(g.gl_pathv[mCurrentDirIndex], '/'); -				 -				if(s == NULL) -					s = g.gl_pathv[mCurrentDirIndex]; -				else if(s[0] == '/') -					s++; -					 -				fname = s; -				 -				result = TRUE; -			} -		} -		 -		globfree(&g); -	} -	 -	return(result); -} - - - -  std::string LLDir_Solaris::getCurPath()  {  	char tmp_str[LL_MAX_PATH];	/* Flawfinder: ignore */  diff --git a/indra/llvfs/lldir_solaris.h b/indra/llvfs/lldir_solaris.h index 70fac6f818..0b58a45b15 100644 --- a/indra/llvfs/lldir_solaris.h +++ b/indra/llvfs/lldir_solaris.h @@ -47,7 +47,6 @@ public:  	virtual std::string getCurPath();  	virtual U32 countFilesInDir(const std::string &dirname, const std::string &mask); -	virtual BOOL getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname);  	/*virtual*/ BOOL fileExists(const std::string &filename) const;  private: diff --git a/indra/llvfs/lldir_win32.cpp b/indra/llvfs/lldir_win32.cpp index 4e2a55f4b3..7709945123 100644 --- a/indra/llvfs/lldir_win32.cpp +++ b/indra/llvfs/lldir_win32.cpp @@ -240,67 +240,6 @@ U32 LLDir_Win32::countFilesInDir(const std::string &dirname, const std::string &  	return (file_count);  } - -// get the next file in the directory -BOOL LLDir_Win32::getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname) -{ -    BOOL fileFound = FALSE; -	fname = ""; - -	WIN32_FIND_DATAW FileData; -    llutf16string pathname = utf8str_to_utf16str(dirname) + utf8str_to_utf16str(mask); - -	if (pathname != mCurrentDir) -	{ -		// different dir specified, close old search -		if (!mCurrentDir.empty()) -		{ -			FindClose(mDirSearch_h); -		} -		mCurrentDir = pathname; - -		// and open new one -		// Check error opening Directory structure -		if ((mDirSearch_h = FindFirstFile(pathname.c_str(), &FileData)) != INVALID_HANDLE_VALUE)    -		{ -           fileFound = TRUE; -		} -	} - -    // Loop to skip over the current (.) and parent (..) directory entries -    // (apparently returned in Win7 but not XP) -    do -    { -       if (   fileFound -           && (  (lstrcmp(FileData.cFileName, (LPCTSTR)TEXT(".")) == 0) -               ||(lstrcmp(FileData.cFileName, (LPCTSTR)TEXT("..")) == 0) -               ) -           ) -       { -          fileFound = FALSE; -       } -    } while (   mDirSearch_h != INVALID_HANDLE_VALUE -             && !fileFound -             && (fileFound = FindNextFile(mDirSearch_h, &FileData) -                 ) -             ); - -    if (!fileFound && GetLastError() == ERROR_NO_MORE_FILES) -    { -       // No more files, so reset to beginning of directory -       FindClose(mDirSearch_h); -       mCurrentDir[0] = '\000'; -    } - -    if (fileFound) -    { -        // convert from TCHAR to char -        fname = utf16str_to_utf8str(FileData.cFileName); -	} -     -	return fileFound; -} -  std::string LLDir_Win32::getCurPath()  {  	WCHAR w_str[MAX_PATH]; diff --git a/indra/llvfs/lldir_win32.h b/indra/llvfs/lldir_win32.h index b170ebbcd7..62fb4713ab 100644 --- a/indra/llvfs/lldir_win32.h +++ b/indra/llvfs/lldir_win32.h @@ -44,15 +44,12 @@ public:  	/*virtual*/ std::string getCurPath();  	/*virtual*/ U32 countFilesInDir(const std::string &dirname, const std::string &mask); -	/*virtual*/ BOOL getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname);  	/*virtual*/ BOOL fileExists(const std::string &filename) const;  	/*virtual*/ std::string getLLPluginLauncher();  	/*virtual*/ std::string getLLPluginFilename(std::string base_name);  private: -	BOOL getNextFileInDir(const llutf16string &dirname, const std::string &mask, std::string &fname); -  	void* mDirSearch_h;  	llutf16string mCurrentDir;  }; diff --git a/indra/llvfs/tests/lldir_test.cpp b/indra/llvfs/tests/lldir_test.cpp index 8788bd63e8..ea321c5ae9 100644 --- a/indra/llvfs/tests/lldir_test.cpp +++ b/indra/llvfs/tests/lldir_test.cpp @@ -28,6 +28,7 @@  #include "linden_common.h"  #include "../lldir.h" +#include "../lldiriterator.h"  #include "../test/lltut.h" @@ -259,13 +260,12 @@ namespace tut     std::string makeTestFile( const std::string& dir, const std::string& file )     { -      std::string delim = gDirUtilp->getDirDelimiter(); -      std::string path = dir + delim + file; +      std::string path = dir + file;        LLFILE* handle = LLFile::fopen( path, "w" );        ensure("failed to open test file '"+path+"'", handle != NULL );        // Harbison & Steele, 4th ed., p. 366: "If an error occurs, fputs        // returns EOF; otherwise, it returns some other, nonnegative value." -      ensure("failed to write to test file '"+path+"'", fputs("test file", handle) >= 0); +      ensure("failed to write to test file '"+path+"'", EOF != fputs("test file", handle) );        fclose(handle);        return path;     } @@ -290,7 +290,7 @@ namespace tut     }     static const char* DirScanFilename[5] = { "file1.abc", "file2.abc", "file1.xyz", "file2.xyz", "file1.mno" }; -    +     void scanTest(const std::string& directory, const std::string& pattern, bool correctResult[5])     { @@ -300,7 +300,8 @@ namespace tut        bool  filesFound[5] = { false, false, false, false, false };        //std::cerr << "searching '"+directory+"' for '"+pattern+"'\n"; -      while ( found <= 5 && gDirUtilp->getNextFileInDir(directory, pattern, scanResult) ) +      LLDirIterator iter(directory, pattern); +      while ( found <= 5 && iter.next(scanResult) )        {           found++;           //std::cerr << "  found '"+scanResult+"'\n"; @@ -334,15 +335,15 @@ namespace tut     template<> template<>     void LLDirTest_object_t::test<5>() -      // getNextFileInDir +      // LLDirIterator::next     {        std::string delim = gDirUtilp->getDirDelimiter();        std::string dirTemp = LLFile::tmpdir();        // Create the same 5 file names of the two directories -      std::string dir1 = makeTestDir(dirTemp + "getNextFileInDir"); -      std::string dir2 = makeTestDir(dirTemp + "getNextFileInDir"); +      std::string dir1 = makeTestDir(dirTemp + "LLDirIterator"); +      std::string dir2 = makeTestDir(dirTemp + "LLDirIterator");        std::string dir1files[5];        std::string dir2files[5];        for (int i=0; i<5; i++) @@ -380,19 +381,17 @@ namespace tut        scanTest(dir2, "file?.x?z", expected7);        // Scan dir2 and see if any file?.??c files are found -      // THESE FAIL ON Mac and Windows, SO ARE COMMENTED OUT FOR NOW -      //      bool  expected8[5] = { true, true, false, false, false }; -      //      scanTest(dir2, "file?.??c", expected8); -      //      scanTest(dir2, "*.??c", expected8); +      bool  expected8[5] = { true, true, false, false, false }; +      scanTest(dir2, "file?.??c", expected8); +      scanTest(dir2, "*.??c", expected8);        // Scan dir1 and see if any *.?n? files are found        bool  expected9[5] = { false, false, false, false, true };        scanTest(dir1, "*.?n?", expected9);        // Scan dir1 and see if any *.???? files are found -      // THIS ONE FAILS ON WINDOWS (returns three charater suffixes) SO IS COMMENTED OUT FOR NOW -      // bool  expected10[5] = { false, false, false, false, false }; -      // scanTest(dir1, "*.????", expected10); +      bool  expected10[5] = { false, false, false, false, false }; +      scanTest(dir1, "*.????", expected10);        // Scan dir1 and see if any ?????.* files are found        bool  expected11[5] = { true, true, true, true, true }; @@ -402,6 +401,15 @@ namespace tut        bool  expected12[5] = { false, false, true, true, false };        scanTest(dir1, "??l??.xyz", expected12); +      bool expected13[5] = { true, false, true, false, false }; +      scanTest(dir1, "file1.{abc,xyz}", expected13); + +      bool expected14[5] = { true, true, false, false, false }; +      scanTest(dir1, "file[0-9].abc", expected14); + +      bool expected15[5] = { true, true, false, false, false }; +      scanTest(dir1, "file[!a-z].abc", expected15); +        // clean up all test files and directories        for (int i=0; i<5; i++)        { diff --git a/indra/llxuixml/lltrans.cpp b/indra/llxuixml/lltrans.cpp index 7619e4b7ac..5388069c24 100644 --- a/indra/llxuixml/lltrans.cpp +++ b/indra/llxuixml/lltrans.cpp @@ -31,6 +31,7 @@  #include "llfasttimer.h"	// for call count statistics  #include "llxuiparser.h"  #include "llsd.h" +#include "llxmlnode.h"  #include <map> diff --git a/indra/llxuixml/lltrans.h b/indra/llxuixml/lltrans.h index 63f7d431d3..128b51d383 100644 --- a/indra/llxuixml/lltrans.h +++ b/indra/llxuixml/lltrans.h @@ -29,8 +29,10 @@  #include <map> +#include "llpointer.h"  #include "llstring.h" -#include "llxmlnode.h" + +class LLXMLNode;  class LLSD; @@ -63,9 +65,9 @@ public:  	 * @param default_args Set of strings (expected to be in the file) to use as default replacement args, e.g. "SECOND_LIFE"  	 * @returns true if the file was parsed successfully, true if something went wrong  	 */ -	static bool parseStrings(LLXMLNodePtr& root, const std::set<std::string>& default_args); +	static bool parseStrings(LLPointer<LLXMLNode> & root, const std::set<std::string>& default_args); -	static bool parseLanguageStrings(LLXMLNodePtr &root); +	static bool parseLanguageStrings(LLPointer<LLXMLNode> & root);  	/**  	 * @brief Returns a translated string diff --git a/indra/llxuixml/llxuiparser.h b/indra/llxuixml/llxuiparser.h index 7a748d8aea..0c38c4da93 100644 --- a/indra/llxuixml/llxuiparser.h +++ b/indra/llxuixml/llxuiparser.h @@ -28,7 +28,6 @@  #define LLXUIPARSER_H  #include "llinitparam.h" -#include "llfasttimer.h"  #include "llregistry.h"  #include "llpointer.h" @@ -95,6 +94,7 @@ public:  }; +class LLXUIParserImpl;  class LLXUIParser : public LLInitParam::Parser  { @@ -176,6 +176,7 @@ private:  // ordering of child elements from base file to localized diff file.  Then we can use a pair  // of coroutines to perform matching of xml nodes during parsing.  Not sure if the overhead  // of coroutines would offset the gain from SAX parsing +class LLSimpleXUIParserImpl;  class LLSimpleXUIParser : public LLInitParam::Parser  { diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index ac52cff49a..e6c2dc4413 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -3910,6 +3910,17 @@        <key>Value</key>        <string>http://search.secondlife.com/viewer/[CATEGORY]/?q=[QUERY]&p=[AUTH_TOKEN]&r=[MATURITY]&lang=[LANGUAGE]&g=[GODLIKE]&sid=[SESSION_ID]&rid=[REGION_ID]&pid=[PARCEL_ID]&channel=[CHANNEL]&version=[VERSION]&major=[VERSION_MAJOR]&minor=[VERSION_MINOR]&patch=[VERSION_PATCH]&build=[VERSION_BUILD]</string>      </map> +    <key>SearchURLBeta</key> +    <map> +      <key>Comment</key> +      <string>URL for Search website, displayed in the Find floater</string> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>http://beta.search.secondlife.com/viewer/[CATEGORY]/?q=[QUERY]&p=[AUTH_TOKEN]&r=[MATURITY]&lang=[LANGUAGE]&g=[GODLIKE]&sid=[SESSION_ID]&rid=[REGION_ID]&pid=[PARCEL_ID]&channel=[CHANNEL]&version=[VERSION]&major=[VERSION_MAJOR]&minor=[VERSION_MINOR]&patch=[VERSION_PATCH]&build=[VERSION_BUILD]</string> +    </map>      <key>WebProfileURL</key>      <map>        <key>Comment</key> @@ -4284,6 +4295,39 @@        <key>Value</key>          <real>0.25</real>        </map> +	<key>Jpeg2000AdvancedCompression</key> +	  <map> +      <key>Comment</key> +        <string>Use advanced Jpeg2000 compression options (precincts, blocks, ordering, markers)</string> +      <key>Persist</key> +        <integer>1</integer> +      <key>Type</key> +        <string>Boolean</string> +      <key>Value</key> +        <integer>0</integer> +	  </map> +	<key>Jpeg2000PrecinctsSize</key> +	  <map> +      <key>Comment</key> +        <string>Size of image precincts. Assumed square and same for all levels. Must be power of 2.</string> +      <key>Persist</key> +        <integer>1</integer> +      <key>Type</key> +        <string>S32</string> +      <key>Value</key> +        <integer>256</integer> +	  </map> +	<key>Jpeg2000BlocksSize</key> +	  <map> +      <key>Comment</key> +        <string>Size of encoding blocks. Assumed square and same for all levels. Must be power of 2. Max 64, Min 4.</string> +      <key>Persist</key> +        <integer>1</integer> +      <key>Type</key> +        <string>S32</string> +      <key>Value</key> +        <integer>64</integer> +	  </map>      <key>KeepAspectForSnapshot</key>      <map>        <key>Comment</key> diff --git a/indra/newview/app_settings/settings_minimal.xml b/indra/newview/app_settings/settings_minimal.xml index d3f0ec5dad..70a75cb4ca 100644 --- a/indra/newview/app_settings/settings_minimal.xml +++ b/indra/newview/app_settings/settings_minimal.xml @@ -45,15 +45,6 @@          <key>Value</key>              <integer>0</integer>          </map> -    <key>EnableVoiceChat</key> -        <map> -        <key>Comment</key> -            <string>Enable talking to other residents with a microphone</string> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map>      <key>HelpURLFormat</key>          <map>          <key>Comment</key> diff --git a/indra/newview/app_settings/settings_per_account.xml b/indra/newview/app_settings/settings_per_account.xml index 8efec1cff0..ff24efaf2c 100644 --- a/indra/newview/app_settings/settings_per_account.xml +++ b/indra/newview/app_settings/settings_per_account.xml @@ -44,6 +44,17 @@          <key>Value</key>              <integer>0</integer>          </map> +    <key>LastPostcardRecipient</key> +      <map> +        <key>Comment</key> +          <string>Last recipient of postcard</string> +        <key>Persist</key> +          <integer>1</integer> +        <key>Type</key> +          <string>String</string> +        <key>Value</key> +          <string /> +      </map>      <key>LogNearbyChat</key>          <map>          <key>Comment</key> diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp index 7319c0d902..8f5efcf941 100644 --- a/indra/newview/llagent.cpp +++ b/indra/newview/llagent.cpp @@ -25,10 +25,12 @@   */  #include "llviewerprecompiledheaders.h" +  #include "llagent.h"   #include "pipeline.h" +#include "llagentaccess.h"  #include "llagentcamera.h"  #include "llagentlistener.h"  #include "llagentwearables.h" @@ -36,6 +38,7 @@  #include "llanimationstates.h"  #include "llbottomtray.h"  #include "llcallingcard.h" +#include "llcapabilitylistener.h"  #include "llchannelmanager.h"  #include "llconsole.h"  #include "llfirstuse.h" @@ -55,8 +58,10 @@  #include "llpaneltopinfobar.h"  #include "llparcel.h"  #include "llrendersphere.h" +#include "llsdmessage.h"  #include "llsdutil.h"  #include "llsky.h" +#include "llslurl.h"  #include "llsmoothstep.h"  #include "llstartup.h"  #include "llstatusbar.h" @@ -74,6 +79,7 @@  #include "llviewerobjectlist.h"  #include "llviewerparcelmgr.h"  #include "llviewerstats.h" +#include "llviewerwindow.h"  #include "llvoavatarself.h"  #include "llwindow.h"  #include "llworld.h" @@ -172,7 +178,8 @@ LLAgent::LLAgent() :  	mbRunning(false),  	mbTeleportKeepsLookAt(false), -	mAgentAccess(gSavedSettings), +	mAgentAccess(new LLAgentAccess(gSavedSettings)), +	mTeleportSourceSLURL(new LLSLURL),  	mTeleportState( TELEPORT_NONE ),  	mRegionp(NULL), @@ -209,7 +216,7 @@ LLAgent::LLAgent() :  	mAutoPilotFinishedCallback(NULL),  	mAutoPilotCallbackData(NULL), -	mEffectColor(LLColor4(0.f, 1.f, 1.f, 1.f)), +	mEffectColor(new LLUIColor(LLColor4(0.f, 1.f, 1.f, 1.f))),  	mHaveHomePosition(FALSE),  	mHomeRegionHandle( 0 ), @@ -251,7 +258,7 @@ void LLAgent::init()  	setFlying( gSavedSettings.getBOOL("FlyingAtExit") ); -	mEffectColor = LLUIColorTable::instance().getColor("EffectColor"); +	*mEffectColor = LLUIColorTable::instance().getColor("EffectColor");  	gSavedSettings.getControl("PreferredMaturity")->getValidateSignal()->connect(boost::bind(&LLAgent::validateMaturity, this, _2));  	gSavedSettings.getControl("PreferredMaturity")->getSignal()->connect(boost::bind(&LLAgent::handleMaturity, this, _2)); @@ -275,9 +282,16 @@ LLAgent::~LLAgent()  	cleanup();  	delete mMouselookModeInSignal; +	mMouselookModeInSignal = NULL;  	delete mMouselookModeOutSignal; +	mMouselookModeOutSignal = NULL; -	// *Note: this is where LLViewerCamera::getInstance() used to be deleted. +	delete mAgentAccess; +	mAgentAccess = NULL; +	delete mEffectColor; +	mEffectColor = NULL; +	delete mTeleportSourceSLURL; +	mTeleportSourceSLURL = NULL;  }  // Handle any actions that need to be performed when the main app gains focus @@ -2142,32 +2156,32 @@ void LLAgent::onAnimStop(const LLUUID& id)  bool LLAgent::isGodlike() const  { -	return mAgentAccess.isGodlike(); +	return mAgentAccess->isGodlike();  }  bool LLAgent::isGodlikeWithoutAdminMenuFakery() const  { -	return mAgentAccess.isGodlikeWithoutAdminMenuFakery(); +	return mAgentAccess->isGodlikeWithoutAdminMenuFakery();  }  U8 LLAgent::getGodLevel() const  { -	return mAgentAccess.getGodLevel(); +	return mAgentAccess->getGodLevel();  }  bool LLAgent::wantsPGOnly() const  { -	return mAgentAccess.wantsPGOnly(); +	return mAgentAccess->wantsPGOnly();  }  bool LLAgent::canAccessMature() const  { -	return mAgentAccess.canAccessMature(); +	return mAgentAccess->canAccessMature();  }  bool LLAgent::canAccessAdult() const  { -	return mAgentAccess.canAccessAdult(); +	return mAgentAccess->canAccessAdult();  }  bool LLAgent::canAccessMaturityInRegion( U64 region_handle ) const @@ -2202,37 +2216,37 @@ bool LLAgent::canAccessMaturityAtGlobal( LLVector3d pos_global ) const  bool LLAgent::prefersPG() const  { -	return mAgentAccess.prefersPG(); +	return mAgentAccess->prefersPG();  }  bool LLAgent::prefersMature() const  { -	return mAgentAccess.prefersMature(); +	return mAgentAccess->prefersMature();  }  bool LLAgent::prefersAdult() const  { -	return mAgentAccess.prefersAdult(); +	return mAgentAccess->prefersAdult();  }  bool LLAgent::isTeen() const  { -	return mAgentAccess.isTeen(); +	return mAgentAccess->isTeen();  }  bool LLAgent::isMature() const  { -	return mAgentAccess.isMature(); +	return mAgentAccess->isMature();  }  bool LLAgent::isAdult() const  { -	return mAgentAccess.isAdult(); +	return mAgentAccess->isAdult();  }  void LLAgent::setTeen(bool teen)  { -	mAgentAccess.setTeen(teen); +	mAgentAccess->setTeen(teen);  }  //static  @@ -2277,37 +2291,37 @@ bool LLAgent::sendMaturityPreferenceToServer(int preferredMaturity)  BOOL LLAgent::getAdminOverride() const	  {  -	return mAgentAccess.getAdminOverride();  +	return mAgentAccess->getAdminOverride();   }  void LLAgent::setMaturity(char text)  { -	mAgentAccess.setMaturity(text); +	mAgentAccess->setMaturity(text);  }  void LLAgent::setAdminOverride(BOOL b)	  {  -	mAgentAccess.setAdminOverride(b); +	mAgentAccess->setAdminOverride(b);  }  void LLAgent::setGodLevel(U8 god_level)	  {  -	mAgentAccess.setGodLevel(god_level); +	mAgentAccess->setGodLevel(god_level);  }  void LLAgent::setAOTransition()  { -	mAgentAccess.setTransition(); +	mAgentAccess->setTransition();  }  const LLAgentAccess& LLAgent::getAgentAccess()  { -	return mAgentAccess; +	return *mAgentAccess;  }  bool LLAgent::validateMaturity(const LLSD& newvalue)  { -	return mAgentAccess.canSetMaturity(newvalue.asInteger()); +	return mAgentAccess->canSetMaturity(newvalue.asInteger());  }  void LLAgent::handleMaturity(const LLSD& newvalue) @@ -2639,12 +2653,12 @@ BOOL LLAgent::allowOperation(PermissionBit op,  const LLColor4 &LLAgent::getEffectColor()  { -	return mEffectColor; +	return *mEffectColor;  }  void LLAgent::setEffectColor(const LLColor4 &color)  { -	mEffectColor = color; +	*mEffectColor = color;  }  void LLAgent::initOriginGlobal(const LLVector3d &origin_global) @@ -3472,7 +3486,7 @@ void LLAgent::setTeleportState(ETeleportState state)  		case TELEPORT_MOVING:  		// We're outa here. Save "back" slurl. -		LLAgentUI::buildSLURL(mTeleportSourceSLURL); +		LLAgentUI::buildSLURL(*mTeleportSourceSLURL);  			break;  		case TELEPORT_ARRIVING: @@ -3805,6 +3819,11 @@ void LLAgent::parseTeleportMessages(const std::string& xml_filename)  	}//end for (all message sets in xml file)  } +const void LLAgent::getTeleportSourceSLURL(LLSLURL& slurl) const +{ +	slurl = *mTeleportSourceSLURL; +} +  void LLAgent::sendAgentUpdateUserInfo(bool im_via_email, const std::string& directory_visibility )  {  	gMessageSystem->newMessageFast(_PREHASH_UpdateUserInfo); diff --git a/indra/newview/llagent.h b/indra/newview/llagent.h index 896408c0dd..54c5649f97 100644 --- a/indra/newview/llagent.h +++ b/indra/newview/llagent.h @@ -29,15 +29,11 @@  #include "indra_constants.h"  #include "llevent.h" 				// LLObservable base class -#include "llagentaccess.h"  #include "llagentconstants.h"  #include "llagentdata.h" 			// gAgentID, gAgentSessionID -#include "llcharacter.h" 			// LLAnimPauseRequest +#include "llcharacter.h"  #include "llcoordframe.h"			// for mFrameAgent -#include "llpointer.h" -#include "lluicolor.h"  #include "llvoavatardefines.h" -#include "llslurl.h"  #include <boost/signals2.hpp> @@ -56,6 +52,10 @@ class LLFriendObserver;  class LLPickInfo;  class LLViewerObject;  class LLAgentDropGroupViewerNode; +class LLAgentAccess; +class LLSLURL; +class LLPauseRequestHandle; +class LLUIColor;  //--------------------------------------------------------------------  // Types @@ -80,6 +80,8 @@ struct LLGroupData  class LLAgentListener; +class LLAgentImpl; +  //------------------------------------------------------------------------  // LLAgent  //------------------------------------------------------------------------ @@ -420,7 +422,7 @@ private:  	camera_signal_t* mMouselookModeInSignal;  	camera_signal_t* mMouselookModeOutSignal;  	BOOL            mCustomAnim; 		// Current animation is ANIM_AGENT_CUSTOMIZE ? -	LLAnimPauseRequest mPauseRequest; +	LLPointer<LLPauseRequestHandle> mPauseRequest;  	BOOL			mViewsPushed; 		// Keep track of whether or not we have pushed views  /**                    Animation @@ -515,13 +517,13 @@ public:  public:  	static void 	parseTeleportMessages(const std::string& xml_filename); -	const void getTeleportSourceSLURL(LLSLURL& slurl) const { slurl = mTeleportSourceSLURL; } +	const void getTeleportSourceSLURL(LLSLURL& slurl) const;  public:  	// ! TODO ! Define ERROR and PROGRESS enums here instead of exposing the mappings.  	static std::map<std::string, std::string> sTeleportErrorMessages;  	static std::map<std::string, std::string> sTeleportProgressMessages;  private: -	LLSLURL	mTeleportSourceSLURL; 			// SLURL where last TP began +	LLSLURL * mTeleportSourceSLURL; 			// SLURL where last TP began  	//--------------------------------------------------------------------  	// Teleport Actions @@ -580,7 +582,7 @@ public:  	// ! BACKWARDS COMPATIBILITY ! This function can go away after the AO transition (see llstartup.cpp).  	void 			setAOTransition();  private: -	LLAgentAccess 	mAgentAccess; +	LLAgentAccess * mAgentAccess;  	//--------------------------------------------------------------------  	// God @@ -660,7 +662,7 @@ public:  	const LLColor4	&getEffectColor();  	void			setEffectColor(const LLColor4 &color);  private: -	LLUIColor 		mEffectColor; +	LLUIColor * mEffectColor;  /**                    Rendering   **                                                                            ** diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 9de2941c4a..3a7e8dff64 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -82,13 +82,14 @@  #include "lltextutil.h"  #include "lllogininstance.h"  #include "llprogressview.h" - +#include "llvocache.h"  #include "llweb.h"  #include "llsecondlifeurls.h"  #include "llupdaterservice.h"  // Linden library includes  #include "llavatarnamecache.h" +#include "lldiriterator.h"  #include "llimagej2c.h"  #include "llmemory.h"  #include "llprimitive.h" @@ -132,7 +133,6 @@  #include "lltoolmgr.h"  #include "llassetstorage.h"  #include "llpolymesh.h" -#include "llcachename.h"  #include "llaudioengine.h"  #include "llstreamingaudio.h"  #include "llviewermenu.h" @@ -3432,7 +3432,9 @@ void LLAppViewer::migrateCacheDirectory()  			S32 file_count = 0;  			std::string file_name;  			std::string mask = delimiter + "*.*"; -			while (gDirUtilp->getNextFileInDir(old_cache_dir, mask, file_name)) + +			LLDirIterator iter(old_cache_dir, mask); +			while (iter.next(file_name))  			{  				if (file_name == "." || file_name == "..") continue;  				std::string source_path = old_cache_dir + delimiter + file_name; @@ -3653,7 +3655,8 @@ bool LLAppViewer::initCache()  		dir = gDirUtilp->getExpandedFilename(LL_PATH_CACHE,"");  		std::string found_file; -		if (gDirUtilp->getNextFileInDir(dir, mask, found_file)) +		LLDirIterator iter(dir, mask); +		if (iter.next(found_file))  		{  			old_vfs_data_file = dir + gDirUtilp->getDirDelimiter() + found_file; diff --git a/indra/newview/llappviewerlinux.cpp b/indra/newview/llappviewerlinux.cpp index 523c2e3adf..714e0e6163 100644 --- a/indra/newview/llappviewerlinux.cpp +++ b/indra/newview/llappviewerlinux.cpp @@ -30,6 +30,7 @@  #include "llcommandlineparser.h" +#include "lldiriterator.h"  #include "llmemtype.h"  #include "llurldispatcher.h"		// SLURL from other app instance  #include "llviewernetwork.h" @@ -504,7 +505,9 @@ std::string LLAppViewerLinux::generateSerialNumber()  	// trawl /dev/disk/by-uuid looking for a good-looking UUID to grab  	std::string this_name; -	while (gDirUtilp->getNextFileInDir(uuiddir, "*", this_name)) + +	LLDirIterator iter(uuiddir, "*"); +	while (iter.next(this_name))  	{  		if (this_name.length() > best.length() ||  		    (this_name.length() == best.length() && diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp index c72cdfd1dc..f51552aae5 100644 --- a/indra/newview/llbottomtray.cpp +++ b/indra/newview/llbottomtray.cpp @@ -559,7 +559,7 @@ BOOL LLBottomTray::postBuild()  	else  	{  		LLTransientFloaterMgr::getInstance()->addControlView(getChild<LLButton>("speak_btn")); -		LLTransientFloaterMgr::getInstance()->addControlView(getChild<LLButton>("speak_flyout_btn")); +		LLTransientFloaterMgr::getInstance()->addControlView(getChild<LLButton>("flyout_btn"));  	} @@ -1591,7 +1591,7 @@ void LLBottomTray::initResizeStateContainers()  // because it resets chatbar's width according to resize logic.  void LLBottomTray::initButtonsVisibility()  { -	setVisibleAndFitWidths(RS_BUTTON_SPEAK, gSavedSettings.getBOOL("EnableVoiceChat")); +	setVisibleAndFitWidths(RS_BUTTON_SPEAK, gSavedSettings.getBOOL("EnableVoiceChat") || !mSpeakBtn );  	setVisibleAndFitWidths(RS_BUTTON_GESTURES, gSavedSettings.getBOOL("ShowGestureButton"));  	setVisibleAndFitWidths(RS_BUTTON_MOVEMENT, gSavedSettings.getBOOL("ShowMoveButton"));  	setVisibleAndFitWidths(RS_BUTTON_CAMERA, gSavedSettings.getBOOL("ShowCameraButton")); @@ -1605,7 +1605,12 @@ void LLBottomTray::initButtonsVisibility()  void LLBottomTray::setButtonsControlsAndListeners()  { -	gSavedSettings.getControl("EnableVoiceChat")->getSignal()->connect(boost::bind(&LLBottomTray::toggleShowButton, RS_BUTTON_SPEAK, _2)); +	// always show the speak panel if using the basic skin +	if (mSpeakBtn) +	{ +		gSavedSettings.getControl("EnableVoiceChat")->getSignal()->connect(boost::bind(&LLBottomTray::toggleShowButton, RS_BUTTON_SPEAK, _2)); +	}	 +  	gSavedSettings.getControl("ShowGestureButton")->getSignal()->connect(boost::bind(&LLBottomTray::toggleShowButton, RS_BUTTON_GESTURES, _2));  	gSavedSettings.getControl("ShowMoveButton")->getSignal()->connect(boost::bind(&LLBottomTray::toggleShowButton, RS_BUTTON_MOVEMENT, _2));  	gSavedSettings.getControl("ShowCameraButton")->getSignal()->connect(boost::bind(&LLBottomTray::toggleShowButton, RS_BUTTON_CAMERA, _2)); diff --git a/indra/newview/lldrawpoolbump.cpp b/indra/newview/lldrawpoolbump.cpp index 223e4a438c..c987847c66 100644 --- a/indra/newview/lldrawpoolbump.cpp +++ b/indra/newview/lldrawpoolbump.cpp @@ -853,6 +853,11 @@ void LLBumpImageList::destroyGL()  void LLBumpImageList::restoreGL()  { +	if(!gTextureList.isInitialized())
 +	{
 +		return ;
 +	} +  	LLStandardBumpmap::restoreGL();  	// Images will be recreated as they are needed.  } diff --git a/indra/newview/lleventnotifier.h b/indra/newview/lleventnotifier.h index 697a708762..3fee46c2f6 100644 --- a/indra/newview/lleventnotifier.h +++ b/indra/newview/lleventnotifier.h @@ -31,6 +31,7 @@  #include "v3dmath.h"  class LLEventNotification; +class LLMessageSystem;  class LLEventNotifier diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp index 7be4ebc690..0d0c1f594d 100644 --- a/indra/newview/llfloaterland.cpp +++ b/indra/newview/llfloaterland.cpp @@ -38,6 +38,7 @@  #include "message.h"  #include "llagent.h" +#include "llagentaccess.h"  #include "llbutton.h"  #include "llcheckboxctrl.h"  #include "llcombobox.h" diff --git a/indra/newview/llfloaterland.h b/indra/newview/llfloaterland.h index a096fb64cd..8a70fa24d8 100644 --- a/indra/newview/llfloaterland.h +++ b/indra/newview/llfloaterland.h @@ -43,11 +43,12 @@ class LLButton;  class LLCheckBoxCtrl;  class LLRadioGroup;  class LLComboBox; -class LLNameListCtrl; -class LLSpinCtrl;  class LLLineEditor; +class LLMessageSystem; +class LLNameListCtrl;  class LLRadioGroup;  class LLParcelSelectionObserver; +class LLSpinCtrl;  class LLTabContainer;  class LLTextBox;  class LLTextEditor; diff --git a/indra/newview/llfloatersearch.cpp b/indra/newview/llfloatersearch.cpp index d5806e375c..c8fe380710 100644 --- a/indra/newview/llfloatersearch.cpp +++ b/indra/newview/llfloatersearch.cpp @@ -38,6 +38,7 @@  #include "llui.h"  #include "llviewercontrol.h"  #include "llweb.h" +#include "llversioninfo.h"  // support secondlife:///app/search/{CATEGORY}/{QUERY} SLapps  class LLSearchHandler : public LLCommandHandler @@ -203,7 +204,15 @@ void LLFloaterSearch::search(const LLSD &key)  	// get the search URL and expand all of the substitutions  	// (also adds things like [LANGUAGE], [VERSION], [OS], etc.) -	std::string url = gSavedSettings.getString("SearchURL"); +	std::string url; +	if (LLVersionInfo::getChannel().find("Beta") != std::string::npos) +	{ +		url = gSavedSettings.getString("SearchURLBeta"); +	} +	else +	{ +		url = gSavedSettings.getString("SearchURL"); +	}  	url = LLWeb::expandURLSubstitutions(url, subs);  	// and load the URL in the web view diff --git a/indra/newview/llfloatersnapshot.cpp b/indra/newview/llfloatersnapshot.cpp index add591895b..00dc7b1627 100644 --- a/indra/newview/llfloatersnapshot.cpp +++ b/indra/newview/llfloatersnapshot.cpp @@ -53,6 +53,7 @@  #include "llfloaterpostcard.h"  #include "llcheckboxctrl.h"  #include "llradiogroup.h" +#include "llslurl.h"  #include "lltoolfocus.h"  #include "lltoolmgr.h"  #include "llwebsharing.h" diff --git a/indra/newview/llfloatersounddevices.cpp b/indra/newview/llfloatersounddevices.cpp index 3903b9b015..9fe7c7f9dd 100644 --- a/indra/newview/llfloatersounddevices.cpp +++ b/indra/newview/llfloatersounddevices.cpp @@ -56,7 +56,7 @@ BOOL LLFloaterSoundDevices::postBuild()  {  	LLTransientDockableFloater::postBuild(); -	LLView *anchor_panel = LLBottomTray::getInstance()->getChild<LLView>("speak_flyout_btn"); +	LLView *anchor_panel = LLBottomTray::getInstance()->getChild<LLView>("flyout_btn");  	setDockControl(new LLDockControl(anchor_panel, this, getDockTongue(), LLDockControl::TOP));  	setIsChrome(TRUE); diff --git a/indra/newview/llfloateruipreview.cpp b/indra/newview/llfloateruipreview.cpp index 0d8601410a..4c9c4cb154 100644 --- a/indra/newview/llfloateruipreview.cpp +++ b/indra/newview/llfloateruipreview.cpp @@ -35,6 +35,7 @@  #include "llfloateruipreview.h"			// Own header  // Internal utility +#include "lldiriterator.h"  #include "lleventtimer.h"  #include "llexternaleditor.h"  #include "llrender.h" @@ -481,9 +482,11 @@ BOOL LLFloaterUIPreview::postBuild()  	std::string language_directory;  	std::string xui_dir = get_xui_dir();	// directory containing localizations -- don't forget trailing delim  	mLanguageSelection->removeall();																				// clear out anything temporarily in list from XML + +	LLDirIterator iter(xui_dir, "*");  	while(found)																									// for every directory  	{ -		if((found = gDirUtilp->getNextFileInDir(xui_dir, "*", language_directory)))							// get next directory +		if((found = iter.next(language_directory)))							// get next directory  		{  			std::string full_path = xui_dir + language_directory;  			if(LLFile::isfile(full_path.c_str()))																	// if it's not a directory, skip it @@ -635,42 +638,51 @@ void LLFloaterUIPreview::refreshList()  	mFileList->clearRows();		// empty list  	std::string name;  	BOOL found = TRUE; + +	LLDirIterator floater_iter(getLocalizedDirectory(), "floater_*.xml");  	while(found)				// for every floater file that matches the pattern  	{ -		if((found = gDirUtilp->getNextFileInDir(getLocalizedDirectory(), "floater_*.xml", name)))	// get next file matching pattern +		if((found = floater_iter.next(name)))	// get next file matching pattern  		{  			addFloaterEntry(name.c_str());	// and add it to the list (file name only; localization code takes care of rest of path)  		}  	}  	found = TRUE; + +	LLDirIterator inspect_iter(getLocalizedDirectory(), "inspect_*.xml");  	while(found)				// for every inspector file that matches the pattern  	{ -		if((found = gDirUtilp->getNextFileInDir(getLocalizedDirectory(), "inspect_*.xml", name)))	// get next file matching pattern +		if((found = inspect_iter.next(name)))	// get next file matching pattern  		{  			addFloaterEntry(name.c_str());	// and add it to the list (file name only; localization code takes care of rest of path)  		}  	}  	found = TRUE; + +	LLDirIterator menu_iter(getLocalizedDirectory(), "menu_*.xml");  	while(found)				// for every menu file that matches the pattern  	{ -		if((found = gDirUtilp->getNextFileInDir(getLocalizedDirectory(), "menu_*.xml", name)))	// get next file matching pattern +		if((found = menu_iter.next(name)))	// get next file matching pattern  		{  			addFloaterEntry(name.c_str());	// and add it to the list (file name only; localization code takes care of rest of path)  		}  	}  	found = TRUE; + +	LLDirIterator panel_iter(getLocalizedDirectory(), "panel_*.xml");  	while(found)				// for every panel file that matches the pattern  	{ -		if((found = gDirUtilp->getNextFileInDir(getLocalizedDirectory(), "panel_*.xml", name)))	// get next file matching pattern +		if((found = panel_iter.next(name)))	// get next file matching pattern  		{  			addFloaterEntry(name.c_str());	// and add it to the list (file name only; localization code takes care of rest of path)  		}  	} -  	found = TRUE; + +	LLDirIterator sidepanel_iter(getLocalizedDirectory(), "sidepanel_*.xml");  	while(found)				// for every sidepanel file that matches the pattern  	{ -		if((found = gDirUtilp->getNextFileInDir(getLocalizedDirectory(), "sidepanel_*.xml", name)))	// get next file matching pattern +		if((found = sidepanel_iter.next(name)))	// get next file matching pattern  		{  			addFloaterEntry(name.c_str());	// and add it to the list (file name only; localization code takes care of rest of path)  		} diff --git a/indra/newview/llfolderviewitem.h b/indra/newview/llfolderviewitem.h index 2006e094a8..fc941510ab 100644 --- a/indra/newview/llfolderviewitem.h +++ b/indra/newview/llfolderviewitem.h @@ -28,6 +28,7 @@  #include "llview.h"  #include "lldarray.h"  // *TODO: Eliminate, forward declare +#include "lluiimage.h"  class LLFontGL;  class LLFolderView; diff --git a/indra/newview/lllocationhistory.h b/indra/newview/lllocationhistory.h index 188fbf1f9b..9fef42c5df 100644 --- a/indra/newview/lllocationhistory.h +++ b/indra/newview/lllocationhistory.h @@ -33,6 +33,7 @@  #include <string>  #include <map>  #include <boost/function.hpp> +#include <boost/signals2.hpp>  class LLSD;  /** diff --git a/indra/newview/lllogchat.cpp b/indra/newview/lllogchat.cpp index 2df683861a..efc4e23838 100644 --- a/indra/newview/lllogchat.cpp +++ b/indra/newview/lllogchat.cpp @@ -32,6 +32,7 @@  #include "lltrans.h"  #include "llviewercontrol.h" +#include "lldiriterator.h"  #include "llinstantmessage.h"  #include "llsingleton.h" // for LLSingleton @@ -602,7 +603,8 @@ std::string LLLogChat::oldLogFileName(std::string filename)  	//LL_INFOS("") << "Checking:" << directory << " for " << pattern << LL_ENDL;/* uncomment if you want to verify step, delete on commit */  	std::vector<std::string> allfiles; -    while (gDirUtilp->getNextFileInDir(directory, pattern, scanResult)) +	LLDirIterator iter(directory, pattern); +	while (iter.next(scanResult))      {  		//LL_INFOS("") << "Found   :" << scanResult << LL_ENDL;          allfiles.push_back(scanResult); diff --git a/indra/newview/lloutputmonitorctrl.h b/indra/newview/lloutputmonitorctrl.h index 026803584d..2d23753d46 100644 --- a/indra/newview/lloutputmonitorctrl.h +++ b/indra/newview/lloutputmonitorctrl.h @@ -31,6 +31,7 @@  #include "llview.h"  #include "llmutelist.h"  #include "llspeakingindicatormanager.h" +#include "lluiimage.h"  class LLTextBox;  class LLUICtrlFactory; diff --git a/indra/newview/llpanelavatar.cpp b/indra/newview/llpanelavatar.cpp index 73c4722b82..d58a1cb663 100644 --- a/indra/newview/llpanelavatar.cpp +++ b/indra/newview/llpanelavatar.cpp @@ -36,6 +36,7 @@  #include "llimview.h"  #include "llmenubutton.h"  #include "llnotificationsutil.h" +#include "llslurl.h"  #include "lltexteditor.h"  #include "lltexturectrl.h"  #include "lltoggleablemenu.h" diff --git a/indra/newview/llpanelgroupgeneral.cpp b/indra/newview/llpanelgroupgeneral.cpp index ec340dc258..1576ccccdf 100644 --- a/indra/newview/llpanelgroupgeneral.cpp +++ b/indra/newview/llpanelgroupgeneral.cpp @@ -44,6 +44,7 @@  #include "llnotificationsutil.h"  #include "llscrolllistitem.h"  #include "llspinctrl.h" +#include "llslurl.h"  #include "lltextbox.h"  #include "lltexteditor.h"  #include "lltexturectrl.h" diff --git a/indra/newview/llpanelgrouproles.cpp b/indra/newview/llpanelgrouproles.cpp index 3dbc637318..fbe331c7ab 100644 --- a/indra/newview/llpanelgrouproles.cpp +++ b/indra/newview/llpanelgrouproles.cpp @@ -42,6 +42,7 @@  #include "llscrolllistctrl.h"  #include "llscrolllistitem.h"  #include "llscrolllistcell.h" +#include "llslurl.h"  #include "lltabcontainer.h"  #include "lltextbox.h"  #include "lltexteditor.h" diff --git a/indra/newview/llpanellogin.cpp b/indra/newview/llpanellogin.cpp index 4ac3a248d3..27f341b4f6 100644 --- a/indra/newview/llpanellogin.cpp +++ b/indra/newview/llpanellogin.cpp @@ -769,7 +769,10 @@ void LLPanelLogin::loadLoginPage()  	gViewerWindow->setMenuBackgroundColor(false, !LLGridManager::getInstance()->isInProductionGrid());  	LLMediaCtrl* web_browser = sInstance->getChild<LLMediaCtrl>("login_html"); -	web_browser->navigateTo( oStr.str(), "text/html" ); +	if (web_browser->getCurrentNavUrl() != oStr.str()) +	{ +		web_browser->navigateTo( oStr.str(), "text/html" ); +	}  }  void LLPanelLogin::handleMediaEvent(LLPluginClassMedia* /*self*/, EMediaEvent event) diff --git a/indra/newview/llpanelvoicedevicesettings.cpp b/indra/newview/llpanelvoicedevicesettings.cpp index 71bb4a5584..dc87bd0077 100644 --- a/indra/newview/llpanelvoicedevicesettings.cpp +++ b/indra/newview/llpanelvoicedevicesettings.cpp @@ -221,23 +221,7 @@ void LLPanelVoiceDeviceSettings::refresh()  				iter != LLVoiceClient::getInstance()->getCaptureDevices().end();  				iter++)  			{ -				// Lets try to localize some system device names. EXT-8375 -				std::string device_name = *iter; -				LLStringUtil::toLower(device_name); //compare in low case -				if ("default system device" == device_name) -				{ -					device_name = getString(device_name); -				} -				else if ("no device" == device_name) -				{ -					device_name = getString(device_name); -				} -				else -				{ -					// restore original value -					device_name = *iter; -				} -				mCtrlInputDevices->add(device_name, ADD_BOTTOM ); +				mCtrlInputDevices->add( *iter, ADD_BOTTOM );  			}  			if(!mCtrlInputDevices->setSimple(mInputDevice)) @@ -254,23 +238,7 @@ void LLPanelVoiceDeviceSettings::refresh()  			for(iter= LLVoiceClient::getInstance()->getRenderDevices().begin();   				iter !=  LLVoiceClient::getInstance()->getRenderDevices().end(); iter++)  			{ -				// Lets try to localize some system device names. EXT-8375 -				std::string device_name = *iter; -				LLStringUtil::toLower(device_name); //compare in low case -				if ("default system device" == device_name) -				{ -					device_name = getString(device_name); -				} -				else if ("no device" == device_name) -				{ -					device_name = getString(device_name); -				} -				else -				{ -					// restore original value -					device_name = *iter; -				} -				mCtrlOutputDevices->add(device_name, ADD_BOTTOM ); +				mCtrlOutputDevices->add( *iter, ADD_BOTTOM );  			}  			if(!mCtrlOutputDevices->setSimple(mOutputDevice)) diff --git a/indra/newview/llpreviewgesture.cpp b/indra/newview/llpreviewgesture.cpp index 8e5beb33ce..9f5c55bad1 100644 --- a/indra/newview/llpreviewgesture.cpp +++ b/indra/newview/llpreviewgesture.cpp @@ -34,6 +34,7 @@  #include "llassetuploadresponders.h"  #include "llcheckboxctrl.h"  #include "llcombobox.h" +#include "lldatapacker.h"  #include "lldelayedgestureerror.h"  #include "llfloaterreg.h"  #include "llgesturemgr.h" diff --git a/indra/newview/llsidepaneliteminfo.cpp b/indra/newview/llsidepaneliteminfo.cpp index c8c6858b81..fbd2f7ca83 100644 --- a/indra/newview/llsidepaneliteminfo.cpp +++ b/indra/newview/llsidepaneliteminfo.cpp @@ -39,6 +39,7 @@  #include "llinventoryobserver.h"  #include "lllineeditor.h"  #include "llradiogroup.h" +#include "llslurl.h"  #include "llviewercontrol.h"  #include "llviewerinventory.h"  #include "llviewerobjectlist.h" diff --git a/indra/newview/lltooldraganddrop.cpp b/indra/newview/lltooldraganddrop.cpp index ba243f258a..671a334600 100644 --- a/indra/newview/lltooldraganddrop.cpp +++ b/indra/newview/lltooldraganddrop.cpp @@ -35,7 +35,6 @@  #include "llagentwearables.h"  #include "llappearancemgr.h"  #include "lldictionary.h" -//#include "llfirstuse.h"  #include "llfloaterreg.h"  #include "llfloatertools.h"  #include "llgesturemgr.h" diff --git a/indra/newview/llviewerchat.cpp b/indra/newview/llviewerchat.cpp index e7a0d17c3a..e06fe7bda0 100644 --- a/indra/newview/llviewerchat.cpp +++ b/indra/newview/llviewerchat.cpp @@ -29,6 +29,8 @@  // newview includes  #include "llagent.h" 	// gAgent		 +#include "llslurl.h" +#include "lluicolor.h"  #include "lluicolortable.h"  #include "llviewercontrol.h" // gSavedSettings  #include "llviewerregion.h" diff --git a/indra/newview/llviewerkeyboard.h b/indra/newview/llviewerkeyboard.h index 925244e89b..ca73212ed1 100644 --- a/indra/newview/llviewerkeyboard.h +++ b/indra/newview/llviewerkeyboard.h @@ -28,6 +28,7 @@  #define LL_LLVIEWERKEYBOARD_H  #include "llkeyboard.h" // For EKeystate +#include "llinitparam.h"  const S32 MAX_NAMED_FUNCTIONS = 100;  const S32 MAX_KEY_BINDINGS = 128; // was 60 diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp index 037e22584f..bc326540e6 100644 --- a/indra/newview/llviewermedia.cpp +++ b/indra/newview/llviewermedia.cpp @@ -54,6 +54,7 @@  #include "llfilepicker.h"  #include "llnotifications.h"  #include "lldir.h" +#include "lldiriterator.h"  #include "llevent.h"		// LLSimpleListener  #include "llnotificationsutil.h"  #include "lluuid.h" @@ -1154,7 +1155,8 @@ void LLViewerMedia::clearAllCookies()  	}  	// the hard part: iterate over all user directories and delete the cookie file from each one -	while(gDirUtilp->getNextFileInDir(base_dir, "*_*", filename)) +	LLDirIterator dir_iter(base_dir, "*_*"); +	while (dir_iter.next(filename))  	{  		target = base_dir;  		target += filename; diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index d958551a0a..b4ec3c135b 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -37,6 +37,7 @@  // newview includes  #include "llagent.h" +#include "llagentaccess.h"  #include "llagentcamera.h"  #include "llagentwearables.h"  #include "llagentpilot.h" diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index 0b8e5cf303..298e789f65 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -2213,7 +2213,9 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)  	name = clean_name_from_im(name, dialog);  	BOOL is_busy = gAgent.getBusy(); -	BOOL is_muted = LLMuteList::getInstance()->isMuted(from_id, name, LLMute::flagTextChat); +	BOOL is_muted = LLMuteList::getInstance()->isMuted(from_id, name, LLMute::flagTextChat) +		// object IMs contain sender object id in session_id (STORM-1209) +		|| dialog == IM_FROM_TASK && LLMuteList::getInstance()->isMuted(session_id);  	BOOL is_linden = LLMuteList::getInstance()->isLinden(name);  	BOOL is_owned_by_me = FALSE;  	BOOL is_friend = (LLAvatarTracker::instance().getBuddyInfo(from_id) == NULL) ? false : true; @@ -5371,6 +5373,12 @@ bool attempt_standard_notification(LLMessageSystem* msgsystem)  	{  		// notification was specified using the new mechanism, so we can just handle it here  		std::string notificationID; +		msgsystem->getStringFast(_PREHASH_AlertInfo, _PREHASH_Message, notificationID);
 +		if (!LLNotifications::getInstance()->templateExists(notificationID))
 +		{
 +			return false;
 +		} +  		std::string llsdRaw;  		LLSD llsdBlock;  		msgsystem->getStringFast(_PREHASH_AlertInfo, _PREHASH_Message, notificationID); diff --git a/indra/newview/llviewerparcelmgr.cpp b/indra/newview/llviewerparcelmgr.cpp index c84a14f62c..5ae4e872f3 100644 --- a/indra/newview/llviewerparcelmgr.cpp +++ b/indra/newview/llviewerparcelmgr.cpp @@ -42,6 +42,7 @@  // Viewer includes  #include "llagent.h" +#include "llagentaccess.h"  #include "llviewerwindow.h"  #include "llviewercontrol.h"  //#include "llfirstuse.h" @@ -54,6 +55,7 @@  #include "llresmgr.h"  #include "llsdutil.h"  #include "llsdutil_math.h" +#include "llslurl.h"  #include "llstatusbar.h"  #include "llui.h"  #include "llviewertexture.h" diff --git a/indra/newview/llviewerprecompiledheaders.h b/indra/newview/llviewerprecompiledheaders.h index ab07adce5d..45c9b3e91f 100644 --- a/indra/newview/llviewerprecompiledheaders.h +++ b/indra/newview/llviewerprecompiledheaders.h @@ -99,8 +99,6 @@  #include "llcoord.h"  #include "llcoordframe.h"  #include "llcrc.h" -#include "llinterp.h" -#include "llperlin.h"  #include "llplane.h"  #include "llquantize.h"  #include "llrand.h" @@ -109,7 +107,6 @@  #include "m3math.h"  #include "m4math.h"  #include "llquaternion.h" -#include "raytrace.h"  #include "v2math.h"  #include "v3color.h"  #include "v3dmath.h" @@ -117,16 +114,12 @@  #include "v4color.h"  #include "v4coloru.h"  #include "v4math.h" -////#include "vmath.h"  #include "xform.h"  // Library includes from llvfs  #include "lldir.h" - -// Library includes from llmessage project +
 +// Library includes from llmessage project
  #include "llcachename.h" -// llxuixml -#include "llinitparam.h" -  #endif diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp index c53fdc3393..8909abf36e 100644 --- a/indra/newview/llviewerregion.cpp +++ b/indra/newview/llviewerregion.cpp @@ -46,6 +46,7 @@  #include "llagentcamera.h"  #include "llcallingcard.h"  #include "llcaphttpsender.h" +#include "llcapabilitylistener.h"  #include "llcommandhandler.h"  #include "lldir.h"  #include "lleventpoll.h" @@ -76,6 +77,71 @@  const F32 WATER_TEXTURE_SCALE = 8.f;			//  Number of times to repeat the water texture across a region  const S16 MAX_MAP_DIST = 10; +typedef std::map<std::string, std::string> CapabilityMap; + +class LLViewerRegionImpl { +public: +	LLViewerRegionImpl(LLViewerRegion * region, LLHost const & host) +		:	mHost(host), +			mCompositionp(NULL), +			mEventPoll(NULL), +		    // I'd prefer to set the LLCapabilityListener name to match the region +		    // name -- it's disappointing that's not available at construction time. +		    // We could instead store an LLCapabilityListener*, making +		    // setRegionNameAndZone() replace the instance. Would that pose +		    // consistency problems? Can we even request a capability before calling +		    // setRegionNameAndZone()? +		    // For testability -- the new Michael Feathers paradigm -- +		    // LLCapabilityListener binds all the globals it expects to need at +		    // construction time. +		    mCapabilityListener(host.getString(), gMessageSystem, *region, +		                        gAgent.getID(), gAgent.getSessionID()) +	{ +	} + +	// The surfaces and other layers +	LLSurface*	mLandp; + +	// Region geometry data +	LLVector3d	mOriginGlobal;	// Location of southwest corner of region (meters) +	LLVector3d	mCenterGlobal;	// Location of center in world space (meters) +	LLHost		mHost; + +	// The unique ID for this region. +	LLUUID mRegionID; + +	// region/estate owner - usually null. +	LLUUID mOwnerID; + +	// Network statistics for the region's circuit... +	LLTimer mLastNetUpdate; + +	// Misc +	LLVLComposition *mCompositionp;		// Composition layer for the surface + +	LLVOCacheEntry::vocache_entry_map_t		mCacheMap; +	// time? +	// LRU info? + +	// Cache ID is unique per-region, across renames, moving locations, +	// etc. +	LLUUID mCacheID; + +	CapabilityMap mCapabilities; +	 +	LLEventPoll* mEventPoll; + +	/// Post an event to this LLCapabilityListener to invoke a capability message on +	/// this LLViewerRegion's server +	/// (https://wiki.lindenlab.com/wiki/Viewer:Messaging/Messaging_Notes#Capabilities) +	LLCapabilityListener mCapabilityListener; + +	//spatial partitions for objects in this region +	std::vector<LLSpatialPartition*> mObjectPartition; + +	LLHTTPClient::ResponderPtr  mHttpResponderPtr ; +}; +  // support for secondlife:///app/region/{REGION} SLapps  // N.B. this is defined to work exactly like the classic secondlife://{REGION}  // However, the later syntax cannot support spaces in the region name because @@ -191,15 +257,12 @@ LLViewerRegion::LLViewerRegion(const U64 &handle,  							   const U32 grids_per_region_edge,   							   const U32 grids_per_patch_edge,   							   const F32 region_width_meters) -:	mCenterGlobal(), +:	mImpl(new LLViewerRegionImpl(this, host)),  	mHandle(handle), -	mHost( host ),  	mTimeDilation(1.0f),  	mName(""),  	mZoning(""), -	mOwnerID(),  	mIsEstateManager(FALSE), -	mCompositionp(NULL),  	mRegionFlags( REGION_FLAGS_DEFAULT ),  	mSimAccess( SIM_ACCESS_MIN ),  	mBillableFactor(1.0), @@ -212,37 +275,27 @@ LLViewerRegion::LLViewerRegion(const U64 &handle,  	mHttpUrl(""),  	mCacheLoaded(FALSE),  	mCacheDirty(FALSE), -	mCacheID(), -	mEventPoll(NULL),  	mReleaseNotesRequested(FALSE), -    // I'd prefer to set the LLCapabilityListener name to match the region -    // name -- it's disappointing that's not available at construction time. -    // We could instead store an LLCapabilityListener*, making -    // setRegionNameAndZone() replace the instance. Would that pose -    // consistency problems? Can we even request a capability before calling -    // setRegionNameAndZone()? -    // For testability -- the new Michael Feathers paradigm -- -    // LLCapabilityListener binds all the globals it expects to need at -    // construction time. -    mCapabilityListener(host.getString(), gMessageSystem, *this, -                        gAgent.getID(), gAgent.getSessionID()),  	mCapabilitiesReceived(false)  {  	mWidth = region_width_meters; -	mOriginGlobal = from_region_handle(handle);  +	mImpl->mOriginGlobal = from_region_handle(handle);   	updateRenderMatrix(); -	mLandp = new LLSurface('l', NULL); +	mImpl->mLandp = new LLSurface('l', NULL);  	// Create the composition layer for the surface -	mCompositionp = new LLVLComposition(mLandp, grids_per_region_edge, region_width_meters/grids_per_region_edge); -	mCompositionp->setSurface(mLandp); +	mImpl->mCompositionp = +		new LLVLComposition(mImpl->mLandp, +							grids_per_region_edge, +							region_width_meters / grids_per_region_edge); +	mImpl->mCompositionp->setSurface(mImpl->mLandp);  	// Create the surfaces -	mLandp->setRegion(this); -	mLandp->create(grids_per_region_edge, +	mImpl->mLandp->setRegion(this); +	mImpl->mLandp->create(grids_per_region_edge,  					grids_per_patch_edge, -					mOriginGlobal, +					mImpl->mOriginGlobal,  					mWidth);  	mParcelOverlay = new LLViewerParcelOverlay(this, region_width_meters); @@ -255,24 +308,24 @@ LLViewerRegion::LLViewerRegion(const U64 &handle,  	//create object partitions  	//MUST MATCH declaration of eObjectPartitions -	mObjectPartition.push_back(new LLHUDPartition());		//PARTITION_HUD -	mObjectPartition.push_back(new LLTerrainPartition());	//PARTITION_TERRAIN -	mObjectPartition.push_back(new LLVoidWaterPartition());	//PARTITION_VOIDWATER -	mObjectPartition.push_back(new LLWaterPartition());		//PARTITION_WATER -	mObjectPartition.push_back(new LLTreePartition());		//PARTITION_TREE -	mObjectPartition.push_back(new LLParticlePartition());	//PARTITION_PARTICLE -	mObjectPartition.push_back(new LLCloudPartition());		//PARTITION_CLOUD -	mObjectPartition.push_back(new LLGrassPartition());		//PARTITION_GRASS -	mObjectPartition.push_back(new LLVolumePartition());	//PARTITION_VOLUME -	mObjectPartition.push_back(new LLBridgePartition());	//PARTITION_BRIDGE -	mObjectPartition.push_back(new LLHUDParticlePartition());//PARTITION_HUD_PARTICLE -	mObjectPartition.push_back(NULL);						//PARTITION_NONE +	mImpl->mObjectPartition.push_back(new LLHUDPartition());		//PARTITION_HUD +	mImpl->mObjectPartition.push_back(new LLTerrainPartition());	//PARTITION_TERRAIN +	mImpl->mObjectPartition.push_back(new LLVoidWaterPartition());	//PARTITION_VOIDWATER +	mImpl->mObjectPartition.push_back(new LLWaterPartition());		//PARTITION_WATER +	mImpl->mObjectPartition.push_back(new LLTreePartition());		//PARTITION_TREE +	mImpl->mObjectPartition.push_back(new LLParticlePartition());	//PARTITION_PARTICLE +	mImpl->mObjectPartition.push_back(new LLCloudPartition());		//PARTITION_CLOUD +	mImpl->mObjectPartition.push_back(new LLGrassPartition());		//PARTITION_GRASS +	mImpl->mObjectPartition.push_back(new LLVolumePartition());	//PARTITION_VOLUME +	mImpl->mObjectPartition.push_back(new LLBridgePartition());	//PARTITION_BRIDGE +	mImpl->mObjectPartition.push_back(new LLHUDParticlePartition());//PARTITION_HUD_PARTICLE +	mImpl->mObjectPartition.push_back(NULL);						//PARTITION_NONE  }  void LLViewerRegion::initStats()  { -	mLastNetUpdate.reset(); +	mImpl->mLastNetUpdate.reset();  	mPacketsIn = 0;  	mBitsIn = 0;  	mLastBitsIn = 0; @@ -287,9 +340,9 @@ void LLViewerRegion::initStats()  LLViewerRegion::~LLViewerRegion()   { -	if(mHttpResponderPtr) +	if(mImpl->mHttpResponderPtr)  	{ -		(static_cast<BaseCapabilitiesComplete*>(mHttpResponderPtr.get()))->setRegion(NULL) ; +		(static_cast<BaseCapabilitiesComplete*>(mImpl->mHttpResponderPtr.get()))->setRegion(NULL) ;  	}  	gVLManager.cleanupData(this); @@ -301,21 +354,44 @@ LLViewerRegion::~LLViewerRegion()  	gObjectList.killObjects(this); -	delete mCompositionp; +	delete mImpl->mCompositionp;  	delete mParcelOverlay; -	delete mLandp; -	delete mEventPoll; -	LLHTTPSender::clearSender(mHost); +	delete mImpl->mLandp; +	delete mImpl->mEventPoll; +	LLHTTPSender::clearSender(mImpl->mHost);  	saveObjectCache(); -	std::for_each(mObjectPartition.begin(), mObjectPartition.end(), DeletePointer()); +	std::for_each(mImpl->mObjectPartition.begin(), mImpl->mObjectPartition.end(), DeletePointer()); + +	delete mImpl; +	mImpl = NULL; +} + +LLEventPump& LLViewerRegion::getCapAPI() const +{ +	return mImpl->mCapabilityListener.getCapAPI();  }  /*virtual*/   const LLHost&	LLViewerRegion::getHost() const				  {  -	return mHost;  +	return mImpl->mHost;  +} + +LLSurface & LLViewerRegion::getLand() const +{ +	return *mImpl->mLandp; +} + +const LLUUID& LLViewerRegion::getRegionID() const +{ +	return mImpl->mRegionID; +} + +void LLViewerRegion::setRegionID(const LLUUID& region_id) +{ +	mImpl->mRegionID = region_id;  }  void LLViewerRegion::loadObjectCache() @@ -330,7 +406,7 @@ void LLViewerRegion::loadObjectCache()  	if(LLVOCache::hasInstance())  	{ -		LLVOCache::getInstance()->readFromCache(mHandle, mCacheID, mCacheMap) ; +		LLVOCache::getInstance()->readFromCache(mHandle, mImpl->mCacheID, mImpl->mCacheMap) ;  	}  } @@ -342,32 +418,32 @@ void LLViewerRegion::saveObjectCache()  		return;  	} -	if (mCacheMap.empty()) +	if (mImpl->mCacheMap.empty())  	{  		return;  	}  	if(LLVOCache::hasInstance())  	{ -		LLVOCache::getInstance()->writeToCache(mHandle, mCacheID, mCacheMap, mCacheDirty) ; +		LLVOCache::getInstance()->writeToCache(mHandle, mImpl->mCacheID, mImpl->mCacheMap, mCacheDirty) ;  		mCacheDirty = FALSE;  	} -	for(LLVOCacheEntry::vocache_entry_map_t::iterator iter = mCacheMap.begin(); iter != mCacheMap.end(); ++iter) +	for(LLVOCacheEntry::vocache_entry_map_t::iterator iter = mImpl->mCacheMap.begin(); iter != mImpl->mCacheMap.end(); ++iter)  	{  		delete iter->second;  	} -	mCacheMap.clear(); +	mImpl->mCacheMap.clear();  }  void LLViewerRegion::sendMessage()  { -	gMessageSystem->sendMessage(mHost); +	gMessageSystem->sendMessage(mImpl->mHost);  }  void LLViewerRegion::sendReliableMessage()  { -	gMessageSystem->sendReliable(mHost); +	gMessageSystem->sendReliable(mImpl->mHost);  }  void LLViewerRegion::setFlags(BOOL b, U32 flags) @@ -384,12 +460,12 @@ void LLViewerRegion::setFlags(BOOL b, U32 flags)  void LLViewerRegion::setWaterHeight(F32 water_level)  { -	mLandp->setWaterHeight(water_level); +	mImpl->mLandp->setWaterHeight(water_level);  }  F32 LLViewerRegion::getWaterHeight() const  { -	return mLandp->getWaterHeight(); +	return mImpl->mLandp->getWaterHeight();  }  BOOL LLViewerRegion::isVoiceEnabled() const @@ -405,9 +481,9 @@ void LLViewerRegion::setRegionFlags(U32 flags)  void LLViewerRegion::setOriginGlobal(const LLVector3d &origin_global)   {  -	mOriginGlobal = origin_global;  +	mImpl->mOriginGlobal = origin_global;   	updateRenderMatrix(); -	mLandp->setOriginGlobal(origin_global); +	mImpl->mLandp->setOriginGlobal(origin_global);  	mWind.setOriginGlobal(origin_global);  	mCloudLayer.setOriginGlobal(origin_global);  	calculateCenterGlobal(); @@ -423,16 +499,34 @@ void LLViewerRegion::setTimeDilation(F32 time_dilation)  	mTimeDilation = time_dilation;  } +const LLVector3d & LLViewerRegion::getOriginGlobal() const +{ +	return mImpl->mOriginGlobal; +}  LLVector3 LLViewerRegion::getOriginAgent() const  { -	return gAgent.getPosAgentFromGlobal(mOriginGlobal); +	return gAgent.getPosAgentFromGlobal(mImpl->mOriginGlobal);  } +const LLVector3d & LLViewerRegion::getCenterGlobal() const +{ +	return mImpl->mCenterGlobal; +}  LLVector3 LLViewerRegion::getCenterAgent() const  { -	return gAgent.getPosAgentFromGlobal(mCenterGlobal); +	return gAgent.getPosAgentFromGlobal(mImpl->mCenterGlobal); +} + +void LLViewerRegion::setOwner(const LLUUID& owner_id) +{ +	mImpl->mOwnerID = owner_id; +} + +const LLUUID& LLViewerRegion::getOwner() const +{ +	return mImpl->mOwnerID;  }  void LLViewerRegion::setRegionNameAndZone	(const std::string& name_zone) @@ -557,7 +651,10 @@ void LLViewerRegion::processRegionInfo(LLMessageSystem* msg, void**)  	LLFloaterReporter::processRegionInfo(msg);  } - +void LLViewerRegion::setCacheID(const LLUUID& id) +{ +	mImpl->mCacheID = id; +}  S32 LLViewerRegion::renderPropertyLines()  { @@ -585,7 +682,7 @@ BOOL LLViewerRegion::idleUpdate(F32 max_update_time)  {  	LLMemType mt_ivr(LLMemType::MTYPE_IDLE_UPDATE_VIEWER_REGION);  	// did_update returns TRUE if we did at least one significant update -	BOOL did_update = mLandp->idleUpdate(max_update_time); +	BOOL did_update = mImpl->mLandp->idleUpdate(max_update_time);  	if (mParcelOverlay)  	{ @@ -600,7 +697,7 @@ BOOL LLViewerRegion::idleUpdate(F32 max_update_time)  // As above, but forcibly do the update.  void LLViewerRegion::forceUpdate()  { -	mLandp->idleUpdate(0.f); +	mImpl->mLandp->idleUpdate(0.f);  	if (mParcelOverlay)  	{ @@ -610,17 +707,21 @@ void LLViewerRegion::forceUpdate()  void LLViewerRegion::connectNeighbor(LLViewerRegion *neighborp, U32 direction)  { -	mLandp->connectNeighbor(neighborp->mLandp, direction); +	mImpl->mLandp->connectNeighbor(neighborp->mImpl->mLandp, direction);  	mCloudLayer.connectNeighbor(&(neighborp->mCloudLayer), direction);  }  void LLViewerRegion::disconnectAllNeighbors()  { -	mLandp->disconnectAllNeighbors(); +	mImpl->mLandp->disconnectAllNeighbors();  	mCloudLayer.disconnectAllNeighbors();  } +LLVLComposition * LLViewerRegion::getComposition() const +{ +	return mImpl->mCompositionp; +}  F32 LLViewerRegion::getCompositionXY(const S32 x, const S32 y) const  { @@ -714,10 +815,10 @@ F32 LLViewerRegion::getCompositionXY(const S32 x, const S32 y) const  void LLViewerRegion::calculateCenterGlobal()   { -	mCenterGlobal = mOriginGlobal; -	mCenterGlobal.mdV[VX] += 0.5 * mWidth; -	mCenterGlobal.mdV[VY] += 0.5 * mWidth; -	mCenterGlobal.mdV[VZ] = 0.5*mLandp->getMinZ() + mLandp->getMaxZ(); +	mImpl->mCenterGlobal = mImpl->mOriginGlobal; +	mImpl->mCenterGlobal.mdV[VX] += 0.5 * mWidth; +	mImpl->mCenterGlobal.mdV[VY] += 0.5 * mWidth; +	mImpl->mCenterGlobal.mdV[VZ] = 0.5 * mImpl->mLandp->getMinZ() + mImpl->mLandp->getMaxZ();  }  void LLViewerRegion::calculateCameraDistance() @@ -728,7 +829,7 @@ void LLViewerRegion::calculateCameraDistance()  std::ostream& operator<<(std::ostream &s, const LLViewerRegion ®ion)  {  	s << "{ "; -	s << region.mHost; +	s << region.mImpl->mHost;  	s << " mOriginGlobal = " << region.getOriginGlobal()<< "\n";      std::string name(region.getName()), zone(region.getZoning());      if (! name.empty()) @@ -748,9 +849,9 @@ std::ostream& operator<<(std::ostream &s, const LLViewerRegion ®ion)  void LLViewerRegion::updateNetStats()  { -	F32 dt = mLastNetUpdate.getElapsedTimeAndResetF32(); +	F32 dt = mImpl->mLastNetUpdate.getElapsedTimeAndResetF32(); -	LLCircuitData *cdp = gMessageSystem->mCircuitInfo.findCircuit(mHost); +	LLCircuitData *cdp = gMessageSystem->mCircuitInfo.findCircuit(mImpl->mHost);  	if (!cdp)  	{  		mAlive = false; @@ -779,10 +880,10 @@ void LLViewerRegion::updateNetStats()  U32 LLViewerRegion::getPacketsLost() const  { -	LLCircuitData *cdp = gMessageSystem->mCircuitInfo.findCircuit(mHost); +	LLCircuitData *cdp = gMessageSystem->mCircuitInfo.findCircuit(mImpl->mHost);  	if (!cdp)  	{ -		llinfos << "LLViewerRegion::getPacketsLost couldn't find circuit for " << mHost << llendl; +		llinfos << "LLViewerRegion::getPacketsLost couldn't find circuit for " << mImpl->mHost << llendl;  		return 0;  	}  	else @@ -791,6 +892,16 @@ U32 LLViewerRegion::getPacketsLost() const  	}  } +void LLViewerRegion::setHttpResponderPtrNULL() +{ +	mImpl->mHttpResponderPtr = NULL; +} + +const LLHTTPClient::ResponderPtr LLViewerRegion::getHttpResponderPtr() const +{ +	return mImpl->mHttpResponderPtr; +} +  BOOL LLViewerRegion::pointInRegionGlobal(const LLVector3d &point_global) const  {  	LLVector3 pos_region = getPosRegionFromGlobal(point_global); @@ -817,7 +928,7 @@ BOOL LLViewerRegion::pointInRegionGlobal(const LLVector3d &point_global) const  LLVector3 LLViewerRegion::getPosRegionFromGlobal(const LLVector3d &point_global) const  {  	LLVector3 pos_region; -	pos_region.setVec(point_global - mOriginGlobal); +	pos_region.setVec(point_global - mImpl->mOriginGlobal);  	return pos_region;  } @@ -825,7 +936,7 @@ LLVector3d LLViewerRegion::getPosGlobalFromRegion(const LLVector3 &pos_region) c  {  	LLVector3d pos_region_d;  	pos_region_d.setVec(pos_region); -	return pos_region_d + mOriginGlobal; +	return pos_region_d + mImpl->mOriginGlobal;  }  LLVector3 LLViewerRegion::getPosAgentFromRegion(const LLVector3 &pos_region) const @@ -842,7 +953,7 @@ LLVector3 LLViewerRegion::getPosRegionFromAgent(const LLVector3 &pos_agent) cons  F32 LLViewerRegion::getLandHeightRegion(const LLVector3& region_pos)  { -	return mLandp->resolveHeightRegion( region_pos ); +	return mImpl->mLandp->resolveHeightRegion( region_pos );  }  bool LLViewerRegion::isAlive() @@ -994,7 +1105,7 @@ void LLViewerRegion::updateCoarseLocations(LLMessageSystem* msg)  		// treat the target specially for the map  		if(i == target_index)  		{ -			LLVector3d global_pos(mOriginGlobal); +			LLVector3d global_pos(mImpl->mOriginGlobal);  			global_pos.mdV[VX] += (F64)(x_pos);  			global_pos.mdV[VY] += (F64)(y_pos);  			global_pos.mdV[VZ] += (F64)(z_pos) * 4.0; @@ -1034,7 +1145,7 @@ LLViewerRegion::eCacheUpdateResult LLViewerRegion::cacheFullUpdate(LLViewerObjec  	U32 local_id = objectp->getLocalID();  	U32 crc = objectp->getCRC(); -	LLVOCacheEntry* entry = get_if_there(mCacheMap, local_id, (LLVOCacheEntry*)NULL); +	LLVOCacheEntry* entry = get_if_there(mImpl->mCacheMap, local_id, (LLVOCacheEntry*)NULL);  	if (entry)  	{ @@ -1047,10 +1158,10 @@ LLViewerRegion::eCacheUpdateResult LLViewerRegion::cacheFullUpdate(LLViewerObjec  		}  		// Update the cache entry -		mCacheMap.erase(local_id); +		mImpl->mCacheMap.erase(local_id);  		delete entry;  		entry = new LLVOCacheEntry(local_id, crc, dp); -		mCacheMap[local_id] = entry; +		mImpl->mCacheMap[local_id] = entry;  		return CACHE_UPDATE_CHANGED;  	} @@ -1058,15 +1169,15 @@ LLViewerRegion::eCacheUpdateResult LLViewerRegion::cacheFullUpdate(LLViewerObjec  	// Create new entry and add to map  	eCacheUpdateResult result = CACHE_UPDATE_ADDED; -	if (mCacheMap.size() > MAX_OBJECT_CACHE_ENTRIES) +	if (mImpl->mCacheMap.size() > MAX_OBJECT_CACHE_ENTRIES)  	{ -		mCacheMap.erase(mCacheMap.begin()); +		mImpl->mCacheMap.erase(mImpl->mCacheMap.begin());  		result = CACHE_UPDATE_REPLACED;  	}  	entry = new LLVOCacheEntry(local_id, crc, dp); -	mCacheMap[local_id] = entry; +	mImpl->mCacheMap[local_id] = entry;  	return result;  } @@ -1076,7 +1187,7 @@ LLDataPacker *LLViewerRegion::getDP(U32 local_id, U32 crc, U8 &cache_miss_type)  {  	llassert(mCacheLoaded); -	LLVOCacheEntry* entry = get_if_there(mCacheMap, local_id, (LLVOCacheEntry*)NULL); +	LLVOCacheEntry* entry = get_if_there(mImpl->mCacheMap, local_id, (LLVOCacheEntry*)NULL);  	if (entry)  	{ @@ -1203,7 +1314,7 @@ void LLViewerRegion::dumpCache()  	}  	LLVOCacheEntry *entry; -	for(LLVOCacheEntry::vocache_entry_map_t::iterator iter = mCacheMap.begin(); iter != mCacheMap.end(); ++iter) +	for(LLVOCacheEntry::vocache_entry_map_t::iterator iter = mImpl->mCacheMap.begin(); iter != mImpl->mCacheMap.end(); ++iter)  	{  		entry = iter->second ; @@ -1217,7 +1328,7 @@ void LLViewerRegion::dumpCache()  		change_bin[changes]++;  	} -	llinfos << "Count " << mCacheMap.size() << llendl; +	llinfos << "Count " << mImpl->mCacheMap.size() << llendl;  	for (i = 0; i < BINS; i++)  	{  		llinfos << "Hits " << i << " " << hit_bin[i] << llendl; @@ -1360,10 +1471,10 @@ void LLViewerRegion::setSeedCapability(const std::string& url)  		return;      } -	delete mEventPoll; -	mEventPoll = NULL; +	delete mImpl->mEventPoll; +	mImpl->mEventPoll = NULL; -	mCapabilities.clear(); +	mImpl->mCapabilities.clear();  	setCapability("Seed", url);  	LLSD capabilityNames = LLSD::emptyArray(); @@ -1430,25 +1541,25 @@ void LLViewerRegion::setSeedCapability(const std::string& url)  	llinfos << "posting to seed " << url << llendl; -	mHttpResponderPtr = BaseCapabilitiesComplete::build(this) ; -	LLHTTPClient::post(url, capabilityNames, mHttpResponderPtr); +	mImpl->mHttpResponderPtr = BaseCapabilitiesComplete::build(this) ; +	LLHTTPClient::post(url, capabilityNames, mImpl->mHttpResponderPtr);  }  void LLViewerRegion::setCapability(const std::string& name, const std::string& url)  {  	if(name == "EventQueueGet")  	{ -		delete mEventPoll; -		mEventPoll = NULL; -		mEventPoll = new LLEventPoll(url, getHost()); +		delete mImpl->mEventPoll; +		mImpl->mEventPoll = NULL; +		mImpl->mEventPoll = new LLEventPoll(url, getHost());  	}  	else if(name == "UntrustedSimulatorMessage")  	{ -		LLHTTPSender::setSender(mHost, new LLCapHTTPSender(url)); +		LLHTTPSender::setSender(mImpl->mHost, new LLCapHTTPSender(url));  	}  	else  	{ -		mCapabilities[name] = url; +		mImpl->mCapabilities[name] = url;  		if(name == "GetTexture")  		{  			mHttpUrl = url ; @@ -1463,8 +1574,8 @@ bool LLViewerRegion::isSpecialCapabilityName(const std::string &name)  std::string LLViewerRegion::getCapability(const std::string& name) const  { -	CapabilityMap::const_iterator iter = mCapabilities.find(name); -	if(iter == mCapabilities.end()) +	CapabilityMap::const_iterator iter = mImpl->mCapabilities.find(name); +	if(iter == mImpl->mCapabilities.end())  	{  		return "";  	} @@ -1485,7 +1596,7 @@ void LLViewerRegion::logActiveCapabilities() const  {  	int count = 0;  	CapabilityMap::const_iterator iter; -	for (iter = mCapabilities.begin(); iter != mCapabilities.end(); iter++, count++) +	for (iter = mImpl->mCapabilities.begin(); iter != mImpl->mCapabilities.end(); ++iter, ++count)  	{  		if (!iter->second.empty())  		{ @@ -1497,9 +1608,9 @@ void LLViewerRegion::logActiveCapabilities() const  LLSpatialPartition* LLViewerRegion::getSpatialPartition(U32 type)  { -	if (type < mObjectPartition.size()) +	if (type < mImpl->mObjectPartition.size())  	{ -		return mObjectPartition[type]; +		return mImpl->mObjectPartition[type];  	}  	return NULL;  } diff --git a/indra/newview/llviewerregion.h b/indra/newview/llviewerregion.h index dd40b876cd..9c5b85b77f 100644 --- a/indra/newview/llviewerregion.h +++ b/indra/newview/llviewerregion.h @@ -33,20 +33,16 @@  #include "lldarray.h"  #include "llwind.h" -#include "llbbox.h"  #include "llcloud.h"  #include "llstat.h"  #include "v3dmath.h" -#include "llhost.h"  #include "llstring.h"  #include "llregionflags.h"  #include "lluuid.h" -#include "lldatapacker.h" -#include "llvocache.h"  #include "llweb.h"  #include "llcapabilityprovider.h" -#include "llcapabilitylistener.h"  #include "m4math.h"					// LLMatrix4 +#include "llhttpclient.h"  // Surface id's  #define LAND  1 @@ -65,6 +61,13 @@ class LLVOCache;  class LLVOCacheEntry;  class LLSpatialPartition;  class LLEventPump; +class LLCapabilityListener; +class LLDataPacker; +class LLDataPackerBinaryBuffer; +class LLHost; +class LLBBox; + +class LLViewerRegionImpl;  class LLViewerRegion: public LLCapabilityProvider // implements this interface  { @@ -159,19 +162,19 @@ public:  	F32  getTimeDilation() const				{ return mTimeDilation; }  	// Origin height is at zero. -	const LLVector3d &getOriginGlobal() const	{ return mOriginGlobal; } +	const LLVector3d &getOriginGlobal() const;  	LLVector3 getOriginAgent() const;  	// Center is at the height of the water table. -	const LLVector3d &getCenterGlobal() const	{ return mCenterGlobal; } +	const LLVector3d &getCenterGlobal() const;  	LLVector3 getCenterAgent() const;  	void setRegionNameAndZone(const std::string& name_and_zone);  	const std::string& getName() const				{ return mName; }  	const std::string& getZoning() const			{ return mZoning; } -	void setOwner(const LLUUID& owner_id) { mOwnerID = owner_id; } -	const LLUUID& getOwner() const { return mOwnerID; } +	void setOwner(const LLUUID& owner_id); +	const LLUUID& getOwner() const;  	// Is the current agent on the estate manager list for this region?  	void setIsEstateManager(BOOL b) { mIsEstateManager = b; } @@ -206,7 +209,7 @@ public:  	// can process the message.  	static void processRegionInfo(LLMessageSystem* msg, void**); -	void setCacheID(const LLUUID& id)			{ mCacheID = id; } +	void setCacheID(const LLUUID& id);  	F32	getWidth() const						{ return mWidth; } @@ -222,8 +225,8 @@ public:  	U32	getPacketsLost() const; -	void setHttpResponderPtrNULL() {mHttpResponderPtr = NULL ;} -	const LLHTTPClient::ResponderPtr getHttpResponderPtr() const {return mHttpResponderPtr ;} +	void setHttpResponderPtrNULL(); +	const LLHTTPClient::ResponderPtr getHttpResponderPtr() const;  	// Get/set named capability URLs for this region.  	void setSeedCapability(const std::string& url); @@ -238,21 +241,19 @@ public:  	static bool isSpecialCapabilityName(const std::string &name);  	void logActiveCapabilities() const; -    /// Capability-request exception -    typedef LLCapabilityListener::ArgError ArgError;      /// Get LLEventPump on which we listen for capability requests      /// (https://wiki.lindenlab.com/wiki/Viewer:Messaging/Messaging_Notes#Capabilities) -    LLEventPump& getCapAPI() { return mCapabilityListener.getCapAPI(); } +    LLEventPump& getCapAPI() const;      /// implements LLCapabilityProvider  	/*virtual*/ const LLHost& getHost() const;  	const U64 		&getHandle() const 			{ return mHandle; } -	LLSurface		&getLand() const			{ return *mLandp; } +	LLSurface		&getLand() const;  	// set and get the region id -	const LLUUID& getRegionID() const { return mRegionID; } -	void setRegionID(const LLUUID& region_id) { mRegionID = region_id; } +	const LLUUID& getRegionID() const; +	void setRegionID(const LLUUID& region_id);  	BOOL pointInRegionGlobal(const LLVector3d &point_global) const;  	LLVector3	getPosRegionFromGlobal(const LLVector3d &point_global) const; @@ -260,7 +261,7 @@ public:  	LLVector3	getPosAgentFromRegion(const LLVector3 ®ion_pos) const;  	LLVector3d	getPosGlobalFromRegion(const LLVector3 &offset) const; -	LLVLComposition *getComposition() const		{ return mCompositionp; } +	LLVLComposition *getComposition() const;  	F32 getCompositionXY(const S32 x, const S32 y) const;  	BOOL isOwnedSelf(const LLVector3& pos); @@ -347,34 +348,19 @@ public:  	LLDynamicArray<LLUUID> mMapAvatarIDs;  private: -	// The surfaces and other layers -	LLSurface*	mLandp; +	LLViewerRegionImpl * mImpl; -	// Region geometry data -	LLVector3d	mOriginGlobal;	// Location of southwest corner of region (meters) -	LLVector3d	mCenterGlobal;	// Location of center in world space (meters)  	F32			mWidth;			// Width of region on a side (meters) -  	U64			mHandle; -	LLHost		mHost; - -	// The unique ID for this region. -	LLUUID mRegionID; -  	F32			mTimeDilation;	// time dilation of physics simulation on simulator  	// simulator name  	std::string mName;  	std::string mZoning; -	// region/estate owner - usually null. -	LLUUID mOwnerID; -  	// Is this agent on the estate managers list for this region?  	BOOL mIsEstateManager; -	// Network statistics for the region's circuit... -	LLTimer mLastNetUpdate;  	U32		mPacketsIn;  	U32		mBitsIn;  	U32		mLastBitsIn; @@ -386,9 +372,6 @@ private:  	U32		mPingDelay;  	F32		mDeltaTime;				// Time since last measurement of lastPackets, Bits, etc -	// Misc -	LLVLComposition *mCompositionp;		// Composition layer for the surface -  	U32		mRegionFlags;			// includes damage flags  	U8		mSimAccess;  	F32 	mBillableFactor; @@ -398,46 +381,24 @@ private:  	// Information for Homestead / CR-53  	S32 mClassID;  	S32 mCPURatio; +  	std::string mColoName;  	std::string mProductSKU;  	std::string mProductName;  	std::string mHttpUrl ; -	  	// Maps local ids to cache entries.  	// Regions can have order 10,000 objects, so assume  	// a structure of size 2^14 = 16,000  	BOOL									mCacheLoaded;  	BOOL                                    mCacheDirty; -	LLVOCacheEntry::vocache_entry_map_t		mCacheMap; +  	LLDynamicArray<U32>						mCacheMissFull;  	LLDynamicArray<U32>						mCacheMissCRC; -	// time? -	// LRU info? -	// Cache ID is unique per-region, across renames, moving locations, -	// etc. -	LLUUID mCacheID; - -	typedef std::map<std::string, std::string> CapabilityMap; -	CapabilityMap mCapabilities; -	 -	LLEventPoll* mEventPoll; - -    /// Post an event to this LLCapabilityListener to invoke a capability message on -    /// this LLViewerRegion's server -    /// (https://wiki.lindenlab.com/wiki/Viewer:Messaging/Messaging_Notes#Capabilities) -    LLCapabilityListener mCapabilityListener; - -private:  	bool	mAlive;					// can become false if circuit disconnects  	bool	mCapabilitiesReceived; -	//spatial partitions for objects in this region -	std::vector<LLSpatialPartition*> mObjectPartition; - -	LLHTTPClient::ResponderPtr  mHttpResponderPtr ; -  	BOOL mReleaseNotesRequested;  }; diff --git a/indra/newview/llviewertexturelist.cpp b/indra/newview/llviewertexturelist.cpp index 5afed721ac..33e7328cd7 100644 --- a/indra/newview/llviewertexturelist.cpp +++ b/indra/newview/llviewertexturelist.cpp @@ -76,18 +76,23 @@ LLStat LLViewerTextureList::sFormattedMemStat(32, TRUE);  LLViewerTextureList gTextureList;  static LLFastTimer::DeclareTimer FTM_PROCESS_IMAGES("Process Images"); +U32 LLViewerTextureList::sRenderThreadID = 0 ;  ///////////////////////////////////////////////////////////////////////////////  LLViewerTextureList::LLViewerTextureList()   	: mForceResetTextureStats(FALSE),  	mUpdateStats(FALSE),  	mMaxResidentTexMemInMegaBytes(0), -	mMaxTotalTextureMemInMegaBytes(0) +	mMaxTotalTextureMemInMegaBytes(0), +	mInitialized(FALSE)  {  }  void LLViewerTextureList::init()  { +	sRenderThreadID = LLThread::currentID() ; + +	mInitialized = TRUE ;  	sNumImages = 0;  	mMaxResidentTexMemInMegaBytes = 0;  	mMaxTotalTextureMemInMegaBytes = 0 ; @@ -105,6 +110,10 @@ void LLViewerTextureList::doPreloadImages()  {  	LL_DEBUGS("ViewerImages") << "Preloading images..." << LL_ENDL; +	llassert_always(mInitialized) ;
 +	llassert_always(mImageList.empty()) ;
 +	llassert_always(mUUIDMap.empty()) ; +  	// Set the "missing asset" image  	LLViewerFetchedTexture::sMissingAssetImagep = LLViewerTextureManager::getFetchedTextureFromFile("missing_asset.tga", MIPMAP_NO, LLViewerFetchedTexture::BOOST_UI); @@ -300,6 +309,7 @@ void LLViewerTextureList::destroyGL(BOOL save_state)  void LLViewerTextureList::restoreGL()  { +	llassert_always(mInitialized) ;  	LLImageGL::restoreGL();  } @@ -477,8 +487,10 @@ LLViewerFetchedTexture *LLViewerTextureList::findImage(const LLUUID &image_id)  	return iter->second;  } -void LLViewerTextureList::addImageToList(LLViewerFetchedTexture *image) +void LLViewerTextureList::addImageToList(LLViewerFetchedTexture *image, U32 thread_id)  { +	llassert_always(mInitialized) ; +	llassert_always(sRenderThreadID == thread_id);  	llassert(image);  	if (image->isInImageList())  	{ @@ -492,8 +504,10 @@ void LLViewerTextureList::addImageToList(LLViewerFetchedTexture *image)  	image->setInImageList(TRUE) ;  } -void LLViewerTextureList::removeImageFromList(LLViewerFetchedTexture *image) +void LLViewerTextureList::removeImageFromList(LLViewerFetchedTexture *image, U32 thread_id)  { +	llassert_always(mInitialized) ; +	llassert_always(sRenderThreadID == thread_id);  	llassert(image);  	if (!image->isInImageList())  	{ @@ -690,9 +704,9 @@ void LLViewerTextureList::updateImagesDecodePriorities()  			if ((decode_priority_test < old_priority_test * .8f) ||  				(decode_priority_test > old_priority_test * 1.25f))  			{ -				removeImageFromList(imagep); +				removeImageFromList(imagep, sRenderThreadID);  				imagep->setDecodePriority(decode_priority); -				addImageToList(imagep); +				addImageToList(imagep, sRenderThreadID);  			}  			update_counter--;  		} @@ -769,9 +783,8 @@ void LLViewerTextureList::forceImmediateUpdate(LLViewerFetchedTexture* imagep)  	imagep->processTextureStats();  	F32 decode_priority = LLViewerFetchedTexture::maxDecodePriority() ;  	imagep->setDecodePriority(decode_priority); -	mImageList.insert(imagep); -	imagep->setInImageList(TRUE) ; - +	addImageToList(imagep); +	  	return ;  } @@ -864,7 +877,9 @@ void LLViewerTextureList::updateImagesUpdateStats()  void LLViewerTextureList::decodeAllImages(F32 max_time)  {  	LLTimer timer; -	 + +	llassert_always(sRenderThreadID == LLThread::currentID()); +  	// Update texture stats and priorities  	std::vector<LLPointer<LLViewerFetchedTexture> > image_list;  	for (image_priority_list_t::iterator iter = mImageList.begin(); @@ -882,8 +897,7 @@ void LLViewerTextureList::decodeAllImages(F32 max_time)  		imagep->processTextureStats();  		F32 decode_priority = imagep->calcDecodePriority();  		imagep->setDecodePriority(decode_priority); -		mImageList.insert(imagep); -		imagep->setInImageList(TRUE) ; +		addImageToList(imagep);  	}  	image_list.clear(); @@ -932,16 +946,19 @@ BOOL LLViewerTextureList::createUploadFile(const std::string& filename,  	LLPointer<LLImageFormatted> image = LLImageFormatted::createFromType(codec);  	if (image.isNull())  	{ +		image->setLastError("Couldn't open the image to be uploaded.");  		return FALSE;  	}	  	if (!image->load(filename))  	{ +		image->setLastError("Couldn't load the image to be uploaded.");  		return FALSE;  	}  	// Decompress or expand it in a raw image structure  	LLPointer<LLImageRaw> raw_image = new LLImageRaw;  	if (!image->decode(raw_image, 0.0f))  	{ +		image->setLastError("Couldn't decode the image to be uploaded.");  		return FALSE;  	}  	// Check the image constraints @@ -952,8 +969,15 @@ BOOL LLViewerTextureList::createUploadFile(const std::string& filename,  	}  	// Convert to j2c (JPEG2000) and save the file locally  	LLPointer<LLImageJ2C> compressedImage = convertToUploadFile(raw_image);	 +	if (compressedImage.isNull()) +	{ +		image->setLastError("Couldn't convert the image to jpeg2000."); +		llinfos << "Couldn't convert to j2c, file : " << filename << llendl; +		return FALSE; +	}  	if (!compressedImage->save(out_filename))  	{ +		image->setLastError("Couldn't create the jpeg2000 image for upload.");  		llinfos << "Couldn't create output file : " << out_filename << llendl;  		return FALSE;  	} @@ -961,6 +985,7 @@ BOOL LLViewerTextureList::createUploadFile(const std::string& filename,  	LLPointer<LLImageJ2C> integrity_test = new LLImageJ2C;  	if (!integrity_test->loadAndValidate( out_filename ))  	{ +		image->setLastError("The created jpeg2000 image is corrupt.");  		llinfos << "Image file : " << out_filename << " is corrupt" << llendl;  		return FALSE;  	} @@ -978,7 +1003,25 @@ LLPointer<LLImageJ2C> LLViewerTextureList::convertToUploadFile(LLPointer<LLImage  		(raw_image->getWidth() * raw_image->getHeight() <= LL_IMAGE_REZ_LOSSLESS_CUTOFF * LL_IMAGE_REZ_LOSSLESS_CUTOFF))  		compressedImage->setReversible(TRUE); -	compressedImage->encode(raw_image, 0.0f); + +	if (gSavedSettings.getBOOL("Jpeg2000AdvancedCompression")) +	{ +		// This test option will create jpeg2000 images with precincts for each level, RPCL ordering +		// and PLT markers. The block size is also optionally modifiable. +		// Note: the images hence created are compatible with older versions of the viewer. +		// Read the blocks and precincts size settings +		S32 block_size = gSavedSettings.getS32("Jpeg2000BlocksSize"); +		S32 precinct_size = gSavedSettings.getS32("Jpeg2000PrecinctsSize"); +		llinfos << "Advanced JPEG2000 Compression: precinct = " << precinct_size << ", block = " << block_size << llendl; +		compressedImage->initEncode(*raw_image, block_size, precinct_size, 0); +	} +	 +	if (!compressedImage->encode(raw_image, 0.0f)) +	{ +		llinfos << "convertToUploadFile : encode returns with error!!" << llendl; +		// Clear up the pointer so we don't leak that one +		compressedImage = NULL; +	}  	return compressedImage;  } diff --git a/indra/newview/llviewertexturelist.h b/indra/newview/llviewertexturelist.h index d508ce1ac6..d02b6be6b5 100644 --- a/indra/newview/llviewertexturelist.h +++ b/indra/newview/llviewertexturelist.h @@ -83,6 +83,7 @@ public:  	void dump();  	void destroyGL(BOOL save_state = TRUE);  	void restoreGL(); +	BOOL isInitialized() const {return mInitialized;}  	LLViewerFetchedTexture *findImage(const LLUUID &image_id); @@ -120,8 +121,8 @@ private:  	void addImage(LLViewerFetchedTexture *image);  	void deleteImage(LLViewerFetchedTexture *image); -	void addImageToList(LLViewerFetchedTexture *image); -	void removeImageFromList(LLViewerFetchedTexture *image); +	void addImageToList(LLViewerFetchedTexture *image, U32 thread_id = LLThread::currentID()); +	void removeImageFromList(LLViewerFetchedTexture *image, U32 thread_id = LLThread::currentID());  	LLViewerFetchedTexture * getImage(const LLUUID &image_id,									   									 BOOL usemipmap = TRUE, @@ -187,6 +188,7 @@ private:  	// simply holds on to LLViewerFetchedTexture references to stop them from being purged too soon  	std::set<LLPointer<LLViewerFetchedTexture> > mImagePreloads; +	BOOL mInitialized ;  	BOOL mUpdateStats;  	S32	mMaxResidentTexMemInMegaBytes;  	S32 mMaxTotalTextureMemInMegaBytes; @@ -206,30 +208,33 @@ public:  private:  	static S32 sNumImages;  	static void (*sUUIDCallback)(void**, const LLUUID &); + +	//debug use +	static U32 sRenderThreadID;  };  class LLUIImageList : public LLImageProviderInterface, public LLSingleton<LLUIImageList>  {  public:  	// LLImageProviderInterface -	/*virtual*/ LLUIImagePtr getUIImageByID(const LLUUID& id, S32 priority); -	/*virtual*/ LLUIImagePtr getUIImage(const std::string& name, S32 priority); +	/*virtual*/ LLPointer<LLUIImage> getUIImageByID(const LLUUID& id, S32 priority); +	/*virtual*/ LLPointer<LLUIImage> getUIImage(const std::string& name, S32 priority);  	void cleanUp();  	bool initFromFile(); -	LLUIImagePtr preloadUIImage(const std::string& name, const std::string& filename, BOOL use_mips, const LLRect& scale_rect); +	LLPointer<LLUIImage> preloadUIImage(const std::string& name, const std::string& filename, BOOL use_mips, const LLRect& scale_rect);  	static void onUIImageLoaded( BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* src_aux, S32 discard_level, BOOL final, void* userdata );  private: -	LLUIImagePtr loadUIImageByName(const std::string& name, const std::string& filename, +	LLPointer<LLUIImage> loadUIImageByName(const std::string& name, const std::string& filename,  		                           BOOL use_mips = FALSE, const LLRect& scale_rect = LLRect::null,   		                           LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_UI); -	LLUIImagePtr loadUIImageByID(const LLUUID& id, +	LLPointer<LLUIImage> loadUIImageByID(const LLUUID& id,  								 BOOL use_mips = FALSE, const LLRect& scale_rect = LLRect::null,   								 LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_UI); -	LLUIImagePtr loadUIImage(LLViewerFetchedTexture* imagep, const std::string& name, BOOL use_mips = FALSE, const LLRect& scale_rect = LLRect::null); +	LLPointer<LLUIImage> loadUIImage(LLViewerFetchedTexture* imagep, const std::string& name, BOOL use_mips = FALSE, const LLRect& scale_rect = LLRect::null);  	struct LLUIImageLoadData diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index e020296842..7728958ed8 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -79,6 +79,7 @@  #include "lltooltip.h"  #include "llmediaentry.h"  #include "llurldispatcher.h" +#include "raytrace.h"  // newview includes  #include "llagent.h" @@ -234,17 +235,12 @@ BOOL				gDisplayCameraPos = FALSE;  BOOL				gDisplayFOV = FALSE;  BOOL				gDisplayBadge = FALSE; -S32 CHAT_BAR_HEIGHT = 28;  -S32 OVERLAY_BAR_HEIGHT = 20; - -const U8 NO_FACE = 255; +static const U8 NO_FACE = 255;  BOOL gQuietSnapshot = FALSE;  const F32 MIN_AFK_TIME = 2.f; // minimum time after setting away state before coming back -const F32 MAX_FAST_FRAME_TIME = 0.5f; -const F32 FAST_FRAME_INCREMENT = 0.1f; -const F32 MIN_DISPLAY_SCALE = 0.75f; +static const F32 MIN_DISPLAY_SCALE = 0.75f;  std::string	LLViewerWindow::sSnapshotBaseName;  std::string	LLViewerWindow::sSnapshotDir; diff --git a/indra/newview/llviewerwindow.h b/indra/newview/llviewerwindow.h index 5eeb02b080..bb0023b787 100644 --- a/indra/newview/llviewerwindow.h +++ b/indra/newview/llviewerwindow.h @@ -38,13 +38,12 @@  #include "v3dmath.h"  #include "v2math.h" +#include "llcursortypes.h"  #include "llwindowcallbacks.h"  #include "lltimer.h"  #include "llstat.h"  #include "llmousehandler.h" -#include "llcursortypes.h"  #include "llhandle.h" -#include "llimage.h"  #include <boost/function.hpp>  #include <boost/signals2.hpp> @@ -59,6 +58,7 @@ class LLTool;  class LLVelocityBar;  class LLPanel;  class LLImageRaw; +class LLImageFormatted;  class LLHUDIcon;  class LLWindow;  class LLRootView; @@ -465,12 +465,6 @@ private:  	LLPointer<LLViewerObject>	mDragHoveredObject;  }; -void toggle_flying(void*); -void toggle_first_person(); -void toggle_build(void*); -void reset_viewer_state_on_sim(void); -void update_saved_window_size(const std::string& control,S32 delta_width, S32 delta_height); -  //  // Globals  // @@ -487,8 +481,6 @@ extern LLVector3        gDebugRaycastNormal;  extern LLVector3        gDebugRaycastBinormal;  extern S32				gDebugRaycastFaceHit; -extern S32 CHAT_BAR_HEIGHT;  -  extern BOOL			gDisplayCameraPos;  extern BOOL			gDisplayWindInfo;  extern BOOL			gDisplayFOV; diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index f1934933b5..79866dc5d2 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -38,9 +38,9 @@  #include <ctype.h>  #include "llaudioengine.h" -#include "llcachename.h"  #include "noise.h"  #include "sound_ids.h" +#include "raytrace.h"  #include "llagent.h" //  Get state values from here  #include "llagentcamera.h" diff --git a/indra/newview/llvoicechannel.cpp b/indra/newview/llvoicechannel.cpp index a71539266d..bd12328a6b 100644 --- a/indra/newview/llvoicechannel.cpp +++ b/indra/newview/llvoicechannel.cpp @@ -412,6 +412,7 @@ void LLVoiceChannel::doSetState(const EState& new_state)  {  	EState old_state = mState;  	mState = new_state; +  	if (!mStateChangedCallback.empty())  		mStateChangedCallback(old_state, mState, mCallDirection, mCallEndedByAgent);  } @@ -846,8 +847,13 @@ void LLVoiceChannelP2P::activate()  		// otherwise answering the call  		else  		{ -			LLVoiceClient::getInstance()->answerInvite(mSessionHandle); -			 +			if (!LLVoiceClient::getInstance()->answerInvite(mSessionHandle)) +			{ +				mCallEndedByAgent = false; +				mSessionHandle.clear(); +				handleError(ERROR_UNKNOWN); +				return; +			}  			// using the session handle invalidates it.  Clear it out here so we can't reuse it by accident.  			mSessionHandle.clear();  		} diff --git a/indra/newview/llvotree.cpp b/indra/newview/llvotree.cpp index 37a974be28..46025b46be 100644 --- a/indra/newview/llvotree.cpp +++ b/indra/newview/llvotree.cpp @@ -50,6 +50,7 @@  #include "pipeline.h"  #include "llspatialpartition.h"  #include "llnotificationsutil.h" +#include "raytrace.h"  extern LLPipeline gPipeline; diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index a207d3e050..ee54a938ba 100644 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -63,6 +63,8 @@  #include "llmediadataclient.h"  #include "llagent.h"  #include "llviewermediafocus.h" +#include "lldatapacker.h" +#include "llvocache.h"  const S32 MIN_QUIET_FRAMES_COALESCE = 30;  const F32 FORCE_SIMPLE_RENDER_AREA = 512.f; diff --git a/indra/newview/llwaterparammanager.cpp b/indra/newview/llwaterparammanager.cpp index 4b3a9a4dc3..67bb965f99 100644 --- a/indra/newview/llwaterparammanager.cpp +++ b/indra/newview/llwaterparammanager.cpp @@ -33,6 +33,7 @@  #include "pipeline.h"  #include "llsky.h" +#include "lldiriterator.h"  #include "llfloaterreg.h"  #include "llsliderctrl.h"  #include "llspinctrl.h" @@ -87,11 +88,12 @@ void LLWaterParamManager::loadAllPresets(const std::string& file_name)  	std::string path_name(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "windlight/water", ""));  	LL_DEBUGS2("AppInit", "Shaders") << "Loading Default water settings from " << path_name << LL_ENDL; -	bool found = true;			 +	bool found = true; +	LLDirIterator app_settings_iter(path_name, "*.xml");  	while(found)   	{  		std::string name; -		found = gDirUtilp->getNextFileInDir(path_name, "*.xml", name); +		found = app_settings_iter.next(name);  		if(found)  		{ @@ -113,11 +115,12 @@ void LLWaterParamManager::loadAllPresets(const std::string& file_name)  	std::string path_name2(gDirUtilp->getExpandedFilename( LL_PATH_USER_SETTINGS , "windlight/water", ""));  	LL_DEBUGS2("AppInit", "Shaders") << "Loading User water settings from " << path_name2 << LL_ENDL; -	found = true;			 +	found = true; +	LLDirIterator user_settings_iter(path_name2, "*.xml");  	while(found)   	{  		std::string name; -		found = gDirUtilp->getNextFileInDir(path_name2, "*.xml", name); +		found = user_settings_iter.next(name);  		if(found)  		{  			name=name.erase(name.length()-4); diff --git a/indra/newview/llwlparammanager.cpp b/indra/newview/llwlparammanager.cpp index e5f52dfc97..848efcbb49 100644 --- a/indra/newview/llwlparammanager.cpp +++ b/indra/newview/llwlparammanager.cpp @@ -31,6 +31,7 @@  #include "pipeline.h"  #include "llsky.h" +#include "lldiriterator.h"  #include "llfloaterreg.h"  #include "llsliderctrl.h"  #include "llspinctrl.h" @@ -100,11 +101,12 @@ void LLWLParamManager::loadPresets(const std::string& file_name)  	std::string path_name(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "windlight/skies", ""));  	LL_DEBUGS2("AppInit", "Shaders") << "Loading Default WindLight settings from " << path_name << LL_ENDL; -	bool found = true;			 +	bool found = true; +	LLDirIterator app_settings_iter(path_name, "*.xml");  	while(found)   	{  		std::string name; -		found = gDirUtilp->getNextFileInDir(path_name, "*.xml", name); +		found = app_settings_iter.next(name);  		if(found)  		{ @@ -126,11 +128,12 @@ void LLWLParamManager::loadPresets(const std::string& file_name)  	std::string path_name2(gDirUtilp->getExpandedFilename( LL_PATH_USER_SETTINGS , "windlight/skies", ""));  	LL_DEBUGS2("AppInit", "Shaders") << "Loading User WindLight settings from " << path_name2 << LL_ENDL; -	found = true;			 +	found = true; +	LLDirIterator user_settings_iter(path_name2, "*.xml");  	while(found)   	{  		std::string name; -		found = gDirUtilp->getNextFileInDir(path_name2, "*.xml", name); +		found = user_settings_iter.next(name);  		if(found)  		{  			name=name.erase(name.length()-4); diff --git a/indra/newview/llworld.cpp b/indra/newview/llworld.cpp index 8f50041474..fd42058c8a 100644 --- a/indra/newview/llworld.cpp +++ b/indra/newview/llworld.cpp @@ -50,6 +50,7 @@  #include "llviewerstats.h"  #include "llvlcomposition.h"  #include "llvoavatar.h" +#include "llvocache.h"  #include "llvowater.h"  #include "message.h"  #include "pipeline.h" diff --git a/indra/newview/skins/default/xui/en/floater_postcard.xml b/indra/newview/skins/default/xui/en/floater_postcard.xml index b4ecedd981..8da35e9d7f 100644 --- a/indra/newview/skins/default/xui/en/floater_postcard.xml +++ b/indra/newview/skins/default/xui/en/floater_postcard.xml @@ -36,6 +36,7 @@          Recipient's Email:      </text>      <line_editor +     control_name="LastPostcardRecipient"       follows="left|top"       height="20"       layout="topleft" diff --git a/indra/newview/skins/default/xui/en/floater_script_debug_panel.xml b/indra/newview/skins/default/xui/en/floater_script_debug_panel.xml index d1db5c17ba..ce96ea232e 100644 --- a/indra/newview/skins/default/xui/en/floater_script_debug_panel.xml +++ b/indra/newview/skins/default/xui/en/floater_script_debug_panel.xml @@ -20,5 +20,6 @@       parse_highlights="true"        read_only="true"       width="420" +     track_bottom="true"        word_wrap="true" />  </floater> diff --git a/indra/newview/skins/default/xui/en/floater_snapshot.xml b/indra/newview/skins/default/xui/en/floater_snapshot.xml index 857932e51a..e413228ddc 100644 --- a/indra/newview/skins/default/xui/en/floater_snapshot.xml +++ b/indra/newview/skins/default/xui/en/floater_snapshot.xml @@ -11,7 +11,7 @@   save_rect="true"   save_visibility="true"   title="SNAPSHOT PREVIEW" - width="215"> + width="245">      <floater.string       name="unknown">          unknown diff --git a/indra/newview/skins/default/xui/en/floater_sound_devices.xml b/indra/newview/skins/default/xui/en/floater_sound_devices.xml index c7c7a05af2..304987c3d5 100644 --- a/indra/newview/skins/default/xui/en/floater_sound_devices.xml +++ b/indra/newview/skins/default/xui/en/floater_sound_devices.xml @@ -11,7 +11,7 @@   save_rect="true"   single_instance="true"   bevel_style="in" - height="140" + height="164"   layout="topleft"   name="floater_sound_devices"   title="Sound Devices" @@ -25,4 +25,23 @@      left="2"      top="26"      class="panel_voice_device_settings"/> +  <text +    name="voice_label" +    top="136" +    left="12" +    height="14" +    width="80" +    layout="topleft" +    >Voice Chat</text> +  <check_box +    layout="topleft" +    control_name="EnableVoiceChat" +    follows="bottom|left" +    top="138" +    left="80" +    name="enable_voice" +    width="100" +    height="14" +    label="Enabled" +    />  </floater> diff --git a/indra/newview/skins/default/xui/en/floater_tools.xml b/indra/newview/skins/default/xui/en/floater_tools.xml index 85182c1c28..d0603cb30e 100644 --- a/indra/newview/skins/default/xui/en/floater_tools.xml +++ b/indra/newview/skins/default/xui/en/floater_tools.xml @@ -1856,26 +1856,26 @@ even though the user gets a free copy.              <spinner               follows="left|top"               height="19" -             increment="0.025" +             increment="0.02"               initial_value="0"               label="B"               label_width="10"               layout="topleft"               left_delta="0" -             max_val="0.95" +             max_val="0.98"               name="Path Limit Begin"               top_pad="3"               width="68" />              <spinner               follows="left|top"               height="19" -             increment="0.025" +             increment="0.02"               initial_value="1"               label="E"               label_width="10"               layout="topleft"               left_pad="10" -             min_val="0.05" +             min_val="0.02"               name="Path Limit End"               top_delta="0"               width="68" /> diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index 06614dd218..d0dd639249 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -6820,7 +6820,7 @@ Deed to group failed.     name="ReleaseLandThrottled"     type="notifytip">  The parcel [PARCEL_NAME] can not be abandoned at this time. -   tag>fail</tag> +   <tag>fail</tag>    </notification>    <notification diff --git a/indra/newview/skins/default/xui/en/panel_sound_devices.xml b/indra/newview/skins/default/xui/en/panel_sound_devices.xml index 9812281323..ccae7c5350 100644 --- a/indra/newview/skins/default/xui/en/panel_sound_devices.xml +++ b/indra/newview/skins/default/xui/en/panel_sound_devices.xml @@ -11,14 +11,6 @@  	  name="default_text">  		Default  	</panel.string> -	<panel.string -	  name="default system device"> -		Default system device -	</panel.string> -	<panel.string -	  name="no device"> -		No device -	</panel.string>  	<icon  		   height="18"  		   image_name="Microphone_On" diff --git a/indra/newview/skins/default/xui/es/strings.xml b/indra/newview/skins/default/xui/es/strings.xml index 75126e74c5..5a913c4c9d 100644 --- a/indra/newview/skins/default/xui/es/strings.xml +++ b/indra/newview/skins/default/xui/es/strings.xml @@ -3588,6 +3588,9 @@ Si sigues recibiendo este mensaje, contacta con [SUPPORT_SITE].  	<string name="conference-title-incoming">  		Conferencia con [AGENT_NAME]  	</string> +	<string name="inventory_item_offered-im"> +		Ofrecido el item del inventario +	</string>  	<string name="no_session_message">  		(La sesión de MI no existe)  	</string> diff --git a/indra/newview/skins/default/xui/pt/strings.xml b/indra/newview/skins/default/xui/pt/strings.xml index 6466f42c75..1dbbcafb0e 100644 --- a/indra/newview/skins/default/xui/pt/strings.xml +++ b/indra/newview/skins/default/xui/pt/strings.xml @@ -3587,6 +3587,9 @@ If you continue to receive this message, contact the [SUPPORT_SITE].  	<string name="conference-title-incoming">  		Conversa com [AGENT_NAME]  	</string> +	<string name="inventory_item_offered-im"> +		Oferta de item de inventário +	</string>  	<string name="no_session_message">  		(Sessão de MI inexistente)  	</string> diff --git a/indra/newview/skins/default/xui/zh/panel_login.xml b/indra/newview/skins/default/xui/zh/panel_login.xml new file mode 100644 index 0000000000..9d094ff731 --- /dev/null +++ b/indra/newview/skins/default/xui/zh/panel_login.xml @@ -0,0 +1,41 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="panel_login">	 +	<layout_stack name="login_widgets"> +		<layout_panel name="login"> +			<text name="username_text"> +				使用者名稱: +			</text>			 +			<text name="password_text"> +				密碼: +			</text> +			<check_box label="記住密碼" name="remember_check"/> +			<button label="登入" name="connect_btn"/> +			<text name="mode_selection_text"> +				模式: +			</text> +			<combo_box name="mode_combo" tool_tip="選擇一個登入模式"> +				<combo_box.item label="基礎" name="Basic"/> +				<combo_box.item label="進階" name="Advanced"/> +			</combo_box> +			<text name="start_location_text"> +				開始地點: +			</text> +			<combo_box name="start_location_combo"> +				<combo_box.item label="上一次的地點" name="MyLastLocation"/> +				<combo_box.item label="我的家" name="MyHome"/> +				<combo_box.item label="<輸入區域名>" name="Typeregionname"/> +			</combo_box> +		</layout_panel> +		<layout_panel name="links"> +			<text name="create_new_account_text"> +				註冊 +			</text> +			<text name="forgot_password_text"> +				忘記使用者名稱或密碼? +			</text> +			<text name="login_help"> +				如何登入? +			</text> +		</layout_panel> +	</layout_stack> +</panel> diff --git a/indra/newview/skins/minimal/xui/en/panel_bottomtray.xml b/indra/newview/skins/minimal/xui/en/panel_bottomtray.xml index 237af61717..d722c54081 100644 --- a/indra/newview/skins/minimal/xui/en/panel_bottomtray.xml +++ b/indra/newview/skins/minimal/xui/en/panel_bottomtray.xml @@ -115,7 +115,7 @@          top="5"       left="0"       height="23" -     name="speak_flyout_btn" +     name="flyout_btn"       label=""       tab_stop="false"       tool_tip="Change your sound preferences" diff --git a/indra/newview/tests/llremoteparcelrequest_test.cpp b/indra/newview/tests/llremoteparcelrequest_test.cpp index 9a6e08ee84..ed66066b0a 100644 --- a/indra/newview/tests/llremoteparcelrequest_test.cpp +++ b/indra/newview/tests/llremoteparcelrequest_test.cpp @@ -35,7 +35,6 @@  #include "llurlentry.h"  namespace { -	LLControlGroup s_saved_settings("dummy_settings");  	const LLUUID TEST_PARCEL_ID("11111111-1111-1111-1111-111111111111");  } @@ -64,13 +63,12 @@ LLMessageSystem * gMessageSystem;  char const* const _PREHASH_AgentID = 0;   // never dereferenced during this test  char const* const _PREHASH_AgentData = 0; // never dereferenced during this test  LLAgent gAgent; -LLAgent::LLAgent() : mAgentAccess(s_saved_settings) { } +LLAgent::LLAgent() : mAgentAccess(NULL) { }  LLAgent::~LLAgent() { }  void LLAgent::sendReliableMessage(void) { }  LLUUID gAgentSessionID;  LLUUID gAgentID;  LLUIColor::LLUIColor(void) { } -LLAgentAccess::LLAgentAccess(LLControlGroup & settings) : mSavedSettings(settings) { }  LLControlGroup::LLControlGroup(std::string const & name) : LLInstanceTracker<LLControlGroup, std::string>(name) { }  LLControlGroup::~LLControlGroup(void) { }  void LLUrlEntryParcel::processParcelInfo(const LLUrlEntryParcel::LLParcelData& parcel_data) { } diff --git a/indra/newview/tests/llviewerhelputil_test.cpp b/indra/newview/tests/llviewerhelputil_test.cpp index b425b50c8b..710881d811 100644 --- a/indra/newview/tests/llviewerhelputil_test.cpp +++ b/indra/newview/tests/llviewerhelputil_test.cpp @@ -73,11 +73,9 @@ static void substitute_string(std::string &input, const std::string &search, con  }  #include "../llagent.h" -LLAgent::LLAgent() : mAgentAccess(gSavedSettings) { } +LLAgent::LLAgent() : mAgentAccess(NULL) { }  LLAgent::~LLAgent() { }  bool LLAgent::isGodlike() const { return FALSE; } -LLAgentAccess::LLAgentAccess(LLControlGroup& settings) : mSavedSettings(settings) { } -LLUIColor::LLUIColor() {}  LLAgent gAgent; diff --git a/indra/newview/tests/llxmlrpclistener_test.cpp b/indra/newview/tests/llxmlrpclistener_test.cpp index 4d5df1043e..711c2a3d51 100644 --- a/indra/newview/tests/llxmlrpclistener_test.cpp +++ b/indra/newview/tests/llxmlrpclistener_test.cpp @@ -40,8 +40,10 @@  #include "llevents.h"  #include "lleventfilter.h"  #include "llsd.h" +#include "llhost.h"  #include "llcontrol.h"  #include "tests/wrapllerrs.h" +#include "tests/commtest.h"  LLControlGroup gSavedSettings("Global"); @@ -54,7 +56,8 @@ namespace tut      {          data():              pumps(LLEventPumps::instance()), -            uri("http://127.0.0.1:8000") +            uri(std::string("http://") + +                LLHost("127.0.0.1", commtest_data::getport("PORT")).getString())          {              // These variables are required by machinery used by              // LLXMLRPCTransaction. The values reflect reality for this test @@ -145,7 +148,7 @@ namespace tut          pumps.obtain("LLXMLRPCTransaction").post(request);          // Set the timer          F32 timeout(10); -        watchdog.eventAfter(timeout, LLSD().insert("timeout", 0)); +        watchdog.eventAfter(timeout, LLSD().with("timeout", 0));          // and pump "mainloop" until we get something, whether from          // LLXMLRPCListener or from the watchdog filter.          LLTimer timer; @@ -182,7 +185,7 @@ namespace tut          pumps.obtain("LLXMLRPCTransaction").post(request);          // Set the timer          F32 timeout(10); -        watchdog.eventAfter(timeout, LLSD().insert("timeout", 0)); +        watchdog.eventAfter(timeout, LLSD().with("timeout", 0));          // and pump "mainloop" until we get something, whether from          // LLXMLRPCListener or from the watchdog filter.          LLTimer timer; @@ -218,7 +221,7 @@ namespace tut          pumps.obtain("LLXMLRPCTransaction").post(request);          // Set the timer          F32 timeout(10); -        watchdog.eventAfter(timeout, LLSD().insert("timeout", 0)); +        watchdog.eventAfter(timeout, LLSD().with("timeout", 0));          // and pump "mainloop" until we get something, whether from          // LLXMLRPCListener or from the watchdog filter.          LLTimer timer; diff --git a/indra/newview/tests/test_llxmlrpc_peer.py b/indra/newview/tests/test_llxmlrpc_peer.py index 1c7204a6b6..281b72a058 100644 --- a/indra/newview/tests/test_llxmlrpc_peer.py +++ b/indra/newview/tests/test_llxmlrpc_peer.py @@ -37,7 +37,7 @@ from SimpleXMLRPCServer import SimpleXMLRPCServer  mydir = os.path.dirname(__file__)       # expected to be .../indra/newview/tests/  sys.path.insert(0, os.path.join(mydir, os.pardir, os.pardir, "lib", "python"))  sys.path.insert(1, os.path.join(mydir, os.pardir, os.pardir, "llmessage", "tests")) -from testrunner import run, debug +from testrunner import freeport, run, debug  class TestServer(SimpleXMLRPCServer):      def _dispatch(self, method, params): @@ -66,11 +66,16 @@ class TestServer(SimpleXMLRPCServer):          # Suppress error output as well          pass -class ServerRunner(Thread): -    def run(self): -        server = TestServer(('127.0.0.1', 8000)) -        debug("Starting XMLRPC server...\n") -        server.serve_forever() -  if __name__ == "__main__": -    sys.exit(run(server=ServerRunner(name="xmlrpc"), *sys.argv[1:])) +    # Instantiate a TestServer on the first free port in the specified port +    # range. Doing this inline is better than in a daemon thread: if it blows +    # up here, we'll get a traceback. If it blew up in some other thread, the +    # traceback would get eaten and we'd run the subject test program anyway. +    xmlrpcd, port = freeport(xrange(8000, 8020), +                             lambda port: TestServer(('127.0.0.1', port))) +    # Pass the selected port number to the subject test program via the +    # environment. We don't want to impose requirements on the test program's +    # command-line parsing -- and anyway, for C++ integration tests, that's +    # performed in TUT code rather than our own. +    os.environ["PORT"] = str(port) +    sys.exit(run(server=Thread(name="xmlrpc", target=xmlrpcd.serve_forever), *sys.argv[1:])) diff --git a/indra/viewer_components/updater/tests/llupdaterservice_test.cpp b/indra/viewer_components/updater/tests/llupdaterservice_test.cpp index 88ab5a2284..e19d5724f1 100644 --- a/indra/viewer_components/updater/tests/llupdaterservice_test.cpp +++ b/indra/viewer_components/updater/tests/llupdaterservice_test.cpp @@ -59,12 +59,6 @@ class LLDir_Mock : public LLDir  		return 0;  	} -	BOOL getNextFileInDir(const std::string &dirname,  -						  const std::string &mask,  -						  std::string &fname)  -	{ -		return false; -	}  	void getRandomFileInDir(const std::string &dirname,   							const std::string &mask,   							std::string &fname) {} | 
