diff options
| author | Adam Moss <moss@lindenlab.com> | 2009-02-03 17:56:26 +0000 | 
|---|---|---|
| committer | Adam Moss <moss@lindenlab.com> | 2009-02-03 17:56:26 +0000 | 
| commit | e188badaf29a1a02307f93864eed6737096bd9a1 (patch) | |
| tree | 767259ad3385fd9ede9722e04752bea008469f8c | |
| parent | 4ad54702fce32905402cb6055c085ac14de188a2 (diff) | |
QAR-1177 maint-viewer-12 + uploadfees-viewer combo mergeme
svn merge -r108355:109316
svn+ssh://svn.lindenlab.com/svn/linden/branches/moss/maint-viewer-12-uploadfees-qa108314
Whew.
101 files changed, 1214 insertions, 733 deletions
| diff --git a/doc/contributions.txt b/doc/contributions.txt index fb3f7ea466..2b0d3abd9e 100644 --- a/doc/contributions.txt +++ b/doc/contributions.txt @@ -29,6 +29,9 @@ Aimee Trescothick  	VWR-9255  Alejandro Rosenthal  	VWR-1184 +Aleric Inglewood +	VWR-10759 +	VWR-10837  Alissa Sabre  	VWR-81  	VWR-83 @@ -50,23 +53,25 @@ Alissa Sabre  	VWR-1351  	VWR-1353  	VWR-1410 +        VWR-1843  	VWR-2116  	VWR-2826  	VWR-3290 +	VWR-3410  	VWR-3857  	VWR-4010 -	VWR-3410 +	VWR-5575 +        VWR-5929 +        VWR-6384 +        VWR-6385  	VWR-6386 -	VWR-6384 -	VWR-6385 -	VWR-5929 -	VWR-6430 -	VWR-1843 -	VWR-6668 -	VWR-7153 -	VWR-7168 -	VWR-7087 -	VWR-7086 +        VWR-6430 +	VWR-6858 +        VWR-6668 +        VWR-7086 +        VWR-7087 +        VWR-7153 +        VWR-7168  	VWR-9190  	VWR-10728  Angus Boyd @@ -193,7 +198,6 @@ Hiro Sommambulist  	VWR-97  	VWR-100  	VWR-105 -	VWR-108  	VWR-118  	VWR-132  	VWR-136 @@ -219,9 +223,13 @@ Kage Pixel  	VWR-11  Kerutsen Sellery  	VWR-1350 +Khyota Wulluf +	VWR-9256  Kunnis Basiat  	VWR-82  	VWR-102 +Lockhart Cordoso +	VWR-108  maciek marksman  	CT-86  march Korda @@ -235,11 +243,13 @@ Matthew Dowd  McCabe Maxsted  	VWR-1318  	VWR-4065 +	VWR-4826  	VWR-7827  	VWR-7877  	VWR-7893  	VWR-8080  	VWR-8689 +	VWR-9007  Michelle2 Zenovka  	VWR-2652  	VWR-2662 @@ -254,6 +264,7 @@ Michelle2 Zenovka  	VWR-7831  	VWR-8889  	VWR-8310 +	VWR-9499  Mm Alder  	VWR-3777  	VWR-4794 @@ -351,6 +362,8 @@ Peekay Semyorka  	VWR-19  	VWR-49  	VWR-79 +Peter Lameth +	VWR-7331  princess niven  	VWR-5733          CT-85 @@ -378,6 +391,7 @@ SignpostMarv Martin  	VWR-155  	VWR-218  	VWR-373 +	VWR-8357  Simon Nolan  	VWR-409  SpacedOut Frye @@ -436,15 +450,36 @@ Whoops Babii  	VWR-631  	VWR-1640  	VWR-3340 +	VWR-4800 +	VWR-4802 +	VWR-4804 +	VWR-4805 +	VWR-4806 +	VWR-4808 +	VWR-4809 +	VWR-4811 +	VWR-4815 +	VWR-4816 +	VWR-4818  	VWR-5659 +	VWR-8291 +	VWR-8292 +	VWR-8293 +	VWR-8294 +	VWR-8295 +	VWR-8296 +	VWR-8297 +	VWR-8298  Wilton Lundquist  	VWR-7682  Zarkonnen Decosta  	VWR-253  Zi Ree +	VWR-423  	VWR-671  	VWR-682  	VWR-684 +	VWR-9127  	VWR-1140  Zipherius Turas  	VWR-76 diff --git a/indra/cmake/ViewerMiscLibs.cmake b/indra/cmake/ViewerMiscLibs.cmake index 68ee8817fd..2a8abdac23 100644 --- a/indra/cmake/ViewerMiscLibs.cmake +++ b/indra/cmake/ViewerMiscLibs.cmake @@ -2,7 +2,6 @@  include(Prebuilt)  if (NOT STANDALONE) -  use_prebuilt_binary(libstdc++)    use_prebuilt_binary(libuuid)    use_prebuilt_binary(vivox)    use_prebuilt_binary(fontconfig) diff --git a/indra/llcharacter/llanimationstates.cpp b/indra/llcharacter/llanimationstates.cpp index d62595cf09..365fb673f3 100644 --- a/indra/llcharacter/llanimationstates.cpp +++ b/indra/llcharacter/llanimationstates.cpp @@ -40,19 +40,19 @@  #include "llstring.h"  LLUUID AGENT_WALK_ANIMS[] = {ANIM_AGENT_WALK, ANIM_AGENT_RUN, ANIM_AGENT_CROUCHWALK, ANIM_AGENT_TURNLEFT, ANIM_AGENT_TURNRIGHT}; -S32 NUM_AGENT_WALK_ANIMS = sizeof(AGENT_WALK_ANIMS) / sizeof(LLUUID); +S32 NUM_AGENT_WALK_ANIMS = LL_ARRAY_SIZE(AGENT_WALK_ANIMS);  LLUUID AGENT_GUN_HOLD_ANIMS[] = {ANIM_AGENT_HOLD_RIFLE_R, ANIM_AGENT_HOLD_HANDGUN_R, ANIM_AGENT_HOLD_BAZOOKA_R, ANIM_AGENT_HOLD_BOW_L}; -S32 NUM_AGENT_GUN_HOLD_ANIMS = sizeof(AGENT_GUN_HOLD_ANIMS) / sizeof(LLUUID); +S32 NUM_AGENT_GUN_HOLD_ANIMS = LL_ARRAY_SIZE(AGENT_GUN_HOLD_ANIMS);  LLUUID AGENT_GUN_AIM_ANIMS[] = {ANIM_AGENT_AIM_RIFLE_R, ANIM_AGENT_AIM_HANDGUN_R, ANIM_AGENT_AIM_BAZOOKA_R, ANIM_AGENT_AIM_BOW_L}; -S32 NUM_AGENT_GUN_AIM_ANIMS = sizeof(AGENT_GUN_AIM_ANIMS) / sizeof(LLUUID); +S32 NUM_AGENT_GUN_AIM_ANIMS = LL_ARRAY_SIZE(AGENT_GUN_AIM_ANIMS);  LLUUID AGENT_NO_ROTATE_ANIMS[] = {ANIM_AGENT_SIT_GROUND, ANIM_AGENT_SIT_GROUND_CONSTRAINED, ANIM_AGENT_STANDUP}; -S32 NUM_AGENT_NO_ROTATE_ANIMS = sizeof(AGENT_NO_ROTATE_ANIMS) / sizeof(LLUUID); +S32 NUM_AGENT_NO_ROTATE_ANIMS = LL_ARRAY_SIZE(AGENT_NO_ROTATE_ANIMS);  LLUUID AGENT_STAND_ANIMS[] = {ANIM_AGENT_STAND, ANIM_AGENT_STAND_1, ANIM_AGENT_STAND_2, ANIM_AGENT_STAND_3, ANIM_AGENT_STAND_4}; -S32 NUM_AGENT_STAND_ANIMS = sizeof(AGENT_STAND_ANIMS) / sizeof(LLUUID); +S32 NUM_AGENT_STAND_ANIMS = LL_ARRAY_SIZE(AGENT_STAND_ANIMS);  LLAnimationLibrary gAnimLibrary; @@ -334,7 +334,7 @@ const LLAnimStateEntry gUserAnimStates[] = {  	LLAnimStateEntry("yes_head",				ANIM_AGENT_YES),  }; -const S32 gUserAnimStatesCount = sizeof(gUserAnimStates) / sizeof(gUserAnimStates[0]); +const S32 gUserAnimStatesCount = LL_ARRAY_SIZE(gUserAnimStates); diff --git a/indra/llcharacter/llmultigesture.h b/indra/llcharacter/llmultigesture.h index 39f2696f55..eb15f600ca 100644 --- a/indra/llcharacter/llmultigesture.h +++ b/indra/llcharacter/llmultigesture.h @@ -108,6 +108,8 @@ public:  }; +// Order must match the library_list in floater_preview_gesture.xml! +  enum EStepType  {  	STEP_ANIMATION = 0, diff --git a/indra/llcommon/llbase32.cpp b/indra/llcommon/llbase32.cpp index c8b6ffff38..5e6ced9ce1 100644 --- a/indra/llcommon/llbase32.cpp +++ b/indra/llcommon/llbase32.cpp @@ -146,8 +146,6 @@ base32_encode(char *dst, size_t size, const void *data, size_t len)  /* *TODO: Implement base32 encode. -#define ARRAY_LEN(a) (sizeof (a) / sizeof((a)[0])) -  static inline int  ascii_toupper(int c)  { @@ -173,7 +171,7 @@ base32_decode(char *dst, size_t size, const void *data, size_t len)    unsigned max_pad = 3;    if (0 == base32_map[0]) { -    for (i = 0; i < ARRAY_LEN(base32_map); i++) { +    for (i = 0; i < LL_ARRAY_SIZE(base32_map); i++) {        const char *x;        x = memchr(base32_alphabet, ascii_toupper(i), sizeof base32_alphabet); @@ -197,7 +195,7 @@ base32_decode(char *dst, size_t size, const void *data, size_t len)        }      } -    j = i % ARRAY_LEN(s); +    j = i % LL_ARRAY_SIZE(s);      s[j] = c;      if (7 == j) { @@ -209,7 +207,7 @@ base32_decode(char *dst, size_t size, const void *data, size_t len)        b[3] = ((s[4] & 1) << 7) | ((s[5] & 0x1f) << 2) | ((s[6] >> 3) & 0x03);        b[4] = ((s[6] & 0x07) << 5) | (s[7] & 0x1f); -      for (j = 0; j < ARRAY_LEN(b); j++) { +      for (j = 0; j < LL_ARRAY_SIZE(b); j++) {          if (q != end)            *q = b[j];          q++; diff --git a/indra/llcommon/llerrorlegacy.h b/indra/llcommon/llerrorlegacy.h index 8b8af4cc9d..143fe20180 100644 --- a/indra/llcommon/llerrorlegacy.h +++ b/indra/llcommon/llerrorlegacy.h @@ -53,6 +53,7 @@ const int LL_ERR_FILE_NOT_FOUND = -43;  const int LL_ERR_FILE_EMPTY     = -44;  const int LL_ERR_TCP_TIMEOUT    = -23016;  const int LL_ERR_CIRCUIT_GONE   = -23017; +const int LL_ERR_PRICE_MISMATCH = -23018; diff --git a/indra/llcommon/llfindlocale.cpp b/indra/llcommon/llfindlocale.cpp index a511d3ffed..505f5c540b 100644 --- a/indra/llcommon/llfindlocale.cpp +++ b/indra/llcommon/llfindlocale.cpp @@ -417,10 +417,8 @@ static const IDToCode primary_to_code[] = {  /*{LANG_WALON,      "wa"},*/    {LANG_CHINESE,    "zh"},  }; -static int num_primary_to_code = -  sizeof(primary_to_code) / sizeof(*primary_to_code); -static int num_both_to_code = -  sizeof(both_to_code) / sizeof(*both_to_code); +static int num_primary_to_code = LL_ARRAY_SIZE(primary_to_code); +static int num_both_to_code = LL_ARRAY_SIZE(both_to_code);  static const int  lcid_to_fl(LCID lcid, diff --git a/indra/llcommon/llmemory.cpp b/indra/llcommon/llmemory.cpp index 29f916bc46..a6de3d2d69 100644 --- a/indra/llcommon/llmemory.cpp +++ b/indra/llcommon/llmemory.cpp @@ -39,7 +39,7 @@  # include <sys/types.h>  # include <mach/task.h>  # include <mach/mach_init.h> -#elif defined(LL_LINUX) +#elif LL_LINUX || LL_SOLARIS  # include <unistd.h>  #endif @@ -389,6 +389,34 @@ bail:  	return rss;  } +#elif LL_SOLARIS +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> +#define _STRUCTURED_PROC 1 +#include <sys/procfs.h> + +U64 getCurrentRSS() +{ +	char path [LL_MAX_PATH];	/* Flawfinder: ignore */  + +	sprintf(path, "/proc/%d/psinfo", (int)getpid()); +	int proc_fd = -1; +	if((proc_fd = open(path, O_RDONLY)) == -1){ +		llwarns << "LLmemory::getCurrentRSS() unable to open " << path << ". Returning 0 RSS!" << llendl; +		return 0; +	} +	psinfo_t proc_psinfo; +	if(read(proc_fd, &proc_psinfo, sizeof(psinfo_t)) != sizeof(psinfo_t)){ +		llwarns << "LLmemory::getCurrentRSS() Unable to read from " << path << ". Returning 0 RSS!" << llendl; +		close(proc_fd); +		return 0; +	} + +	close(proc_fd); + +	return((U64)proc_psinfo.pr_rssize * 1024); +}  #else  U64 getCurrentRSS() diff --git a/indra/llcommon/llpreprocessor.h b/indra/llcommon/llpreprocessor.h index 1ac2c9422b..2e4fd4787a 100644 --- a/indra/llcommon/llpreprocessor.h +++ b/indra/llcommon/llpreprocessor.h @@ -40,7 +40,16 @@  #include <endian.h>  #endif	//	LL_LINUX -#if (defined(LL_WINDOWS) || (defined(LL_LINUX) && (__BYTE_ORDER == __LITTLE_ENDIAN)) || (defined(LL_DARWIN) && defined(__LITTLE_ENDIAN__))) +#if LL_SOLARIS +#   ifdef  __sparc     // Since we're talking Solaris 10 and up, only 64 bit is supported. +#      define LL_BIG_ENDIAN 1 +#      define LL_SOLARIS_ALIGNED_CPU 1     //  used to designate issues where SPARC alignment is addressed +#      define LL_SOLARIS_NON_MESA_GL 1      //  The SPARC GL does not provide a MESA-based GL API +#   endif +#   include <sys/isa_defs.h> // ensure we know which end is up +#endif // LL_SOLARIS + +#if (defined(LL_WINDOWS) || (defined(LL_LINUX) && (__BYTE_ORDER == __LITTLE_ENDIAN)) || (defined(LL_DARWIN) && defined(__LITTLE_ENDIAN__)) || (defined(LL_SOLARIS) && defined(__i386)))  #define LL_LITTLE_ENDIAN 1  #else  #define LL_BIG_ENDIAN 1 diff --git a/indra/llcommon/llprocessor.cpp b/indra/llcommon/llprocessor.cpp index c6f9d3c758..469e544b16 100644 --- a/indra/llcommon/llprocessor.cpp +++ b/indra/llcommon/llprocessor.cpp @@ -279,7 +279,7 @@ bool CProcessor::AnalyzeIntelProcessor()  	// Only override the brand if we have it in the lookup table.  We should  	// already have a string here from GetCPUInfo().  JC -	if (CPUInfo.uiBrandID < (sizeof(INTEL_BRAND)/sizeof(INTEL_BRAND[0]))) +	if ( CPUInfo.uiBrandID < LL_ARRAY_SIZE(INTEL_BRAND) )  	{  		strcpy(CPUInfo.strBrandID, INTEL_BRAND[CPUInfo.uiBrandID]); @@ -1665,6 +1665,10 @@ const ProcessorInfo *CProcessor::GetCPUInfo()  #elif LL_SOLARIS  #include <kstat.h> +#if defined(__i386) +#include <sys/auxv.h> +#endif +  // ======================  // Class constructor:  ///////////////////////// @@ -1778,6 +1782,37 @@ const ProcessorInfo *CProcessor::GetCPUInfo()  	// DEBUG llinfo << "The system has " << ncpus << " CPUs with a clock rate of " <<  uqwFrequency << "MHz." << llendl; +#if defined (__i386)  //  we really don't care about the CPU extensions on SPARC but on x86... + +	// Now get cpu extensions + +	uint_t ui; + +	(void) getisax(&ui, 1); +	 +	if(ui & AV_386_FPU) +		CPUInfo._Ext.FPU_FloatingPointUnit = true; +	if(ui & AV_386_CX8) +		CPUInfo._Ext.CX8_COMPXCHG8B_Instruction = true; +	if(ui & AV_386_MMX) +		CPUInfo._Ext.MMX_MultimediaExtensions = true; +	if(ui & AV_386_AMD_MMX) +		CPUInfo._Ext.MMX_MultimediaExtensions = true; +	if(ui & AV_386_FXSR) +		CPUInfo._Ext.FXSR_FastStreamingSIMD_ExtensionsSaveRestore = true; +	if(ui & AV_386_SSE) +		 CPUInfo._Ext.SSE_StreamingSIMD_Extensions = true; +	if(ui & AV_386_SSE2) +		CPUInfo._Ext.SSE2_StreamingSIMD2_Extensions = true; +/* Left these here since they may get used later +	if(ui & AV_386_SSE3) +		CPUInfo._Ext.... = true; +	if(ui & AV_386_AMD_3DNow) +		CPUInfo._Ext.... = true; +	if(ui & AV_386_AMD_3DNowx) +		CPUInfo._Ext.... = true; +*/ +#endif  	return (&CPUInfo);  } diff --git a/indra/llcommon/llstring.h b/indra/llcommon/llstring.h index 8f6626b501..d728221b54 100644 --- a/indra/llcommon/llstring.h +++ b/indra/llcommon/llstring.h @@ -38,6 +38,13 @@  #include <wchar.h>  #endif +#if LL_SOLARIS +// stricmp and strnicmp do not exist on Solaris: +#include <string.h> +#define stricmp strcasecmp +#define strnicmp strncasecmp +#endif +  const char LL_UNKNOWN_CHAR = '?';  #if LL_DARWIN || LL_LINUX || LL_SOLARIS diff --git a/indra/llcommon/llsys.cpp b/indra/llcommon/llsys.cpp index cf281e92e7..f68d86ff7c 100644 --- a/indra/llcommon/llsys.cpp +++ b/indra/llcommon/llsys.cpp @@ -59,6 +59,17 @@  #	include <sys/sysinfo.h>  const char MEMINFO_FILE[] = "/proc/meminfo";  const char CPUINFO_FILE[] = "/proc/cpuinfo"; +#elif LL_SOLARIS +#	include <stdio.h> +#	include <unistd.h> +#	include <sys/utsname.h> +#	define _STRUCTURED_PROC 1 +#	include <sys/procfs.h> +#	include <sys/types.h> +#	include <sys/stat.h> +#	include <fcntl.h> +#	include <errno.h> +extern int errno;  #endif diff --git a/indra/llcommon/lltimer.h b/indra/llcommon/lltimer.h index 452df2ee58..e2cf1c7689 100644 --- a/indra/llcommon/lltimer.h +++ b/indra/llcommon/lltimer.h @@ -33,7 +33,7 @@  #ifndef LL_TIMER_H					  #define LL_TIMER_H -#if LL_LINUX || LL_DARWIN +#if LL_LINUX || LL_DARWIN || LL_SOLARIS  #include <sys/time.h>  #endif  #include <limits.h> diff --git a/indra/llcommon/stdtypes.h b/indra/llcommon/stdtypes.h index 62fe7b98ff..6b25b2d355 100644 --- a/indra/llcommon/stdtypes.h +++ b/indra/llcommon/stdtypes.h @@ -105,6 +105,8 @@ typedef U32             		TPACKETID;  typedef U8 LLPCode; +#define	LL_ARRAY_SIZE( _kArray ) ( sizeof( (_kArray) ) / sizeof( _kArray[0] ) ) +  #if LL_LINUX && __GNUC__ <= 2  typedef int intptr_t;  #endif diff --git a/indra/llimage/llimage.cpp b/indra/llimage/llimage.cpp index 87d465fa81..bfa129ea1d 100644 --- a/indra/llimage/llimage.cpp +++ b/indra/llimage/llimage.cpp @@ -1137,7 +1137,7 @@ file_extensions[] =  	{ "dxt", IMG_CODEC_DXT },  	{ "png", IMG_CODEC_PNG }  }; -#define NUM_FILE_EXTENSIONS sizeof(file_extensions)/sizeof(file_extensions[0]) +#define NUM_FILE_EXTENSIONS LL_ARRAY_SIZE(file_extensions)  static std::string find_file(std::string &name, S8 *codec)  { diff --git a/indra/llimage/llimagetga.cpp b/indra/llimage/llimagetga.cpp index 6d03ccbf25..a6721bfa0f 100644 --- a/indra/llimage/llimagetga.cpp +++ b/indra/llimage/llimagetga.cpp @@ -105,7 +105,7 @@ LLImageTGA::LLImageTGA(const std::string& file_name)  LLImageTGA::~LLImageTGA()  { -	delete mColorMap; +	delete [] mColorMap;  }  BOOL LLImageTGA::updateData() diff --git a/indra/llinventory/lleconomy.cpp b/indra/llinventory/lleconomy.cpp index ad37c0c27a..4366d1eb2a 100644 --- a/indra/llinventory/lleconomy.cpp +++ b/indra/llinventory/lleconomy.cpp @@ -74,6 +74,18 @@ void LLGlobalEconomy::processEconomyData(LLMessageSystem *msg, LLGlobalEconomy*  	econ_data->setPricePublicObjectDelete(i);  	msg->getS32Fast(_PREHASH_Info, _PREHASH_PriceUpload, i);  	econ_data->setPriceUpload(i); +#if LL_LINUX +	// We can optionally fake the received upload price for testing. +	// Note that the server is within its rights to not obey our fake +	// price. :) +	const char* fakeprice_str = getenv("LL_FAKE_UPLOAD_PRICE"); +	if (fakeprice_str) +	{ +		S32 fakeprice = (S32)atoi(fakeprice_str); +		llwarns << "LL_FAKE_UPLOAD_PRICE: Faking upload price as L$" << fakeprice << llendl; +		econ_data->setPriceUpload(fakeprice); +	} +#endif  	msg->getS32Fast(_PREHASH_Info, _PREHASH_PriceRentLight, i);  	econ_data->setPriceRentLight(i);  	msg->getS32Fast(_PREHASH_Info, _PREHASH_TeleportMinPrice, i); diff --git a/indra/llmath/llvolume.cpp b/indra/llmath/llvolume.cpp index 7d01ba059c..1250f539f5 100644 --- a/indra/llmath/llvolume.cpp +++ b/indra/llmath/llvolume.cpp @@ -1973,34 +1973,29 @@ inline LLVector3 sculpt_xy_to_vector(U32 x, U32 y, U16 sculpt_width, U16 sculpt_  } -F32 LLVolume::sculptGetSurfaceArea(U16 sculpt_width, U16 sculpt_height, S8 sculpt_components, const U8* sculpt_data) +F32 LLVolume::sculptGetSurfaceArea()  {  	// test to see if image has enough variation to create non-degenerate geometry +	F32 area = 0; +  	S32 sizeS = mPathp->mPath.size();  	S32 sizeT = mProfilep->mProfile.size(); - -	F32 area = 0; -	 -	if ((sculpt_width != 0) && -		(sculpt_height != 0) && -		(sculpt_components != 0) && -		(sculpt_data != NULL)) +			 +	for (S32 s = 0; s < sizeS-1; s++)  	{ -		for (S32 s = 0; s < sizeS - 1; s++) +		for (S32 t = 0; t < sizeT-1; t++)  		{ -			for (S32 t = 0; t < sizeT - 1; t++) -			{ -				// convert image data to vectors -				LLVector3 p1 = sculpt_st_to_vector(s, t, sizeS, sizeT, sculpt_width, sculpt_height, sculpt_components, sculpt_data); -				LLVector3 p2 = sculpt_st_to_vector(s+1, t, sizeS, sizeT, sculpt_width, sculpt_height, sculpt_components, sculpt_data); -				LLVector3 p3 = sculpt_st_to_vector(s, t+1, sizeS, sizeT, sculpt_width, sculpt_height, sculpt_components, sculpt_data); - -				// compute the area of the parallelogram by taking the length of the cross product: -				// (parallegram is an approximation of two triangles) -				LLVector3 cross = (p1 - p2) % (p1 - p3); -				area += cross.magVec(); -			} +			// get four corners of quad +			LLVector3 p1 = mMesh[(s  )*sizeT + (t  )].mPos; +			LLVector3 p2 = mMesh[(s+1)*sizeT + (t  )].mPos; +			LLVector3 p3 = mMesh[(s  )*sizeT + (t+1)].mPos; +			LLVector3 p4 = mMesh[(s+1)*sizeT + (t+1)].mPos; + +			// compute the area of the quad by taking the length of the cross product of the two triangles +			LLVector3 cross1 = (p1 - p2) % (p1 - p3); +			LLVector3 cross2 = (p4 - p2) % (p4 - p3); +			area += (cross1.magVec() + cross2.magVec()) / 2.0;  		}  	} @@ -2164,7 +2159,21 @@ S32 sculpt_sides(F32 detail)  // determine the number of vertices in both s and t direction for this sculpt  void sculpt_calc_mesh_resolution(U16 width, U16 height, U8 type, F32 detail, S32& s, S32& t)  { -	S32 vertices = sculpt_sides(detail); +	// this code has the following properties: +	// 1) the aspect ratio of the mesh is as close as possible to the ratio of the map +	//    while still using all available verts +	// 2) the mesh cannot have more verts than is allowed by LOD +	// 3) the mesh cannot have more verts than is allowed by the map +	 +	S32 max_vertices_lod = (S32)pow((double)sculpt_sides(detail), 2.0); +	S32 max_vertices_map = width * height / 4; +	 +	S32 vertices; +	if (max_vertices_map > 0) +		vertices = llmin(max_vertices_lod, max_vertices_map); +	else +		vertices = max_vertices_lod; +	  	F32 ratio;  	if ((width == 0) || (height == 0)) @@ -2173,13 +2182,13 @@ void sculpt_calc_mesh_resolution(U16 width, U16 height, U8 type, F32 detail, S32  		ratio = (F32) width / (F32) height; -	s = (S32)(vertices / fsqrtf(ratio)); +	s = (S32)fsqrtf(((F32)vertices / ratio)); -	s = llmax(s, 3);   // no degenerate sizes, please -	t = vertices * vertices / s; +	s = llmax(s, 4);              // no degenerate sizes, please +	t = vertices / s; -	t = llmax(t, 3);   // no degenerate sizes, please -	s = vertices * vertices / t; +	t = llmax(t, 4);              // no degenerate sizes, please +	s = vertices / t;  }  // sculpt replaces generate() for sculpted surfaces @@ -2216,20 +2225,25 @@ void LLVolume::sculpt(U16 sculpt_width, U16 sculpt_height, S8 sculpt_components,  	sNumMeshPoints -= mMesh.size();  	mMesh.resize(sizeS * sizeT);  	sNumMeshPoints += mMesh.size(); -	 -	if (!data_is_empty && sculptGetSurfaceArea(sculpt_width, sculpt_height, sculpt_components, sculpt_data) < SCULPT_MIN_AREA) -		data_is_empty = TRUE;  	//generate vertex positions -	if (data_is_empty) // if empty, make a placeholder mesh -	{ -		sculptGeneratePlaceholder(); -	}	 -	else +	if (!data_is_empty)  	{  		sculptGenerateMapVertices(sculpt_width, sculpt_height, sculpt_components, sculpt_data, sculpt_type); +		 +		if (sculptGetSurfaceArea() < SCULPT_MIN_AREA) +		{ +			data_is_empty = TRUE; +		}  	} +	if (data_is_empty) +	{ +		sculptGeneratePlaceholder(); +	} + + +	  	for (S32 i = 0; i < (S32)mProfilep->mFaces.size(); i++)  	{  		mFaceMask |= mProfilep->mFaces[i].mFaceID; diff --git a/indra/llmath/llvolume.h b/indra/llmath/llvolume.h index ab30d78333..e55fe52c91 100644 --- a/indra/llmath/llvolume.h +++ b/indra/llmath/llvolume.h @@ -943,8 +943,8 @@ public:  	void sculpt(U16 sculpt_width, U16 sculpt_height, S8 sculpt_components, const U8* sculpt_data, S32 sculpt_level);  private: -	F32 sculptGetSurfaceArea(U16 sculpt_width, U16 sculpt_height, S8 sculpt_components, const U8* sculpt_data);  	void sculptGenerateMapVertices(U16 sculpt_width, U16 sculpt_height, S8 sculpt_components, const U8* sculpt_data, U8 sculpt_type); +	F32 sculptGetSurfaceArea();  	void sculptGeneratePlaceholder();  	void sculptCalcMeshResolution(U16 width, U16 height, U8 type, S32& s, S32& t); diff --git a/indra/llmessage/llassetstorage.cpp b/indra/llmessage/llassetstorage.cpp index 4d10f1e3da..2966b602d7 100644 --- a/indra/llmessage/llassetstorage.cpp +++ b/indra/llmessage/llassetstorage.cpp @@ -1210,6 +1210,9 @@ const char* LLAssetStorage::getErrorString(S32 status)  	case LL_ERR_CIRCUIT_GONE:  		return "Circuit gone"; +	case LL_ERR_PRICE_MISMATCH: +		return "Viewer and server do not agree on price"; +  	default:  		return "Unknown status";  	} diff --git a/indra/llmessage/llinstantmessage.h b/indra/llmessage/llinstantmessage.h index 774349036d..96a2cf9cab 100644 --- a/indra/llmessage/llinstantmessage.h +++ b/indra/llmessage/llinstantmessage.h @@ -159,7 +159,7 @@ enum EInstantMessage  	IM_FRIENDSHIP_OFFERED = 38,  	IM_FRIENDSHIP_ACCEPTED = 39, -	IM_FRIENDSHIP_DECLINED = 40, +	IM_FRIENDSHIP_DECLINED_DEPRECATED = 40,  	IM_TYPING_START = 41,  	IM_TYPING_STOP = 42, diff --git a/indra/llrender/llgl.cpp b/indra/llrender/llgl.cpp index 01df71c570..74313974c9 100644 --- a/indra/llrender/llgl.cpp +++ b/indra/llrender/llgl.cpp @@ -65,7 +65,7 @@ LLMatrix4 gGLObliqueProjectionInverse;  LLGLNamePool::pool_list_t LLGLNamePool::sInstances; -#if (LL_WINDOWS || LL_LINUX) && !LL_MESA_HEADLESS +#if (LL_WINDOWS || LL_LINUX || LL_SOLARIS)  && !LL_MESA_HEADLESS  // ATI prototypes  // vertex blending prototypes  PFNGLWEIGHTPOINTERARBPROC			glWeightPointerARB = NULL; @@ -175,7 +175,7 @@ PFNGLGETUNIFORMIVARBPROC glGetUniformivARB = NULL;  PFNGLGETSHADERSOURCEARBPROC glGetShaderSourceARB = NULL;  // vertex shader prototypes -#if LL_LINUX +#if LL_LINUX || LL_SOLARIS  PFNGLVERTEXATTRIB1DARBPROC glVertexAttrib1dARB = NULL;  PFNGLVERTEXATTRIB1DVARBPROC glVertexAttrib1dvARB = NULL;  PFNGLVERTEXATTRIB1FARBPROC glVertexAttrib1fARB = NULL; @@ -194,7 +194,7 @@ PFNGLVERTEXATTRIB3FARBPROC glVertexAttrib3fARB = NULL;  PFNGLVERTEXATTRIB3FVARBPROC glVertexAttrib3fvARB = NULL;  PFNGLVERTEXATTRIB3SARBPROC glVertexAttrib3sARB = NULL;  PFNGLVERTEXATTRIB3SVARBPROC glVertexAttrib3svARB = NULL; -#endif // LL_LINUX +#endif // LL_LINUX || LL_SOLARIS  PFNGLVERTEXATTRIB4NBVARBPROC glVertexAttrib4nbvARB = NULL;  PFNGLVERTEXATTRIB4NIVARBPROC glVertexAttrib4nivARB = NULL;  PFNGLVERTEXATTRIB4NSVARBPROC glVertexAttrib4nsvARB = NULL; @@ -202,7 +202,7 @@ PFNGLVERTEXATTRIB4NUBARBPROC glVertexAttrib4nubARB = NULL;  PFNGLVERTEXATTRIB4NUBVARBPROC glVertexAttrib4nubvARB = NULL;  PFNGLVERTEXATTRIB4NUIVARBPROC glVertexAttrib4nuivARB = NULL;  PFNGLVERTEXATTRIB4NUSVARBPROC glVertexAttrib4nusvARB = NULL; -#if LL_LINUX +#if LL_LINUX  || LL_SOLARIS  PFNGLVERTEXATTRIB4BVARBPROC glVertexAttrib4bvARB = NULL;  PFNGLVERTEXATTRIB4DARBPROC glVertexAttrib4dARB = NULL;  PFNGLVERTEXATTRIB4DVARBPROC glVertexAttrib4dvARB = NULL; @@ -240,7 +240,7 @@ PFNGLGETVERTEXATTRIBFVARBPROC glGetVertexAttribfvARB = NULL;  PFNGLGETVERTEXATTRIBIVARBPROC glGetVertexAttribivARB = NULL;  PFNGLGETVERTEXATTRIBPOINTERVARBPROC glGetVertexAttribPointervARB = NULL;  PFNGLISPROGRAMARBPROC glIsProgramARB = NULL; -#endif // LL_LINUX +#endif // LL_LINUX || LL_SOLARIS  PFNGLBINDATTRIBLOCATIONARBPROC glBindAttribLocationARB = NULL;  PFNGLGETACTIVEATTRIBARBPROC glGetActiveAttribARB = NULL;  PFNGLGETATTRIBLOCATIONARBPROC glGetAttribLocationARB = NULL; @@ -249,10 +249,6 @@ PFNGLGETATTRIBLOCATIONARBPROC glGetAttribLocationARB = NULL;  PFNWGLSWAPINTERVALEXTPROC			wglSwapIntervalEXT = NULL;  #endif -#if LL_LINUX -PFNGLCOLORTABLEEXTPROC glColorTableEXT = NULL; -#endif // LL_LINUX -  #endif  LLGLManager gGLManager; @@ -490,7 +486,7 @@ std::string LLGLManager::getGLInfoString()  	info_str += std::string("GL_RENDERER    ") + ll_safe_string((const char *)glGetString(GL_RENDERER)) + std::string("\n");  	info_str += std::string("GL_VERSION     ") + ll_safe_string((const char *)glGetString(GL_VERSION)) + std::string("\n"); -#if !LL_MESA_HEADLESS +#if !LL_MESA_HEADLESS   	all_exts = (const char *)gGLHExts.mSysExts;  	LLStringUtil::replaceChar(all_exts, ' ', '\n');  	info_str += std::string("GL_EXTENSIONS:\n") + all_exts + std::string("\n"); @@ -597,7 +593,8 @@ void LLGLManager::initExtensions()  	mHasFragmentShader = ExtensionExists("GL_ARB_fragment_shader", gGLHExts.mSysExts) && ExtensionExists("GL_ARB_shading_language_100", gGLHExts.mSysExts);  #endif -#if LL_LINUX +#if LL_LINUX || LL_SOLARIS +	llinfos << "initExtensions() checking shell variables to adjust features..." << llendl;  	// Our extension support for the Linux Client is very young with some  	// potential driver gotchas, so offer a semi-secret way to turn it off.  	if (getenv("LL_GL_NOEXT"))	/* Flawfinder: ignore */ @@ -657,7 +654,7 @@ void LLGLManager::initExtensions()  		if (strchr(blacklist,'p')) mHasPointParameters = FALSE;//S  		if (strchr(blacklist,'q')) mHasFramebufferObject = FALSE;//S  	} -#endif // LL_LINUX +#endif // LL_LINUX || LL_SOLARIS  	if (!mHasMultitexture)  	{ @@ -720,7 +717,7 @@ void LLGLManager::initExtensions()  	glGetIntegerv(GL_MAX_ELEMENTS_VERTICES, (GLint*) &mGLMaxVertexRange);  	glGetIntegerv(GL_MAX_ELEMENTS_INDICES, (GLint*) &mGLMaxIndexRange); -#if (LL_WINDOWS || LL_LINUX) && !LL_MESA_HEADLESS +#if (LL_WINDOWS || LL_LINUX || LL_SOLARIS) && !LL_MESA_HEADLESS  	LL_DEBUGS("RenderInit") << "GL Probe: Getting symbols" << LL_ENDL;  	if (mHasVertexBufferObject)  	{ @@ -745,6 +742,7 @@ void LLGLManager::initExtensions()  	}  	if (mHasFramebufferObject)  	{ +		llinfos << "initExtensions() FramebufferObject-related procs..." << llendl;  		glIsRenderbufferEXT = (PFNGLISRENDERBUFFEREXTPROC) GLH_EXT_GET_PROC_ADDRESS("glIsRenderbufferEXT");  		glBindRenderbufferEXT = (PFNGLBINDRENDERBUFFEREXTPROC) GLH_EXT_GET_PROC_ADDRESS("glBindRenderbufferEXT");  		glDeleteRenderbuffersEXT = (PFNGLDELETERENDERBUFFERSEXTPROC) GLH_EXT_GET_PROC_ADDRESS("glDeleteRenderbuffersEXT"); @@ -763,7 +761,7 @@ void LLGLManager::initExtensions()  		glGetFramebufferAttachmentParameterivEXT = (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC) GLH_EXT_GET_PROC_ADDRESS("glGetFramebufferAttachmentParameterivEXT");  		glGenerateMipmapEXT = (PFNGLGENERATEMIPMAPEXTPROC) GLH_EXT_GET_PROC_ADDRESS("glGenerateMipmapEXT");  	} -#if !LL_LINUX +#if !LL_LINUX && !LL_SOLARIS  	// This is expected to be a static symbol on Linux GL implementations  	glDrawRangeElements = (PFNGLDRAWRANGEELEMENTSPROC)GLH_EXT_GET_PROC_ADDRESS("glDrawRangeElements");  	if (!glDrawRangeElements) @@ -775,6 +773,7 @@ void LLGLManager::initExtensions()  	if (mHasOcclusionQuery)  	{ +		llinfos << "initExtensions() OcclusionQuery-related procs..." << llendl;  		glGenQueriesARB = (PFNGLGENQUERIESARBPROC)GLH_EXT_GET_PROC_ADDRESS("glGenQueriesARB");  		glDeleteQueriesARB = (PFNGLDELETEQUERIESARBPROC)GLH_EXT_GET_PROC_ADDRESS("glDeleteQueriesARB");  		glIsQueryARB = (PFNGLISQUERYARBPROC)GLH_EXT_GET_PROC_ADDRESS("glIsQueryARB"); @@ -786,6 +785,7 @@ void LLGLManager::initExtensions()  	}  	if (mHasPointParameters)  	{ +		llinfos << "initExtensions() PointParameters-related procs..." << llendl;  		glPointParameterfARB = (PFNGLPOINTPARAMETERFARBPROC)GLH_EXT_GET_PROC_ADDRESS("glPointParameterfARB");  		glPointParameterfvARB = (PFNGLPOINTPARAMETERFVARBPROC)GLH_EXT_GET_PROC_ADDRESS("glPointParameterfvARB");  	} @@ -833,6 +833,7 @@ void LLGLManager::initExtensions()  	}  	if (mHasVertexShader)  	{ +		llinfos << "initExtensions() VertexShader-related procs..." << llendl;  		glGetAttribLocationARB = (PFNGLGETATTRIBLOCATIONARBPROC) GLH_EXT_GET_PROC_ADDRESS("glGetAttribLocationARB");  		glBindAttribLocationARB = (PFNGLBINDATTRIBLOCATIONARBPROC) GLH_EXT_GET_PROC_ADDRESS("glBindAttribLocationARB");  		glGetActiveAttribARB = (PFNGLGETACTIVEATTRIBARBPROC) GLH_EXT_GET_PROC_ADDRESS("glGetActiveAttribARB"); diff --git a/indra/llrender/llglheaders.h b/indra/llrender/llglheaders.h index 9c72c179f7..e9a9ad1a77 100644 --- a/indra/llrender/llglheaders.h +++ b/indra/llrender/llglheaders.h @@ -33,11 +33,215 @@  #ifndef LL_LLGLHEADERS_H  #define LL_LLGLHEADERS_H -#if LL_MESA +#if LL_SOLARIS +#   if defined(__sparc) +#      define I_NEED_OS2_H 	//  avoiding BOOL conflicts +#   endif +#   include "GL/gl.h" +#   if defined(__sparc) +#      undef I_NEED_OS2_H +#      ifdef BOOL +#         undef BOOL		// now get rid of Xmd.h crap +#      endif +#   endif +#   include "GL/glx.h" +#   define  GL_GLEXT_PROTOTYPES 1 +#   include "GL/glext.h" +#   include "GL/glu.h" +#   include "GL/glx.h" +#   define  GLX_GLXEXT_PROTOTYPES 1 +#   include "GL/glxext.h" +//#   define  GLH_EXT_GET_PROC_ADDRESS(p) glXGetProcAddressARB((const GLubyte*)(p)) +#   define  GLH_EXT_GET_PROC_ADDRESS(p) glXGetProcAddress((const GLubyte*)(p)) +//  the X headers define 'Status'.  Undefine to avoid confusion. +#undef Status + +// The __APPLE__ kludge is to make glh_extensions.h not symbol-clash horribly +// This header is distributed with SL.  You'll find it in linden/libraries/include/GL/ +# define __APPLE__ +# include "GL/glh_extensions.h" +# undef __APPLE__ + + +// GL_ARB_vertex_buffer_object +extern PFNGLBINDBUFFERARBPROC		glBindBufferARB; +extern PFNGLDELETEBUFFERSARBPROC	glDeleteBuffersARB; +extern PFNGLGENBUFFERSARBPROC		glGenBuffersARB; +extern PFNGLISBUFFERARBPROC			glIsBufferARB; +extern PFNGLBUFFERDATAARBPROC		glBufferDataARB; +extern PFNGLBUFFERSUBDATAARBPROC	glBufferSubDataARB; +extern PFNGLGETBUFFERSUBDATAARBPROC glGetBufferSubDataARB; +extern PFNGLMAPBUFFERARBPROC		glMapBufferARB; +extern PFNGLUNMAPBUFFERARBPROC		glUnmapBufferARB; +extern PFNGLGETBUFFERPARAMETERIVARBPROC	glGetBufferParameterivARB; +extern PFNGLGETBUFFERPOINTERVARBPROC	glGetBufferPointervARB; + +// GL_ATI_vertex_array_object +extern PFNGLNEWOBJECTBUFFERATIPROC			glNewObjectBufferATI; +extern PFNGLISOBJECTBUFFERATIPROC			glIsObjectBufferATI; +extern PFNGLUPDATEOBJECTBUFFERATIPROC		glUpdateObjectBufferATI; +extern PFNGLGETOBJECTBUFFERFVATIPROC		glGetObjectBufferfvATI; +extern PFNGLGETOBJECTBUFFERIVATIPROC		glGetObjectBufferivATI; +extern PFNGLFREEOBJECTBUFFERATIPROC		    glFreeObjectBufferATI; +extern PFNGLARRAYOBJECTATIPROC				glArrayObjectATI; +extern PFNGLVERTEXATTRIBARRAYOBJECTATIPROC	glVertexAttribArrayObjectATI; +extern PFNGLGETARRAYOBJECTFVATIPROC			glGetArrayObjectfvATI; +extern PFNGLGETARRAYOBJECTIVATIPROC			glGetArrayObjectivATI; +extern PFNGLVARIANTARRAYOBJECTATIPROC		glVariantObjectArrayATI; +extern PFNGLGETVARIANTARRAYOBJECTFVATIPROC	glGetVariantArrayObjectfvATI; +extern PFNGLGETVARIANTARRAYOBJECTIVATIPROC	glGetVariantArrayObjectivATI; + +// GL_ARB_occlusion_query +extern PFNGLGENQUERIESARBPROC glGenQueriesARB; +extern PFNGLDELETEQUERIESARBPROC glDeleteQueriesARB; +extern PFNGLISQUERYARBPROC glIsQueryARB; +extern PFNGLBEGINQUERYARBPROC glBeginQueryARB; +extern PFNGLENDQUERYARBPROC glEndQueryARB; +extern PFNGLGETQUERYIVARBPROC glGetQueryivARB; +extern PFNGLGETQUERYOBJECTIVARBPROC glGetQueryObjectivARB; +extern PFNGLGETQUERYOBJECTUIVARBPROC glGetQueryObjectuivARB; + +// GL_ARB_point_parameters +extern PFNGLPOINTPARAMETERFARBPROC glPointParameterfARB; +extern PFNGLPOINTPARAMETERFVARBPROC glPointParameterfvARB; + +// GL_ARB_shader_objects +extern PFNGLDELETEOBJECTARBPROC glDeleteObjectARB; +extern PFNGLGETHANDLEARBPROC glGetHandleARB; +extern PFNGLDETACHOBJECTARBPROC glDetachObjectARB; +extern PFNGLCREATESHADEROBJECTARBPROC glCreateShaderObjectARB; +extern PFNGLSHADERSOURCEARBPROC glShaderSourceARB; +extern PFNGLCOMPILESHADERARBPROC glCompileShaderARB; +extern PFNGLCREATEPROGRAMOBJECTARBPROC glCreateProgramObjectARB; +extern PFNGLATTACHOBJECTARBPROC glAttachObjectARB; +extern PFNGLLINKPROGRAMARBPROC glLinkProgramARB; +extern PFNGLUSEPROGRAMOBJECTARBPROC glUseProgramObjectARB; +extern PFNGLVALIDATEPROGRAMARBPROC glValidateProgramARB; +extern PFNGLUNIFORM1FARBPROC glUniform1fARB; +extern PFNGLUNIFORM2FARBPROC glUniform2fARB; +extern PFNGLUNIFORM3FARBPROC glUniform3fARB; +extern PFNGLUNIFORM4FARBPROC glUniform4fARB; +extern PFNGLUNIFORM1IARBPROC glUniform1iARB; +extern PFNGLUNIFORM2IARBPROC glUniform2iARB; +extern PFNGLUNIFORM3IARBPROC glUniform3iARB; +extern PFNGLUNIFORM4IARBPROC glUniform4iARB; +extern PFNGLUNIFORM1FVARBPROC glUniform1fvARB; +extern PFNGLUNIFORM2FVARBPROC glUniform2fvARB; +extern PFNGLUNIFORM3FVARBPROC glUniform3fvARB; +extern PFNGLUNIFORM4FVARBPROC glUniform4fvARB; +extern PFNGLUNIFORM1IVARBPROC glUniform1ivARB; +extern PFNGLUNIFORM2IVARBPROC glUniform2ivARB; +extern PFNGLUNIFORM3IVARBPROC glUniform3ivARB; +extern PFNGLUNIFORM4IVARBPROC glUniform4ivARB; +extern PFNGLUNIFORMMATRIX2FVARBPROC glUniformMatrix2fvARB; +extern PFNGLUNIFORMMATRIX3FVARBPROC glUniformMatrix3fvARB; +extern PFNGLUNIFORMMATRIX4FVARBPROC glUniformMatrix4fvARB; +extern PFNGLGETOBJECTPARAMETERFVARBPROC glGetObjectParameterfvARB; +extern PFNGLGETOBJECTPARAMETERIVARBPROC glGetObjectParameterivARB; +extern PFNGLGETINFOLOGARBPROC glGetInfoLogARB; +extern PFNGLGETATTACHEDOBJECTSARBPROC glGetAttachedObjectsARB; +extern PFNGLGETUNIFORMLOCATIONARBPROC glGetUniformLocationARB; +extern PFNGLGETACTIVEUNIFORMARBPROC glGetActiveUniformARB; +extern PFNGLGETUNIFORMFVARBPROC glGetUniformfvARB; +extern PFNGLGETUNIFORMIVARBPROC glGetUniformivARB; +extern PFNGLGETSHADERSOURCEARBPROC glGetShaderSourceARB; + +// GL_ARB_vertex_shader +extern PFNGLVERTEXATTRIB1DARBPROC glVertexAttrib1dARB; +extern PFNGLVERTEXATTRIB1DVARBPROC glVertexAttrib1dvARB; +extern PFNGLVERTEXATTRIB1FARBPROC glVertexAttrib1fARB; +extern PFNGLVERTEXATTRIB1FVARBPROC glVertexAttrib1fvARB; +extern PFNGLVERTEXATTRIB1SARBPROC glVertexAttrib1sARB; +extern PFNGLVERTEXATTRIB1SVARBPROC glVertexAttrib1svARB; +extern PFNGLVERTEXATTRIB2DARBPROC glVertexAttrib2dARB; +extern PFNGLVERTEXATTRIB2DVARBPROC glVertexAttrib2dvARB; +extern PFNGLVERTEXATTRIB2FARBPROC glVertexAttrib2fARB; +extern PFNGLVERTEXATTRIB2FVARBPROC glVertexAttrib2fvARB; +extern PFNGLVERTEXATTRIB2SARBPROC glVertexAttrib2sARB; +extern PFNGLVERTEXATTRIB2SVARBPROC glVertexAttrib2svARB; +extern PFNGLVERTEXATTRIB3DARBPROC glVertexAttrib3dARB; +extern PFNGLVERTEXATTRIB3DVARBPROC glVertexAttrib3dvARB; +extern PFNGLVERTEXATTRIB3FARBPROC glVertexAttrib3fARB; +extern PFNGLVERTEXATTRIB3FVARBPROC glVertexAttrib3fvARB; +extern PFNGLVERTEXATTRIB3SARBPROC glVertexAttrib3sARB; +extern PFNGLVERTEXATTRIB3SVARBPROC glVertexAttrib3svARB; +extern PFNGLVERTEXATTRIB4NBVARBPROC glVertexAttrib4nbvARB; +extern PFNGLVERTEXATTRIB4NIVARBPROC glVertexAttrib4nivARB; +extern PFNGLVERTEXATTRIB4NSVARBPROC glVertexAttrib4nsvARB; +extern PFNGLVERTEXATTRIB4NUBARBPROC glVertexAttrib4nubARB; +extern PFNGLVERTEXATTRIB4NUBVARBPROC glVertexAttrib4nubvARB; +extern PFNGLVERTEXATTRIB4NUIVARBPROC glVertexAttrib4nuivARB; +extern PFNGLVERTEXATTRIB4NUSVARBPROC glVertexAttrib4nusvARB; +extern PFNGLVERTEXATTRIB4BVARBPROC glVertexAttrib4bvARB; +extern PFNGLVERTEXATTRIB4DARBPROC glVertexAttrib4dARB; +extern PFNGLVERTEXATTRIB4DVARBPROC glVertexAttrib4dvARB; +extern PFNGLVERTEXATTRIB4FARBPROC glVertexAttrib4fARB; +extern PFNGLVERTEXATTRIB4FVARBPROC glVertexAttrib4fvARB; +extern PFNGLVERTEXATTRIB4IVARBPROC glVertexAttrib4ivARB; +extern PFNGLVERTEXATTRIB4SARBPROC glVertexAttrib4sARB; +extern PFNGLVERTEXATTRIB4SVARBPROC glVertexAttrib4svARB; +extern PFNGLVERTEXATTRIB4UBVARBPROC glVertexAttrib4ubvARB; +extern PFNGLVERTEXATTRIB4UIVARBPROC glVertexAttrib4uivARB; +extern PFNGLVERTEXATTRIB4USVARBPROC glVertexAttrib4usvARB; +extern PFNGLVERTEXATTRIBPOINTERARBPROC glVertexAttribPointerARB; +extern PFNGLENABLEVERTEXATTRIBARRAYARBPROC glEnableVertexAttribArrayARB; +extern PFNGLDISABLEVERTEXATTRIBARRAYARBPROC glDisableVertexAttribArrayARB; +extern PFNGLPROGRAMSTRINGARBPROC glProgramStringARB; +extern PFNGLBINDPROGRAMARBPROC glBindProgramARB; +extern PFNGLDELETEPROGRAMSARBPROC glDeleteProgramsARB; +extern PFNGLGENPROGRAMSARBPROC glGenProgramsARB; +extern PFNGLPROGRAMENVPARAMETER4DARBPROC glProgramEnvParameter4dARB; +extern PFNGLPROGRAMENVPARAMETER4DVARBPROC glProgramEnvParameter4dvARB; +extern PFNGLPROGRAMENVPARAMETER4FARBPROC glProgramEnvParameter4fARB; +extern PFNGLPROGRAMENVPARAMETER4FVARBPROC glProgramEnvParameter4fvARB; +extern PFNGLPROGRAMLOCALPARAMETER4DARBPROC glProgramLocalParameter4dARB; +extern PFNGLPROGRAMLOCALPARAMETER4DVARBPROC glProgramLocalParameter4dvARB; +extern PFNGLPROGRAMLOCALPARAMETER4FARBPROC glProgramLocalParameter4fARB; +extern PFNGLPROGRAMLOCALPARAMETER4FVARBPROC glProgramLocalParameter4fvARB; +extern PFNGLGETPROGRAMENVPARAMETERDVARBPROC glGetProgramEnvParameterdvARB; +extern PFNGLGETPROGRAMENVPARAMETERFVARBPROC glGetProgramEnvParameterfvARB; +extern PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC glGetProgramLocalParameterdvARB; +extern PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC glGetProgramLocalParameterfvARB; +extern PFNGLGETPROGRAMIVARBPROC glGetProgramivARB; +extern PFNGLGETPROGRAMSTRINGARBPROC glGetProgramStringARB; +extern PFNGLGETVERTEXATTRIBDVARBPROC glGetVertexAttribdvARB; +extern PFNGLGETVERTEXATTRIBFVARBPROC glGetVertexAttribfvARB; +extern PFNGLGETVERTEXATTRIBIVARBPROC glGetVertexAttribivARB; +extern PFNGLGETVERTEXATTRIBPOINTERVARBPROC glGetVertexAttribPointervARB; +extern PFNGLISPROGRAMARBPROC glIsProgramARB; +extern PFNGLBINDATTRIBLOCATIONARBPROC glBindAttribLocationARB; +extern PFNGLGETACTIVEATTRIBARBPROC glGetActiveAttribARB; +extern PFNGLGETATTRIBLOCATIONARBPROC glGetAttribLocationARB; + +extern PFNGLCOMPRESSEDTEXIMAGE2DARBPROC glCompressedTexImage2DARB; +extern PFNGLGETCOMPRESSEDTEXIMAGEARBPROC glGetCompressedTexImageARB; + +extern PFNGLCOLORTABLEEXTPROC glColorTableEXT; + +//GL_EXT_framebuffer_object +extern PFNGLISRENDERBUFFEREXTPROC glIsRenderbufferEXT; +extern PFNGLBINDRENDERBUFFEREXTPROC glBindRenderbufferEXT; +extern PFNGLDELETERENDERBUFFERSEXTPROC glDeleteRenderbuffersEXT; +extern PFNGLGENRENDERBUFFERSEXTPROC glGenRenderbuffersEXT; +extern PFNGLRENDERBUFFERSTORAGEEXTPROC glRenderbufferStorageEXT; +extern PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC glGetRenderbufferParameterivEXT; +extern PFNGLISFRAMEBUFFEREXTPROC glIsFramebufferEXT; +extern PFNGLBINDFRAMEBUFFEREXTPROC glBindFramebufferEXT; +extern PFNGLDELETEFRAMEBUFFERSEXTPROC glDeleteFramebuffersEXT; +extern PFNGLGENFRAMEBUFFERSEXTPROC glGenFramebuffersEXT; +extern PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC glCheckFramebufferStatusEXT; +extern PFNGLFRAMEBUFFERTEXTURE1DEXTPROC glFramebufferTexture1DEXT; +extern PFNGLFRAMEBUFFERTEXTURE2DEXTPROC glFramebufferTexture2DEXT; +extern PFNGLFRAMEBUFFERTEXTURE3DEXTPROC glFramebufferTexture3DEXT; +extern PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC glFramebufferRenderbufferEXT; +extern PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC glGetFramebufferAttachmentParameterivEXT; +extern PFNGLGENERATEMIPMAPEXTPROC glGenerateMipmapEXT; + +#elif LL_MESA  //----------------------------------------------------------------------------  // MESA headers  // quotes so we get libraries/.../GL/ version -#define GL_GLEXT_PROTOTYPES +#define GL_GLEXT_PROTOTYPES 1  #include "GL/gl.h"  #include "GL/glext.h"  #include "GL/glu.h" @@ -47,7 +251,7 @@  # include "GL/glh_extensions.h"  # undef __APPLE__ -#elif LL_LINUX +#elif LL_LINUX   //----------------------------------------------------------------------------  // Linux, MESA headers, but not necessarily assuming MESA runtime.  // quotes so we get libraries/.../GL/ version diff --git a/indra/llrender/llshadermgr.cpp b/indra/llrender/llshadermgr.cpp index 91c6a4ee35..1286e91e49 100644 --- a/indra/llrender/llshadermgr.cpp +++ b/indra/llrender/llshadermgr.cpp @@ -364,7 +364,7 @@ GLhandleARB LLShaderMgr::loadShaderFile(const std::string& filename, S32 & shade  	//copy file into memory -	while(fgets((char *)buff, 1024, file) != NULL && count < (sizeof(buff)/sizeof(buff[0])))  +	while( fgets((char *)buff, 1024, file) != NULL && count < LL_ARRAY_SIZE(buff) )   	{  		text[count++] = (GLcharARB *)strdup((char *)buff);   	} diff --git a/indra/llui/CMakeLists.txt b/indra/llui/CMakeLists.txt index 1b4d4e7d54..8ae0137a5e 100644 --- a/indra/llui/CMakeLists.txt +++ b/indra/llui/CMakeLists.txt @@ -68,6 +68,7 @@ set(llui_SOURCE_FILES      lluictrl.cpp      lluictrlfactory.cpp      lluistring.cpp +    lluitrans.cpp      llundo.cpp      llviewborder.cpp      llview.cpp @@ -124,6 +125,7 @@ set(llui_HEADER_FILES      lluifwd.h      llui.h      lluistring.h +    lluitrans.h      lluixmltags.h      llundo.h      llviewborder.h diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp index c4e928ce55..3d92280828 100644 --- a/indra/llui/llfloater.cpp +++ b/indra/llui/llfloater.cpp @@ -780,7 +780,7 @@ void LLFloater::snappedTo(const LLView* snap_view)  void LLFloater::userSetShape(const LLRect& new_rect)  { -	const LLRect& old_rect = getRect(); +	const LLRect old_rect = getRect();  	LLView::userSetShape(new_rect);  	// if not minimized, adjust all snapped dependents to new shape diff --git a/indra/llui/llmenugl.cpp b/indra/llui/llmenugl.cpp index ad980d67fc..64649b664c 100644 --- a/indra/llui/llmenugl.cpp +++ b/indra/llui/llmenugl.cpp @@ -59,6 +59,8 @@  #include "llresmgr.h"  #include "llui.h" +#include "lluitrans.h" +  #include "llstl.h"  #include "v2math.h" @@ -267,24 +269,24 @@ void LLMenuItemGL::appendAcceleratorString( std::string& st ) const  	{  		if ( mAcceleratorMask & MASK_MAC_CONTROL )  		{ -			st.append( "Ctrl-" ); +			st.append( LLUITrans::getString("accel-mac-control") );  		}  		else  		{ -			st.append( "Cmd-" );		// Symbol would be "\xE2\x8C\x98" +			st.append( LLUITrans::getString("accel-mac-command") );		// Symbol would be "\xE2\x8C\x98"  		}  	}  	if( mAcceleratorMask & MASK_ALT ) -		st.append( "Opt-" );		// Symbol would be "\xE2\x8C\xA5" +		st.append( LLUITrans::getString("accel-mac-option") );		// Symbol would be "\xE2\x8C\xA5"  	if( mAcceleratorMask & MASK_SHIFT ) -		st.append( "Shift-" );		// Symbol would be "\xE2\x8C\xA7" +		st.append( LLUITrans::getString("accel-mac-shift") );		// Symbol would be "\xE2\x8C\xA7"  #else  	if( mAcceleratorMask & MASK_CONTROL ) -		st.append( "Ctrl-" ); +		st.append( LLUITrans::getString("accel-win-control") );  	if( mAcceleratorMask & MASK_ALT ) -		st.append( "Alt-" ); +		st.append( LLUITrans::getString("accel-win-alt") );  	if( mAcceleratorMask & MASK_SHIFT ) -		st.append( "Shift-" ); +		st.append( LLUITrans::getString("accel-win-shift") );  #endif  	std::string keystr = LLKeyboard::stringFromKey( mAcceleratorKey ); diff --git a/indra/llui/llspinctrl.h b/indra/llui/llspinctrl.h index 424cda1207..dfd0eb3ac1 100644 --- a/indra/llui/llspinctrl.h +++ b/indra/llui/llspinctrl.h @@ -82,6 +82,7 @@ public:  	virtual void	setFocus( BOOL b );  	virtual void	clear();  	virtual BOOL	isDirty() const { return( mValue != mInitialValue ); } +	virtual void    resetDirty() { mInitialValue = mValue; }  	virtual void	setPrecision(S32 precision);  	virtual void	setMinValue(F32 min)			{ mMinValue = min; } diff --git a/indra/llui/lltexteditor.cpp b/indra/llui/lltexteditor.cpp index 3ad4270929..a626a7a1bc 100644 --- a/indra/llui/lltexteditor.cpp +++ b/indra/llui/lltexteditor.cpp @@ -1322,6 +1322,8 @@ BOOL LLTextEditor::handleMouseUp(S32 x, S32 y, MASK mask)  			setCursorAtLocalPos( x, y, TRUE );  			endSelection(); + +			updateScrollFromCursor();  		}  		if( !hasSelection() ) diff --git a/indra/llvfs/lldir.cpp b/indra/llvfs/lldir.cpp index 07e7a93f9f..d6a6eca341 100644 --- a/indra/llvfs/lldir.cpp +++ b/indra/llvfs/lldir.cpp @@ -433,7 +433,7 @@ std::string LLDir::getExpandedFilename(ELLPath location, const std::string& subd  		expanded_filename.assign("");  	} -	//llinfos << "*** EXPANDED FILENAME: <" << mExpandedFilename << ">" << llendl; +	//llinfos << "*** EXPANDED FILENAME: <" << expanded_filename << ">" << llendl;  	return expanded_filename;  } @@ -661,6 +661,11 @@ void LLDir::dumpCurrentDirectories()  	LL_DEBUGS2("AppInit","Directories") << "  TempDir:               " << getTempDir() << LL_ENDL;  	LL_DEBUGS2("AppInit","Directories") << "  CAFile:				 " << getCAFile() << LL_ENDL;  	LL_DEBUGS2("AppInit","Directories") << "  SkinDir:               " << getSkinDir() << LL_ENDL; + +#if LL_LIBXUL_ENABLED + 	LL_DEBUGS2("AppInit","Directories") << "  HTML Path:             " << getExpandedFilename( LL_PATH_HTML, "" ) << llendl; + 	LL_DEBUGS2("AppInit","Directories") << "  Mozilla Profile Path:  " << getExpandedFilename( LL_PATH_MOZILLA_PROFILE, "" ) << llendl; +#endif  } diff --git a/indra/llvfs/lldir.h b/indra/llvfs/lldir.h index 2bdc0ced00..760b6512a5 100644 --- a/indra/llvfs/lldir.h +++ b/indra/llvfs/lldir.h @@ -33,6 +33,11 @@  #ifndef LL_LLDIR_H  #define LL_LLDIR_H +#if LL_SOLARIS +#include <sys/param.h> +#define MAX_PATH MAXPATHLEN +#endif +  // these numbers *may* get serialized, so we need to be explicit  typedef enum ELLPath  { diff --git a/indra/llvfs/lldir_solaris.cpp b/indra/llvfs/lldir_solaris.cpp index 49e2d3e6c5..9553d923aa 100644 --- a/indra/llvfs/lldir_solaris.cpp +++ b/indra/llvfs/lldir_solaris.cpp @@ -37,14 +37,13 @@  #include "llrand.h"  #include <sys/types.h>  #include <sys/stat.h> -#include <fcntl.h> -#include <sys/param.h>  #include <unistd.h>  #include <glob.h>  #include <pwd.h>  #include <sys/utsname.h>  #define _STRUCTURED_PROC 1  #include <sys/procfs.h> +#include <fcntl.h>  static std::string getCurrentUserHome(char* fallback)  { @@ -83,7 +82,16 @@ LLDir_Solaris::LLDir_Solaris()  	mDirp = NULL;  	char tmp_str[LL_MAX_PATH];	/* Flawfinder: ignore */  -	getcwd(tmp_str, LL_MAX_PATH); +	if (getcwd(tmp_str, LL_MAX_PATH) == NULL) +	{ +		strcpy(tmp_str, "/tmp"); +		llwarns << "Could not get current directory; changing to " +				<< tmp_str << llendl; +		if (chdir(tmp_str) == -1) +		{ +			llerrs << "Could not change directory to " << tmp_str << llendl; +		} +	}  	mExecutableFilename = "";  	mExecutablePathAndName = ""; @@ -122,20 +130,35 @@ LLDir_Solaris::LLDir_Solaris()  		return;  	} +	char *p = execpath;			// nuke trash in link, if any exists +	int i = 0; +	while(*p != NULL && ++i < LL_MAX_PATH && isprint((int)(*p++))); +	*p = NULL; +  	mExecutablePathAndName = strdup(execpath);  	llinfos << "mExecutablePathAndName = [" << mExecutablePathAndName << "]" << llendl; +	//NOTE: Why force people to cd into the package directory? +	//      Look for SECONDLIFE env variable and use it, if set. + +	char *dcf = getenv("SECONDLIFE"); +	if(dcf != NULL){ +		(void)strcpy(path, dcf); +		(void)strcat(path, "/bin");	//NOTE:  make sure we point at the bin +		mExecutableDir = strdup(path); +	}else{  			// plunk a null at last '/' to get exec dir -	char *s = execpath + strlen(execpath) -1; -	while(*s != '/' && s != execpath){ -		--s; -	} +		char *s = execpath + strlen(execpath) -1; +		while(*s != '/' && s != execpath){ +			--s; +		} -	if(s != execpath){ -		*s = (char)NULL; +		if(s != execpath){ +			*s = (char)NULL; -		mExecutableDir = strdup(execpath); -		llinfos << "mExecutableDir = [" << mExecutableDir << "]" << llendl; +			mExecutableDir = strdup(execpath); +			llinfos << "mExecutableDir = [" << mExecutableDir << "]" << llendl; +		}  	}  	// *TODO: don't use /tmp, use $HOME/.secondlife/tmp or something. @@ -355,12 +378,16 @@ void LLDir_Solaris::getRandomFileInDir(const std::string &dirname, const std::st  std::string LLDir_Solaris::getCurPath()  {  	char tmp_str[LL_MAX_PATH];	/* Flawfinder: ignore */  -	getcwd(tmp_str, LL_MAX_PATH); +	if (getcwd(tmp_str, LL_MAX_PATH) == NULL) +	{ +		llwarns << "Could not get current directory" << llendl; +		tmp_str[0] = '\0'; +	}  	return tmp_str;  } -BOOL LLDir_Solaris::fileExists(const std::string &filename) +BOOL LLDir_Solaris::fileExists(const std::string &filename) const  {  	struct stat stat_data;  	// Check the age of the file diff --git a/indra/llvfs/lldir_solaris.h b/indra/llvfs/lldir_solaris.h index f6e7c3cba5..139754ba28 100644 --- a/indra/llvfs/lldir_solaris.h +++ b/indra/llvfs/lldir_solaris.h @@ -50,7 +50,7 @@ public:  	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, BOOL wrap);  	virtual void getRandomFileInDir(const std::string &dirname, const std::string &mask, std::string &fname); -	/*virtual*/ BOOL fileExists(const std::string &filename); +	/*virtual*/ BOOL fileExists(const std::string &filename) const;  private:  	DIR *mDirp; diff --git a/indra/llwindow/llwindowmacosx.cpp b/indra/llwindow/llwindowmacosx.cpp index 49fbb78d9d..8d446f18f1 100644 --- a/indra/llwindow/llwindowmacosx.cpp +++ b/indra/llwindow/llwindowmacosx.cpp @@ -702,7 +702,7 @@ BOOL LLWindowMacOSX::createContext(int x, int y, int width, int height, int bits  		"Radeon DDR",  		"Radeon VE",  		"GDI Generic" }; -		const S32 CARD_COUNT = sizeof(CARD_LIST)/sizeof(char*); +		const S32 CARD_COUNT = LL_ARRAY_SIZE(CARD_LIST);  		// Future candidates:  		// ProSavage/Twister diff --git a/indra/llwindow/llwindowsdl.cpp b/indra/llwindow/llwindowsdl.cpp index bd38a60fa2..6b1b6f4d60 100644 --- a/indra/llwindow/llwindowsdl.cpp +++ b/indra/llwindow/llwindowsdl.cpp @@ -85,8 +85,6 @@ static bool ATIbug = false;  // be only one object of this class at any time.  Currently this is true.  static LLWindowSDL *gWindowImplementation = NULL; -static BOOL was_fullscreen = FALSE; -  void maybe_lock_display(void)  { @@ -324,8 +322,7 @@ static int x11_detect_VRAM_kb_fp(FILE *fp, const char *prefix_str)  static int x11_detect_VRAM_kb()  { -#if LL_SOLARIS -#error Can this be done without an explicit architecture test, ie a test FOR xorg? Was followed by: && defined(__sparc) +#if LL_SOLARIS && defined(__sparc)        //  NOTE: there's no Xorg server on SPARC so just return 0        //        and allow SDL to attempt to get the amount of VRAM        return(0); @@ -421,7 +418,7 @@ BOOL LLWindowSDL::createContext(int x, int y, int width, int height, int bits, B  	if (SDL_Init(SDL_INIT_VIDEO) < 0)  	{  		llinfos << "sdl_init() failed! " << SDL_GetError() << llendl; -		setupFailure("window creation error", "error", OSMB_OK); +		setupFailure("sdl_init() failure,  window creation error", "error", OSMB_OK);  		return false;  	} @@ -442,7 +439,7 @@ BOOL LLWindowSDL::createContext(int x, int y, int width, int height, int bits, B  	if (!videoInfo)  	{  		llinfos << "SDL_GetVideoInfo() failed! " << SDL_GetError() << llendl; -		setupFailure("Window creation error", "Error", OSMB_OK); +		setupFailure("SDL_GetVideoInfo() failed, Window creation error", "Error", OSMB_OK);  		return FALSE;  	} @@ -498,7 +495,6 @@ BOOL LLWindowSDL::createContext(int x, int y, int width, int height, int bits, B          // *FIX: try to toggle vsync here?  	mFullscreen = fullscreen; -	was_fullscreen = fullscreen;  	int sdlflags = SDL_OPENGL | SDL_RESIZABLE | SDL_ANYFORMAT; @@ -574,7 +570,6 @@ BOOL LLWindowSDL::createContext(int x, int y, int width, int height, int bits, B  		if (mWindow)  		{  			mFullscreen = TRUE; -			was_fullscreen = TRUE;  			mFullscreenWidth   = mWindow->w;  			mFullscreenHeight  = mWindow->h;  			mFullscreenBits    = mWindow->format->BitsPerPixel; @@ -591,7 +586,6 @@ BOOL LLWindowSDL::createContext(int x, int y, int width, int height, int bits, B  			llwarns << "createContext: fullscreen creation failure. SDL: " << SDL_GetError() << llendl;  			// No fullscreen support  			mFullscreen = FALSE; -			was_fullscreen = FALSE;  			mFullscreenWidth   = -1;  			mFullscreenHeight  = -1;  			mFullscreenBits    = -1; @@ -673,8 +667,8 @@ BOOL LLWindowSDL::createContext(int x, int y, int width, int height, int bits, B  	// fixme: actually, it's REALLY important for picking that we get at  	// least 8 bits each of red,green,blue.  Alpha we can be a bit more  	// relaxed about if we have to. -#if LL_SOLARIS -#error && defined(__sparc) +#if LL_SOLARIS && defined(__sparc) +//  again the __sparc required because Xsun support, 32bit are very pricey on SPARC  	if(colorBits < 24)		//HACK:  on SPARC allow 24-bit color  #else  	if (colorBits < 32) @@ -682,8 +676,7 @@ BOOL LLWindowSDL::createContext(int x, int y, int width, int height, int bits, B  	{  		close();  		setupFailure( -#if LL_SOLARIS -#error && defined(__sparc) +#if LL_SOLARIS && defined(__sparc)  			"Second Life requires at least 24-bit color on SPARC to run in a window.\n"  			"Please use fbconfig to set your default color depth to 24 bits.\n"  			"You may also need to adjust the X11 setting in SMF.  To do so use\n" @@ -927,7 +920,6 @@ BOOL LLWindowSDL::getSize(LLCoordScreen *size)  	return (TRUE);      } -    llwarns << "LLWindowSDL::getPosition(): no window and not fullscreen!" << llendl;      return (FALSE);  } @@ -940,7 +932,6 @@ BOOL LLWindowSDL::getSize(LLCoordWindow *size)  	return (TRUE);      } -    llwarns << "LLWindowSDL::getPosition(): no window and not fullscreen!" << llendl;      return (FALSE);  } @@ -959,11 +950,18 @@ BOOL LLWindowSDL::setSize(const LLCoordScreen size)  {  	if(mWindow)  	{ -        // *FIX: (???) -		//SizeWindow(mWindow, size.mX, size.mY, true); -	} +		// Push a resize event onto SDL's queue - we'll handle it +		// when it comes out again. +		SDL_Event event; +		event.type = SDL_VIDEORESIZE; +		event.resize.w = size.mX; +		event.resize.h = size.mY; +		SDL_PushEvent(&event); // copied into queue -	return TRUE; +		return TRUE; +	} +		 +	return FALSE;  }  void LLWindowSDL::swapBuffers() @@ -1107,24 +1105,28 @@ F32 LLWindowSDL::getPixelAspectRatio()  } -// some of this stuff is to support 'temporarily windowed' mode so that -// dialogs are still usable in fullscreen.  HOWEVER! - it's not enabled/working -// yet. -static LLCoordScreen old_size; -static BOOL old_fullscreen; +// This is to support 'temporarily windowed' mode so that +// dialogs are still usable in fullscreen.  void LLWindowSDL::beforeDialog()  { +	bool running_x11 = false; +#if LL_X11 +	running_x11 = (mSDL_XWindowID != None); +#endif //LL_X11 +  	llinfos << "LLWindowSDL::beforeDialog()" << llendl; -	if (SDLReallyCaptureInput(FALSE) // must ungrab input so popup works! -	    && getSize(&old_size)) +	if (SDLReallyCaptureInput(FALSE)) // must ungrab input so popup works!  	{ -		old_fullscreen = was_fullscreen; -		 -		if (old_fullscreen) +		if (mFullscreen)  		{ -			// NOT YET WORKING -			//switchContext(FALSE, old_size, TRUE); +			// need to temporarily go non-fullscreen; bless SDL +			// for providing a SDL_WM_ToggleFullScreen() - though +			// it only works in X11 +			if (running_x11 && mWindow) +			{ +				SDL_WM_ToggleFullScreen(mWindow); +			}  		}  	} @@ -1150,17 +1152,24 @@ void LLWindowSDL::beforeDialog()  void LLWindowSDL::afterDialog()  { +	bool running_x11 = false; +#if LL_X11 +	running_x11 = (mSDL_XWindowID != None); +#endif //LL_X11 +  	llinfos << "LLWindowSDL::afterDialog()" << llendl;  	maybe_unlock_display(); -	if (old_fullscreen && !was_fullscreen) +	if (mFullscreen)  	{ -		// *FIX: NOT YET WORKING (see below) -		//switchContext(TRUE, old_size, TRUE); +		// need to restore fullscreen mode after dialog - only works +		// in X11 +		if (running_x11 && mWindow) +		{ +			SDL_WM_ToggleFullScreen(mWindow); +		}  	} -	// *FIX: we need to restore the GL context using -	// LLViewerWindow::restoreGL() - but how??  } @@ -1703,12 +1712,12 @@ void LLWindowSDL::gatherInput()  			// which confuses the focus code [SL-24071].  			if (event.active.gain != mHaveInputFocus)  			{ -				if (event.active.gain) +				mHaveInputFocus = !!event.active.gain; + +				if (mHaveInputFocus)  					mCallbacks->handleFocus(this);  				else  					mCallbacks->handleFocusLost(this); -			 -				mHaveInputFocus = !!event.active.gain;  			}                  }                  if (event.active.state & SDL_APPACTIVE) @@ -1716,10 +1725,10 @@ void LLWindowSDL::gatherInput()  			// Change in iconification/minimization state.  			if ((!event.active.gain) != mIsMinimized)  			{ -				mCallbacks->handleActivate(this, !!event.active.gain); -				llinfos << "SDL deiconification state switched to " << BOOL(event.active.gain) << llendl; -	  				mIsMinimized = (!event.active.gain); + +				mCallbacks->handleActivate(this, !mIsMinimized); +				llinfos << "SDL deiconification state switched to " << BOOL(event.active.gain) << llendl;  			}  			else  			{ @@ -2047,10 +2056,7 @@ S32 OSMessageBoxSDL(const std::string& text, const std::string& caption, U32 typ  	if(gWindowImplementation != NULL)  		gWindowImplementation->beforeDialog(); -	if (LLWindowSDL::ll_try_gtk_init() -	    // We can NOT expect to combine GTK and SDL's aggressive fullscreen -	    && ((NULL==gWindowImplementation) || (!was_fullscreen)) -	    ) +	if (LLWindowSDL::ll_try_gtk_init())  	{  		GtkWidget *win = NULL; @@ -2155,10 +2161,7 @@ BOOL LLWindowSDL::dialog_color_picker ( F32 *r, F32 *g, F32 *b)  	beforeDialog(); -	if (ll_try_gtk_init() -	    // We can NOT expect to combine GTK and SDL's aggressive fullscreen -	    && !was_fullscreen -	    ) +	if (ll_try_gtk_init())  	{  		GtkWidget *win = NULL; diff --git a/indra/llwindow/llwindowwin32.cpp b/indra/llwindow/llwindowwin32.cpp index 58d0967226..d1fdc8caa1 100644 --- a/indra/llwindow/llwindowwin32.cpp +++ b/indra/llwindow/llwindowwin32.cpp @@ -2931,7 +2931,7 @@ void LLWindowWin32::spawnWebBrowser(const std::string& escaped_url )  	/*  	std::string reg_path_str = gURLProtocolWhitelistHandler[i] + "\\shell\\open\\command";  	WCHAR reg_path_wstr[256]; -	mbstowcs(reg_path_wstr, reg_path_str.c_str(), sizeof(reg_path_wstr)/sizeof(reg_path_wstr[0])); +	mbstowcs( reg_path_wstr, reg_path_str.c_str(), LL_ARRAY_SIZE(reg_path_wstr) );  	HKEY key;  	WCHAR browser_open_wstr[1024]; diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 750771f6ce..9ec838ad46 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -41,6 +41,7 @@ if (WINDOWS)  endif (WINDOWS)  include_directories( +    ${DBUSGLIB_INCLUDE_DIRS}      ${ELFIO_INCLUDE_DIR}      ${LLAUDIO_INCLUDE_DIRS}      ${LLCHARACTER_INCLUDE_DIRS} @@ -937,11 +938,8 @@ if (WINDOWS)          res/arrowcop.cur          res/arrowcopmulti.cur          res/arrowdrag.cur -        res/bitmap2.bmp          res/circleandline.cur          res/icon1.ico -        res/install_icon.BMP -        res/install_icon.ico          res/llarrow.cur          res/llarrowdrag.cur          res/llarrowdragmulti.cur @@ -963,7 +961,6 @@ if (WINDOWS)          res/lltoolzoomout.cur          res/ll_icon.BMP          res/ll_icon.ico -        res/loginbackground.bmp          res/resource.h          res/toolbuy.cur          res/toolopen.cur @@ -973,8 +970,6 @@ if (WINDOWS)          res/toolpickobject3.cur          res/toolpipette.cur          res/toolsit.cur -        res/uninstall_icon.BMP -        res/uninstall_icon.ico          )      set_source_files_properties(${viewer_RESOURCE_FILES} @@ -1070,7 +1065,6 @@ set(viewer_XUI_FILES      skins/default/xui/en-us/floater_html_simple.xml      skins/default/xui/en-us/floater_hud.xml      skins/default/xui/en-us/floater_image_preview.xml -    skins/default/xui/en-us/floater_import.xml      skins/default/xui/en-us/floater_im.xml      skins/default/xui/en-us/floater_inspect.xml      skins/default/xui/en-us/floater_instant_message_ad_hoc.xml @@ -1535,6 +1529,25 @@ if (DARWIN)            ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py        ) + +      add_custom_command( +        TARGET package POST_BUILD +        COMMAND ${PYTHON_EXECUTABLE} +        ARGS +          ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py +          --grid=${GRID} +          --configuration=${CMAKE_CFG_INTDIR} +          --channel=${VIEWER_CHANNEL} +          --login_channel=${VIEWER_LOGIN_CHANNEL} +          --source=${CMAKE_CURRENT_SOURCE_DIR} +          --artwork=${ARTWORK_DIR} +          --build=${CMAKE_CURRENT_BINARY_DIR} +          --dest=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/${product}.app +          --touch=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/.${product}.touched +        DEPENDS +          ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py +      ) +    endif (PACKAGE)  endif (DARWIN) diff --git a/indra/newview/featuretable_solaris.txt b/indra/newview/featuretable_solaris.txt index 2a514eaab1..f24cbde5e2 100644 --- a/indra/newview/featuretable_solaris.txt +++ b/indra/newview/featuretable_solaris.txt @@ -35,6 +35,8 @@ RenderRippleWater	1	1  RenderTerrainDetail	1	2  VertexShaderEnable	1	1  RenderTextureMemoryMultiple		1	1.0 +UseOcclusion		1       1 +RenderCubeMap		1       1  //  // Class 0 Hardware (Unknown or just old) @@ -108,6 +110,8 @@ RenderAvatarVP		0	0  RenderLighting		1	0  RenderParticleCount	1	1024  RenderTerrainDetail 1	0 +RenderCubeMap		0	0 +UseOcclusion		0	0  list low @@ -146,6 +150,7 @@ RenderVBO			1	0  RenderAniso			1	0  RenderLighting		1	0  RenderTerrainDetail	1	0 +RenderCubeMap		0	0  list GeForce2  RenderVBO			1	1 @@ -157,6 +162,7 @@ RenderTerrainDetail	1	0  list GeForce3  list ATI +UseOcclusion		0	0  list Radeon8500  RenderLighting		1	0 diff --git a/indra/newview/res/install_icon.BMP b/indra/newview/installers/windows/install_icon.BMPBinary files differ index 09df573870..09df573870 100644 --- a/indra/newview/res/install_icon.BMP +++ b/indra/newview/installers/windows/install_icon.BMP diff --git a/indra/newview/installers/windows/install_icon.ico b/indra/newview/installers/windows/install_icon.icoBinary files differ new file mode 100644 index 0000000000..1e00530c90 --- /dev/null +++ b/indra/newview/installers/windows/install_icon.ico diff --git a/indra/newview/installers/windows/installer_template.nsi b/indra/newview/installers/windows/installer_template.nsi index 0a68d6badc..483568f974 100644 --- a/indra/newview/installers/windows/installer_template.nsi +++ b/indra/newview/installers/windows/installer_template.nsi @@ -68,8 +68,8 @@ Name ${INSTNAME}  SubCaption 0 $(LicenseSubTitleSetup)	; override "license agreement" text  BrandingText " "						; bottom of window text -Icon %%SOURCE%%\res\install_icon.ico	; our custom icon -UninstallIcon %%SOURCE%%\res\uninstall_icon.ico    ; our custom icon +Icon          %%SOURCE%%\installers\windows\install_icon.ico +UninstallIcon %%SOURCE%%\installers\windows\uninstall_icon.ico  WindowIcon on							; show our icon in left corner  BGGradient off							; no big background window  CRCCheck on								; make sure CRC is OK diff --git a/indra/newview/res/uninstall_icon.BMP b/indra/newview/installers/windows/uninstall_icon.BMPBinary files differ index 562b56676a..562b56676a 100644 --- a/indra/newview/res/uninstall_icon.BMP +++ b/indra/newview/installers/windows/uninstall_icon.BMP diff --git a/indra/newview/installers/windows/uninstall_icon.ico b/indra/newview/installers/windows/uninstall_icon.icoBinary files differ new file mode 100644 index 0000000000..c4ec6c70bd --- /dev/null +++ b/indra/newview/installers/windows/uninstall_icon.ico diff --git a/indra/newview/linux_tools/client-readme.txt b/indra/newview/linux_tools/client-readme.txt index 543a7a1881..757e4a08cc 100644 --- a/indra/newview/linux_tools/client-readme.txt +++ b/indra/newview/linux_tools/client-readme.txt @@ -95,12 +95,6 @@ you wish.  4. KNOWN ISSUES  -=-=-=-=-=-=-=- -These are the most commonly-encountered known issues which are specific to -the Beta release of the Linux client. - -* UPLOAD / SAVE / COLOR-PICKER DIALOGS - These only appear when the client -  is in 'windowed' mode, not 'fullscreen' mode. -  * UPDATING - when the client detects that a new version of Second Life    is available, it will ask you if you wish to download the new version.    This option is not implemented; to upgrade, you should manually download a diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp index efa7504a48..7ef757f1ba 100644 --- a/indra/newview/llagent.cpp +++ b/indra/newview/llagent.cpp @@ -4348,7 +4348,19 @@ void LLAgent::setFocusObject(LLViewerObject* object)  //-----------------------------------------------------------------------------  void LLAgent::setFocusGlobal(const LLPickInfo& pick)  { -	setFocusGlobal(pick.mPosGlobal, pick.mObjectID); +	LLViewerObject* objectp = gObjectList.findObject(pick.mObjectID); + +	if (objectp) +	{ +		// focus on object plus designated offset +		// which may or may not be same as pick.mPosGlobal +		setFocusGlobal(objectp->getPositionGlobal() + LLVector3d(pick.mObjectOffset), pick.mObjectID); +	} +	else +	{ +		// focus directly on point where user clicked +		setFocusGlobal(pick.mPosGlobal, pick.mObjectID); +	}  } @@ -5831,7 +5843,12 @@ bool LLAgent::teleportCore(bool is_local)  		return false;  	} -	// Stop all animation before actual teleporting +#if 0 +	// This should not exist. It has been added, removed, added, and now removed again. +	// This change needs to come from the simulator. Otherwise, the agent ends up out of +	// sync with other viewers. Discuss in DEV-14145/VWR-6744 before reenabling. + +	// Stop all animation before actual teleporting   	LLVOAvatar* avatarp = gAgent.getAvatarObject();          if (avatarp)  	{ @@ -5843,6 +5860,7 @@ bool LLAgent::teleportCore(bool is_local)                 }                 avatarp->processAnimationStateChanges();         } +#endif  	// Don't call LLFirstUse::useTeleport because we don't know  	// yet if the teleport will succeed.  Look in  diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 1be0644840..44b9cb2198 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -104,6 +104,7 @@  #include "llviewermenu.h"  #include "llselectmgr.h"  #include "lltrans.h" +#include "lluitrans.h"  #include "lltracker.h"  #include "llviewerparcelmgr.h"  #include "llworldmapview.h" @@ -604,25 +605,6 @@ bool LLAppViewer::init()  	/////////////////////////////////////////////////  	// OS-specific login dialogs  	///////////////////////////////////////////////// -#if LL_WINDOWS -	/* -	// Display initial login screen, comes up quickly. JC -	{ -		LLSplashScreen::hide(); - -		INT_PTR result = DialogBox(hInstance, L"CONNECTBOX", NULL, login_dialog_func); -		if (result < 0) -		{ -			llwarns << "Connect dialog box failed, returned " << result << llendl; -			return 1; -		} -		// success, result contains which button user clicked -		llinfos << "Connect dialog box clicked " << result << llendl; - -		LLSplashScreen::show(); -	} -	*/ -#endif  	//test_cached_control(); @@ -1292,6 +1274,13 @@ bool LLAppViewer::cleanup()  	LLVFile::cleanupClass();  	llinfos << "VFS cleaned up" << llendflush; +	// Quitting with "Remember Password" turned off should always stomp your +	// saved password, whether or not you successfully logged in.  JC +	if (!gSavedSettings.getBOOL("RememberPassword")) +	{ +		LLStartUp::deletePasswordFromDisk(); +	} +	  	// Store the time of our current logoff  	gSavedPerAccountSettings.setU32("LastLogoff", time_corrected()); @@ -2139,6 +2128,7 @@ bool LLAppViewer::initWindow()  	LLUI::sWindow = gViewerWindow->getWindow();  	LLTrans::parseStrings("strings.xml"); +	LLUITrans::parseStrings("ui_strings.xml");  	// Show watch cursor  	gViewerWindow->setCursor(UI_CURSOR_WAIT); diff --git a/indra/newview/llappviewerlinux.cpp b/indra/newview/llappviewerlinux.cpp index 427f67c331..0778503a92 100644 --- a/indra/newview/llappviewerlinux.cpp +++ b/indra/newview/llappviewerlinux.cpp @@ -540,9 +540,11 @@ void LLAppViewerLinux::handleCrashReporting(bool reportFreeze)  	cmd += gDirUtilp->getDirDelimiter();  #if LL_LINUX  	cmd += "linux-crash-logger.bin"; -#else // LL_SOLARIS -	cmd += "bin/solaris-crash-logger"; -#endif // LL_LINUX +#elif LL_SOLARIS +	cmd += "solaris-crash-logger"; +#else +# error Unknown platform +#endif  	if(reportFreeze)  	{ @@ -623,7 +625,10 @@ void LLAppViewerLinux::handleCrashReporting(bool reportFreeze)  bool LLAppViewerLinux::beingDebugged()  {  	static enum {unknown, no, yes} debugged = unknown; -	 + +#if LL_SOLARIS +	return debugged == no;	// BUG: fix this for Solaris +#else  	if (debugged == unknown)  	{  		pid_t ppid = getppid(); @@ -658,6 +663,7 @@ bool LLAppViewerLinux::beingDebugged()  	}  	return debugged == yes; +#endif  }  bool LLAppViewerLinux::initLogging() diff --git a/indra/newview/llassetuploadresponders.cpp b/indra/newview/llassetuploadresponders.cpp index 5bdfbb0975..9dd0668787 100644 --- a/indra/newview/llassetuploadresponders.cpp +++ b/indra/newview/llassetuploadresponders.cpp @@ -206,6 +206,7 @@ void LLNewAgentInventoryResponder::uploadComplete(const LLSD& content)  	LLAssetType::EType asset_type = LLAssetType::lookup(mPostData["asset_type"].asString());  	LLInventoryType::EType inventory_type = LLInventoryType::lookup(mPostData["inventory_type"].asString()); +	S32 expected_upload_cost = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload();  	// Update L$ and ownership credit information  	// since it probably changed on the server @@ -222,7 +223,7 @@ void LLNewAgentInventoryResponder::uploadComplete(const LLSD& content)  		gAgent.sendReliableMessage();  		LLSD args; -		args["AMOUNT"] = llformat("%d",LLGlobalEconomy::Singleton::getInstance()->getPriceUpload()); +		args["AMOUNT"] = llformat("%d", expected_upload_cost);  		LLNotifications::instance().add("UploadPayment", args);  	} @@ -320,9 +321,14 @@ void LLNewAgentInventoryResponder::uploadComplete(const LLSD& content)  		U32 everyone_perms   = mPostData.has("everyone_mask")   ? mPostData.get("everyone_mask"  ).asInteger() : PERM_NONE;  		U32 group_perms      = mPostData.has("group_mask")      ? mPostData.get("group_mask"     ).asInteger() : PERM_NONE;  		U32 next_owner_perms = mPostData.has("next_owner_mask") ? mPostData.get("next_owner_mask").asInteger() : PERM_NONE; +		std::string display_name = LLStringUtil::null; +		LLAssetStorage::LLStoreAssetCallback callback = NULL; +		void *userdata = NULL;  		upload_new_resource(next_file, asset_name, asset_name, -							0, LLAssetType::AT_NONE, LLInventoryType::IT_NONE, -							next_owner_perms, group_perms, everyone_perms); +				    0, LLAssetType::AT_NONE, LLInventoryType::IT_NONE, +				    next_owner_perms, group_perms, +				    everyone_perms, display_name, +				    callback, expected_upload_cost, userdata);  	}  } diff --git a/indra/newview/llchatbar.cpp b/indra/newview/llchatbar.cpp index c76cbbeb3e..2395f3c5ae 100644 --- a/indra/newview/llchatbar.cpp +++ b/indra/newview/llchatbar.cpp @@ -523,7 +523,8 @@ void LLChatBar::onInputEditorKeystroke( LLLineEditor* caller, void* userdata )  		{  			if (self->mInputEditor)  			{ -				self->mInputEditor->setText(utf8_out_str); +				std::string rest_of_match = utf8_out_str.substr(utf8_trigger.size()); +				self->mInputEditor->setText(utf8_trigger + rest_of_match); // keep original capitalization for user-entered part  				S32 outlength = self->mInputEditor->getLength(); // in characters  				// Select to end of line, starting from the character diff --git a/indra/newview/lldirpicker.cpp b/indra/newview/lldirpicker.cpp index c89d56474d..8b0ed39eb0 100644 --- a/indra/newview/lldirpicker.cpp +++ b/indra/newview/lldirpicker.cpp @@ -39,8 +39,9 @@  #include "llkeyboard.h"  #include "lldir.h"  #include "llframetimer.h" +#include "lltrans.h" -#if LL_LINUX +#if LL_LINUX || LL_SOLARIS  # include "llfilepicker.h"  #endif @@ -264,7 +265,7 @@ void LLDirPicker::reset()  	mDir.clear();  } -#elif LL_LINUX +#elif LL_LINUX || LL_SOLARIS  LLDirPicker::LLDirPicker()   { @@ -294,7 +295,7 @@ BOOL LLDirPicker::getDir(std::string* filename)  		if (picker)  		{		    -		   gtk_window_set_title(GTK_WINDOW(picker), "Choose Directory"); +		   gtk_window_set_title(GTK_WINDOW(picker), LLTrans::getString("choose_the_directory").c_str());  		   gtk_widget_show_all(GTK_WIDGET(picker));  		   gtk_main();  		   return (!mFilePicker->getFirstFile().empty()); diff --git a/indra/newview/lldirpicker.h b/indra/newview/lldirpicker.h index 9c36dc6750..26f76915ae 100644 --- a/indra/newview/lldirpicker.h +++ b/indra/newview/lldirpicker.h @@ -90,7 +90,7 @@ private:  #endif -#if LL_LINUX +#if LL_LINUX || LL_SOLARIS  	// On Linux we just implement LLDirPicker on top of LLFilePicker  	LLFilePicker *mFilePicker;  #endif diff --git a/indra/newview/llfasttimerview.cpp b/indra/newview/llfasttimerview.cpp index 768a728749..25a26f05d8 100644 --- a/indra/newview/llfasttimerview.cpp +++ b/indra/newview/llfasttimerview.cpp @@ -205,7 +205,7 @@ static struct ft_display_info ft_display_table[] =  	{ LLFastTimer::FTM_OTHER,				" Other",			&red0 }  };  static int ft_display_didcalc = 0; -static const int FTV_DISPLAY_NUM  = (sizeof(ft_display_table)/sizeof(ft_display_table[0])); +static const int FTV_DISPLAY_NUM  = LL_ARRAY_SIZE(ft_display_table);  S32 ft_display_idx[FTV_DISPLAY_NUM]; // line of table entry for display purposes (for collapse) diff --git a/indra/newview/llfilepicker.cpp b/indra/newview/llfilepicker.cpp index 1ad55ae35c..8f5882615f 100644 --- a/indra/newview/llfilepicker.cpp +++ b/indra/newview/llfilepicker.cpp @@ -38,6 +38,7 @@  #include "llkeyboard.h"  #include "lldir.h"  #include "llframetimer.h" +#include "lltrans.h"  #if LL_SDL  #include "llwindowsdl.h" // for some X/GTK utils to help with filepickers @@ -893,19 +894,45 @@ BOOL LLFilePicker::getSaveFile(ESaveFilter filter, const std::string& filename)  	return success;  } -#elif LL_LINUX +#elif LL_LINUX || LL_SOLARIS  # if LL_GTK  // static  void LLFilePicker::add_to_selectedfiles(gpointer data, gpointer user_data)  { +	// We need to run g_filename_to_utf8 in the user's locale +	std::string saved_locale(setlocale(LC_ALL, NULL)); +	setlocale(LC_ALL, ""); +  	LLFilePicker* picker = (LLFilePicker*) user_data; +	GError *error = NULL;  	gchar* filename_utf8 = g_filename_to_utf8((gchar*)data, -						  -1, NULL, NULL, NULL); -	picker->mFiles.push_back(std::string(filename_utf8)); -	lldebugs << "ADDED FILE " << filename_utf8 << llendl; -	g_free(filename_utf8); +						  -1, NULL, NULL, &error); +	if (error) +	{ +		// *FIXME. +		// This condition should really be notified to the user, e.g. +		// through a message box.  Just logging it is inappropriate. +		 +		// g_filename_display_name is ideal, but >= glib 2.6, so: +		// a hand-rolled hacky makeASCII which disallows control chars +		std::string display_name; +		for (const gchar *str = (const gchar *)data; *str; str++) +		{ +			display_name += (char)((*str >= 0x20 && *str <= 0x7E) ? *str : '?'); +		} +		llwarns << "g_filename_to_utf8 failed on \"" << display_name << "\": " << error->message << llendl; +	} + +	if (filename_utf8) +	{ +		picker->mFiles.push_back(std::string(filename_utf8)); +		lldebugs << "ADDED FILE " << filename_utf8 << llendl; +		g_free(filename_utf8); +	} + +	setlocale(LC_ALL, saved_locale.c_str());  }  // static @@ -934,8 +961,7 @@ void LLFilePicker::chooser_responder(GtkWidget *widget, gint response, gpointer  GtkWindow* LLFilePicker::buildFilePicker(bool is_save, bool is_folder, std::string context)  { -	if (LLWindowSDL::ll_try_gtk_init() && -	    ! gViewerWindow->getWindow()->getFullscreen()) +	if (LLWindowSDL::ll_try_gtk_init())  	{  		GtkWidget *win = NULL;  		GtkFileChooserAction pickertype = @@ -1017,7 +1043,7 @@ static void add_common_filters_to_gtkchooser(GtkFileFilter *gfilter,  				    gfilter);  	GtkFileFilter *allfilter = gtk_file_filter_new();  	gtk_file_filter_add_pattern(allfilter, "*"); -	gtk_file_filter_set_name(allfilter, "All Files"); +	gtk_file_filter_set_name(allfilter, LLTrans::getString("all_files").c_str());  	gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(picker), allfilter);  	gtk_file_chooser_set_filter(GTK_FILE_CHOOSER(picker), gfilter);  } @@ -1045,13 +1071,13 @@ static std::string add_simple_mime_filter_to_gtkchooser(GtkWindow *picker,  static std::string add_wav_filter_to_gtkchooser(GtkWindow *picker)  {  	return add_simple_mime_filter_to_gtkchooser(picker,  "audio/x-wav", -						    "Sounds (*.wav)"); +						    LLTrans::getString("sound_files") + " (*.wav)");  }  static std::string add_bvh_filter_to_gtkchooser(GtkWindow *picker)  {  	return add_simple_pattern_filter_to_gtkchooser(picker,  "*.bvh", -						       "Animations (*.bvh)"); +						       LLTrans::getString("animation_files") + " (*.bvh)");  }  static std::string add_imageload_filter_to_gtkchooser(GtkWindow *picker) @@ -1061,7 +1087,7 @@ static std::string add_imageload_filter_to_gtkchooser(GtkWindow *picker)  	gtk_file_filter_add_mime_type(gfilter, "image/jpeg");  	gtk_file_filter_add_mime_type(gfilter, "image/png");  	gtk_file_filter_add_mime_type(gfilter, "image/bmp"); -	std::string filtername = "Images (*.tga; *.bmp; *.jpg; *.png)"; +	std::string filtername = LLTrans::getString("image_files") + " (*.tga; *.bmp; *.jpg; *.png)";  	add_common_filters_to_gtkchooser(gfilter, picker, filtername);  	return filtername;  } @@ -1081,7 +1107,7 @@ BOOL LLFilePicker::getSaveFile( ESaveFilter filter, const std::string& filename  	{  		std::string suggest_name = "untitled";  		std::string suggest_ext = ""; -		std::string caption = "Save "; +		std::string caption = LLTrans::getString("save_file_verb") + " ";  		switch (filter)  		{  		case FFSAVE_WAV: @@ -1090,39 +1116,39 @@ BOOL LLFilePicker::getSaveFile( ESaveFilter filter, const std::string& filename  			break;  		case FFSAVE_TGA:  			caption += add_simple_pattern_filter_to_gtkchooser -				(picker, "*.tga", "Targa Images (*.tga)"); +				(picker, "*.tga", LLTrans::getString("targa_image_files") + " (*.tga)");  			suggest_ext = ".tga";  			break;  		case FFSAVE_BMP:  			caption += add_simple_mime_filter_to_gtkchooser -				(picker, "image/bmp", "Bitmap Images (*.bmp)"); +				(picker, "image/bmp", LLTrans::getString("bitmap_image_files") + " (*.bmp)");  			suggest_ext = ".bmp";  			break;  		case FFSAVE_AVI:  			caption += add_simple_mime_filter_to_gtkchooser  				(picker, "video/x-msvideo", -				 "AVI Movie File (*.avi)"); +				 LLTrans::getString("avi_movie_file") + " (*.avi)");  			suggest_ext = ".avi";  			break;  		case FFSAVE_ANIM:  			caption += add_simple_pattern_filter_to_gtkchooser -				(picker, "*.xaf", "XAF Anim File (*.xaf)"); +				(picker, "*.xaf", LLTrans::getString("xaf_animation_file") + " (*.xaf)");  			suggest_ext = ".xaf";  			break;  		case FFSAVE_XML:  			caption += add_simple_pattern_filter_to_gtkchooser -				(picker, "*.xml", "XML File (*.xml)"); +				(picker, "*.xml", LLTrans::getString("xml_file") + " (*.xml)");  			suggest_ext = ".xml";  			break;  		case FFSAVE_RAW:  			caption += add_simple_pattern_filter_to_gtkchooser -				(picker, "*.raw", "RAW File (*.raw)"); +				(picker, "*.raw", LLTrans::getString("raw_file") + " (*.raw)");  			suggest_ext = ".raw";  			break;  		case FFSAVE_J2C:  			caption += add_simple_mime_filter_to_gtkchooser  				(picker, "images/jp2", -				 "Compressed Images (*.j2c)"); +				 LLTrans::getString("compressed_image_files") + " (*.j2c)");  			suggest_ext = ".j2c";  			break;  		default:; @@ -1168,7 +1194,7 @@ BOOL LLFilePicker::getOpenFile( ELoadFilter filter )  	if (picker)  	{ -		std::string caption = "Load "; +		std::string caption = LLTrans::getString("load_file_verb") + " ";  		std::string filtername = "";  		switch (filter)  		{ @@ -1215,7 +1241,7 @@ BOOL LLFilePicker::getMultipleOpenFiles( ELoadFilter filter )  		gtk_file_chooser_set_select_multiple (GTK_FILE_CHOOSER(picker),  						      TRUE); -		gtk_window_set_title(GTK_WINDOW(picker), "Load Files"); +		gtk_window_set_title(GTK_WINDOW(picker), LLTrans::getString("load_files").c_str());  		gtk_widget_show_all(GTK_WIDGET(picker));  		gtk_main(); diff --git a/indra/newview/llfloateranimpreview.cpp b/indra/newview/llfloateranimpreview.cpp index 0cdd3f5b66..045ca6aa36 100644 --- a/indra/newview/llfloateranimpreview.cpp +++ b/indra/newview/llfloateranimpreview.cpp @@ -989,15 +989,19 @@ void LLFloaterAnimPreview::onBtnOK(void* userdata)  			{  				std::string name = floaterp->childGetValue("name_form").asString();  				std::string desc = floaterp->childGetValue("description_form").asString(); +				LLAssetStorage::LLStoreAssetCallback callback = NULL; +				S32 expected_upload_cost = sUploadAmount; +				void *userdata = NULL;  				upload_new_resource(floaterp->mTransactionID, // tid -									LLAssetType::AT_ANIMATION, -									name, -									desc, -									0, -									LLAssetType::AT_NONE, -									LLInventoryType::IT_ANIMATION, -									LLFloaterPerms::getNextOwnerPerms(), LLFloaterPerms::getGroupPerms(), LLFloaterPerms::getEveryonePerms(), -									name); +						    LLAssetType::AT_ANIMATION, +						    name, +						    desc, +						    0, +						    LLAssetType::AT_NONE, +						    LLInventoryType::IT_ANIMATION, +						    LLFloaterPerms::getNextOwnerPerms(), LLFloaterPerms::getGroupPerms(), LLFloaterPerms::getEveryonePerms(), +						    name, +						    callback, expected_upload_cost, userdata);  			}  			else  			{ diff --git a/indra/newview/llfloaterchat.cpp b/indra/newview/llfloaterchat.cpp index 793ae954ae..f57042eedb 100644 --- a/indra/newview/llfloaterchat.cpp +++ b/indra/newview/llfloaterchat.cpp @@ -393,7 +393,11 @@ void LLFloaterChat::addChat(const LLChat& chat,  			text_color = gSavedSettings.getColor("IMChatColor");  			size = INSTANT_MSG_SIZE;  		} -		gConsole->addLine(chat.mText, size, text_color); +		// We display anything if it's not an IM. If it's an IM, check pref... +		if	( !from_instant_message || gSavedSettings.getBOOL("IMInChatHistory") )  +		{ +			gConsole->addLine(chat.mText, size, text_color); +		}  	}  	if(from_instant_message && gSavedPerAccountSettings.getBOOL("LogChatIM")) diff --git a/indra/newview/llfloaternamedesc.cpp b/indra/newview/llfloaternamedesc.cpp index db9d943ed3..acfcfab445 100644 --- a/indra/newview/llfloaternamedesc.cpp +++ b/indra/newview/llfloaternamedesc.cpp @@ -49,6 +49,7 @@  #include "llviewermenufile.h"	// upload_new_resource()  #include "lluictrlfactory.h"  #include "llstring.h" +#include "lleconomy.h"  // linden includes  #include "llassetstorage.h" @@ -179,11 +180,16 @@ void LLFloaterNameDesc::onBtnOK( void* userdata )  	fp->childDisable("ok_btn"); // don't allow inadvertent extra uploads +	LLAssetStorage::LLStoreAssetCallback callback = NULL; +	S32 expected_upload_cost = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload(); // kinda hack - assumes that unsubclassed LLFloaterNameDesc is only used for uploading chargeable assets, which it is right now (it's only used unsubclassed for the sound upload dialog, and THAT should be a subclass). +	void *nruserdata = NULL; +	std::string display_name = LLStringUtil::null;  	upload_new_resource(fp->mFilenameAndPath, // file -		fp->childGetValue("name_form").asString(),  -		fp->childGetValue("description_form").asString(),  -		0, LLAssetType::AT_NONE, LLInventoryType::IT_NONE, -		LLFloaterPerms::getNextOwnerPerms(), LLFloaterPerms::getGroupPerms(), LLFloaterPerms::getEveryonePerms()); +			    fp->childGetValue("name_form").asString(),  +			    fp->childGetValue("description_form").asString(),  +			    0, LLAssetType::AT_NONE, LLInventoryType::IT_NONE, +			    LLFloaterPerms::getNextOwnerPerms(), LLFloaterPerms::getGroupPerms(), LLFloaterPerms::getEveryonePerms(), +			    display_name, callback, expected_upload_cost, nruserdata);  	fp->close(false);  } diff --git a/indra/newview/llfloaterproperties.cpp b/indra/newview/llfloaterproperties.cpp index 8a057b442c..406d940cf0 100644 --- a/indra/newview/llfloaterproperties.cpp +++ b/indra/newview/llfloaterproperties.cpp @@ -248,7 +248,7 @@ void LLFloaterProperties::refresh()  			"RadioSaleType",  			"EditPrice"  		}; -		for(size_t t=0; t<sizeof(enableNames)/sizeof(char*); ++t) +		for(size_t t=0; t<LL_ARRAY_SIZE(enableNames); ++t)  		{  			childSetEnabled(enableNames[t],false);  		} @@ -259,7 +259,7 @@ void LLFloaterProperties::refresh()  			"EveryoneMaskDebug",  			"NextMaskDebug"  		}; -		for(size_t t=0; t<sizeof(hideNames)/sizeof(char*); ++t) +		for(size_t t=0; t<LL_ARRAY_SIZE(hideNames); ++t)  		{  			childSetVisible(hideNames[t],false);  		} diff --git a/indra/newview/llfloaterreporter.cpp b/indra/newview/llfloaterreporter.cpp index 1f401acc4c..3f699fda99 100644 --- a/indra/newview/llfloaterreporter.cpp +++ b/indra/newview/llfloaterreporter.cpp @@ -693,6 +693,9 @@ LLSD LLFloaterReporter::gatherReport()  #elif LL_LINUX  	const char* platform = "Lnx";  	const char* short_platform = "O:L"; +#elif LL_SOLARIS +	const char* platform = "Sol"; +	const char* short_platform = "O:S";  #else  	const char* platform = "???";  	const char* short_platform = "O:?"; @@ -885,6 +888,8 @@ void LLFloaterReporter::takeScreenshot()  	// create a resource data  	mResourceDatap->mInventoryType = LLInventoryType::IT_NONE; +	mResourceDatap->mNextOwnerPerm = 0; // not used +	mResourceDatap->mExpectedUploadCost = 0; // we expect that abuse screenshots are free  	mResourceDatap->mAssetInfo.mTransactionID.generate();  	mResourceDatap->mAssetInfo.mUuid = mResourceDatap->mAssetInfo.mTransactionID.makeAssetID(gAgent.getSecureSessionID());  	if (BUG_REPORT == mReportType) diff --git a/indra/newview/llfloatersnapshot.cpp b/indra/newview/llfloatersnapshot.cpp index dd5f2662d6..14caed9d97 100644 --- a/indra/newview/llfloatersnapshot.cpp +++ b/indra/newview/llfloatersnapshot.cpp @@ -51,6 +51,7 @@  #include "llfocusmgr.h"  #include "llbutton.h"  #include "llcombobox.h" +#include "lleconomy.h"  #include "llsliderctrl.h"  #include "llspinctrl.h"  #include "llviewercontrol.h" @@ -952,17 +953,21 @@ void LLSnapshotLivePreview::saveTexture()  		gAgent.buildLocationString(pos_string);  		std::string who_took_it;  		gAgent.buildFullname(who_took_it); +		LLAssetStorage::LLStoreAssetCallback callback = NULL; +		S32 expected_upload_cost = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload(); +		void *userdata = NULL;  		upload_new_resource(tid,	// tid -							LLAssetType::AT_TEXTURE, -							"Snapshot : " + pos_string, -							"Taken by " + who_took_it + " at " + pos_string, -							0, -							LLAssetType::AT_SNAPSHOT_CATEGORY, -							LLInventoryType::IT_SNAPSHOT, -							PERM_ALL,  // Note: Snapshots to inventory is a special case of content upload -							PERM_NONE, // that ignores the user's premissions preferences and continues to -							PERM_NONE, // always use these fairly permissive hard-coded initial perms. - MG -							"Snapshot : " + pos_string); +				    LLAssetType::AT_TEXTURE, +				    "Snapshot : " + pos_string, +				    "Taken by " + who_took_it + " at " + pos_string, +				    0, +				    LLAssetType::AT_SNAPSHOT_CATEGORY, +				    LLInventoryType::IT_SNAPSHOT, +				    PERM_ALL,  // Note: Snapshots to inventory is a special case of content upload +				    PERM_NONE, // that ignores the user's premissions preferences and continues to +				    PERM_NONE, // always use these fairly permissive hard-coded initial perms. - MG +				    "Snapshot : " + pos_string, +				    callback, expected_upload_cost, userdata);  		gViewerWindow->playSnapshotAnimAndSound();  	}  	else @@ -1271,6 +1276,9 @@ void LLFloaterSnapshot::Impl::updateControls(LLFloaterSnapshot* floater)  	LLLocale locale(LLLocale::USER_LOCALE);  	std::string bytes_string;  	LLResMgr::getInstance()->getIntegerString(bytes_string, (previewp->getDataSize()) >> 10 ); +	S32 upload_cost = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload(); +	floater->childSetLabelArg("texture", "[AMOUNT]", llformat("%d",upload_cost)); +	floater->childSetLabelArg("upload_btn", "[AMOUNT]", llformat("%d",upload_cost));  	floater->childSetTextArg("file_size_label", "[SIZE]", got_snap ? bytes_string : floater->getString("unknown"));  	floater->childSetColor("file_size_label",   		shot_type == LLSnapshotLivePreview::SNAPSHOT_POSTCARD  diff --git a/indra/newview/llfloatertools.cpp b/indra/newview/llfloatertools.cpp index 9a0d831be4..704b53e816 100644 --- a/indra/newview/llfloatertools.cpp +++ b/indra/newview/llfloatertools.cpp @@ -271,7 +271,7 @@ BOOL	LLFloaterTools::postBuild()  			&LLToolPlacerPanel::sTriangleTorus,  			&LLToolPlacerPanel::sTree,  			&LLToolPlacerPanel::sGrass}; -	for(size_t t=0; t<sizeof(toolNames)/sizeof(toolNames[0]); ++t) +	for(size_t t=0; t<LL_ARRAY_SIZE(toolNames); ++t)  	{  		LLButton *found = getChild<LLButton>(toolNames[t]);  		if(found) diff --git a/indra/newview/llfloatertopobjects.cpp b/indra/newview/llfloatertopobjects.cpp index a9c182455c..16428ce6d1 100644 --- a/indra/newview/llfloatertopobjects.cpp +++ b/indra/newview/llfloatertopobjects.cpp @@ -185,7 +185,7 @@ void LLFloaterTopObjects::handleReply(LLMessageSystem *msg, void** data)  		{  			have_extended_data = true;  			msg->getU32("DataExtended", "TimeStamp", time_stamp, block); -			msg->getF32(_PREHASH_ReportData, "MonoScore", mono_score, block); +			msg->getF32("DataExtended", "MonoScore", mono_score, block);  		}  		LLSD element; diff --git a/indra/newview/llfloatertos.cpp b/indra/newview/llfloatertos.cpp index 1ba85e6e53..6a392e03fb 100644 --- a/indra/newview/llfloatertos.cpp +++ b/indra/newview/llfloatertos.cpp @@ -34,21 +34,25 @@  #include "llfloatertos.h" -#include "llbutton.h" -#include "llradiogroup.h" -#include "llvfile.h" -#include "lltextbox.h" -#include "llviewertexteditor.h" +// viewer includes +#include "llagent.h"  #include "llappviewer.h"  #include "llstartup.h" -#include "message.h" -#include "llagent.h" -#include "lluictrlfactory.h" -#include "llviewerwindow.h"  #include "llviewerstats.h" -#include "llui.h" +#include "llviewertexteditor.h" +#include "llviewerwindow.h" + +// linden library includes +#include "llbutton.h"  #include "llhttpclient.h" +#include "llhttpstatuscodes.h"	// for HTTP_FOUND  #include "llradiogroup.h" +#include "lltextbox.h" +#include "llui.h" +#include "lluictrlfactory.h" +#include "llvfile.h" +#include "message.h" +  // static   LLFloaterTOS* LLFloaterTOS::sInstance = NULL; @@ -115,7 +119,13 @@ class LLIamHere : public LLHTTPClient::Responder  		virtual void error( U32 status, const std::string& reason )  		{  			if ( mParent ) -				mParent->setSiteIsAlive( false ); +			{ +				// *HACK: For purposes of this alive check, 302 Found +				// (aka Moved Temporarily) is considered alive.  The web site +				// redirects this link to a "cache busting" temporary URL. JC +				bool alive = (status == HTTP_FOUND); +				mParent->setSiteIsAlive( alive ); +			}  		};  }; @@ -185,12 +195,6 @@ void LLFloaterTOS::setSiteIsAlive( bool alive )  			// but if the page is unavailable, we need to do this now  			LLCheckBoxCtrl* tos_agreement = getChild<LLCheckBoxCtrl>("agree_chk");  			tos_agreement->setEnabled( true ); - -			if ( web_browser ) -			{ -				// hide browser control (revealing default text message) -				web_browser->setVisible( FALSE ); -			};  		};  	};  } diff --git a/indra/newview/llfloaterworldmap.cpp b/indra/newview/llfloaterworldmap.cpp index 7f2321aafb..d59f513925 100644 --- a/indra/newview/llfloaterworldmap.cpp +++ b/indra/newview/llfloaterworldmap.cpp @@ -742,7 +742,7 @@ void LLFloaterWorldMap::updateLocation()  void LLFloaterWorldMap::trackURL(const std::string& region_name, S32 x_coord, S32 y_coord, S32 z_coord)  {  	LLSimInfo* sim_info = LLWorldMap::getInstance()->simInfoFromName(region_name); -	z_coord = llclamp(z_coord, 0, 1000); +	z_coord = llclamp(z_coord, 0, 4096);  	if (sim_info)  	{  		LLVector3 local_pos; diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp index 48d9a8a76b..f98a3f9ee5 100644 --- a/indra/newview/llinventorymodel.cpp +++ b/indra/newview/llinventorymodel.cpp @@ -1067,7 +1067,7 @@ void  LLInventoryModel::fetchInventoryResponder::result(const LLSD& content)  	S32 count = content["items"].size();  	bool all_one_folder = true;  	LLUUID folder_id; -	// Does this loop ever execute more than once? -Gigs +	// Does this loop ever execute more than once?  	for(S32 i = 0; i < count; ++i)  	{  		LLPointer<LLViewerInventoryItem> titem = new LLViewerInventoryItem; @@ -2645,7 +2645,7 @@ void LLInventoryModel::processFetchInventoryReply(LLMessageSystem* msg, void**)  bool LLInventoryModel::messageUpdateCore(LLMessageSystem* msg, bool account)  { -	//make sure our added inventory observer is active -Gigs +	//make sure our added inventory observer is active  	start_new_inventory_observer();  	LLUUID agent_id; @@ -2661,7 +2661,7 @@ bool LLInventoryModel::messageUpdateCore(LLMessageSystem* msg, bool account)  	S32 count = msg->getNumberOfBlocksFast(_PREHASH_InventoryData);  	bool all_one_folder = true;  	LLUUID folder_id; -	// Does this loop ever execute more than once? -Gigs +	// Does this loop ever execute more than once?  	for(S32 i = 0; i < count; ++i)  	{  		LLPointer<LLViewerInventoryItem> titem = new LLViewerInventoryItem; @@ -3791,7 +3791,6 @@ void LLInventoryAddedObserver::changed(U32 mask)  	// *HACK: If this was in response to a packet off  	// the network, figure out which item was updated. -	// Code from Gigs Taggert, sin allowed by JC.  	LLMessageSystem* msg = gMessageSystem;  	std::string msg_name; diff --git a/indra/newview/llloginhandler.cpp b/indra/newview/llloginhandler.cpp index d298f8e0e7..053f798882 100644 --- a/indra/newview/llloginhandler.cpp +++ b/indra/newview/llloginhandler.cpp @@ -192,27 +192,18 @@ bool LLLoginHandler::handle(const LLSD& tokens,  			LLMD5 pass((unsigned char*)password.c_str());  			char md5pass[33];		/* Flawfinder: ignore */  			pass.hex_digest(md5pass); -			password = ll_safe_string(md5pass, 32); -			save_password_to_disk(password.c_str()); +			std::string hashed_password = ll_safe_string(md5pass, 32); +			LLStartUp::savePasswordToDisk(hashed_password);  		}  	} -	else -	{ -		save_password_to_disk(NULL); -		gSavedSettings.setBOOL("RememberPassword", FALSE); -	}  	if (LLStartUp::getStartupState() < STATE_LOGIN_CLEANUP)  //on splash page  	{  		if (!mFirstName.empty() || !mLastName.empty())  		{ -			// Fill in the name, and maybe the password, preserving the -			// remember-password setting. JC -			std::string ignore; -			BOOL remember; -			LLPanelLogin::getFields(ignore, ignore, ignore, remember); -			LLPanelLogin::setFields(mFirstName, mLastName, password, remember); +			// Fill in the name, and maybe the password +			LLPanelLogin::setFields(mFirstName, mLastName, password);  		}  		if (mWebLoginKey.isNull()) diff --git a/indra/newview/llmaniptranslate.cpp b/indra/newview/llmaniptranslate.cpp index b9a700991e..959a575950 100644 --- a/indra/newview/llmaniptranslate.cpp +++ b/indra/newview/llmaniptranslate.cpp @@ -1635,7 +1635,7 @@ void LLManipTranslate::highlightIntersection(LLVector3 normal,  	}  	U32 types[] = { LLRenderPass::PASS_SIMPLE, LLRenderPass::PASS_ALPHA, LLRenderPass::PASS_FULLBRIGHT, LLRenderPass::PASS_SHINY }; -	U32 num_types = sizeof(types)/sizeof(U32); +	U32 num_types = LL_ARRAY_SIZE(types);  	GLuint stencil_mask = 0xFFFFFFFF;  	//stencil in volumes diff --git a/indra/newview/llmemoryview.cpp b/indra/newview/llmemoryview.cpp index 2a8fa2bf35..97dc373b07 100644 --- a/indra/newview/llmemoryview.cpp +++ b/indra/newview/llmemoryview.cpp @@ -138,7 +138,7 @@ static const struct mtv_display_info mtv_display_table[] =   	{ LLMemType::MTYPE_OTHER,			"Other",			&red0 },  }; -static const int MTV_DISPLAY_NUM  = (sizeof(mtv_display_table)/sizeof(mtv_display_table[0])); +static const int MTV_DISPLAY_NUM  = LL_ARRAY_SIZE(mtv_display_table);  void LLMemoryView::draw()  { diff --git a/indra/newview/llpanelavatar.cpp b/indra/newview/llpanelavatar.cpp index 8b5cb94221..41f8f3941a 100644 --- a/indra/newview/llpanelavatar.cpp +++ b/indra/newview/llpanelavatar.cpp @@ -78,9 +78,6 @@  #include "llweb.h"  #include "llinventorymodel.h"  #include "roles_constants.h" - -#define	kArraySize( _kArray ) ( sizeof( (_kArray) ) / sizeof( _kArray[0] ) ) -  #include "lluictrlfactory.h"  // Statics @@ -504,17 +501,17 @@ BOOL LLPanelAvatarPicks::postBuild(void)  BOOL LLPanelAvatarAdvanced::postBuild()  { -	for(size_t ii = 0; ii < kArraySize(mWantToCheck); ++ii) +	for(size_t ii = 0; ii < LL_ARRAY_SIZE(mWantToCheck); ++ii)  		mWantToCheck[ii] = NULL; -	for(size_t ii = 0; ii < kArraySize(mSkillsCheck); ++ii) +	for(size_t ii = 0; ii < LL_ARRAY_SIZE(mSkillsCheck); ++ii)  		mSkillsCheck[ii] = NULL; -	mWantToCount = (8>kArraySize(mWantToCheck))?kArraySize(mWantToCheck):8; +	mWantToCount = (8>LL_ARRAY_SIZE(mWantToCheck))?LL_ARRAY_SIZE(mWantToCheck):8;  	for(S32 tt=0; tt < mWantToCount; ++tt)  	{	  		std::string ctlname = llformat("chk%d", tt);  		mWantToCheck[tt] = getChild<LLCheckBoxCtrl>(ctlname);  	}	 -	mSkillsCount = (6>kArraySize(mSkillsCheck))?kArraySize(mSkillsCheck):6; +	mSkillsCount = (6>LL_ARRAY_SIZE(mSkillsCheck))?LL_ARRAY_SIZE(mSkillsCheck):6;  	for(S32 tt=0; tt < mSkillsCount; ++tt)  	{ @@ -1817,7 +1814,7 @@ void LLPanelAvatar::processAvatarPropertiesReply(LLMessageSystem *msg, void**)  				"AcctTypeCharterMember",  				"AcctTypeEmployee"  			}; -			caption_index = llclamp(caption_index, (U8)0, (U8)(sizeof(ACCT_TYPE)/sizeof(ACCT_TYPE[0])-1)); +			caption_index = llclamp(caption_index, (U8)0, (U8)(LL_ARRAY_SIZE(ACCT_TYPE)-1));  			args["[ACCTTYPE]"] = self->mPanelSecondLife->getString(ACCT_TYPE[caption_index]);  			std::string payment_text = " "; diff --git a/indra/newview/llpanelgroupgeneral.cpp b/indra/newview/llpanelgroupgeneral.cpp index ceca360967..cbf4a8740c 100644 --- a/indra/newview/llpanelgroupgeneral.cpp +++ b/indra/newview/llpanelgroupgeneral.cpp @@ -195,6 +195,7 @@ BOOL LLPanelGroupGeneral::postBuild()  		mSpinEnrollmentFee->setCommitCallback(onCommitAny);  		mSpinEnrollmentFee->setCallbackUserData(this);  		mSpinEnrollmentFee->setPrecision(0); +		mSpinEnrollmentFee->resetDirty();  	}  	BOOL accept_notices = FALSE; @@ -221,6 +222,7 @@ BOOL LLPanelGroupGeneral::postBuild()  		mCtrlListGroup->setCallbackUserData(this);  		mCtrlListGroup->set(list_in_profile);  		mCtrlListGroup->setEnabled(data.mID.notNull()); +		mCtrlListGroup->resetDirty();  	}  	mActiveTitleLabel = getChild<LLTextBox>("active_title_label", recurse); @@ -230,6 +232,7 @@ BOOL LLPanelGroupGeneral::postBuild()  	{  		mComboActiveTitle->setCommitCallback(onCommitTitle);  		mComboActiveTitle->setCallbackUserData(this); +		mComboActiveTitle->resetDirty();  	}  	mIncompleteMemberDataStr = getString("incomplete_member_data_str"); @@ -259,7 +262,7 @@ BOOL LLPanelGroupGeneral::postBuild()  void LLPanelGroupGeneral::onFocusEdit(LLFocusableElement* ctrl, void* data)  {  	LLPanelGroupGeneral* self = (LLPanelGroupGeneral*)data; -	self->mChanged = TRUE; +	self->updateChanged();  	self->notifyObservers();  } @@ -317,6 +320,7 @@ void LLPanelGroupGeneral::onCommitTitle(LLUICtrl* ctrl, void* data)  	if (self->mGroupID.isNull() || !self->mAllowEdit) return;  	LLGroupMgr::getInstance()->sendGroupTitleUpdate(self->mGroupID,self->mComboActiveTitle->getCurrentID());  	self->update(GC_TITLES); +	self->mComboActiveTitle->resetDirty();  }  // static @@ -398,6 +402,7 @@ void LLPanelGroupGeneral::openProfile(void* data)  bool LLPanelGroupGeneral::needsApply(std::string& mesg)  {  +	updateChanged();  	mesg = getString("group_info_unchanged");  	return mChanged || mGroupID.isNull();  } @@ -660,6 +665,8 @@ void LLPanelGroupGeneral::update(LLGroupChange gc)  				mComboActiveTitle->setCurrentByID(LLUUID::null);  			}  		} + +		mComboActiveTitle->resetDirty();  	}  	// If this was just a titles update, we are done. @@ -674,6 +681,8 @@ void LLPanelGroupGeneral::update(LLGroupChange gc)  	{  		mCtrlShowInGroupList->set(gdatap->mShowInList);  		mCtrlShowInGroupList->setEnabled(mAllowEdit && can_change_ident); +		mCtrlShowInGroupList->resetDirty(); +  	}  	if (mComboMature)  	{ @@ -687,24 +696,29 @@ void LLPanelGroupGeneral::update(LLGroupChange gc)  		}  		mComboMature->setEnabled(mAllowEdit && can_change_ident);  		mComboMature->setVisible( !gAgent.isTeen() ); +		mComboMature->resetDirty();  	}  	if (mCtrlOpenEnrollment)   	{  		mCtrlOpenEnrollment->set(gdatap->mOpenEnrollment);  		mCtrlOpenEnrollment->setEnabled(mAllowEdit && can_change_member_opts); +		mCtrlOpenEnrollment->resetDirty();  	}  	if (mCtrlEnrollmentFee)   	{	  		mCtrlEnrollmentFee->set(gdatap->mMembershipFee > 0);  		mCtrlEnrollmentFee->setEnabled(mAllowEdit && can_change_member_opts); +		mCtrlEnrollmentFee->resetDirty();  	}  	if (mSpinEnrollmentFee)  	{  		S32 fee = gdatap->mMembershipFee;  		mSpinEnrollmentFee->set((F32)fee); -		mSpinEnrollmentFee->setEnabled( mAllowEdit  -								&& (fee > 0) && can_change_member_opts); +		mSpinEnrollmentFee->setEnabled( mAllowEdit && +						(fee > 0) && +						can_change_member_opts); +		mSpinEnrollmentFee->resetDirty();  	}  	if ( mBtnJoinGroup )  	{ @@ -733,8 +747,9 @@ void LLPanelGroupGeneral::update(LLGroupChange gc)  		{  			mCtrlReceiveNotices->setEnabled(mAllowEdit);  		} +		mCtrlReceiveNotices->resetDirty();  	} -	 +  	if (mInsignia) mInsignia->setEnabled(mAllowEdit && can_change_ident);  	if (mEditCharter) mEditCharter->setEnabled(mAllowEdit && can_change_ident); @@ -750,11 +765,15 @@ void LLPanelGroupGeneral::update(LLGroupChange gc)  		}  		else  		{ -			  			mInsignia->setImageAssetID(mDefaultIconID);  		}  	} -	if (mEditCharter) mEditCharter->setText(gdatap->mCharter); + +	if (mEditCharter) +	{ +		mEditCharter->setText(gdatap->mCharter); +		mEditCharter->resetDirty(); +	}  	if (mListVisibleMembers)  	{ @@ -882,7 +901,7 @@ void LLPanelGroupGeneral::updateChanged()  	mChanged = FALSE; -	for( int i= 0; i< sizeof(check_list)/sizeof(*check_list); i++ ) +	for( int i= 0; i< LL_ARRAY_SIZE(check_list); i++ )  	{  		if( check_list[i] && check_list[i]->isDirty() )  		{ diff --git a/indra/newview/llpanellogin.cpp b/indra/newview/llpanellogin.cpp index 46ced60b44..bc5e8f2482 100644 --- a/indra/newview/llpanellogin.cpp +++ b/indra/newview/llpanellogin.cpp @@ -546,8 +546,9 @@ void LLPanelLogin::show(const LLRect &rect,  }  // static -void LLPanelLogin::setFields(const std::string& firstname, const std::string& lastname, const std::string& password, -							 BOOL remember) +void LLPanelLogin::setFields(const std::string& firstname, +			     const std::string& lastname, +			     const std::string& password)  {  	if (!sInstance)  	{ @@ -581,8 +582,6 @@ void LLPanelLogin::setFields(const std::string& firstname, const std::string& la  		pass.hex_digest(munged_password);  		sInstance->mMungedPassword = munged_password;  	} - -	sInstance->childSetValue("remember_check", remember);  } @@ -601,8 +600,9 @@ void LLPanelLogin::addServer(const std::string& server, S32 domain_name)  }  // static -void LLPanelLogin::getFields(std::string &firstname, std::string &lastname, std::string &password, -							BOOL &remember) +void LLPanelLogin::getFields(std::string *firstname, +			     std::string *lastname, +			     std::string *password)  {  	if (!sInstance)  	{ @@ -610,14 +610,13 @@ void LLPanelLogin::getFields(std::string &firstname, std::string &lastname, std:  		return;  	} -	firstname = sInstance->childGetText("first_name_edit"); -	LLStringUtil::trim(firstname); +	*firstname = sInstance->childGetText("first_name_edit"); +	LLStringUtil::trim(*firstname); -	lastname = sInstance->childGetText("last_name_edit"); -	LLStringUtil::trim(lastname); +	*lastname = sInstance->childGetText("last_name_edit"); +	LLStringUtil::trim(*lastname); -	password = sInstance->mMungedPassword; -	remember = sInstance->childGetValue("remember_check"); +	*password = sInstance->mMungedPassword;  }  // static diff --git a/indra/newview/llpanellogin.h b/indra/newview/llpanellogin.h index 5dffaa8323..47d42da7f1 100644 --- a/indra/newview/llpanellogin.h +++ b/indra/newview/llpanellogin.h @@ -59,14 +59,15 @@ public:  		void (*callback)(S32 option, void* user_data),   		void* callback_data); +	// Remember password checkbox is set via gSavedSettings "RememberPassword"  	static void setFields(const std::string& firstname, const std::string& lastname,  -		const std::string& password, BOOL remember); +		const std::string& password);  	static void addServer(const std::string& server, S32 domain_name);  	static void refreshLocation( bool force_visible ); -	static void getFields(std::string& firstname, std::string& lastname, -						  std::string& password, BOOL& remember); +	static void getFields(std::string *firstname, std::string *lastname, +						  std::string *password);  	static BOOL isGridComboDirty();  	static void getLocation(std::string &location); diff --git a/indra/newview/llpreviewgesture.cpp b/indra/newview/llpreviewgesture.cpp index 09cdfabfc1..ff3b9433f4 100644 --- a/indra/newview/llpreviewgesture.cpp +++ b/indra/newview/llpreviewgesture.cpp @@ -236,14 +236,14 @@ BOOL LLPreviewGesture::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,  					LLScrollListItem* line = NULL;  					if (cargo_type == DAD_ANIMATION)  					{ -						line = addStep("Animation"); +						line = addStep( STEP_ANIMATION );  						LLGestureStepAnimation* anim = (LLGestureStepAnimation*)line->getUserdata();  						anim->mAnimAssetID = item->getAssetUUID();  						anim->mAnimName = item->getName();  					}  					else if (cargo_type == DAD_SOUND)  					{ -						line = addStep("Sound"); +						line = addStep( STEP_SOUND );  						LLGestureStepSound* sound = (LLGestureStepSound*)line->getUserdata();  						sound->mSoundAssetID = item->getAssetUUID();  						sound->mSoundName = item->getName(); @@ -847,18 +847,18 @@ void LLPreviewGesture::refresh()  void LLPreviewGesture::initDefaultGesture()  {  	LLScrollListItem* item; -	item = addStep("Animation"); +	item = addStep( STEP_ANIMATION );  	LLGestureStepAnimation* anim = (LLGestureStepAnimation*)item->getUserdata();  	anim->mAnimAssetID = ANIM_AGENT_HELLO;  	anim->mAnimName = "Wave";  	updateLabel(item); -	item = addStep("Wait"); +	item = addStep( STEP_WAIT );  	LLGestureStepWait* wait = (LLGestureStepWait*)item->getUserdata();  	wait->mFlags = WAIT_FLAG_ALL_ANIM;  	updateLabel(item); -	item = addStep("Chat"); +	item = addStep( STEP_CHAT );  	LLGestureStepChat* chat_step = (LLGestureStepChat*)item->getUserdata();  	chat_step->mChatText = "Hello, avatar!";  	updateLabel(item); @@ -1597,38 +1597,44 @@ void LLPreviewGesture::onClickAdd(void* data)  	LLScrollListItem* library_item = self->mLibraryList->getFirstSelected();  	if (!library_item) return; +	S32 library_item_index = self->mLibraryList->getFirstSelectedIndex(); +  	const LLScrollListCell* library_cell = library_item->getColumn(0);  	const std::string& library_text = library_cell->getValue().asString(); -	self->addStep(library_text); +	if( library_item_index >= STEP_EOF ) +	{ +		llerrs << "Unknown step type: " << library_text << llendl; +		return; +	} +	self->addStep( (EStepType)library_item_index );  	self->mDirty = TRUE;  	self->refresh();  } -LLScrollListItem* LLPreviewGesture::addStep(const std::string& library_text) +LLScrollListItem* LLPreviewGesture::addStep( const EStepType step_type )  { +	// Order of enum EStepType MUST match the library_list element in floater_preview_gesture.xml +  	LLGestureStep* step = NULL; -	if (!LLStringUtil::compareInsensitive(library_text, "Animation")) -	{ -		step = new LLGestureStepAnimation(); -	} -	else if (!LLStringUtil::compareInsensitive(library_text, "Sound")) -	{ -		step = new LLGestureStepSound(); -	} -	else if (!LLStringUtil::compareInsensitive(library_text, "Chat")) +	switch( step_type)  	{ -		step = new LLGestureStepChat(); -	} -	else if (!LLStringUtil::compareInsensitive(library_text, "Wait")) -	{ -		step = new LLGestureStepWait(); -	} -	else -	{ -		llerrs << "Unknown step type: " << library_text << llendl;; -		return NULL; +		case STEP_ANIMATION: +			step = new LLGestureStepAnimation(); +			break; +		case STEP_SOUND: +			step = new LLGestureStepSound(); +			break; +		case STEP_CHAT: +			step = new LLGestureStepChat(); +			break; +		case STEP_WAIT: +			step = new LLGestureStepWait(); +			break; +		default: +			llerrs << "Unknown step type: " << (S32)step_type << llendl; +			return NULL;  	}  	// Create an enabled item with this step diff --git a/indra/newview/llpreviewgesture.h b/indra/newview/llpreviewgesture.h index 91c214be62..c245c0e8da 100644 --- a/indra/newview/llpreviewgesture.h +++ b/indra/newview/llpreviewgesture.h @@ -34,6 +34,7 @@  #define LL_LLPREVIEWGESTURE_H  #include "llpreview.h" +#include "llmultigesture.h"  class LLMultiGesture;  class LLLineEditor; @@ -109,7 +110,7 @@ protected:  	// Add a step.  Pass the name of the step, like "Animation",  	// "Sound", "Chat", or "Wait" -	LLScrollListItem* addStep(const std::string& step_name); +	LLScrollListItem* addStep(const enum EStepType step_type);  	static void updateLabel(LLScrollListItem* item); diff --git a/indra/newview/llresourcedata.h b/indra/newview/llresourcedata.h index 2609775794..46b79150bb 100644 --- a/indra/newview/llresourcedata.h +++ b/indra/newview/llresourcedata.h @@ -42,6 +42,7 @@ struct LLResourceData  	LLAssetType::EType mPreferredLocation;  	LLInventoryType::EType mInventoryType;  	U32 mNextOwnerPerm; +	S32 mExpectedUploadCost;  	void *mUserData;  }; diff --git a/indra/newview/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp index ebbc49fbd6..dc4b8134dc 100644 --- a/indra/newview/llspatialpartition.cpp +++ b/indra/newview/llspatialpartition.cpp @@ -1896,7 +1896,7 @@ void pushVertsColorCoded(LLSpatialGroup* group, U32 mask)  		LLColor4::green6  	}; -	static const U32 col_count = sizeof(colors)/sizeof(LLColor4); +	static const U32 col_count = LL_ARRAY_SIZE(colors);  	U32 col = 0; diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index 6663b5ec19..b4f8f6b71e 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -232,8 +232,6 @@ EStartupState LLStartUp::gStartupState = STATE_FIRST;  void login_show();  void login_callback(S32 option, void* userdata); -std::string load_password_from_disk(); -void save_password_to_disk(const char* hashed_password);  bool is_hex_string(U8* str, S32 len);  void show_first_run_dialog();  bool first_run_dialog_callback(const LLSD& notification, const LLSD& response); @@ -351,7 +349,6 @@ bool idle_startup()  	static S32  location_which = START_LOCATION_ID_LAST;  	static bool show_connect_box = true; -	static BOOL remember_password = TRUE;  	static bool stipend_since_login = false; @@ -684,7 +681,6 @@ bool idle_startup()  			char md5pass[33];               /* Flawfinder: ignore */  			pass.hex_digest(md5pass);  			password = md5pass; -			remember_password = gSavedSettings.getBOOL("RememberPassword");  #ifdef USE_VIEWER_AUTH  			show_connect_box = true; @@ -697,9 +693,8 @@ bool idle_startup()  		{  			firstname = gSavedSettings.getString("FirstName");  			lastname = gSavedSettings.getString("LastName"); -			password = load_password_from_disk(); +			password = LLStartUp::loadPasswordFromDisk();  			gSavedSettings.setBOOL("RememberPassword", TRUE); -			remember_password = TRUE;  #ifdef USE_VIEWER_AUTH  			show_connect_box = true; @@ -713,8 +708,7 @@ bool idle_startup()  			// a valid grid is selected  			firstname = gSavedSettings.getString("FirstName");  			lastname = gSavedSettings.getString("LastName"); -			password = load_password_from_disk(); -			remember_password = gSavedSettings.getBOOL("RememberPassword"); +			password = LLStartUp::loadPasswordFromDisk();  			show_connect_box = true;  		} @@ -753,7 +747,7 @@ bool idle_startup()  			// Load all the name information out of the login view  			// NOTE: Hits "Attempted getFields with no login view shown" warning, since we don't  			// show the login view until login_show() is called below.   -			// LLPanelLogin::getFields(firstname, lastname, password, remember_password); +			// LLPanelLogin::getFields(firstname, lastname, password);  			if (gNoRender)  			{ @@ -765,7 +759,7 @@ bool idle_startup()  			// Show the login dialog  			login_show();  			// connect dialog is already shown, so fill in the names -			LLPanelLogin::setFields( firstname, lastname, password, remember_password ); +			LLPanelLogin::setFields( firstname, lastname, password);  			LLPanelLogin::giveFocus(); @@ -834,7 +828,7 @@ bool idle_startup()  		{  			// TODO if not use viewer auth  			// Load all the name information out of the login view -			LLPanelLogin::getFields(firstname, lastname, password, remember_password); +			LLPanelLogin::getFields(&firstname, &lastname, &password);  			// end TODO  			// HACK: Try to make not jump on login @@ -846,16 +840,6 @@ bool idle_startup()  			gSavedSettings.setString("FirstName", firstname);  			gSavedSettings.setString("LastName", lastname); -			if (remember_password) -			{ -				   save_password_to_disk(password.c_str()); -			} -			else -			{ -				   save_password_to_disk(NULL); -			} -			gSavedSettings.setBOOL("RememberPassword", remember_password); -  			LL_INFOS("AppInit") << "Attempting login as: " << firstname << " " << lastname << LL_ENDL;  			gDebugInfo["LoginName"] = firstname + " " + lastname;	  		} @@ -1362,15 +1346,17 @@ bool idle_startup()  			gSavedSettings.setString("FirstName", firstname);  			gSavedSettings.setString("LastName", lastname); -			if (remember_password) +			if (gSavedSettings.getBOOL("RememberPassword"))  			{ -				   save_password_to_disk(password.c_str()); +				// Successful login means the password is valid, so save it. +				LLStartUp::savePasswordToDisk(password);  			}  			else  			{ -				   save_password_to_disk(NULL); +				// Don't leave password from previous session sitting around +				// during this login session. +				LLStartUp::deletePasswordFromDisk();  			} -			gSavedSettings.setBOOL("RememberPassword", remember_password);  			text = LLUserAuth::getInstance()->getResponse("agent_access");  			if(!text.empty() && (text[0] == 'M')) @@ -1563,7 +1549,7 @@ bool idle_startup()  			// Pass the user information to the voice chat server interface.  			gVoiceClient->userAuthorized(firstname, lastname, gAgentID);  		} -		else +		else // if(successful_login)  		{  			if (gNoRender)  			{ @@ -1578,8 +1564,6 @@ bool idle_startup()  			reset_login();  			gSavedSettings.setBOOL("AutoLogin", FALSE);  			show_connect_box = true; -			// Don't save an incorrect password to disk. -			save_password_to_disk(NULL);  		}  		return FALSE;  	} @@ -2571,16 +2555,11 @@ void login_callback(S32 option, void *userdata)  	{  		// Make sure we don't save the password if the user is trying to clear it.  		std::string first, last, password; -		BOOL remember = TRUE; -		LLPanelLogin::getFields(first, last, password, remember); -		if (!remember) +		LLPanelLogin::getFields(&first, &last, &password); +		if (!gSavedSettings.getBOOL("RememberPassword"))  		{  			// turn off the setting and write out to disk -			gSavedSettings.setBOOL("RememberPassword", FALSE);  			gSavedSettings.saveToFile( gSavedSettings.getString("ClientSettingsFile") , TRUE ); - -			// stomp the saved password on disk -			save_password_to_disk(NULL);  		}  		// Next iteration through main loop should shut down the app cleanly. @@ -2598,8 +2577,18 @@ void login_callback(S32 option, void *userdata)  	}  } -std::string load_password_from_disk() + +// static +std::string LLStartUp::loadPasswordFromDisk()  { +	// Only load password if we also intend to save it (otherwise the user +	// wonders what we're doing behind his back).  JC +	BOOL remember_password = gSavedSettings.getBOOL("RememberPassword"); +	if (!remember_password) +	{ +		return std::string(""); +	} +  	std::string hashed_password("");  	// Look for legacy "marker" password from settings.ini @@ -2651,41 +2640,45 @@ std::string load_password_from_disk()  	return hashed_password;  } -void save_password_to_disk(const char* hashed_password) + +// static +void LLStartUp::savePasswordToDisk(const std::string& hashed_password)  {  	std::string filepath = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS,  													   "password.dat"); -	if (!hashed_password) +	LLFILE* fp = LLFile::fopen(filepath, "wb");		/* Flawfinder: ignore */ +	if (!fp)  	{ -		// No password, remove the file. -		LLFile::remove(filepath); +		return;  	} -	else -	{ -		LLFILE* fp = LLFile::fopen(filepath, "wb");		/* Flawfinder: ignore */ -		if (!fp) -		{ -			return; -		} - -		// Encipher with MAC address -		const S32 HASHED_LENGTH = 32; -		U8 buffer[HASHED_LENGTH+1]; -		LLStringUtil::copy((char*)buffer, hashed_password, HASHED_LENGTH+1); +	// Encipher with MAC address +	const S32 HASHED_LENGTH = 32; +	U8 buffer[HASHED_LENGTH+1]; -		LLXORCipher cipher(gMACAddress, 6); -		cipher.encrypt(buffer, HASHED_LENGTH); +	LLStringUtil::copy((char*)buffer, hashed_password.c_str(), HASHED_LENGTH+1); -		if (fwrite(buffer, HASHED_LENGTH, 1, fp) != 1) -		{ -			LL_WARNS("AppInit") << "Short write" << LL_ENDL; -		} +	LLXORCipher cipher(gMACAddress, 6); +	cipher.encrypt(buffer, HASHED_LENGTH); -		fclose(fp); +	if (fwrite(buffer, HASHED_LENGTH, 1, fp) != 1) +	{ +		LL_WARNS("AppInit") << "Short write" << LL_ENDL;  	} + +	fclose(fp);  } + +// static +void LLStartUp::deletePasswordFromDisk() +{ +	std::string filepath = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, +														  "password.dat"); +	LLFile::remove(filepath); +} + +  bool is_hex_string(U8* str, S32 len)  {  	bool rv = true; @@ -2869,6 +2862,8 @@ bool update_dialog_callback(const LLSD& notification, const LLSD& response)  	query_map["os"] = "mac";  #elif LL_LINUX  	query_map["os"] = "lnx"; +#elif LL_SOLARIS +	query_map["os"] = "sol";  #endif  	// *TODO change userserver to be grid on both viewer and sim, since  	// userserver no longer exists. @@ -2952,7 +2947,7 @@ bool update_dialog_callback(const LLSD& notification, const LLSD& response)  	// Run the auto-updater.  	system(LLAppViewer::sUpdaterInfo->mUpdateExePath.c_str()); /* Flawfinder: ignore */ -#elif LL_LINUX +#elif LL_LINUX || LL_SOLARIS  	OSMessageBox("Automatic updating is not yet implemented for Linux.\n"  		"Please download the latest version from www.secondlife.com.",  		LLStringUtil::null, OSMB_OK); diff --git a/indra/newview/llstartup.h b/indra/newview/llstartup.h index e455c4aed1..fe347e9efe 100644 --- a/indra/newview/llstartup.h +++ b/indra/newview/llstartup.h @@ -37,7 +37,6 @@  // functions  bool idle_startup(); -std::string load_password_from_disk();  void release_start_screen();  bool login_alert_done(const LLSD& notification, const LLSD& response); @@ -99,6 +98,15 @@ public:  	static void loadInitialOutfit( const std::string& outfit_folder_name,  								   const std::string& gender_name ); +	// Load MD5 of user's password from local disk file. +	static std::string loadPasswordFromDisk(); +	 +	// Record MD5 of user's password for subsequent login. +	static void savePasswordToDisk(const std::string& hashed_password); +	 +	// Delete the saved password local disk file. +	static void deletePasswordFromDisk(); +	  	static bool dispatchURL();  		// if we have a SLURL or sim string ("Ahern/123/45") that started  		// the viewer, dispatch it diff --git a/indra/newview/lltextureview.cpp b/indra/newview/lltextureview.cpp index b1ad80cdd9..450e5d83af 100644 --- a/indra/newview/lltextureview.cpp +++ b/indra/newview/lltextureview.cpp @@ -235,7 +235,7 @@ void LLTextureBar::draw()  		{ "MIS", LLColor4::red }, // LAST_STATE+4  		{ "---", LLColor4::white }, // LAST_STATE+5  	}; -	const S32 fetch_state_desc_size = (S32)(sizeof(fetch_state_desc)/sizeof(fetch_state_desc[0])); +	const S32 fetch_state_desc_size = (S32)LL_ARRAY_SIZE(fetch_state_desc);  	S32 state =  		mImagep->mNeedsCreateTexture ? LAST_STATE+1 :  		mImagep->mFullyLoaded ? LAST_STATE+2 : diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp index fe94863f2d..70fc78d277 100644 --- a/indra/newview/llviewermedia.cpp +++ b/indra/newview/llviewermedia.cpp @@ -526,6 +526,14 @@ void LLViewerMedia::buildMediaManagerData( LLMediaManagerData* init_data )  	std::string component_dir( gDirUtilp->getExpandedFilename( LL_PATH_APP_SETTINGS, "" ) );  	component_dir += gDirUtilp->getDirDelimiter();  	component_dir += "mozilla-runtime-linux-i686"; +#elif LL_SOLARIS +	std::string component_dir( gDirUtilp->getExpandedFilename( LL_PATH_APP_SETTINGS, "" ) ); +	component_dir += gDirUtilp->getDirDelimiter(); +	#ifdef  __sparc +		component_dir += "mozilla-solaris-sparc"; +	#else +		component_dir += "mozilla-solaris-i686"; +	#endif  #else  	std::string component_dir( gDirUtilp->getExpandedFilename( LL_PATH_APP_SETTINGS, "" ) );  	component_dir += gDirUtilp->getDirDelimiter(); diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index 17f59595f6..e0b7b233ec 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -285,9 +285,6 @@ typedef LLMemberListener<LLView> view_listener_t;  void handle_leave_group(void *);  // File Menu -const char* upload_pick(void* data); -void handle_upload(void* data); -//void handle_upload_object(void* data);  void handle_compress_image(void*);  BOOL enable_save_as(void *); @@ -654,7 +651,7 @@ void init_menus()      gViewerWindow->setMenuBackgroundColor(false,           LLViewerLogin::getInstance()->isInProductionGrid()); -	// *TODO:Get the cost info from the server +	// Assume L$10 for now, the server will tell us the real cost at login  	const std::string upload_cost("10");  	gMenuHolder->childSetLabelArg("Upload Image", "[COST]", upload_cost);  	gMenuHolder->childSetLabelArg("Upload Sound", "[COST]", upload_cost); diff --git a/indra/newview/llviewermenufile.cpp b/indra/newview/llviewermenufile.cpp index ff8d717b12..a6dede1e38 100644 --- a/indra/newview/llviewermenufile.cpp +++ b/indra/newview/llviewermenufile.cpp @@ -274,6 +274,7 @@ class LLFileUploadSound : public view_listener_t  		{  			LLFloaterNameDesc* floaterp = new LLFloaterNameDesc(filename);  			LLUICtrlFactory::getInstance()->buildFloater(floaterp, "floater_sound_preview.xml"); +			floaterp->childSetLabelArg("ok_btn", "[AMOUNT]", llformat("%d", LLGlobalEconomy::Singleton::getInstance()->getPriceUpload() ));  		}  		return true;  	} @@ -324,8 +325,14 @@ class LLFileUploadBulk : public view_listener_t  			LLStringUtil::stripNonprintable(asset_name);  			LLStringUtil::trim(asset_name); +			std::string display_name = LLStringUtil::null; +			LLAssetStorage::LLStoreAssetCallback callback = NULL; +			S32 expected_upload_cost = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload(); +			void *userdata = NULL;  			upload_new_resource(filename, asset_name, asset_name, 0, LLAssetType::AT_NONE, LLInventoryType::IT_NONE, -				LLFloaterPerms::getNextOwnerPerms(), LLFloaterPerms::getGroupPerms(), LLFloaterPerms::getEveryonePerms()); +				LLFloaterPerms::getNextOwnerPerms(), LLFloaterPerms::getGroupPerms(), LLFloaterPerms::getEveryonePerms(), +					    display_name, +					    callback, expected_upload_cost, userdata);  			// *NOTE: Ew, we don't iterate over the file list here,  			// we handle the next files in upload_done_callback() @@ -482,6 +489,7 @@ void handle_upload(void* data)  	{  		LLFloaterNameDesc* floaterp = new LLFloaterNameDesc(filename);  		LLUICtrlFactory::getInstance()->buildFloater(floaterp, "floater_name_description.xml"); +		floaterp->childSetLabelArg("ok_btn", "[AMOUNT]", llformat("%d", LLGlobalEconomy::Singleton::getInstance()->getPriceUpload() ));  	}  } @@ -517,15 +525,16 @@ void handle_compress_image(void*)  }  void upload_new_resource(const std::string& src_filename, std::string name, -						 std::string desc, S32 compression_info, -						 LLAssetType::EType destination_folder_type, -						 LLInventoryType::EType inv_type, -						 U32 next_owner_perms, -						 U32 group_perms, -						 U32 everyone_perms, -						 const std::string& display_name, -						 LLAssetStorage::LLStoreAssetCallback callback, -						 void *userdata) +			 std::string desc, S32 compression_info, +			 LLAssetType::EType destination_folder_type, +			 LLInventoryType::EType inv_type, +			 U32 next_owner_perms, +			 U32 group_perms, +			 U32 everyone_perms, +			 const std::string& display_name, +			 LLAssetStorage::LLStoreAssetCallback callback, +			 S32 expected_upload_cost, +			 void *userdata)  {	  	// Generate the temporary UUID.  	std::string filename = gDirUtilp->getTempFilename(); @@ -809,8 +818,8 @@ void upload_new_resource(const std::string& src_filename, std::string name,  			t_disp_name = src_filename;  		}  		upload_new_resource(tid, asset_type, name, desc, compression_info, // tid -							destination_folder_type, inv_type, next_owner_perms, group_perms, everyone_perms, -							display_name, callback, userdata); +				    destination_folder_type, inv_type, next_owner_perms, group_perms, everyone_perms, +				    display_name, callback, expected_upload_cost, userdata);  	}  	else  	{ @@ -829,8 +838,10 @@ void upload_new_resource(const std::string& src_filename, std::string name,  void upload_done_callback(const LLUUID& uuid, void* user_data, S32 result, LLExtStat ext_status) // StoreAssetData callback (fixed)  {  	LLResourceData* data = (LLResourceData*)user_data; +	S32 expected_upload_cost = data ? data->mExpectedUploadCost : 0;  	//LLAssetType::EType pref_loc = data->mPreferredLocation;  	BOOL is_balance_sufficient = TRUE; +  	if(result >= 0)  	{  		LLAssetType::EType dest_loc = (data->mPreferredLocation == LLAssetType::AT_NONE) ? data->mAssetInfo.mType : data->mPreferredLocation; @@ -841,20 +852,19 @@ void upload_done_callback(const LLUUID& uuid, void* user_data, S32 result, LLExt  		{  			// Charge the user for the upload.  			LLViewerRegion* region = gAgent.getRegion(); -			S32 upload_cost = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload(); -			if(!(can_afford_transaction(upload_cost))) +			if(!(can_afford_transaction(expected_upload_cost)))  			{  				LLFloaterBuyCurrency::buyCurrency(  					llformat("Uploading %s costs",  							 data->mAssetInfo.getName().c_str()), // *TODO: Translate -					upload_cost); +					expected_upload_cost);  				is_balance_sufficient = FALSE;  			}  			else if(region)  			{  				// Charge user for upload -				gStatusBar->debitBalance(upload_cost); +				gStatusBar->debitBalance(expected_upload_cost);  				LLMessageSystem* msg = gMessageSystem;  				msg->newMessageFast(_PREHASH_MoneyTransferRequest); @@ -865,7 +875,9 @@ void upload_done_callback(const LLUUID& uuid, void* user_data, S32 result, LLExt  				msg->addUUIDFast(_PREHASH_SourceID, gAgent.getID());  				msg->addUUIDFast(_PREHASH_DestID, LLUUID::null);  				msg->addU8("Flags", 0); -				msg->addS32Fast(_PREHASH_Amount, upload_cost); +				// we tell the sim how much we were expecting to pay so it +				// can respond to any discrepancy +				msg->addS32Fast(_PREHASH_Amount, expected_upload_cost);  				msg->addU8Fast(_PREHASH_AggregatePermNextOwner, (U8)LLAggregatePermissions::AP_EMPTY);  				msg->addU8Fast(_PREHASH_AggregatePermInventory, (U8)LLAggregatePermissions::AP_EMPTY);  				msg->addS32Fast(_PREHASH_TransactionType, TRANS_UPLOAD_CHARGE); @@ -921,22 +933,31 @@ void upload_done_callback(const LLUUID& uuid, void* user_data, S32 result, LLExt  		LLStringUtil::stripNonprintable(asset_name);  		LLStringUtil::trim(asset_name); +		std::string display_name = LLStringUtil::null; +		LLAssetStorage::LLStoreAssetCallback callback = NULL; +		void *userdata = NULL;  		upload_new_resource(next_file, asset_name, asset_name,	// file -							0, LLAssetType::AT_NONE, LLInventoryType::IT_NONE); +				    0, LLAssetType::AT_NONE, LLInventoryType::IT_NONE, +				    PERM_NONE, PERM_NONE, PERM_NONE, +				    display_name, +				    callback, +				    expected_upload_cost, // assuming next in a group of uploads is of roughly the same type, i.e. same upload cost +				    userdata);  	}  }  void upload_new_resource(const LLTransactionID &tid, LLAssetType::EType asset_type, -						 std::string name, -						 std::string desc, S32 compression_info, -						 LLAssetType::EType destination_folder_type, -						 LLInventoryType::EType inv_type, -						 U32 next_owner_perms, -						 U32 group_perms, -						 U32 everyone_perms, -						 const std::string& display_name, -						 LLAssetStorage::LLStoreAssetCallback callback, -						 void *userdata) +			 std::string name, +			 std::string desc, S32 compression_info, +			 LLAssetType::EType destination_folder_type, +			 LLInventoryType::EType inv_type, +			 U32 next_owner_perms, +			 U32 group_perms, +			 U32 everyone_perms, +			 const std::string& display_name, +			 LLAssetStorage::LLStoreAssetCallback callback, +			 S32 expected_upload_cost, +			 void *userdata)  {  	if(gDisconnected)  	{ @@ -985,6 +1006,7 @@ void upload_new_resource(const LLTransactionID &tid, LLAssetType::EType asset_ty  	llinfos << "UUID: " << uuid << llendl;  	llinfos << "Name: " << name << llendl;  	llinfos << "Desc: " << desc << llendl; +	llinfos << "Expected Upload Cost: " << expected_upload_cost << llendl;  	lldebugs << "Folder: " << gInventory.findCategoryUUIDForType((destination_folder_type == LLAssetType::AT_NONE) ? asset_type : destination_folder_type) << llendl;  	lldebugs << "Asset Type: " << LLAssetType::lookup(asset_type) << llendl;  	std::string url = gAgent.getRegion()->getCapability("NewFileAgentInventory"); @@ -1000,6 +1022,7 @@ void upload_new_resource(const LLTransactionID &tid, LLAssetType::EType asset_ty  		body["next_owner_mask"] = LLSD::Integer(next_owner_perms);  		body["group_mask"] = LLSD::Integer(group_perms);  		body["everyone_mask"] = LLSD::Integer(everyone_perms); +		body["expected_upload_cost"] = LLSD::Integer(expected_upload_cost);  		//std::ostringstream llsdxml;  		//LLSDSerialize::toPrettyXML(body, llsdxml); @@ -1016,12 +1039,11 @@ void upload_new_resource(const LLTransactionID &tid, LLAssetType::EType asset_ty  			LLAssetType::AT_TEXTURE == asset_type ||  			LLAssetType::AT_ANIMATION == asset_type)  		{ -			S32 upload_cost = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload();  			S32 balance = gStatusBar->getBalance(); -			if (balance < upload_cost) +			if (balance < expected_upload_cost)  			{  				// insufficient funds, bail on this upload -				LLFloaterBuyCurrency::buyCurrency("Uploading costs", upload_cost); +				LLFloaterBuyCurrency::buyCurrency("Uploading costs", expected_upload_cost);  				return;  			}  		} @@ -1033,6 +1055,7 @@ void upload_new_resource(const LLTransactionID &tid, LLAssetType::EType asset_ty  		data->mAssetInfo.mCreatorID = gAgentID;  		data->mInventoryType = inv_type;  		data->mNextOwnerPerm = next_owner_perms; +		data->mExpectedUploadCost = expected_upload_cost;  		data->mUserData = userdata;  		data->mAssetInfo.setName(name);  		data->mAssetInfo.setDescription(desc); diff --git a/indra/newview/llviewermenufile.h b/indra/newview/llviewermenufile.h index 5a7aa427b4..bf21292082 100644 --- a/indra/newview/llviewermenufile.h +++ b/indra/newview/llviewermenufile.h @@ -42,30 +42,32 @@ class LLTransactionID;  void init_menu_file();  void upload_new_resource(const std::string& src_filename,  -						 std::string name, -						 std::string desc,  -						 S32 compression_info, -						 LLAssetType::EType destination_folder_type, -						 LLInventoryType::EType inv_type, -						 U32 next_owner_perms = 0x0,	// PERM_NONE -						 U32 group_perms = 0x0,	// PERM_NONE -						 U32 everyone_perms = 0x0,	// PERM_NONE -						 const std::string& display_name = LLStringUtil::null, -						 LLAssetStorage::LLStoreAssetCallback callback = NULL, -						 void *userdata = NULL); +			 std::string name, +			 std::string desc,  +			 S32 compression_info, +			 LLAssetType::EType destination_folder_type, +			 LLInventoryType::EType inv_type, +			 U32 next_owner_perms, +			 U32 group_perms, +			 U32 everyone_perms, +			 const std::string& display_name, +			 LLAssetStorage::LLStoreAssetCallback callback, +			 S32 expected_upload_cost, +			 void *userdata);  void upload_new_resource(const LLTransactionID &tid,  -						 LLAssetType::EType type, -						 std::string name, -						 std::string desc,  -						 S32 compression_info, -						 LLAssetType::EType destination_folder_type, -						 LLInventoryType::EType inv_type, -						 U32 next_owner_perms = 0x0,	// PERM_NONE -						 U32 group_perms = 0x0,	// PERM_NONE -						 U32 everyone_perms = 0x0,	// PERM_NONE -						 const std::string& display_name = LLStringUtil::null, -						 LLAssetStorage::LLStoreAssetCallback callback = NULL, -						 void *userdata = NULL); +			 LLAssetType::EType type, +			 std::string name, +			 std::string desc,  +			 S32 compression_info, +			 LLAssetType::EType destination_folder_type, +			 LLInventoryType::EType inv_type, +			 U32 next_owner_perms, +			 U32 group_perms, +			 U32 everyone_perms, +			 const std::string& display_name, +			 LLAssetStorage::LLStoreAssetCallback callback, +			 S32 expected_upload_cost, +			 void *userdata);  #endif diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index 08dbc5b3b8..c840557f01 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -73,6 +73,7 @@  #include "lldrawpool.h"  #include "llfirstuse.h"  #include "llfloateractivespeakers.h" +#include "llfloateranimpreview.h"  #include "llfloaterbuycurrency.h"  #include "llfloaterbuyland.h"  #include "llfloaterchat.h" @@ -133,7 +134,6 @@  #include "pipeline.h"  #include "llappviewer.h"  #include "llfloaterworldmap.h" -#include "llkeythrottle.h"  #include "llviewerdisplay.h"  #include "llkeythrottle.h" @@ -227,6 +227,8 @@ bool friendship_offer_callback(const LLSD& notification, const LLSD& response)  		break;  	case 1:  		// decline +		// We no longer notify other viewers, but we DO still send +		// the rejection to the simulator to delete the pending userop.  		msg->newMessageFast(_PREHASH_DeclineFriendship);  		msg->nextBlockFast(_PREHASH_AgentData);  		msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); @@ -721,7 +723,7 @@ private:  //instance of the AddedObserver for TaskOffers  //and it never dies.  We do this because we don't know the UUID of   //task offers until they are accepted, so we don't wouldn't  -//know what to watch for, so instead we just watch for all additions. -Gigs +//know what to watch for, so instead we just watch for all additions.  class LLOpenTaskOffer : public LLInventoryAddedObserver  {  protected: @@ -797,7 +799,7 @@ protected:  //Returns TRUE if we are OK, FALSE if we are throttled  //Set check_only true if you want to know the throttle status  -//without registering a hit -Gigs +//without registering a hit  bool check_offer_throttle(const std::string& from_name, bool check_only)  {  	static U32 throttle_count; @@ -824,14 +826,14 @@ bool check_offer_throttle(const std::string& from_name, bool check_only)  	{  		LL_DEBUGS("Messaging") << "Throttle Not Expired, Count: " << throttle_count << LL_ENDL;  		// When downloading the initial inventory we get a lot of new items -		// coming in and can't tell that from spam.  JC +		// coming in and can't tell that from spam.  		if (LLStartUp::getStartupState() >= STATE_STARTED  			&& throttle_count >= OFFER_THROTTLE_MAX_COUNT)  		{  			if (!throttle_logged)  			{  				// Use the name of the last item giver, who is probably the person -				// spamming you. JC +				// spamming you.  				std::ostringstream message;  				message << LLAppViewer::instance()->getSecondLifeTitle();  				if (!from_name.empty()) @@ -879,10 +881,10 @@ void open_offer(const std::vector<LLUUID>& items, const std::string& from_name)  		}  		LLAssetType::EType asset_type = item->getType(); -		//if we are throttled, don't display them - Gigs +		//if we are throttled, don't display them  		if (check_offer_throttle(from_name, false))  		{ -			// I'm not sure this is a good idea.  JC +			// I'm not sure this is a good idea.  			bool show_keep_discard = item->getPermissions().getCreator() != gAgent.getID();  			//bool show_keep_discard = true;  			switch(asset_type) @@ -934,7 +936,7 @@ void open_offer(const std::vector<LLUUID>& items, const std::string& from_name)  			return;  		} -		//Not sure about this check.  Could make it easy to miss incoming items. -Gigs +		//Not sure about this check.  Could make it easy to miss incoming items.  		//don't dick with highlight while the user is working  		//if(inventory_has_focus && !user_is_away)  		//	break; @@ -1037,7 +1039,7 @@ bool LLOfferInfo::inventory_offer_callback(const LLSD& notification, const LLSD&  	// This must be done here because:  	// * callback may be called immediately,  	// * adding the mute sends a message, -	// * we can't build two messages at once.  JC +	// * we can't build two messages at once.  	if (2 == button)  	{  		gCacheName->get(mFromID, mFromGroup, inventory_offer_mute_callback, this); @@ -1301,7 +1303,7 @@ void inventory_offer_handler(LLOfferInfo* info, BOOL from_task)  	}  	// Name cache callbacks don't store userdata, so can't save -	// off the LLOfferInfo.  Argh.  JC +	// off the LLOfferInfo.  Argh.  	BOOL name_found = FALSE;  	if (info->mFromGroup)  	{ @@ -1948,6 +1950,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)  					<< LLURI::mapToQueryString(query_string);  			chat.mURL = link.str(); +			chat.mText = name + separator_string + message.substr(message_offset);  			// Note: lie to LLFloaterChat::addChat(), pretending that this is NOT an IM, because  			// IMs from objcts don't open IM sessions. @@ -2092,11 +2095,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)  		}  		break; -	case IM_FRIENDSHIP_DECLINED: -		args["NAME"] = name; -		LLNotifications::instance().add("FriendshipDeclined", args); -		break; - +	case IM_FRIENDSHIP_DECLINED_DEPRECATED:  	default:  		LL_WARNS("Messaging") << "Instant message calling for unknown dialog "  				<< (S32)dialog << LL_ENDL; @@ -2769,7 +2768,7 @@ void process_agent_movement_complete(LLMessageSystem* msg, void**)  	if (!avatarp)  	{  		// Could happen if you were immediately god-teleported away on login, -		// maybe other cases.  Continue, but warn.  JC +		// maybe other cases.  Continue, but warn.  		LL_WARNS("Messaging") << "agent_movement_complete() with NULL avatarp." << LL_ENDL;  	} @@ -2809,7 +2808,7 @@ void process_agent_movement_complete(LLMessageSystem* msg, void**)  	if( is_teleport )  	{ -		// Force the camera back onto the agent, don't animate. JC +		// Force the camera back onto the agent, don't animate.  		gAgent.setFocusOnAvatar(TRUE, FALSE);  		gAgent.slamLookAt(look_at);  		gAgent.updateCamera(); @@ -4261,7 +4260,7 @@ void process_mean_collision_alert_message(LLMessageSystem *msgsystem, void **use  {  	if (gAgent.inPrelude())  	{ -		// JC: In prelude, bumping is OK.  This dialog is rather confusing to  +		// In prelude, bumping is OK.  This dialog is rather confusing to   		// newbies, so we don't show it.  Drop the packet on the floor.  		return;  	} @@ -4336,7 +4335,11 @@ void process_economy_data(LLMessageSystem *msg, void** /*user_data*/)  	LLGlobalEconomy::processEconomyData(msg, LLGlobalEconomy::Singleton::getInstance());  	S32 upload_cost = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload(); + +	LL_INFOS_ONCE("Messaging") << "EconomyData message arrived; upload cost is L$" << upload_cost << LL_ENDL; +  	LLFloaterImagePreview::setUploadAmount(upload_cost); +	LLFloaterAnimPreview::setUploadAmount(upload_cost);  	gMenuHolder->childSetLabelArg("Upload Image", "[COST]", llformat("%d", upload_cost));  	gMenuHolder->childSetLabelArg("Upload Sound", "[COST]", llformat("%d", upload_cost)); @@ -4521,14 +4524,26 @@ void process_script_question(LLMessageSystem *msg, void **user_data)  	msg->getStringFast(_PREHASH_Data, _PREHASH_ObjectOwner, owner_name);  	msg->getS32Fast(_PREHASH_Data, _PREHASH_Questions, questions ); -	// don't display permission requests if this object is muted - JS. +	// Special case. If the objects are owned by this agent, throttle per-object instead +	// of per-owner. It's common for residents to reset a ton of scripts that re-request +	// permissions, as with tier boxes. UUIDs can't be valid agent names and vice-versa, +	// so we'll reuse the same namespace for both throttle types. +	std::string throttle_name = owner_name; +	std::string self_name; +	gAgent.getName( self_name ); +	if( owner_name == self_name ) +	{ +		throttle_name = taskid.getString(); +	} +	 +	// don't display permission requests if this object is muted  	if (LLMuteList::getInstance()->isMuted(taskid)) return; - +	  	// throttle excessive requests from any specific user's scripts  	typedef LLKeyThrottle<std::string> LLStringThrottle;  	static LLStringThrottle question_throttle( LLREQUEST_PERMISSION_THROTTLE_LIMIT, LLREQUEST_PERMISSION_THROTTLE_INTERVAL ); -	switch (question_throttle.noteAction(owner_name)) +	switch (question_throttle.noteAction(throttle_name))  	{  		case LLStringThrottle::THROTTLE_NEWLY_BLOCKED:  			LL_INFOS("Messaging") << "process_script_question throttled" @@ -5426,7 +5441,7 @@ void invalid_message_callback(LLMessageSystem* msg,  }  // Please do not add more message handlers here. This file is huge. -// Put them in a file related to the functionality you are implementing. JC +// Put them in a file related to the functionality you are implementing.  void LLOfferInfo::forceResponse(InventoryOfferResponse response)  { diff --git a/indra/newview/llviewerstats.cpp b/indra/newview/llviewerstats.cpp index 1b4517372d..07569a5e54 100644 --- a/indra/newview/llviewerstats.cpp +++ b/indra/newview/llviewerstats.cpp @@ -58,6 +58,7 @@  #include "llviewerwindow.h"		// *TODO: remove, only used for width/height  #include "llworld.h"  #include "llfeaturemanager.h" +#include "llviewernetwork.h"  #if LL_LCD_COMPILE  #include "lllcd.h"  #endif @@ -662,7 +663,7 @@ void send_stats()  	time(<ime);  	F32 run_time = F32(LLFrameTimer::getElapsedSeconds()); -	agent["start_time"] = ltime - run_time; +	agent["start_time"] = S32(ltime - S32(run_time));  	// The first stat set must have a 0 run time if it doesn't actually  	// contain useful data in terms of FPS, etc.  We use half the @@ -701,7 +702,11 @@ void send_stats()  	system["ram"] = (S32) gSysMemory.getPhysicalMemoryKB();  	system["os"] = LLAppViewer::instance()->getOSInfo().getOSStringSimple();  	system["cpu"] = gSysCPU.getCPUString(); - +	std::string macAddressString = llformat("%02x-%02x-%02x-%02x-%02x-%02x", +											gMACAddress[0],gMACAddress[1],gMACAddress[2], +											gMACAddress[3],gMACAddress[4],gMACAddress[5]); +	system["mac_address"] = macAddressString; +	system["serial_number"] = LLAppViewer::instance()->getSerialNumber();  	std::string gpu_desc = llformat(  		"%-6s Class %d ",  		gGLManager.mGLVendorShort.substr(0,6).c_str(), diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index 597513ba0c..4f2504fc17 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -3216,69 +3216,69 @@ void LLVOAvatar::idleUpdateNameTag(const LLVector3& root_pos_last)  				(is_away != mNameAway || is_busy != mNameBusy || is_muted != mNameMute)  				|| is_appearance != mNameAppearance)  			{ -				char line[MAX_STRING];		/* Flawfinder: ignore */ +				std::string line;  				if (!sRenderGroupTitles)  				{  					// If all group titles are turned off, stack first name  					// on a line above last name -					strncpy(line, firstname->getString(), MAX_STRING -1 );		/* Flawfinder: ignore */ -					line[MAX_STRING -1] = '\0'; -					strcat(line, "\n"); +					line += firstname->getString(); +					line += "\n";  				}  				else if (title && title->getString() && title->getString()[0] != '\0')  				{ -					strncpy(line, title->getString(), MAX_STRING -1 );		/* Flawfinder: ignore */ -					line[MAX_STRING -1] = '\0'; -					strcat(line, "\n");		/* Flawfinder: ignore */ -					strncat(line, firstname->getString(), MAX_STRING - strlen(line) -1 );		/* Flawfinder: ignore */ +					line += title->getString(); +					LLStringFn::replace_ascii_controlchars(line,LL_UNKNOWN_CHAR); +					line += "\n"; +					line += firstname->getString();  				}  				else  				{ -					strncpy(line, firstname->getString(), MAX_STRING -1 );		/* Flawfinder: ignore */ -					line[MAX_STRING -1] = '\0'; +					line += firstname->getString();  				} -				strcat(line, " ");		/* Flawfinder: ignore */ -				strncat(line, lastname->getString(), MAX_STRING - strlen(line) -1);		/* Flawfinder: ignore */ +				line += " "; +				line += lastname->getString();  				BOOL need_comma = FALSE;  				if (is_away || is_muted || is_busy)  				{ -					strcat(line, " (");		/* Flawfinder: ignore */ +					line += " (";  					if (is_away)  					{ -						strcat(line, "Away");		/* Flawfinder: ignore */ +						line += "Away";  						need_comma = TRUE;  					}  					if (is_busy)  					{  						if (need_comma)  						{ -							strcat(line, ", ");		/* Flawfinder: ignore */ +							line += ", ";  						} -						strcat(line, "Busy");		/* Flawfinder: ignore */ +						line += "Busy";  						need_comma = TRUE;  					}  					if (is_muted)  					{  						if (need_comma)  						{ -							strcat(line, ", ");		/* Flawfinder: ignore */ +							line += ", ";  						} -						strcat(line, "Muted");		/* Flawfinder: ignore */ +						line += "Muted";  						need_comma = TRUE;  					} -					strcat(line,")");		/* Flawfinder: ignore */ +					line += ")";  				}  				if (is_appearance)  				{ -					strcat(line, "\n(Editing Appearance)");		/* Flawfinder: ignore */ +					line += "\n"; +					line += "(Editing Appearance)";  				}  				mNameAway = is_away;  				mNameBusy = is_busy;  				mNameMute = is_muted;  				mNameAppearance = is_appearance;  				mTitle = title ? title->getString() : ""; +				LLStringFn::replace_ascii_controlchars(mTitle,LL_UNKNOWN_CHAR);  				mNameString = utf8str_to_wstring(line);  				new_name = TRUE;  			} @@ -3915,7 +3915,7 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent)  	// Generate footstep sounds when feet hit the ground  	//-------------------------------------------------------------------------  	const LLUUID AGENT_FOOTSTEP_ANIMS[] = {ANIM_AGENT_WALK, ANIM_AGENT_RUN, ANIM_AGENT_LAND}; -	const S32 NUM_AGENT_FOOTSTEP_ANIMS = sizeof(AGENT_FOOTSTEP_ANIMS) / sizeof(LLUUID); +	const S32 NUM_AGENT_FOOTSTEP_ANIMS = LL_ARRAY_SIZE(AGENT_FOOTSTEP_ANIMS);  	if ( gAudiop && isAnyAnimationSignaled(AGENT_FOOTSTEP_ANIMS, NUM_AGENT_FOOTSTEP_ANIMS) )  	{ diff --git a/indra/newview/llvoiceclient.cpp b/indra/newview/llvoiceclient.cpp index 6a6064e0a2..1a4f28a8aa 100644 --- a/indra/newview/llvoiceclient.cpp +++ b/indra/newview/llvoiceclient.cpp @@ -863,7 +863,7 @@ LLVoiceClient::LLVoiceClient()  	// This now happens when init() is called instead.  	mPump = NULL; -#if LL_DARWIN || LL_LINUX +#if LL_DARWIN || LL_LINUX || LL_SOLARIS  		// MBW -- XXX -- THIS DOES NOT BELONG HERE  		// When the vivox daemon dies, the next write attempt on our socket generates a SIGPIPE, which kills us.  		// This should cause us to ignore SIGPIPE and handle the error through proper channels. diff --git a/indra/newview/llwlparamset.cpp b/indra/newview/llwlparamset.cpp index 1cb5ee7754..ea9c00ae81 100644 --- a/indra/newview/llwlparamset.cpp +++ b/indra/newview/llwlparamset.cpp @@ -69,7 +69,7 @@ LLWLParamSet::LLWLParamSet(void) :  		std::make_pair("gamma",					LLVector4(2.0f, 2.0f, 2.0f, 0.0f)),  	};  	std::map<std::string, LLVector4>::value_type const * endHardcodedPreset =  -		hardcodedPreset + sizeof(hardcodedPreset)/sizeof(hardcodedPreset[0]); +		hardcodedPreset + LL_ARRAY_SIZE(hardcodedPreset);  	mParamValues.insert(hardcodedPreset, endHardcodedPreset);  */ diff --git a/indra/newview/llworldmap.cpp b/indra/newview/llworldmap.cpp index e01e595747..4d46ff19cc 100644 --- a/indra/newview/llworldmap.cpp +++ b/indra/newview/llworldmap.cpp @@ -49,6 +49,13 @@  const F32 REQUEST_ITEMS_TIMER =  10.f * 60.f; // 10 minutes +// For DEV-17507, do lazy image loading in llworldmapview.cpp instead, +// limiting requests to currently visible regions and minimizing the +// number of textures being requested simultaneously. +// +// Uncomment IMMEDIATE_IMAGE_LOAD to restore the old behavior +// +//#define IMMEDIATE_IMAGE_LOAD  LLItemInfo::LLItemInfo(F32 global_x, F32 global_y,  					   const std::string& name,   					   LLUUID id, @@ -611,13 +618,17 @@ void LLWorldMap::processMapBlockReply(LLMessageSystem* msg, void**)  			siminfo->mRegionFlags = region_flags;  			siminfo->mWaterHeight = (F32) water_height;  			siminfo->mMapImageID[agent_flags] = image_id; +#ifdef IMMEDIATE_IMAGE_LOAD  			siminfo->mCurrentImage = gImageList.getImage(siminfo->mMapImageID[LLWorldMap::getInstance()->mCurrentMap], MIPMAP_TRUE, FALSE);  			gGL.getTexUnit(0)->bind(siminfo->mCurrentImage.get());  			siminfo->mCurrentImage->setClamp(TRUE, TRUE); +#endif  			if (siminfo->mMapImageID[2].notNull())  			{ +#ifdef IMMEDIATE_IMAGE_LOAD  				siminfo->mOverlayImage = gImageList.getImage(siminfo->mMapImageID[2], MIPMAP_TRUE, FALSE); +#endif  			}  			else  			{ diff --git a/indra/newview/llworldmapview.cpp b/indra/newview/llworldmapview.cpp index 685ca8bba5..1cf8755e62 100644 --- a/indra/newview/llworldmapview.cpp +++ b/indra/newview/llworldmapview.cpp @@ -61,6 +61,7 @@  #include "llviewerregion.h"  #include "llviewerwindow.h"  #include "llworldmap.h" +#include "lltexturefetch.h"  #include "llappviewer.h"				// Only for constants!  #include "lltrans.h" @@ -422,30 +423,24 @@ void LLWorldMapView::draw()  	F32 sim_alpha = 1.f;  	// Draw one image per region, centered on the camera position. +	const S32 MAX_SIMULTANEOUS_TEX = 100; +	const S32 MAX_REQUEST_PER_TICK = 5; +	const S32 MIN_REQUEST_PER_TICK = 1; +	S32 textures_requested_this_tick = 0; +  	for (LLWorldMap::sim_info_map_t::iterator it = LLWorldMap::getInstance()->mSimInfoMap.begin();  		 it != LLWorldMap::getInstance()->mSimInfoMap.end(); ++it)  	{  		U64 handle = (*it).first;  		LLSimInfo* info = (*it).second; -		if (info->mCurrentImage.isNull()) -		{ -			info->mCurrentImage = gImageList.getImage(info->mMapImageID[LLWorldMap::getInstance()->mCurrentMap], MIPMAP_TRUE, FALSE); -		} -		if (info->mOverlayImage.isNull() && info->mMapImageID[2].notNull()) -		{ -			info->mOverlayImage = gImageList.getImage(info->mMapImageID[2], MIPMAP_TRUE, FALSE); -			gGL.getTexUnit(0)->bind(info->mOverlayImage.get()); -			info->mOverlayImage->setClamp(TRUE, TRUE); -		} -		  		LLViewerImage* simimage = info->mCurrentImage;  		LLViewerImage* overlayimage = info->mOverlayImage;  		if (gMapScale < SIM_MAP_SCALE)  		{ -			simimage->setBoostLevel(0); -			if (overlayimage) overlayimage->setBoostLevel(0); +			if (simimage != NULL) simimage->setBoostLevel(0); +			if (overlayimage != NULL) overlayimage->setBoostLevel(0);  			continue;  		} @@ -476,6 +471,7 @@ void LLWorldMapView::draw()  		bool sim_visible =  			(gMapScale >= map_scale_cutoff) && +			(simimage != NULL) &&  			(simimage->getHasGLTexture());  		if (sim_visible) @@ -502,11 +498,38 @@ void LLWorldMapView::draw()  			right < 0.f ||  			left > width )  		{ -			simimage->setBoostLevel(0); -			if (overlayimage) overlayimage->setBoostLevel(0); +			if (simimage != NULL) simimage->setBoostLevel(0); +			if (overlayimage != NULL) overlayimage->setBoostLevel(0);  			continue;  		} +		if (info->mCurrentImage.isNull()) +		{ +			if ((textures_requested_this_tick < MIN_REQUEST_PER_TICK) || +				((LLAppViewer::getTextureFetch()->getNumRequests() < MAX_SIMULTANEOUS_TEX) && +				 (textures_requested_this_tick < MAX_REQUEST_PER_TICK))) +			{ +				textures_requested_this_tick++; +				info->mCurrentImage = gImageList.getImage(info->mMapImageID[LLWorldMap::getInstance()->mCurrentMap], MIPMAP_TRUE, FALSE); +				info->mCurrentImage->setClamp(TRUE, TRUE); +				simimage = info->mCurrentImage; +				gGL.getTexUnit(0)->bind(simimage); +			} +		} +		if (info->mOverlayImage.isNull() && info->mMapImageID[2].notNull()) +		{ +			if ((textures_requested_this_tick < MIN_REQUEST_PER_TICK) || +				((LLAppViewer::getTextureFetch()->getNumRequests() < MAX_SIMULTANEOUS_TEX) && +				 (textures_requested_this_tick < MAX_REQUEST_PER_TICK))) +			{ +				textures_requested_this_tick++; +				info->mOverlayImage = gImageList.getImage(info->mMapImageID[2], MIPMAP_TRUE, FALSE); +				info->mOverlayImage->setClamp(TRUE, TRUE); +				overlayimage = info->mOverlayImage; +				gGL.getTexUnit(0)->bind(overlayimage); +			} +		} +  		mVisibleRegions.push_back(handle);  		// See if the agents need updating  		if (current_time - info->mAgentsUpdateTime > AGENTS_UPDATE_TIME) @@ -521,10 +544,13 @@ void LLWorldMapView::draw()  		center_global.mdV[VY] += 128.0;  		S32 draw_size = llround(gMapScale); -		simimage->setBoostLevel(LLViewerImage::BOOST_MAP); -		simimage->setKnownDrawSize(llround(draw_size * LLUI::sGLScaleFactor.mV[VX]), llround(draw_size * LLUI::sGLScaleFactor.mV[VY])); +		if (simimage != NULL) +		{ +			simimage->setBoostLevel(LLViewerImage::BOOST_MAP); +			simimage->setKnownDrawSize(llround(draw_size * LLUI::sGLScaleFactor.mV[VX]), llround(draw_size * LLUI::sGLScaleFactor.mV[VY])); +		} -		if (overlayimage) +		if (overlayimage != NULL)  		{  			overlayimage->setBoostLevel(LLViewerImage::BOOST_MAP);  			overlayimage->setKnownDrawSize(llround(draw_size * LLUI::sGLScaleFactor.mV[VX]), llround(draw_size * LLUI::sGLScaleFactor.mV[VY])); @@ -537,7 +563,8 @@ void LLWorldMapView::draw()  			// Draw using the texture.  If we don't clamp we get artifact at  			// the edge.  			LLGLSUIDefault gls_ui; -			gGL.getTexUnit(0)->bind(simimage); +			if (simimage != NULL) +				gGL.getTexUnit(0)->bind(simimage);  			gGL.setSceneBlendType(LLRender::BT_ALPHA);  			F32 alpha = sim_alpha * info->mAlpha; @@ -663,7 +690,8 @@ void LLWorldMapView::draw()  			// If map texture is still loading,  			// display "Loading" placeholder text. -			if (simimage->getDiscardLevel() != 1 && +			if ((simimage != NULL) && +				simimage->getDiscardLevel() != 1 &&  				simimage->getDiscardLevel() != 0)  			{  				font->renderUTF8( @@ -1658,43 +1686,59 @@ BOOL LLWorldMapView::handleMouseUp( S32 x, S32 y, MASK mask )  	return FALSE;  } -void LLWorldMapView::updateBlock(S32 block_x, S32 block_y) +U32 LLWorldMapView::updateBlock(S32 block_x, S32 block_y)  { +	U32 blocks_requested = 0;  	S32 offset = block_x | (block_y * MAP_BLOCK_RES);  	if (!LLWorldMap::getInstance()->mMapBlockLoaded[LLWorldMap::getInstance()->mCurrentMap][offset])  	{  // 		llinfos << "Loading Block (" << block_x << "," << block_y << ")" << llendl;  		LLWorldMap::getInstance()->sendMapBlockRequest(block_x << 3, block_y << 3, (block_x << 3) + 7, (block_y << 3) + 7);  		LLWorldMap::getInstance()->mMapBlockLoaded[LLWorldMap::getInstance()->mCurrentMap][offset] = TRUE; +		blocks_requested++;  	} +	return blocks_requested;  } -void LLWorldMapView::updateVisibleBlocks() +U32 LLWorldMapView::updateVisibleBlocks()  {  	if (gMapScale < SIM_MAP_SCALE)  	{  		// We don't care what is loaded if we're zoomed out -		return; +		return 0;  	} -	// check if we've loaded the 9 potentially visible zones -	LLVector3d camera_global = gAgent.getCameraPositionGlobal(); +	LLVector3d camera_global = gAgent.getCameraPositionGlobal(); +	 +	F32 pixels_per_region = gMapScale; +	const S32 width = getRect().getWidth(); +	const S32 height = getRect().getHeight();  	// Convert pan to sim coordinates -	S32 world_center_x = S32((-sPanX / gMapScale) + (camera_global.mdV[0] / REGION_WIDTH_METERS)); -	S32 world_center_y = S32((-sPanY / gMapScale) + (camera_global.mdV[1] / REGION_WIDTH_METERS)); - +	S32 world_center_x_lo = S32(((-sPanX - width/2) / pixels_per_region) + (camera_global.mdV[0] / REGION_WIDTH_METERS)); +	S32 world_center_x_hi = S32(((-sPanX + width/2) / pixels_per_region) + (camera_global.mdV[0] / REGION_WIDTH_METERS)); +	S32 world_center_y_lo = S32(((-sPanY - height/2) / pixels_per_region) + (camera_global.mdV[1] / REGION_WIDTH_METERS)); +	S32 world_center_y_hi = S32(((-sPanY + height/2)/ pixels_per_region) + (camera_global.mdV[1] / REGION_WIDTH_METERS)); +	  	// Find the corresponding 8x8 block -	S32 world_block_x = world_center_x >> 3; -	S32 world_block_y = world_center_y >> 3; +	S32 world_block_x_lo = world_center_x_lo >> 3; +	S32 world_block_x_hi = world_center_x_hi >> 3; +	S32 world_block_y_lo = world_center_y_lo >> 3; +	S32 world_block_y_hi = world_center_y_hi >> 3; +	 +	U32 blocks_requested = 0; +	const U32 max_blocks_requested = 9; -	for (S32 block_x = llmax(world_block_x-1, 0); block_x <= llmin(world_block_x+1, MAP_BLOCK_RES-1); ++block_x) +	for (S32 block_x = llmax(world_block_x_lo, 0); block_x <= llmin(world_block_x_hi, MAP_BLOCK_RES-1); ++block_x)  	{ -		for (S32 block_y = llmax(world_block_y-1, 0); block_y <= llmin(world_block_y+1, MAP_BLOCK_RES-1); ++block_y) +		for (S32 block_y = llmax(world_block_y_lo, 0); block_y <= llmin(world_block_y_hi, MAP_BLOCK_RES-1); ++block_y)  		{ -			updateBlock(block_x, block_y); +			blocks_requested += updateBlock(block_x, block_y); +			if (blocks_requested >= max_blocks_requested) +				return blocks_requested;  		}  	} -} +	return blocks_requested; +}   BOOL LLWorldMapView::handleHover( S32 x, S32 y, MASK mask )  { diff --git a/indra/newview/llworldmapview.h b/indra/newview/llworldmapview.h index 566468fa0c..980ddf9c73 100644 --- a/indra/newview/llworldmapview.h +++ b/indra/newview/llworldmapview.h @@ -127,8 +127,9 @@ public:  	static void		clearLastClick() { sHandledLastClick = FALSE; }  	// if the view changes, download additional sim info as needed -	void			updateBlock(S32 block_x, S32 block_y); -	void			updateVisibleBlocks(); +	// return value is number of blocks newly requested. +	U32				updateBlock(S32 block_x, S32 block_y); +	U32				updateVisibleBlocks();  protected:  	void			setDirectionPos( LLTextBox* text_box, F32 rotation ); diff --git a/indra/newview/llxmlrpctransaction.cpp b/indra/newview/llxmlrpctransaction.cpp index 0a7dd17ef5..a2fd0f0d9c 100644 --- a/indra/newview/llxmlrpctransaction.cpp +++ b/indra/newview/llxmlrpctransaction.cpp @@ -414,7 +414,7 @@ void LLXMLRPCTransaction::Impl::setStatus(Status status,  			default:  				// Usually this means that there's a problem with the login server, -				// not with the client.  Direct user to status page. JC +				// not with the client.  Direct user to status page.  				mStatusMessage =  					"Despite our best efforts, something unexpected has gone wrong. \n"  					" \n" diff --git a/indra/newview/res/bitmap2.bmp b/indra/newview/res/bitmap2.bmpBinary files differ deleted file mode 100644 index 770b07558c..0000000000 --- a/indra/newview/res/bitmap2.bmp +++ /dev/null diff --git a/indra/newview/res/loginbackground.bmp b/indra/newview/res/loginbackground.bmpBinary files differ deleted file mode 100644 index 288a0b0398..0000000000 --- a/indra/newview/res/loginbackground.bmp +++ /dev/null diff --git a/indra/newview/res/resource.h b/indra/newview/res/resource.h index 1a1ace82ae..da27e47dfb 100644 --- a/indra/newview/res/resource.h +++ b/indra/newview/res/resource.h @@ -36,17 +36,9 @@  #define IDREMOVE                        3  #define IDI_LL_ICON                     103  #define IDC_GRABHAND                    104 -#define IDR_MENU1                       112 -#define IDD_DIALOG1                     113 -#define IDI_INSTALL_ICON                133  #define IDC_CURSOR1                     134  #define IDC_CURSOR2                     136 -#define IDB_BITMAP1                     138 -#define IDB_BITMAP2                     140 -#define IDB_BITMAP3                     144  #define IDC_CURSOR3                     147 -#define IDB_BITMAP4                     148 -#define IDB_BITMAP5                     149  #define IDB_LOGIN                       149  #define IDC_CURSOR4                     153  #define IDC_CURSOR5                     154 diff --git a/indra/newview/res/viewerRes.rc b/indra/newview/res/viewerRes.rc index b360871f20..908c4e1da3 100644 --- a/indra/newview/res/viewerRes.rc +++ b/indra/newview/res/viewerRes.rc @@ -62,7 +62,6 @@ END  // Icon with lowest ID value placed first to ensure application icon  // remains consistent on all systems.  IDI_LL_ICON             ICON                    "ll_icon.ico" -IDI_INSTALL_ICON        ICON                    "install_icon.ico"  IDI_LCD_LL_ICON         ICON                    "icon1.ico"  ///////////////////////////////////////////////////////////////////////////// @@ -70,55 +69,6 @@ IDI_LCD_LL_ICON         ICON                    "icon1.ico"  // Dialog  // -CONNECTBOX DIALOGEX 32, 32, 187, 246 -STYLE DS_SETFONT | DS_SETFOREGROUND | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | -    WS_VISIBLE | WS_CAPTION | WS_SYSMENU -FONT 8, "MS Sans Serif", 0, 0, 0x0 -BEGIN -    CONTROL         149,IDC_STATIC,"Static",SS_BITMAP,0,0,187,246 -    EDITTEXT        IDC_EDIT_FIRSTNAME,9,180,80,13,ES_AUTOHSCROLL -    EDITTEXT        IDC_EDIT_LASTNAME,98,180,80,13,ES_AUTOHSCROLL -    EDITTEXT        IDC_EDIT_PASSWORD,9,210,80,13,ES_PASSWORD | -                    ES_AUTOHSCROLL -    CONTROL         "Remember password",IDC_REMEMBER_PASSWORD,"Button", -                    BS_AUTOCHECKBOX | WS_TABSTOP,9,229,80,10 -    DEFPUSHBUTTON   "Connect...",IDOK,98,210,80,13 -    CONTROL         "Full screen",IDC_FULL_SCREEN,"Button",BS_AUTOCHECKBOX | -                    WS_TABSTOP,100,229,50,10 -    COMBOBOX        IDC_COMBO_SERVER,98,6,84,30,CBS_DROPDOWNLIST | CBS_SORT | -                    WS_VSCROLL | WS_TABSTOP -END - -CONNECTBOXIP DIALOG  32, 32, 282, 174 -STYLE DS_SETFONT | DS_MODALFRAME | DS_SETFOREGROUND | DS_CENTER | WS_POPUP | -    WS_VISIBLE -FONT 8, "MS Sans Serif" -BEGIN -    LTEXT           "First name:",IDC_STATIC_FIRSTNAME,152,24,36,10,NOT -                    WS_GROUP -    EDITTEXT        IDC_EDIT_FIRSTNAME,152,37,58,13,ES_AUTOHSCROLL -    LTEXT           "Last name:",IDC_STATIC_LASTNAME,218,24,38,10,NOT -                    WS_GROUP -    EDITTEXT        IDC_EDIT_LASTNAME,218,37,57,13,ES_AUTOHSCROLL -    LTEXT           "Password:",IDC_STATIC_PASSWORD,152,55,38,10 -    EDITTEXT        IDC_EDIT_PASSWORD,152,71,123,13,ES_PASSWORD | -                    ES_AUTOHSCROLL -    CONTROL         "Remember password for next time",IDC_REMEMBER_PASSWORD, -                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,152,84,123,10 -    LTEXT           "Return to:",IDC_STATIC,152,97,32,8 -    CONTROL         "Last location",IDC_RADIO_LAST,"Button", -                    BS_AUTORADIOBUTTON | WS_TABSTOP,152,109,56,10 -    CONTROL         "Home",IDC_RADIO_HOME,"Button",BS_AUTORADIOBUTTON | -                    WS_TABSTOP,218,109,35,10 -    LTEXT           "Server:",IDC_STATIC_SERVER,152,119,38,10,NOT WS_GROUP -    COMBOBOX        IDC_COMBO_SERVER,152,134,88,43,CBS_DROPDOWN | WS_VSCROLL | -                    WS_TABSTOP -    PUSHBUTTON      "Quit",IDCANCEL,152,152,50,14 -    DEFPUSHBUTTON   "Connect...",IDOK,225,152,50,14 -    CONTROL         140,IDB_BITMAP1,"Static",SS_BITMAP,8,7,133,157 -    LTEXT           "Connect to Second Life",IDC_STATIC,152,7,78,8 -END -  SPLASHSCREEN DIALOG  32, 32, 144, 34  STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE  FONT 8, "MS Sans Serif" @@ -136,35 +86,6 @@ END  #ifdef APSTUDIO_INVOKED  GUIDELINES DESIGNINFO  BEGIN -    "CONNECTBOX", DIALOG -    BEGIN -        LEFTMARGIN, 8 -        RIGHTMARGIN, 180 -        VERTGUIDE, 152 -        TOPMARGIN, 7 -        BOTTOMMARGIN, 239 -        HORZGUIDE, 44 -        HORZGUIDE, 57 -        HORZGUIDE, 123 -    END - -    "CONNECTBOXIP", DIALOG -    BEGIN -        LEFTMARGIN, 7 -        RIGHTMARGIN, 275 -        VERTGUIDE, 152 -        VERTGUIDE, 218 -        TOPMARGIN, 7 -        BOTTOMMARGIN, 166 -        HORZGUIDE, 12 -        HORZGUIDE, 17 -        HORZGUIDE, 24 -        HORZGUIDE, 50 -        HORZGUIDE, 55 -        HORZGUIDE, 84 -        HORZGUIDE, 105 -        HORZGUIDE, 119 -    END      "SPLASHSCREEN", DIALOG      BEGIN @@ -180,20 +101,6 @@ END  /////////////////////////////////////////////////////////////////////////////  // -// Menu -// - -IDR_MENU1 MENU -BEGIN -    POPUP "testmenu" -    BEGIN -        MENUITEM "test",                        ID_TESTMENU_TEST -    END -END - - -///////////////////////////////////////////////////////////////////////////// -//  // Cursor  // @@ -269,8 +176,6 @@ END  // Bitmap  // -IDB_BITMAP2             BITMAP                  "bitmap2.bmp" -IDB_LOGIN               BITMAP                  "loginbackground.bmp"  #endif    // English (U.S.) resources  ///////////////////////////////////////////////////////////////////////////// diff --git a/indra/newview/skins/default/xui/de/floater_preview_gesture.xml b/indra/newview/skins/default/xui/de/floater_preview_gesture.xml index da385b72d6..327d0b70f1 100644 --- a/indra/newview/skins/default/xui/de/floater_preview_gesture.xml +++ b/indra/newview/skins/default/xui/de/floater_preview_gesture.xml @@ -30,14 +30,12 @@  	<text name="steps_label">  		Schritte:  	</text> -	<!-- Revert translations as interim fix to VWR-9985 while the code is not properly internationalized  	<scroll_list name="library_list">  		Animation  Ton  Chat  Warten  	</scroll_list> -	-->  	<button label="Hinzufügen >>" name="add_btn"/>  	<button label="Nach oben" name="up_btn"/>  	<button label="Nach unten" name="down_btn"/> diff --git a/indra/newview/skins/default/xui/fr/floater_preview_gesture.xml b/indra/newview/skins/default/xui/fr/floater_preview_gesture.xml index 3f7d0973b9..6c373030ad 100644 --- a/indra/newview/skins/default/xui/fr/floater_preview_gesture.xml +++ b/indra/newview/skins/default/xui/fr/floater_preview_gesture.xml @@ -33,14 +33,12 @@  	<text name="steps_label">
  		Étapes :
  	</text>
 -	<!-- Revert translations as interim fix to VWR-9985 while the code is not properly internationalized
  	<scroll_list name="library_list">
  		Animation
  Son
  Chat
  Attendre
  	</scroll_list>
 -	-->
  	<button label="Ajouter >>" name="add_btn" />
  	<button label="Monter" name="up_btn" />
  	<button label="Descendre" name="down_btn" />
 diff --git a/indra/newview/skins/default/xui/ja/floater_preview_gesture.xml b/indra/newview/skins/default/xui/ja/floater_preview_gesture.xml index 61665a124a..177895f44e 100644 --- a/indra/newview/skins/default/xui/ja/floater_preview_gesture.xml +++ b/indra/newview/skins/default/xui/ja/floater_preview_gesture.xml @@ -30,14 +30,12 @@  	<text name="steps_label">  		手順:  	</text> -	<!-- Revert translations as interim fix to VWR-9985 while the code is not properly internationalized  	<scroll_list name="library_list">  		アニメーション  サウンド  チャット  待機  	</scroll_list> -	-->  	<button label="追加>>" name="add_btn"/>  	<button label="上に移動" name="up_btn"/>  	<button label="下に移動" name="down_btn"/> diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index be17f1f390..f72e4a8b7c 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -171,7 +171,7 @@ class WindowsManifest(ViewerManifest):                  '../../libraries/i686-win32/lib/release/llkdu.dll'),                     dst='llkdu.dll')          except: -            print "Skipping llkdu,.dll" +            print "Skipping llkdu.dll"          self.path(src="licenses-win32.txt", dst="licenses.txt")          self.path("featuretable.txt") @@ -578,13 +578,6 @@ class LinuxManifest(ViewerManifest):      def package_finish(self): -        # stripping all the libs removes a few megabytes from the end-user package -        for s,d in self.file_list: -            if re.search("lib/lib.+\.so.*", d): -                self.run_command('strip -S %s' % d) -            if re.search("app_settings/mozilla-runtime-.*/lib.+\.so.*", d): -                self.run_command('strip %s' % d) -          if 'installer_name' in self.args:              installer_name = self.args['installer_name']          else: @@ -628,6 +621,17 @@ class LinuxManifest(ViewerManifest):  class Linux_i686Manifest(LinuxManifest):      def construct(self):          super(Linux_i686Manifest, self).construct() + +        # install either the libllkdu we just built, or a prebuilt one, in +        # decreasing order of preference.  for linux package, this goes to bin/ +        try: +            self.path(self.find_existing_file( +                '../llkdu/libllkdu.so', +                '../../libraries/i686-linux/lib_release_client/libllkdu.so'),  +                  dst='bin/libllkdu.so') +        except: +            print "Skipping libllkdu.so - not found" +          self.path("secondlife-stripped","bin/do-not-directly-run-secondlife-bin")          self.path("../linux_crash_logger/linux-crash-logger-stripped","linux-crash-logger.bin")          self.path("linux_tools/launch_url.sh","launch_url.sh") @@ -642,7 +646,7 @@ class Linux_i686Manifest(LinuxManifest):          self.path("app_settings/mozilla-runtime-linux-i686")          if self.prefix("../../libraries/i686-linux/lib_release_client", dst="lib"): -            self.path("libkdu_v42R.so") +            self.path("libkdu_v42R.so", "libkdu.so")              self.path("libfmod-3.75.so")              self.path("libapr-1.so.0")              self.path("libaprutil-1.so.0") @@ -650,12 +654,10 @@ class Linux_i686Manifest(LinuxManifest):              self.path("libcrypto.so.0.9.7")              self.path("libexpat.so.1")              self.path("libssl.so.0.9.7") -            self.path("libstdc++.so.6")              self.path("libuuid.so", "libuuid.so.1")              self.path("libSDL-1.2.so.0")              self.path("libELFIO.so") -            self.path("libopenjpeg.so.2") -            self.path("libllkdu.so", "../bin/libllkdu.so") # llkdu goes in bin for some reason +            self.path("libopenjpeg.so.1.3.0", "libopenjpeg.so.1.3")              self.path("libalut.so")              self.path("libopenal.so", "libopenal.so.1")              self.end_prefix("lib") diff --git a/indra/win_crash_logger/llcrashloggerwindows.cpp b/indra/win_crash_logger/llcrashloggerwindows.cpp index c938f209ff..c9e01c8418 100644 --- a/indra/win_crash_logger/llcrashloggerwindows.cpp +++ b/indra/win_crash_logger/llcrashloggerwindows.cpp @@ -259,8 +259,8 @@ bool LLCrashLoggerWindows::init(void)  	if(!ok) return false;  	/* -	mbstowcs(gProductName, mProductName.c_str(), sizeof(gProductName)/sizeof(gProductName[0])); -	gProductName[ sizeof(gProductName)/sizeof(gProductName[0]) - 1 ] = 0; +	mbstowcs( gProductName, mProductName.c_str(), LL_ARRAY_SIZE(gProductName) ); +	gProductName[ LL_ARRY_SIZE(gProductName) - 1 ] = 0;  	swprintf(gProductName, L"Second Life");  	*/ diff --git a/install.xml b/install.xml index 07b5f78144..ad559a0e90 100644 --- a/install.xml +++ b/install.xml @@ -153,9 +153,9 @@            <key>linux</key>            <map>              <key>md5sum</key> -            <string>aa111fae0ac550bba5e280275eb25904</string> +            <string>946c2e106f14f7a1e521d4a14e0e146f</string>              <key>url</key> -            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ares-1.4.0-linux-20080729.tar.bz2</uri> +            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ares-1.4.0-linux-20081202.tar.bz2</uri>            </map>            <key>linux32</key>            <map> @@ -256,9 +256,9 @@            <key>linux</key>            <map>              <key>md5sum</key> -            <string>e6d4cd23f5df4c74072d5d0437ca999b</string> +            <string>a88e8285b3d97a21bf43cc5f90e87eb9</string>              <key>url</key> -            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/curl-7.16.0-linux-20080812.tar.bz2</uri> +            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/curl-7.16.4-linux-20081202.tar.bz2</uri>            </map>            <key>linux32</key>            <map> @@ -460,9 +460,9 @@            <key>linux</key>            <map>              <key>md5sum</key> -            <string>07665d74d37c56fd884610ec80a1d19f</string> +            <string>eeffb03bd6672b6e7751448e5306d874</string>              <key>url</key> -            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/freetype-2.1.5-linux-20080812.tar.bz2</uri> +            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/freetype-2.1.5-linux-20081201.tar.bz2</uri>            </map>            <key>linux32</key>            <map> @@ -694,7 +694,7 @@          <key>copyright</key>          <string>Copyright (c) 2003, Yves Piguet.</string>          <key>description</key> -        <string>An open-source JPEG-2000 library; a slower alternative to Kadaku. Used in the open source release </string> +        <string>An open-source JPEG (JFIF) library</string>          <key>license</key>          <string>jpeglib</string>          <key>packages</key> @@ -709,9 +709,9 @@            <key>linux</key>            <map>              <key>md5sum</key> -            <string>41085a9915598bba0e6bcb0da23ff929</string> +            <string>8aa8e01e0c21f60f0ede0ffb04e9214f</string>              <key>url</key> -            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/jpeglib-6b-linux-20080812.tar.bz2</uri> +            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/jpeglib-6b-linux-20081218.tar.bz2</uri>            </map>            <key>linux32</key>            <map> @@ -891,9 +891,9 @@ anguage Infrstructure (CLI) international standard</string>            <key>linux</key>            <map>              <key>md5sum</key> -            <string>0878662f8c1c695a82477f7b0c57a7af</string> +            <string>8ccd6155e0236b78548125a8aabebf79</string>              <key>url</key> -            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libpng-1.2.18-linux-20080812.tar.bz2</uri> +            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libpng-1.2.33-linux-20081201.tar.bz2</uri>            </map>            <key>linux32</key>            <map> @@ -918,39 +918,6 @@ anguage Infrstructure (CLI) international standard</string>            </map>          </map>        </map> -      <key>libstdc++</key> -      <map> -        <key>copyright</key> -        <string>Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/></string> -        <key>description</key> -        <string>Bundled library.</string> -        <key>license</key> -        <string>gpl</string> -        <key>packages</key> -        <map> -          <key>linux</key> -          <map> -            <key>md5sum</key> -            <string>1464a75ec87ee28e3b4f7840e9af41e3</string> -            <key>url</key> -            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libstdc++-6.0-linux-20080812.tar.bz2</uri> -          </map> -          <key>linux32</key> -          <map> -            <key>md5sum</key> -            <string>1218347dd70c3b471530793d0fc09b69</string> -            <key>url</key> -            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libstdc++-6.4.1-linux-i686-gcc-4.1-20080915.tar.bz2</uri> -          </map> -          <key>linux64</key> -          <map> -            <key>md5sum</key> -            <string>9a191dc453017b19c5803b046d82f32a</string> -            <key>url</key> -            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libstdc++-6.4.1-linux64-20080909.tar.bz2</uri> -          </map> -        </map> -      </map>        <key>libuuid</key>        <map>          <key>copyright</key> @@ -1022,9 +989,9 @@ anguage Infrstructure (CLI) international standard</string>            <key>linux</key>            <map>              <key>md5sum</key> -            <string>344bfdb8448bbc4158a99300cf4e2b4b</string> +            <string>6866c147730c83b7858765355df75047</string>              <key>url</key> -            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/llmozlib-linux-20080922.tar.bz2</uri> +            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/llmozlib-linux-20081218prfhk.tar.bz2</uri>            </map>            <key>linux32</key>            <map> @@ -1171,9 +1138,9 @@ anguage Infrstructure (CLI) international standard</string>            <key>linux</key>            <map>              <key>md5sum</key> -            <string>df1809565b87b1dc28e3ca70db6e7d46</string> +            <string>6dc0536329a0aadf76e3054ffd4da61c</string>              <key>url</key> -            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ogg-vorbis-1.03-1.1.2-linux-20080812.tar.bz2</uri> +            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ogg-vorbis-1.2.0-linux-20081201.tar.bz2</uri>            </map>            <key>linux32</key>            <map> @@ -1301,9 +1268,9 @@ anguage Infrstructure (CLI) international standard</string>            <key>linux</key>            <map>              <key>md5sum</key> -            <string>c333219c88462b8b22c815cd2b700218</string> +            <string>02af0dad64803e0d821bc09e6038682c</string>              <key>url</key> -            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openjpeg-1.2-linux-20080812.tar.bz2</uri> +            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openjpeg-1.3-linux-20081124b.tar.bz2</uri>            </map>            <key>linux32</key>            <map> | 
