diff options
130 files changed, 1650 insertions, 1822 deletions
| @@ -213,7 +213,11 @@ e440cd1dfbd128d7d5467019e497f7f803640ad6 3.2.0-beta1  9bcc2b7176634254e501e3fb4c5b56c1f637852e 3.2.0-beta2  2a13d30ee50ccfed50268238e36bb90d738ccc9e DRTVWR-98_3.2.0-beta3  2a13d30ee50ccfed50268238e36bb90d738ccc9e 3.2.0-beta3 +3150219d229d628f0c15e58e8a51511cbd97e58d DRTVWR-94_3.2.0-release +3150219d229d628f0c15e58e8a51511cbd97e58d 3.2.0-release  c4911ec8cd81e676dfd2af438b3e065407a94a7a 3.2.1-start +3150219d229d628f0c15e58e8a51511cbd97e58d DRTVWR-94_3.2.0-release +3150219d229d628f0c15e58e8a51511cbd97e58d 3.2.0-release  40b46edba007d15d0059c80864b708b99c1da368 3.2.2-start  3150219d229d628f0c15e58e8a51511cbd97e58d DRTVWR-94_3.2.0-release  3150219d229d628f0c15e58e8a51511cbd97e58d 3.2.0-release @@ -221,3 +225,6 @@ c4911ec8cd81e676dfd2af438b3e065407a94a7a 3.2.1-start  9e390d76807fa70d356b8716fb83b8ce42a629ef 3.2.1-beta1  523df3e67378541498d516d52af4402176a26bac DRTVWR-102_3.2.2-beta1  523df3e67378541498d516d52af4402176a26bac 3.2.2-beta1 +80f3e30d8aa4d8f674a48bd742aaa6d8e9eae0b5 3.2.3-start +a8c7030d6845186fac7c188be4323a0e887b4184 DRTVWR-99_3.2.1-release +a8c7030d6845186fac7c188be4323a0e887b4184 3.2.1-release diff --git a/BuildParams b/BuildParams index 5068edb21f..3f5d6f8c6b 100755 --- a/BuildParams +++ b/BuildParams @@ -136,14 +136,6 @@ viewer-mesh.login_channel = "Project Viewer - Mesh"  viewer-mesh.viewer_grid = aditi  viewer-mesh.email = shining@lists.lindenlab.com - -# ======================================== -# CG -# ======================================== - -cg_viewer-development_lenny.show_changes_since = 4b140ce7839d -cg_viewer-development_lenny.email = cg@lindenlab.com -  # ================  # oz  # ================ @@ -151,20 +143,29 @@ cg_viewer-development_lenny.email = cg@lindenlab.com  oz_viewer-devreview.build_debug_release_separately = true  oz_viewer-devreview.codeticket_add_context = false  oz_viewer-devreview.build_enforce_coding_policy = true +oz_viewer-devreview.email = oz@lindenlab.com  oz_project-1.build_debug_release_separately = true  oz_project-1.codeticket_add_context = false +oz_project-1.email = oz@lindenlab.com  oz_project-2.build_debug_release_separately = true  oz_project-2.codeticket_add_context = false +oz_project-2.email = oz@lindenlab.com  oz_project-3.build_debug_release_separately = true  oz_project-3.codeticket_add_context = false +oz_project-3.email = oz@lindenlab.com  oz_project-4.build_debug_release_separately = true  oz_project-4.codeticket_add_context = false +oz_project-4.email = oz@lindenlab.com +oz_project-5.build_debug_release_separately = true +oz_project-5.codeticket_add_context = false +oz_project-5.email = oz@lindenlab.com  oz_viewer-beta-review.build_debug_release_separately = true  oz_viewer-beta-review.codeticket_add_context = false  oz_viewer-beta-review.viewer_channel = "Second Life Beta Viewer"  oz_viewer-beta-review.login_channel = "Second Life Beta Viewer" +oz_viewer-beta-review.email = oz@lindenlab.com  # =================================================================  # asset delivery 2010 projects diff --git a/doc/contributions.txt b/doc/contributions.txt index 2b39e15e2a..8d30c21f90 100644 --- a/doc/contributions.txt +++ b/doc/contributions.txt @@ -170,6 +170,7 @@ Ansariel Hiller  	STORM-1101  	VWR-25480  	VWR-26150 +	STORM-1685  Aralara Rajal  Ardy Lay  	STORM-859 @@ -583,9 +584,11 @@ Jonathan Yap  	STORM-910  	STORM-1642  	STORM-1105 +	STORM-1679  	STORM-1222  	STORM-1659  	STORM-1674 +	STORM-1685  Kadah Coba  	STORM-1060  Jondan Lundquist @@ -1114,6 +1117,7 @@ Tofu Buzzard  	CTS-411  	STORM-546  	VWR-24509 +    STORM-1684  Tony Kembia  Torben Trautman  TouchaHoney Perhaps diff --git a/indra/CMakeLists.txt b/indra/CMakeLists.txt index d1042d6e86..4b1bf49d07 100644 --- a/indra/CMakeLists.txt +++ b/indra/CMakeLists.txt @@ -1,4 +1,3 @@ -  # -*- cmake -*-  # cmake_minimum_required should appear before any @@ -70,6 +69,9 @@ if (VIEWER)    add_subdirectory(${LIBS_OPEN_PREFIX}llxuixml)    add_subdirectory(${LIBS_OPEN_PREFIX}viewer_components) +  # Legacy C++ tests. Build always, run if LL_TESTS is true. +  add_subdirectory(${VIEWER_PREFIX}test) +    # viewer media plugins    add_subdirectory(${LIBS_OPEN_PREFIX}media_plugins) diff --git a/indra/llcommon/llversionviewer.h b/indra/llcommon/llversionviewer.h index fc1c1449da..b50405421d 100644 --- a/indra/llcommon/llversionviewer.h +++ b/indra/llcommon/llversionviewer.h @@ -29,7 +29,7 @@  const S32 LL_VERSION_MAJOR = 3;  const S32 LL_VERSION_MINOR = 2; -const S32 LL_VERSION_PATCH = 2; +const S32 LL_VERSION_PATCH = 4;  const S32 LL_VERSION_BUILD = 0;  const char * const LL_CHANNEL = "Second Life Developer"; diff --git a/indra/llui/llsdparam.cpp b/indra/llui/llsdparam.cpp index 6fa90933a4..0e29873bb0 100644 --- a/indra/llui/llsdparam.cpp +++ b/indra/llui/llsdparam.cpp @@ -36,6 +36,8 @@ static 	LLInitParam::Parser::parser_write_func_map_t sWriteFuncs;  static 	LLInitParam::Parser::parser_inspect_func_map_t sInspectFuncs;  static const LLSD NO_VALUE_MARKER; +LLFastTimer::DeclareTimer FTM_SD_PARAM_ADAPTOR("LLSD to LLInitParam conversion"); +  //  // LLParamSDParser  // diff --git a/indra/llui/llsdparam.h b/indra/llui/llsdparam.h index c1cfa98399..3dfc6d020e 100644 --- a/indra/llui/llsdparam.h +++ b/indra/llui/llsdparam.h @@ -91,6 +91,8 @@ private:  	LLSD*					mCurWriteSD;  }; + +extern LLFastTimer::DeclareTimer FTM_SD_PARAM_ADAPTOR;  template<typename T>  class LLSDParamAdapter : public T  { @@ -98,8 +100,11 @@ public:  	LLSDParamAdapter() {}  	LLSDParamAdapter(const LLSD& sd)  	{ +		LLFastTimer _(FTM_SD_PARAM_ADAPTOR);  		LLParamSDParser parser; -		parser.readSD(sd, *this); +		// don't spam for implicit parsing of LLSD, as we want to allow arbitrary freeform data and ignore most of it +		bool parse_silently = true; +		parser.readSD(sd, *this, parse_silently);  	}  	operator LLSD() const diff --git a/indra/llui/llurlaction.cpp b/indra/llui/llurlaction.cpp index 42b779bd28..fd9b3d9a6d 100644 --- a/indra/llui/llurlaction.cpp +++ b/indra/llui/llurlaction.cpp @@ -33,28 +33,28 @@  #include "llurlregistry.h"  // global state for the callback functions -void (*LLUrlAction::sOpenURLCallback) (const std::string& url) = NULL; -void (*LLUrlAction::sOpenURLInternalCallback) (const std::string& url) = NULL; -void (*LLUrlAction::sOpenURLExternalCallback) (const std::string& url) = NULL; -bool (*LLUrlAction::sExecuteSLURLCallback) (const std::string& url) = NULL; +LLUrlAction::url_callback_t 		LLUrlAction::sOpenURLCallback; +LLUrlAction::url_callback_t 		LLUrlAction::sOpenURLInternalCallback; +LLUrlAction::url_callback_t 		LLUrlAction::sOpenURLExternalCallback; +LLUrlAction::execute_url_callback_t LLUrlAction::sExecuteSLURLCallback; -void LLUrlAction::setOpenURLCallback(void (*cb) (const std::string& url)) +void LLUrlAction::setOpenURLCallback(url_callback_t cb)  {  	sOpenURLCallback = cb;  } -void LLUrlAction::setOpenURLInternalCallback(void (*cb) (const std::string& url)) +void LLUrlAction::setOpenURLInternalCallback(url_callback_t cb)  {  	sOpenURLInternalCallback = cb;  } -void LLUrlAction::setOpenURLExternalCallback(void (*cb) (const std::string& url)) +void LLUrlAction::setOpenURLExternalCallback(url_callback_t cb)  {  	sOpenURLExternalCallback = cb;  } -void LLUrlAction::setExecuteSLURLCallback(bool (*cb) (const std::string& url)) +void LLUrlAction::setExecuteSLURLCallback(execute_url_callback_t cb)  {  	sExecuteSLURLCallback = cb;  } @@ -63,7 +63,7 @@ void LLUrlAction::openURL(std::string url)  {  	if (sOpenURLCallback)  	{ -		(*sOpenURLCallback)(url); +		sOpenURLCallback(url);  	}  } @@ -71,7 +71,7 @@ void LLUrlAction::openURLInternal(std::string url)  {  	if (sOpenURLInternalCallback)  	{ -		(*sOpenURLInternalCallback)(url); +		sOpenURLInternalCallback(url);  	}  } @@ -79,7 +79,7 @@ void LLUrlAction::openURLExternal(std::string url)  {  	if (sOpenURLExternalCallback)  	{ -		(*sOpenURLExternalCallback)(url); +		sOpenURLExternalCallback(url);  	}  } @@ -87,18 +87,18 @@ void LLUrlAction::executeSLURL(std::string url)  {  	if (sExecuteSLURLCallback)  	{ -		(*sExecuteSLURLCallback)(url); +		sExecuteSLURLCallback(url);  	}  }  void LLUrlAction::clickAction(std::string url)  {  	// Try to handle as SLURL first, then http Url -	if ( (sExecuteSLURLCallback) && !(*sExecuteSLURLCallback)(url) ) +	if ( (sExecuteSLURLCallback) && !sExecuteSLURLCallback(url) )  	{  		if (sOpenURLCallback)  		{ -			(*sOpenURLCallback)(url); +			sOpenURLCallback(url);  		}  	}  } diff --git a/indra/llui/llurlaction.h b/indra/llui/llurlaction.h index 0132dbaaf0..c34960b826 100644 --- a/indra/llui/llurlaction.h +++ b/indra/llui/llurlaction.h @@ -29,6 +29,7 @@  #define LL_LLURLACTION_H  #include <string> +#include <boost/function.hpp>  ///  /// The LLUrlAction class provides a number of static functions that @@ -77,17 +78,21 @@ public:  	static void showProfile(std::string url);  	/// specify the callbacks to enable this class's functionality -	static void	setOpenURLCallback(void (*cb) (const std::string& url)); -	static void	setOpenURLInternalCallback(void (*cb) (const std::string& url)); -	static void	setOpenURLExternalCallback(void (*cb) (const std::string& url)); -	static void	setExecuteSLURLCallback(bool (*cb) (const std::string& url)); +	typedef boost::function<void (const std::string&)> url_callback_t; +	typedef boost::function<bool(const std::string& url)> execute_url_callback_t; + +	static void	setOpenURLCallback(url_callback_t cb); +	static void	setOpenURLInternalCallback(url_callback_t cb); +	static void	setOpenURLExternalCallback(url_callback_t cb); +	static void	setExecuteSLURLCallback(execute_url_callback_t cb);  private:  	// callbacks for operations we can perform on Urls -	static void (*sOpenURLCallback) (const std::string& url); -	static void (*sOpenURLInternalCallback) (const std::string& url); -	static void (*sOpenURLExternalCallback) (const std::string& url); -	static bool (*sExecuteSLURLCallback) (const std::string& url); +	static url_callback_t sOpenURLCallback; +	static url_callback_t sOpenURLInternalCallback; +	static url_callback_t sOpenURLExternalCallback; + +	static execute_url_callback_t sExecuteSLURLCallback;  };  #endif diff --git a/indra/llwindow/llwindowsdl.cpp b/indra/llwindow/llwindowsdl.cpp index e41aa9820f..da2222ad51 100644 --- a/indra/llwindow/llwindowsdl.cpp +++ b/indra/llwindow/llwindowsdl.cpp @@ -63,6 +63,9 @@ extern BOOL gDebugWindowProc;  const S32 MAX_NUM_RESOLUTIONS = 200; +const S32 MIN_WINDOW_WIDTH = 1024; +const S32 MIN_WINDOW_HEIGHT = 768; +  // static variable for ATI mouse cursor crash work-around:  static bool ATIbug = false;  @@ -1843,11 +1846,15 @@ void LLWindowSDL::gatherInput()                  break;              case SDL_VIDEORESIZE:  // *FIX: handle this? +            {  		llinfos << "Handling a resize event: " << event.resize.w <<  			"x" << event.resize.h << llendl; +		S32 width = llmax(event.resize.w, MIN_WINDOW_WIDTH); +		S32 height = llmax(event.resize.h, MIN_WINDOW_HEIGHT); +  		// *FIX: I'm not sure this is necessary! -		mWindow = SDL_SetVideoMode(event.resize.w, event.resize.h, 32, mSDLFlags); +		mWindow = SDL_SetVideoMode(width, height, 32, mSDLFlags);  		if (!mWindow)  		{  			// *FIX: More informative dialog? @@ -1861,9 +1868,9 @@ void LLWindowSDL::gatherInput()                  break;  		} -		mCallbacks->handleResize(this, event.resize.w, event.resize.h ); +		mCallbacks->handleResize(this, width, height);                  break; - +            }              case SDL_ACTIVEEVENT:                  if (event.active.state & SDL_APPINPUTFOCUS)                  { diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index ff9cf3199e..ba05f6288b 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -207,7 +207,6 @@ set(viewer_SOURCE_FILES      llfloaterland.cpp      llfloaterlandholdings.cpp      llfloatermap.cpp -    llfloatermediabrowser.cpp      llfloatermediasettings.cpp      llfloatermemleak.cpp      llfloatermodelpreview.cpp @@ -781,7 +780,6 @@ set(viewer_HEADER_FILES      llfloaterland.h      llfloaterlandholdings.h      llfloatermap.h -    llfloatermediabrowser.h      llfloatermediasettings.h      llfloatermemleak.h      llfloatermodelpreview.h diff --git a/indra/newview/installers/windows/installer_template.nsi b/indra/newview/installers/windows/installer_template.nsi index 02ca7cbb3a..8a6114f0d5 100755 --- a/indra/newview/installers/windows/installer_template.nsi +++ b/indra/newview/installers/windows/installer_template.nsi @@ -115,6 +115,7 @@ Var COMMANDLINE         ; command line passed to this installer, set in .onInit  Var SHORTCUT_LANG_PARAM ; "--set InstallLanguage de", passes language to viewer
  Var SKIP_DIALOGS        ; set from command line in  .onInit. autoinstall 
                          ; GUI and the defaults.
 +Var DO_UNINSTALL_V2     ; If non-null, path to a previous Viewer 2 installation that will be uninstalled.
  ;;; Function definitions should go before file includes, because calls to
  ;;; DLLs like LangDLL trigger an implicit file include, so if that call is at
 @@ -311,6 +312,29 @@ FunctionEnd  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 +; Function CheckWillUninstallV2               
 +;
 +; If we are being called through auto-update, we need to uninstall any
 +; existing V2 installation. Otherwise, we wind up with
 +; SecondLifeViewer2 and SecondLifeViewer installations existing side
 +; by side no indication which to use.
 +; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 +Function CheckWillUninstallV2
 +
 +  StrCpy $DO_UNINSTALL_V2 ""
 +
 +  StrCmp $SKIP_DIALOGS "true" 0 CHECKV2_DONE
 +  StrCmp $INSTDIR "$PROGRAMFILES\SecondLifeViewer2" CHECKV2_DONE ; don't uninstall our own install dir.
 +  IfFileExists "$PROGRAMFILES\SecondLifeViewer2\uninst.exe" CHECKV2_FOUND CHECKV2_DONE
 +
 +CHECKV2_FOUND:
 +  StrCpy $DO_UNINSTALL_V2 "true"
 +
 +CHECKV2_DONE:
 +
 +FunctionEnd
 +
 +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  ; Save user files to temp location
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  Function PreserveUserFiles
 @@ -334,7 +358,7 @@ Push $2      ExpandEnvStrings $2 $2
      CreateDirectory "$TEMP\SecondLifeSettingsBackup\$0"
 -    CopyFiles  "$2\Application Data\SecondLife\*" "$TEMP\SecondLifeSettingsBackup\$0"
 +    CopyFiles /SILENT "$2\Application Data\SecondLife\*" "$TEMP\SecondLifeSettingsBackup\$0"
    CONTINUE:
      IntOp $0 $0 + 1
 @@ -350,7 +374,7 @@ Push $0      ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" "Common AppData"
      StrCmp $0 "" +2
      CreateDirectory "$TEMP\SecondLifeSettingsBackup\AllUsers\"
 -    CopyFiles "$2\Application Data\SecondLife\*" "$TEMP\SecondLifeSettingsBackup\AllUsers\"
 +    CopyFiles /SILENT "$2\Application Data\SecondLife\*" "$TEMP\SecondLifeSettingsBackup\AllUsers\"
  Pop $0
  FunctionEnd
 @@ -377,7 +401,7 @@ Push $2      ExpandEnvStrings $2 $2
      CreateDirectory "$2\Application Data\SecondLife\"
 -    CopyFiles "$TEMP\SecondLifeSettingsBackup\$0\*" "$2\Application Data\SecondLife\" 
 +    CopyFiles /SILENT "$TEMP\SecondLifeSettingsBackup\$0\*" "$2\Application Data\SecondLife\" 
    CONTINUE:
      IntOp $0 $0 + 1
 @@ -393,11 +417,53 @@ Push $0      ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" "Common AppData"
      StrCmp $0 "" +2
      CreateDirectory "$2\Application Data\SecondLife\"
 -    CopyFiles "$TEMP\SecondLifeSettingsBackup\AllUsers\*" "$2\Application Data\SecondLife\" 
 +    CopyFiles /SILENT "$TEMP\SecondLifeSettingsBackup\AllUsers\*" "$2\Application Data\SecondLife\" 
 +Pop $0
 +
 +FunctionEnd
 +
 +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 +; Remove temp dirs
 +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 +Function RemoveTempUserFiles
 +
 +Push $0
 +Push $1
 +Push $2
 +
 +    StrCpy $0 0 ; Index number used to iterate via EnumRegKey
 +
 +  LOOP:
 +    EnumRegKey $1 HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList" $0
 +    StrCmp $1 "" DONE               ; no more users
 +
 +    ReadRegStr $2 HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\$1" "ProfileImagePath" 
 +    StrCmp $2 "" CONTINUE 0         ; "ProfileImagePath" value is missing
 +
 +    ; Required since ProfileImagePath is of type REG_EXPAND_SZ
 +    ExpandEnvStrings $2 $2
 +
 +    RMDir /r "$TEMP\SecondLifeSettingsBackup\$0\*"
 +
 +  CONTINUE:
 +    IntOp $0 $0 + 1
 +    Goto LOOP
 +  DONE:
 +
 +Pop $2
 +Pop $1
 +Pop $0
 +
 +; Copy files in Documents and Settings\All Users\SecondLife
 +Push $0
 +    ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" "Common AppData"
 +    StrCmp $0 "" +2
 +    RMDir /r "$TEMP\SecondLifeSettingsBackup\AllUsers\*"
  Pop $0
  FunctionEnd
 +
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  ; Clobber user files - TEST ONLY
  ; This is here for testing, generally not desirable to call it.
 @@ -864,9 +930,12 @@ Call CheckIfAdministrator		; Make sure the user can install/uninstall  Call CheckIfAlreadyCurrent		; Make sure that we haven't already installed this version
  Call CloseSecondLife			; Make sure we're not running
  Call CheckNetworkConnection		; ping secondlife.com
 +Call CheckWillUninstallV2               ; See if a V2 install exists and will be removed.
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 -Call PreserveUserFiles
 +StrCmp $DO_UNINSTALL_V2 "" PRESERVE_DONE
 +  Call PreserveUserFiles
 +PRESERVE_DONE:
  ;;; Don't remove cache files during a regular install, removing the inventory cache on upgrades results in lots of damage to the servers.
  ;Call RemoveCacheFiles			; Installing over removes potentially corrupted
 @@ -951,17 +1020,15 @@ WriteRegExpandStr HKEY_CLASSES_ROOT "x-grid-location-info\shell\open\command" ""  ; write out uninstaller
  WriteUninstaller "$INSTDIR\uninst.exe"
 -; Remove existing "Second Life Viewer 2" install if any.
 -StrCmp $INSTDIR "$PROGRAMFILES\SecondLifeViewer2" SLV2_DONE ; unless that's the install directory
 -IfFileExists "$PROGRAMFILES\SecondLifeViewer2\uninst.exe" SLV2_FOUND SLV2_DONE
 -
 -SLV2_FOUND:
 -ExecWait '"$PROGRAMFILES\SecondLifeViewer2\uninst.exe" /S _?=$PROGRAMFILES\SecondLifeViewer2'
 -Delete "$PROGRAMFILES\SecondLifeViewer2\uninst.exe" ; with _? option above, uninst.exe will be left behind.
 -RMDir "$PROGRAMFILES\SecondLifeViewer2" ; will remove only if empty.
 +; Uninstall existing "Second Life Viewer 2" install if needed.
 +StrCmp $DO_UNINSTALL_V2 "" REMOVE_SLV2_DONE
 +  ExecWait '"$PROGRAMFILES\SecondLifeViewer2\uninst.exe" /S _?=$PROGRAMFILES\SecondLifeViewer2'
 +  Delete "$PROGRAMFILES\SecondLifeViewer2\uninst.exe" ; with _? option above, uninst.exe will be left behind.
 +  RMDir "$PROGRAMFILES\SecondLifeViewer2" ; will remove only if empty.
 -SLV2_DONE:
 -Call RestoreUserFiles
 +  Call RestoreUserFiles
 +  Call RemoveTempUserFiles
 +REMOVE_SLV2_DONE:
  ; end of default section
  SectionEnd
 diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp index f8b204eca0..37bf856662 100755 --- a/indra/newview/llagent.cpp +++ b/indra/newview/llagent.cpp @@ -1101,20 +1101,11 @@ F32 LLAgent::clampPitchToLimits(F32 angle)  	LLVector3 skyward = getReferenceUpVector(); -	F32			look_down_limit; -	F32			look_up_limit = 10.f * DEG_TO_RAD; +	const F32 look_down_limit = 179.f * DEG_TO_RAD;; +	const F32 look_up_limit   =   1.f * DEG_TO_RAD;  	F32 angle_from_skyward = acos( mFrameAgent.getAtAxis() * skyward ); -	if (isAgentAvatarValid() && gAgentAvatarp->isSitting()) -	{ -		look_down_limit = 130.f * DEG_TO_RAD; -	} -	else -	{ -		look_down_limit = 170.f * DEG_TO_RAD; -	} -  	// clamp pitch to limits  	if ((angle >= 0.f) && (angle_from_skyward + angle > look_down_limit))  	{ diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index c937f604fc..8bf4d94059 100755 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -847,9 +847,9 @@ bool LLAppViewer::init()  	LLWeb::initClass();			  // do this after LLUI  	// Provide the text fields with callbacks for opening Urls -	LLUrlAction::setOpenURLCallback(&LLWeb::loadURL); -	LLUrlAction::setOpenURLInternalCallback(&LLWeb::loadURLInternal); -	LLUrlAction::setOpenURLExternalCallback(&LLWeb::loadURLExternal); +	LLUrlAction::setOpenURLCallback(boost::bind(&LLWeb::loadURL, _1, LLStringUtil::null, LLStringUtil::null)); +	LLUrlAction::setOpenURLInternalCallback(boost::bind(&LLWeb::loadURLInternal, _1, LLStringUtil::null, LLStringUtil::null)); +	LLUrlAction::setOpenURLExternalCallback(boost::bind(&LLWeb::loadURLExternal, _1, true, LLStringUtil::null));  	LLUrlAction::setExecuteSLURLCallback(&LLURLDispatcher::dispatchFromTextEditor);  	// Let code in llui access the viewer help floater diff --git a/indra/newview/llfloaterhelpbrowser.h b/indra/newview/llfloaterhelpbrowser.h index 80b0ecc06b..bf4f544a14 100644 --- a/indra/newview/llfloaterhelpbrowser.h +++ b/indra/newview/llfloaterhelpbrowser.h @@ -1,5 +1,5 @@  /**  - * @file llfloatermediabrowser.h + * @file llfloaterhelpbrowser.h   * @brief HTML Help floater - uses embedded web browser control   *   * $LicenseInfo:firstyear=2006&license=viewerlgpl$ diff --git a/indra/newview/llfloatermediabrowser.cpp b/indra/newview/llfloatermediabrowser.cpp deleted file mode 100644 index 7a670dd90c..0000000000 --- a/indra/newview/llfloatermediabrowser.cpp +++ /dev/null @@ -1,462 +0,0 @@ -/**  - * @file llfloatermediabrowser.cpp - * @brief media browser floater - uses embedded media browser control - * - * $LicenseInfo:firstyear=2006&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2010, Linden Research, Inc. - *  - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License only. - *  - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU - * Lesser General Public License for more details. - *  - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA - *  - * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA - * $/LicenseInfo$ - */ - -#include "llviewerprecompiledheaders.h" - -#include "llfloatermediabrowser.h" - -#include "llfloaterreg.h" -#include "llparcel.h" -#include "llpluginclassmedia.h" -#include "lluictrlfactory.h" -#include "llmediactrl.h" -#include "llviewerwindow.h" -#include "llviewercontrol.h" -#include "llviewerparcelmgr.h" -#include "llweb.h" -#include "llui.h" -#include "roles_constants.h" - -#include "llurlhistory.h" -#include "llmediactrl.h" -#include "llviewermedia.h" -#include "llviewerparcelmedia.h" -#include "llcombobox.h" -#include "llwindow.h" -#include "lllayoutstack.h" -#include "llcheckboxctrl.h" - -#include "llnotifications.h" - -// TEMP -#include "llsdutil.h" - -LLFloaterMediaBrowser::LLFloaterMediaBrowser(const LLSD& key) -	: LLFloater(key) -{ -} - -//static  -void LLFloaterMediaBrowser::create(const std::string &url, const std::string& target, const std::string& uuid) -{ -	lldebugs << "url = " << url << ", target = " << target << ", uuid = " << uuid << llendl; -	 -	std::string tag = target; -	 -	if(target.empty() || target == "_blank") -	{ -		if(!uuid.empty()) -		{ -			tag = uuid; -		} -		else -		{ -		// create a unique tag for this instance -		LLUUID id; -		id.generate(); -		tag = id.asString(); -	} -	} -	 -	S32 browser_window_limit = gSavedSettings.getS32("MediaBrowserWindowLimit"); -	 -	if(LLFloaterReg::findInstance("media_browser", tag) != NULL) -	{ -		// There's already a media browser for this tag, so we won't be opening a new window. -	} -	else if(browser_window_limit != 0) -	{ -		// showInstance will open a new window.  Figure out how many media browsers are already open,  -		// and close the least recently opened one if this will put us over the limit. -		 -		LLFloaterReg::const_instance_list_t &instances = LLFloaterReg::getFloaterList("media_browser"); -		lldebugs << "total instance count is " << instances.size() << llendl; -		 -		for(LLFloaterReg::const_instance_list_t::const_iterator iter = instances.begin(); iter != instances.end(); iter++) -		{ -			lldebugs << "    " << (*iter)->getKey() << llendl; -		} -		 -		if(instances.size() >= (size_t)browser_window_limit) -		{ -			// Destroy the least recently opened instance -			(*instances.begin())->closeFloater(); -		} -	} - -	LLFloaterMediaBrowser *browser = dynamic_cast<LLFloaterMediaBrowser*> (LLFloaterReg::showInstance("media_browser", tag)); -	llassert(browser); -	if(browser) -	{ -		browser->mUUID = uuid; - -		// tell the browser instance to load the specified URL -		browser->openMedia(url, target); -		LLViewerMedia::proxyWindowOpened(target, uuid); -	} -} - -//static  -void LLFloaterMediaBrowser::closeRequest(const std::string &uuid) -{ -	LLFloaterReg::const_instance_list_t& inst_list = LLFloaterReg::getFloaterList("media_browser"); -	lldebugs << "instance list size is " << inst_list.size() << ", incoming uuid is " << uuid << llendl; -	for (LLFloaterReg::const_instance_list_t::const_iterator iter = inst_list.begin(); iter != inst_list.end(); ++iter) -	{ -		LLFloaterMediaBrowser* i = dynamic_cast<LLFloaterMediaBrowser*>(*iter); -		lldebugs << "    " << i->mUUID << llendl; -		if (i && i->mUUID == uuid) -		{ -			i->closeFloater(false); -			return; - 		} - 	} -} - -//static  -void LLFloaterMediaBrowser::geometryChanged(const std::string &uuid, S32 x, S32 y, S32 width, S32 height) -{ -	LLFloaterReg::const_instance_list_t& inst_list = LLFloaterReg::getFloaterList("media_browser"); -	lldebugs << "instance list size is " << inst_list.size() << ", incoming uuid is " << uuid << llendl; -	for (LLFloaterReg::const_instance_list_t::const_iterator iter = inst_list.begin(); iter != inst_list.end(); ++iter) -	{ -		LLFloaterMediaBrowser* i = dynamic_cast<LLFloaterMediaBrowser*>(*iter); -		lldebugs << "    " << i->mUUID << llendl; -		if (i && i->mUUID == uuid) -		{ -			i->geometryChanged(x, y, width, height); -			return; -	} -} -} -	 -void LLFloaterMediaBrowser::geometryChanged(S32 x, S32 y, S32 width, S32 height) -{	 -	// Make sure the layout of the browser control is updated, so this calculation is correct. -	LLLayoutStack::updateClass(); -		 -	// TODO: need to adjust size and constrain position to make sure floaters aren't moved outside the window view, etc. -	LLCoordWindow window_size; -	getWindow()->getSize(&window_size); - -	// Adjust width and height for the size of the chrome on the Media Browser window. -	width += getRect().getWidth() - mBrowser->getRect().getWidth(); -	height += getRect().getHeight() - mBrowser->getRect().getHeight(); -	 -	LLRect geom; -	geom.setOriginAndSize(x, window_size.mY - (y + height), width, height); - -	lldebugs << "geometry change: " << geom << llendl; -	 -	handleReshape(geom,false); -} - - -void LLFloaterMediaBrowser::draw() -{ -	getChildView("go")->setEnabled(!mAddressCombo->getValue().asString().empty()); -	LLParcel* parcel = LLViewerParcelMgr::getInstance()->getAgentParcel(); -	if(parcel) -	{ -		getChildView("parcel_owner_controls")->setVisible( LLViewerParcelMgr::isParcelModifiableByAgent(parcel, GP_LAND_CHANGE_MEDIA)); -		getChildView("assign")->setEnabled(!mAddressCombo->getValue().asString().empty()); -	} -	bool show_time_controls = false; -	bool media_playing = false; -	if(mBrowser) -	{ -		LLPluginClassMedia* media_plugin = mBrowser->getMediaPlugin(); -		if(media_plugin) -		{ -			show_time_controls = media_plugin->pluginSupportsMediaTime(); -			media_playing = media_plugin->getStatus() == LLPluginClassMediaOwner::MEDIA_PLAYING; -		} -	} -	getChildView("rewind")->setVisible( show_time_controls); -	getChildView("play")->setVisible( show_time_controls && ! media_playing); -	getChildView("pause")->setVisible( show_time_controls && media_playing); -	getChildView("stop")->setVisible( show_time_controls); -	getChildView("seek")->setVisible( show_time_controls); - -	getChildView("play")->setEnabled(! media_playing); -	getChildView("stop")->setEnabled(media_playing); - -	getChildView("back")->setEnabled(mBrowser->canNavigateBack()); -	getChildView("forward")->setEnabled(mBrowser->canNavigateForward()); - -	LLFloater::draw(); -} - -BOOL LLFloaterMediaBrowser::postBuild() -{ -	mBrowser = getChild<LLMediaCtrl>("browser"); -	mBrowser->addObserver(this); - -	mAddressCombo = getChild<LLComboBox>("address"); -	mAddressCombo->setCommitCallback(onEnterAddress, this); -	mAddressCombo->sortByName(); - -	childSetAction("back", onClickBack, this); -	childSetAction("forward", onClickForward, this); -	childSetAction("reload", onClickRefresh, this); -	childSetAction("rewind", onClickRewind, this); -	childSetAction("play", onClickPlay, this); -	childSetAction("stop", onClickStop, this); -	childSetAction("pause", onClickPlay, this); -	childSetAction("seek", onClickSeek, this); -	childSetAction("go", onClickGo, this); -	childSetAction("close", onClickClose, this); -	childSetAction("open_browser", onClickOpenWebBrowser, this); -	childSetAction("assign", onClickAssign, this); - -	buildURLHistory(); - -	return TRUE; -} - -void LLFloaterMediaBrowser::buildURLHistory() -{ -	LLCtrlListInterface* url_list = childGetListInterface("address"); -	if (url_list) -	{ -		url_list->operateOnAll(LLCtrlListInterface::OP_DELETE); -	} - -	// Get all of the entries in the "browser" collection -	LLSD browser_history = LLURLHistory::getURLHistory("browser"); - -	LLSD::array_iterator iter_history = -		browser_history.beginArray(); -	LLSD::array_iterator end_history = -		browser_history.endArray(); -	for(; iter_history != end_history; ++iter_history) -	{ -		std::string url = (*iter_history).asString(); -		if(! url.empty()) -			url_list->addSimpleElement(url); -	} - -	// initialize URL history in the plugin -	if(mBrowser && mBrowser->getMediaPlugin()) -	{ -		mBrowser->getMediaPlugin()->initializeUrlHistory(browser_history); -	} -} - -std::string LLFloaterMediaBrowser::getSupportURL() -{ -	return getString("support_page_url"); -} - -//virtual -void LLFloaterMediaBrowser::onClose(bool app_quitting) -{ -	LLViewerMedia::proxyWindowClosed(mUUID); -	//setVisible(FALSE); -	destroy(); -} - -void LLFloaterMediaBrowser::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event) -{ -	if(event == MEDIA_EVENT_LOCATION_CHANGED) -	{ -		setCurrentURL(self->getLocation()); -	} -	else if(event == MEDIA_EVENT_NAVIGATE_COMPLETE) -	{ -		// This is the event these flags are sent with. -		getChildView("back")->setEnabled(self->getHistoryBackAvailable()); -		getChildView("forward")->setEnabled(self->getHistoryForwardAvailable()); -	} -	else if(event == MEDIA_EVENT_CLOSE_REQUEST) -	{ -		// The browser instance wants its window closed. -		closeFloater(); -	} -	else if(event == MEDIA_EVENT_GEOMETRY_CHANGE) -	{ -		geometryChanged(self->getGeometryX(), self->getGeometryY(), self->getGeometryWidth(), self->getGeometryHeight()); -	} -} - -void LLFloaterMediaBrowser::setCurrentURL(const std::string& url) -{ -	mCurrentURL = url; - -	mAddressCombo->remove(mCurrentURL); -	mAddressCombo->add(mCurrentURL); -	mAddressCombo->selectByValue(mCurrentURL); - -	// Serialize url history -	LLURLHistory::removeURL("browser", mCurrentURL); -	LLURLHistory::addURL("browser", mCurrentURL); - -	getChildView("back")->setEnabled(mBrowser->canNavigateBack()); -	getChildView("forward")->setEnabled(mBrowser->canNavigateForward()); -	getChildView("reload")->setEnabled(TRUE); -} - -//static  -void LLFloaterMediaBrowser::onEnterAddress(LLUICtrl* ctrl, void* user_data) -{ -	LLFloaterMediaBrowser* self = (LLFloaterMediaBrowser*)user_data; -	self->mBrowser->navigateTo(self->mAddressCombo->getValue().asString()); -} - -//static  -void LLFloaterMediaBrowser::onClickRefresh(void* user_data) -{ -	LLFloaterMediaBrowser* self = (LLFloaterMediaBrowser*)user_data; - -	if( self->mBrowser->getMediaPlugin() &&  self->mBrowser->getMediaPlugin()->pluginSupportsMediaBrowser()) -	{ -		bool ignore_cache = true; -		self->mBrowser->getMediaPlugin()->browse_reload( ignore_cache ); -	} -	else -	{ -		self->mBrowser->navigateTo(self->mCurrentURL); -	} -} - -//static  -void LLFloaterMediaBrowser::onClickForward(void* user_data) -{ -	LLFloaterMediaBrowser* self = (LLFloaterMediaBrowser*)user_data; - -	self->mBrowser->navigateForward(); -} - -//static  -void LLFloaterMediaBrowser::onClickBack(void* user_data) -{ -	LLFloaterMediaBrowser* self = (LLFloaterMediaBrowser*)user_data; - -	self->mBrowser->navigateBack(); -} - -//static  -void LLFloaterMediaBrowser::onClickGo(void* user_data) -{ -	LLFloaterMediaBrowser* self = (LLFloaterMediaBrowser*)user_data; - -	self->mBrowser->navigateTo(self->mAddressCombo->getValue().asString()); -} - -//static  -void LLFloaterMediaBrowser::onClickClose(void* user_data) -{ -	LLFloaterMediaBrowser* self = (LLFloaterMediaBrowser*)user_data; - -	self->closeFloater(); -} - -//static  -void LLFloaterMediaBrowser::onClickOpenWebBrowser(void* user_data) -{ -	LLFloaterMediaBrowser* self = (LLFloaterMediaBrowser*)user_data; - -	std::string url = self->mCurrentURL.empty() ?  -		self->mBrowser->getHomePageUrl() : -		self->mCurrentURL; -	LLWeb::loadURLExternal(url); -} - -void LLFloaterMediaBrowser::onClickAssign(void* user_data) -{ -	LLFloaterMediaBrowser* self = (LLFloaterMediaBrowser*)user_data; - -	LLParcel* parcel = LLViewerParcelMgr::getInstance()->getAgentParcel(); -	if (!parcel) -	{ -		return; -	} -	std::string media_url = self->mAddressCombo->getValue().asString(); -	LLStringUtil::trim(media_url); - -	if(parcel->getMediaType() != "text/html") -	{ -		parcel->setMediaURL(media_url); -		parcel->setMediaCurrentURL(media_url); -		parcel->setMediaType(std::string("text/html")); -		LLViewerParcelMgr::getInstance()->sendParcelPropertiesUpdate( parcel, true ); -		LLViewerParcelMedia::sendMediaNavigateMessage(media_url); -		LLViewerParcelMedia::stop(); -		// LLViewerParcelMedia::update( parcel ); -	} -	LLViewerParcelMedia::sendMediaNavigateMessage(media_url); -} -//static  -void LLFloaterMediaBrowser::onClickRewind(void* user_data) -{ -	LLFloaterMediaBrowser* self = (LLFloaterMediaBrowser*)user_data; - -	if(self->mBrowser->getMediaPlugin()) -		self->mBrowser->getMediaPlugin()->start(-2.0f); -} -//static  -void LLFloaterMediaBrowser::onClickPlay(void* user_data) -{ -	LLFloaterMediaBrowser* self = (LLFloaterMediaBrowser*)user_data; - -	LLPluginClassMedia* plugin = self->mBrowser->getMediaPlugin(); -	if(plugin) -	{ -		if(plugin->getStatus() == LLPluginClassMediaOwner::MEDIA_PLAYING) -		{ -			plugin->pause(); -		} -		else -		{ -			plugin->start(); -		} -	} -} -//static  -void LLFloaterMediaBrowser::onClickStop(void* user_data) -{ -	LLFloaterMediaBrowser* self = (LLFloaterMediaBrowser*)user_data; - -	if(self->mBrowser->getMediaPlugin()) -		self->mBrowser->getMediaPlugin()->stop(); -} -//static  -void LLFloaterMediaBrowser::onClickSeek(void* user_data) -{ -	LLFloaterMediaBrowser* self = (LLFloaterMediaBrowser*)user_data; - -	if(self->mBrowser->getMediaPlugin()) -		self->mBrowser->getMediaPlugin()->start(2.0f); -} -void LLFloaterMediaBrowser::openMedia(const std::string& media_url, const std::string& target) -{ -	mBrowser->setHomePageUrl(media_url); -	mBrowser->setTarget(target); -	mBrowser->navigateTo(media_url); -	setCurrentURL(media_url); -} - - diff --git a/indra/newview/llfloatermediabrowser.h b/indra/newview/llfloatermediabrowser.h deleted file mode 100644 index 152d221a01..0000000000 --- a/indra/newview/llfloatermediabrowser.h +++ /dev/null @@ -1,86 +0,0 @@ -/**  - * @file llfloatermediabrowser.h - * @brief media browser floater - uses embedded media browser control - * - * $LicenseInfo:firstyear=2006&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2010, Linden Research, Inc. - *  - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License only. - *  - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU - * Lesser General Public License for more details. - *  - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA - *  - * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA - * $/LicenseInfo$ - */ - -#ifndef LL_LLFLOATERMEDIABROWSER_H -#define LL_LLFLOATERMEDIABROWSER_H - -#include "llfloater.h" -#include "llmediactrl.h" - - -class LLComboBox; -class LLMediaCtrl; -class LLNotification; - -class LLFloaterMediaBrowser :  -	public LLFloater,  -	public LLViewerMediaObserver -{ -public: -    LOG_CLASS(LLFloaterMediaBrowser); -	LLFloaterMediaBrowser(const LLSD& key); - -	static void create(const std::string &url, const std::string& target, const std::string& uuid = LLStringUtil::null); - -	static void closeRequest(const std::string &uuid); -	static void geometryChanged(const std::string &uuid, S32 x, S32 y, S32 width, S32 height); -	void geometryChanged(S32 x, S32 y, S32 width, S32 height); -	 -	/*virtual*/ BOOL postBuild(); -	/*virtual*/ void onClose(bool app_quitting); -	/*virtual*/ void draw(); - -	// inherited from LLViewerMediaObserver -	/*virtual*/ void handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event); - -	void openMedia(const std::string& media_url, const std::string& target); -	void buildURLHistory(); -	std::string getSupportURL(); -	void setCurrentURL(const std::string& url); - -	static void onEnterAddress(LLUICtrl* ctrl, void* user_data); -	static void onClickRefresh(void* user_data); -	static void onClickBack(void* user_data); -	static void onClickForward(void* user_data); -	static void onClickGo(void* user_data); -	static void onClickClose(void* user_data); -	static void onClickOpenWebBrowser(void* user_data); -	static void onClickAssign(void* user_data); -	static void onClickRewind(void* user_data); -	static void onClickPlay(void* user_data); -	static void onClickStop(void* user_data); -	static void onClickSeek(void* user_data); - -private: -	LLMediaCtrl* mBrowser; -	LLComboBox* mAddressCombo; -	std::string mCurrentURL; -	boost::shared_ptr<LLNotification> mCurNotification; -	std::string mUUID; -}; - -#endif  // LL_LLFLOATERMEDIABROWSER_H - diff --git a/indra/newview/llfloatermodelpreview.cpp b/indra/newview/llfloatermodelpreview.cpp index 881f087d7b..4f683076a8 100644..100755 --- a/indra/newview/llfloatermodelpreview.cpp +++ b/indra/newview/llfloatermodelpreview.cpp @@ -496,6 +496,11 @@ BOOL LLFloaterModelPreview::postBuild()  	{  		validate_url = "http://secondlife.com/my/account/mesh.php";  	} +	else if (current_grid == "damballah") +	{ +		// Staging grid has its own naming scheme. +		validate_url = "http://secondlife-staging.com/my/account/mesh.php"; +	}  	else  	{  		validate_url = llformat("http://secondlife.%s.lindenlab.com/my/account/mesh.php",current_grid.c_str()); @@ -744,6 +749,11 @@ void LLFloaterModelPreview::draw()  	if (!mModelPreview->mLoading)  	{ +		if ( mModelPreview->getLoadState() == LLModelLoader::ERROR_MATERIALS ) +		{ +			childSetTextArg("status", "[STATUS]", getString("status_material_mismatch")); +		} +		else  		if ( mModelPreview->getLoadState() > LLModelLoader::ERROR_PARSING )  		{		  			childSetTextArg("status", "[STATUS]", getString(LLModel::getStatusString(mModelPreview->getLoadState() - LLModelLoader::ERROR_PARSING))); @@ -3304,7 +3314,7 @@ void LLModelPreview::rebuildUploadData()  	F32 max_scale = 0.f;  	//reorder materials to match mBaseModel -	for (U32 i = 0; i < LLModel::NUM_LODS; i++) +	for (U32 i = 0; i < LLModel::NUM_LODS-1; i++)  	{  		if (mBaseModel.size() == mModel[i].size())  		{ @@ -3316,6 +3326,7 @@ void LLModelPreview::rebuildUploadData()  				if ( !mModel[i][j]->matchMaterialOrder(mBaseModel[j], refFaceCnt, modelFaceCnt ) )  				{ +					setLoadState( LLModelLoader::ERROR_MATERIALS );  					mFMP->childDisable( "calculate_btn" );  				}  			} @@ -4351,11 +4362,6 @@ void LLModelPreview::updateStatusMessages()  		{  			skinAndRigOk = false;  		}	 -		else -		if ( !isLegacyRigValid() ) -		{ -			mFMP->childDisable("calculate_btn"); -		}  	}  	if(upload_ok && mModelLoader) @@ -5071,6 +5077,8 @@ BOOL LLModelPreview::render()  	if (!mModel[mPreviewLOD].empty())  	{ +		mFMP->childEnable("reset_btn"); +  		bool regen = mVertexBuffer[mPreviewLOD].empty();  		if (!regen)  		{ @@ -5083,7 +5091,7 @@ BOOL LLModelPreview::render()  		}  		//make sure material lists all match -		for (U32 i = 0; i < LLModel::NUM_LODS; i++) +		for (U32 i = 0; i < LLModel::NUM_LODS-1; i++)  		{  			if (mBaseModel.size() == mModel[i].size())  			{ @@ -5568,6 +5576,7 @@ void LLFloaterModelPreview::onReset(void* user_data)  	assert_main_thread();  	LLFloaterModelPreview* fmp = (LLFloaterModelPreview*) user_data; +	fmp->childDisable("reset_btn");  	LLModelPreview* mp = fmp->mModelPreview;  	std::string filename = mp->mLODFile[3];  diff --git a/indra/newview/llfloatermodelpreview.h b/indra/newview/llfloatermodelpreview.h index 47de99ce25..64324854a5 100644 --- a/indra/newview/llfloatermodelpreview.h +++ b/indra/newview/llfloatermodelpreview.h @@ -70,7 +70,8 @@ public:  		GENERATING_VERTEX_BUFFERS,  		GENERATING_LOD,  		DONE, -		ERROR_PARSING //basically loading failed +		ERROR_PARSING, //basically loading failed +		ERROR_MATERIALS,  	} eLoadState;  	U32 mState; diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp index 18c3f76826..acbec531b6 100644 --- a/indra/newview/llinventorypanel.cpp +++ b/indra/newview/llinventorypanel.cpp @@ -1128,19 +1128,78 @@ LLInventoryPanel* LLInventoryPanel::getActiveInventoryPanel(BOOL auto_open)  	{  		// Make sure the floater is not minimized (STORM-438).  		if (active_inv_floaterp && active_inv_floaterp->isMinimized()) +		{  			active_inv_floaterp->setMinimized(FALSE); +		} +	}	 +	else if (auto_open) +	{ +		floater_inventory->openFloater(); -		return res; +		res = sidepanel_inventory->getActivePanel();  	} + +	return res; +} + +//static +void LLInventoryPanel::openInventoryPanelAndSetSelection(BOOL auto_open, const LLUUID& obj_id) +{ +	LLInventoryPanel *active_panel = LLInventoryPanel::getActiveInventoryPanel(auto_open); + +	if (active_panel) +	{ +		LL_DEBUGS("Messaging") << "Highlighting" << obj_id  << LL_ENDL; -	// C. If no panels are open and we don't want to force open a panel, then just abort out. -	if (!auto_open) return NULL; -	 -	// D. Open the inventory side panel floater and use that. -	floater_inventory->openFloater(); -	return sidepanel_inventory->getActivePanel(); +		LLViewerInventoryItem * item = gInventory.getItem(obj_id); +		LLViewerInventoryCategory * cat = gInventory.getCategory(obj_id); +		 +		bool in_inbox = false; +		bool in_outbox = false; +		 +		LLViewerInventoryCategory * parent_cat = NULL; +		 +		if (item) +		{ +			parent_cat = gInventory.getCategory(item->getParentUUID()); +		} +		else if (cat) +		{ +			parent_cat = gInventory.getCategory(cat->getParentUUID()); +		} +		 +		if (parent_cat) +		{ +			in_inbox = (LLFolderType::FT_INBOX == parent_cat->getPreferredType()); +			in_outbox = (LLFolderType::FT_OUTBOX == parent_cat->getPreferredType()); +		} +		 +		if (in_inbox || in_outbox) +		{ +			LLSidepanelInventory * sidepanel_inventory =	LLFloaterSidePanelContainer::getPanel<LLSidepanelInventory>("inventory"); +			LLInventoryPanel * inventory_panel = NULL; +			 +			if (in_inbox) +			{ +				sidepanel_inventory->openInbox(); +				inventory_panel = sidepanel_inventory->getInboxPanel(); +			} +			else +			{ +				sidepanel_inventory->openOutbox(); +				inventory_panel = sidepanel_inventory->getOutboxPanel(); +			} -	return NULL; +			if (inventory_panel) +			{ +				inventory_panel->setSelection(obj_id, TAKE_FOCUS_YES); +			} +		} +		else +		{ +			active_panel->setSelection(obj_id, TAKE_FOCUS_YES); +		} +	}  }  void LLInventoryPanel::addHideFolderType(LLFolderType::EType folder_type) diff --git a/indra/newview/llinventorypanel.h b/indra/newview/llinventorypanel.h index 8635ebc5c8..2a24327115 100644 --- a/indra/newview/llinventorypanel.h +++ b/indra/newview/llinventorypanel.h @@ -175,6 +175,8 @@ public:  	// Find whichever inventory panel is active / on top.  	// "Auto_open" determines if we open an inventory panel if none are open.  	static LLInventoryPanel *getActiveInventoryPanel(BOOL auto_open = TRUE); +	 +	static void openInventoryPanelAndSetSelection(BOOL auto_open, const LLUUID& obj_id);  protected:  	void openStartFolderOrMyInventory(); // open the first level of inventory diff --git a/indra/newview/llmediactrl.cpp b/indra/newview/llmediactrl.cpp index 58ba0219cc..74fa5d350a 100644 --- a/indra/newview/llmediactrl.cpp +++ b/indra/newview/llmediactrl.cpp @@ -57,7 +57,6 @@  #include "llcheckboxctrl.h"  #include "llnotifications.h"  #include "lllineeditor.h" -#include "llfloatermediabrowser.h"  #include "llfloaterwebcontent.h"  #include "llwindowshade.h" @@ -1082,26 +1081,6 @@ void LLMediaCtrl::onPopup(const LLSD& notification, const LLSD& response)  {  	if (response["open"])  	{ -		// name of default floater to open -		std::string floater_name = "media_browser"; - -		// look for parent floater name -		if ( gFloaterView ) -		{ -			if ( gFloaterView->getParentFloater(this) ) -			{ -				floater_name = gFloaterView->getParentFloater(this)->getInstanceName(); -			} -			else -			{ -				lldebugs << "No gFloaterView->getParentFloater(this) for onPopuup()" << llendl; -			}; -		} -		else -		{ -			lldebugs << "No gFloaterView for onPopuup()" << llendl; -		}; -  		LLWeb::loadURL(notification["payload"]["url"], notification["payload"]["target"], notification["payload"]["uuid"]);  	}  	else diff --git a/indra/newview/llnavigationbar.cpp b/indra/newview/llnavigationbar.cpp index fc264db5af..146bcbe47b 100644 --- a/indra/newview/llnavigationbar.cpp +++ b/indra/newview/llnavigationbar.cpp @@ -54,7 +54,6 @@  #include "llworldmapmessage.h"  #include "llappviewer.h"  #include "llviewercontrol.h" -#include "llfloatermediabrowser.h"  #include "llweb.h"  #include "llhints.h" diff --git a/indra/newview/llpanelmarketplaceinboxinventory.cpp b/indra/newview/llpanelmarketplaceinboxinventory.cpp index df89adb8da..678e4f2843 100644 --- a/indra/newview/llpanelmarketplaceinboxinventory.cpp +++ b/indra/newview/llpanelmarketplaceinboxinventory.cpp @@ -189,16 +189,16 @@ void LLInboxFolderViewFolder::draw()  void LLInboxFolderViewFolder::selectItem()  { -	LLFolderViewFolder::selectItem(); -  	deFreshify(); + +	LLFolderViewFolder::selectItem();  }  void LLInboxFolderViewFolder::toggleOpen()  { -	LLFolderViewFolder::toggleOpen(); -  	deFreshify(); + +	LLFolderViewFolder::toggleOpen();  }  void LLInboxFolderViewFolder::computeFreshness() @@ -270,7 +270,9 @@ BOOL LLInboxFolderViewItem::addToFolder(LLFolderViewFolder* folder, LLFolderView  BOOL LLInboxFolderViewItem::handleDoubleClick(S32 x, S32 y, MASK mask)  { -	return TRUE; +	deFreshify(); +	 +	return LLFolderViewItem::handleDoubleClick(x, y, mask);  }  // virtual @@ -290,9 +292,9 @@ void LLInboxFolderViewItem::draw()  void LLInboxFolderViewItem::selectItem()  { -	LLFolderViewItem::selectItem(); -  	deFreshify(); + +	LLFolderViewItem::selectItem();  }  void LLInboxFolderViewItem::computeFreshness() diff --git a/indra/newview/llpanelpicks.cpp b/indra/newview/llpanelpicks.cpp index 04e78e04e3..50dc66ed7c 100755 --- a/indra/newview/llpanelpicks.cpp +++ b/indra/newview/llpanelpicks.cpp @@ -134,7 +134,10 @@ public:  		LLFloater* picks_floater = LLFloaterReg::showInstance("picks");  		LLPanelPicks* picks = picks_floater->findChild<LLPanelPicks>("panel_picks"); -		picks->createNewPick(); +		if (picks) +		{ +			picks->createNewPick(); +		}  	}  	void editPick(LLPickData* pick_info) @@ -147,7 +150,7 @@ public:  		params["snapshot_id"] = pick_info->snapshot_id;  		params["pick_name"] = pick_info->name;  		params["pick_desc"] = pick_info->desc; -		LLFloaterSidePanelContainer::showPanel("my_profile", params); +		LLFloaterSidePanelContainer::showPanel("picks", params);  	}  	/*virtual*/ void processProperties(void* data, EAvatarProcessorType type) @@ -251,7 +254,10 @@ public:  		LLFloater* picks_floater = LLFloaterReg::showInstance("picks");  		LLPanelPicks* picks = picks_floater->findChild<LLPanelPicks>("panel_picks"); -		picks->createNewClassified(); +		if (picks) +		{ +			picks->createNewClassified(); +		}  	}  	void openClassified(LLAvatarClassifiedInfo* c_info) @@ -269,7 +275,7 @@ public:  			params["classified_name"] = c_info->name;  			params["classified_desc"] = c_info->description;  			params["from_search"] = true; -			LLFloaterSidePanelContainer::showPanel("people", "panel_profile_view", params); +			LLFloaterSidePanelContainer::showPanel("picks", params);  		}  		else if (mRequestVerb == "edit")  		{ diff --git a/indra/newview/llsidepanelinventory.cpp b/indra/newview/llsidepanelinventory.cpp index 91f8035556..9d069c3996 100644 --- a/indra/newview/llsidepanelinventory.cpp +++ b/indra/newview/llsidepanelinventory.cpp @@ -450,6 +450,24 @@ void LLSidepanelInventory::enableOutbox(bool enabled)  	}  } +void LLSidepanelInventory::openInbox() +{ +	if (mInboxEnabled) +	{ +		getChild<LLButton>(INBOX_BUTTON_NAME)->setToggleState(true); +		onToggleInboxBtn(); +	} +} + +void LLSidepanelInventory::openOutbox() +{ +	if (mOutboxEnabled) +	{ +		getChild<LLButton>(OUTBOX_BUTTON_NAME)->setToggleState(true); +		onToggleOutboxBtn(); +	} +} +  void LLSidepanelInventory::onInboxChanged(const LLUUID& inbox_id)  {  	// Trigger a load of the entire inbox so we always know the contents and their creation dates for sorting diff --git a/indra/newview/llsidepanelinventory.h b/indra/newview/llsidepanelinventory.h index 4e34926a4b..2c6f807013 100644 --- a/indra/newview/llsidepanelinventory.h +++ b/indra/newview/llsidepanelinventory.h @@ -58,6 +58,9 @@ public:  	/*virtual*/ void onOpen(const LLSD& key);  	LLInventoryPanel* getActivePanel(); // Returns an active inventory panel, if any. +	LLInventoryPanel* getInboxPanel() const { return mInventoryPanelInbox; } +	LLInventoryPanel* getOutboxPanel() const { return mInventoryPanelOutbox; } +  	LLPanelMainInventory* getMainInventoryPanel() const { return mPanelMainInventory; }  	BOOL isMainInventoryPanelActive() const; @@ -77,6 +80,9 @@ public:  	void enableInbox(bool enabled);  	void enableOutbox(bool enabled); +	void openInbox(); +	void openOutbox(); +	  	bool isInboxEnabled() const { return mInboxEnabled; }  	bool isOutboxEnabled() const { return mOutboxEnabled; } diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index 9d8d1be0f5..66187f6b42 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -2034,7 +2034,7 @@ bool idle_startup()  		show_debug_menus(); // Debug menu visiblity and First Use trigger  		// If we've got a startup URL, dispatch it -		LLStartUp::dispatchURL(); +		//LLStartUp::dispatchURL();  		// Retrieve information about the land data  		// (just accessing this the first time will fetch it, @@ -2694,12 +2694,12 @@ void LLStartUp::cleanupNameCache()  bool LLStartUp::dispatchURL()  {  	// ok, if we've gotten this far and have a startup URL -        if (!getStartSLURL().isValid()) +    if (!getStartSLURL().isValid())  	{  	  return false;  	} -        if(getStartSLURL().getType() != LLSLURL::APP) -	  { +    if(getStartSLURL().getType() != LLSLURL::APP) +	{  		// If we started with a location, but we're already  		// at that location, don't pop dialogs open. diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp index 74c4f6d2dc..273bf822bc 100644 --- a/indra/newview/llviewerfloaterreg.cpp +++ b/indra/newview/llviewerfloaterreg.cpp @@ -64,7 +64,6 @@  #include "llfloatergroups.h"  #include "llfloaterhardwaresettings.h"  #include "llfloaterhelpbrowser.h" -#include "llfloatermediabrowser.h"  #include "llfloaterwebcontent.h"  #include "llfloatermediasettings.h"  #include "llfloaterhud.h" @@ -226,7 +225,6 @@ void LLViewerFloaterReg::registerFloaters()  	LLFloaterReg::add("land_holdings", "floater_land_holdings.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterLandHoldings>);  	LLFloaterReg::add("mem_leaking", "floater_mem_leaking.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterMemLeak>); -	LLFloaterReg::add("media_browser", "floater_media_browser.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterMediaBrowser>);	  	LLFloaterReg::add("media_settings", "floater_media_settings.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterMediaSettings>);	  	LLFloaterReg::add("message_critical", "floater_critical.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterTOS>);  	LLFloaterReg::add("message_tos", "floater_tos.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterTOS>); diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp index 2858330597..67c8a4b902 100644 --- a/indra/newview/llviewermedia.cpp +++ b/indra/newview/llviewermedia.cpp @@ -69,7 +69,6 @@  #include "llwindow.h" -#include "llfloatermediabrowser.h"	// for handling window close requests and geometry change requests in media browser windows.  #include "llfloaterwebcontent.h"	// for handling window close requests and geometry change requests in media browser windows.  #include <boost/bind.hpp>	// for SkinFolder listener @@ -3374,7 +3373,6 @@ void LLViewerMediaImpl::handleMediaEvent(LLPluginClassMedia* plugin, LLPluginCla  			{  				// This close request is directed at another instance  				pass_through = false; -				LLFloaterMediaBrowser::closeRequest(uuid);  				LLFloaterWebContent::closeRequest(uuid);  			}  		} @@ -3394,7 +3392,6 @@ void LLViewerMediaImpl::handleMediaEvent(LLPluginClassMedia* plugin, LLPluginCla  			{  				// This request is directed at another instance  				pass_through = false; -				LLFloaterMediaBrowser::geometryChanged(uuid, plugin->getGeometryX(), plugin->getGeometryY(), plugin->getGeometryWidth(), plugin->getGeometryHeight());  				LLFloaterWebContent::geometryChanged(uuid, plugin->getGeometryX(), plugin->getGeometryY(), plugin->getGeometryWidth(), plugin->getGeometryHeight());  			}  		} diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index 22d95563d8..6d45e48d23 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -7701,7 +7701,14 @@ class LLWorldEnvSettings : public view_listener_t  		}  		else  		{ -			LLEnvManagerNew::instance().setUseDayCycle(LLEnvManagerNew::instance().getDayCycleName()); +			LLEnvManagerNew &envmgr = LLEnvManagerNew::instance(); +			// reset all environmental settings to track the region defaults, make this reset 'sticky' like the other sun settings. +			bool use_fixed_sky = false; +			bool use_region_settings = true; +			envmgr.setUserPrefs(envmgr.getWaterPresetName(), +					    envmgr.getSkyPresetName(), +					    envmgr.getDayCycleName(), +					    use_fixed_sky, use_region_settings);  		}  		return true; diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index 7cae19a1d2..dca5cdd06d 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -1256,14 +1256,7 @@ void open_inventory_offer(const uuid_vec_t& objects, const std::string& from_nam  		const BOOL auto_open =   			gSavedSettings.getBOOL("ShowInInventory") && // don't open if showininventory is false  			!from_name.empty(); // don't open if it's not from anyone. -		LLInventoryPanel *active_panel = LLInventoryPanel::getActiveInventoryPanel(auto_open); -		if(active_panel) -		{ -			LL_DEBUGS("Messaging") << "Highlighting" << obj_id  << LL_ENDL; -			LLFocusableElement* focus_ctrl = gFocusMgr.getKeyboardFocus(); -			active_panel->setSelection(obj_id, TAKE_FOCUS_NO); -			gFocusMgr.setKeyboardFocus(focus_ctrl); -		} +		LLInventoryPanel::openInventoryPanelAndSetSelection(auto_open, obj_id);  	}  } diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index d81e67bfe2..46e4fc3b02 100755 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -3219,7 +3219,7 @@ F32 LLViewerObject::getLinksetPhysicsCost()  	return mLinksetPhysicsCost;  } -F32 LLViewerObject::getStreamingCost(S32* bytes, S32* visible_bytes) +F32 LLViewerObject::getStreamingCost(S32* bytes, S32* visible_bytes, F32* unscaled_value) const  {  	return 0.f;  } diff --git a/indra/newview/llviewerobject.h b/indra/newview/llviewerobject.h index 53e951e483..be5b9819b1 100644 --- a/indra/newview/llviewerobject.h +++ b/indra/newview/llviewerobject.h @@ -340,7 +340,7 @@ public:  	virtual void setScale(const LLVector3 &scale, BOOL damped = FALSE); -	virtual F32 getStreamingCost(S32* bytes = NULL, S32* visible_bytes = NULL); +	virtual	F32	getStreamingCost(S32* bytes = NULL, S32* visible_bytes = NULL, F32* unscaled_value = NULL) const;  	virtual U32 getTriangleCount();  	virtual U32 getHighLODTriangleCount(); diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index bdab250b49..6af800f1d7 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -8335,7 +8335,7 @@ void LLVOAvatar::getImpostorValues(LLVector4a* extents, LLVector3& angle, F32& d  void LLVOAvatar::idleUpdateRenderCost()  {  	static const U32 ARC_BODY_PART_COST = 200; -	static const U32 ARC_LIMIT = 2048; +	static const U32 ARC_LIMIT = 20000;  	static std::set<LLUUID> all_textures; diff --git a/indra/newview/llweb.cpp b/indra/newview/llweb.cpp index b2f35892d0..d2d48dc68f 100644 --- a/indra/newview/llweb.cpp +++ b/indra/newview/llweb.cpp @@ -34,7 +34,6 @@  #include "llagent.h"  #include "llappviewer.h" -#include "llfloatermediabrowser.h"  #include "llfloaterwebcontent.h"  #include "llfloaterreg.h"  #include "lllogininstance.h" @@ -78,32 +77,15 @@ void LLWeb::initClass()  } -// static -void LLWeb::loadURL(const std::string& url, const std::string& target, const std::string& uuid) -{ -	loadWebURL(url, target, uuid); -	//if(target == "_internal") -	//{ -	//	// Force load in the internal browser, as if with a blank target. -	//	loadURLInternal(url, "", uuid); -	//} -	//else if (gSavedSettings.getBOOL("UseExternalBrowser") || (target == "_external")) -	//{ -	//	loadURLExternal(url); -	//} -	//else -	//{ -	//	loadURLInternal(url, target, uuid); -	//} -} +  // static -void LLWeb::loadWebURL(const std::string& url, const std::string& target, const std::string& uuid) +void LLWeb::loadURL(const std::string& url, const std::string& target, const std::string& uuid)  {  	if(target == "_internal")  	{  		// Force load in the internal browser, as if with a blank target. -		loadWebURLInternal(url, "", uuid); +		loadURLInternal(url, "", uuid);  	}  	else if (gSavedSettings.getBOOL("UseExternalBrowser") || (target == "_external"))  	{ @@ -111,19 +93,13 @@ void LLWeb::loadWebURL(const std::string& url, const std::string& target, const  	}  	else  	{ -		loadWebURLInternal(url, target, uuid); +		loadURLInternal(url, target, uuid);  	}  }  // static -void LLWeb::loadURLInternal(const std::string &url, const std::string& target, const std::string& uuid) -{ -	LLFloaterMediaBrowser::create(url, target, uuid); -} - -// static  // Explicitly open a Web URL using the Web content floater -void LLWeb::loadWebURLInternal(const std::string &url, const std::string& target, const std::string& uuid) +void LLWeb::loadURLInternal(const std::string &url, const std::string& target, const std::string& uuid)  {  	LLFloaterWebContent::Params p;  	p.url(url).target(target).id(uuid); diff --git a/indra/newview/llweb.h b/indra/newview/llweb.h index 376abc0ece..0b95f664d6 100644 --- a/indra/newview/llweb.h +++ b/indra/newview/llweb.h @@ -42,23 +42,15 @@ class LLWeb  public:  	static void initClass(); -	/// Load the given url in the user's preferred web browser -	static void loadURL(const std::string& url, const std::string& target, const std::string& uuid = LLStringUtil::null); -	static void loadURL(const std::string& url) { loadURL(url, LLStringUtil::null); } -	/// Load the given url in the user's preferred web browser	 -	static void loadURL(const char* url, const std::string& target = LLStringUtil::null) { loadURL( ll_safe_string(url), target); } -	/// Load the given url in the Second Life internal web browser -	static void loadURLInternal(const std::string &url, const std::string& target, const std::string& uuid = LLStringUtil::null); -	static void loadURLInternal(const std::string &url) { loadURLInternal(url, LLStringUtil::null, LLStringUtil::null);}  	/// Load the given url in the operating system's web browser, async if we want to return immediately  	/// before browser has spawned  	static void loadURLExternal(const std::string& url) {loadURLExternal(url, LLStringUtil::null);}  	static void loadURLExternal(const std::string& url, const std::string& uuid);  	static void loadURLExternal(const std::string& url, bool async, const std::string& uuid = LLStringUtil::null); -	// Explicitly open a Web URL using the Web content floater vs. the more general media browser -	static void loadWebURL(const std::string& url, const std::string& target, const std::string& uuid); -	static void loadWebURLInternal(const std::string &url, const std::string& target = LLStringUtil::null, const std::string& uuid = LLStringUtil::null); +	static void loadURL(const std::string& url, const std::string& target = LLStringUtil::null, const std::string& uuid = LLStringUtil::null); +	// load content using built-in browser +	static void loadURLInternal(const std::string &url, const std::string& target = LLStringUtil::null, const std::string& uuid = LLStringUtil::null);  	/// Returns escaped url (eg, " " to "%20") - used by all loadURL methods  	static std::string escapeURL(const std::string& url); diff --git a/indra/newview/llworldmapmessage.cpp b/indra/newview/llworldmapmessage.cpp index 66d0d698ba..8307d32336 100644 --- a/indra/newview/llworldmapmessage.cpp +++ b/indra/newview/llworldmapmessage.cpp @@ -210,15 +210,14 @@ void LLWorldMapMessage::processMapBlockReply(LLMessageSystem* msg, void**)  		}  		// Handle the SLURL callback if any -		if(LLWorldMapMessage::getInstance()->mSLURLCallback != NULL) +		url_callback_t callback = LLWorldMapMessage::getInstance()->mSLURLCallback; +		if(callback != NULL)  		{  			U64 handle = to_region_handle(x_world, y_world);  			// Check if we reached the requested region  			if ((LLStringUtil::compareInsensitive(LLWorldMapMessage::getInstance()->mSLURLRegionName, name)==0)  				|| (LLWorldMapMessage::getInstance()->mSLURLRegionHandle == handle))  			{ -				url_callback_t callback = LLWorldMapMessage::getInstance()->mSLURLCallback; -  				LLWorldMapMessage::getInstance()->mSLURLCallback = NULL;  				LLWorldMapMessage::getInstance()->mSLURLRegionName.clear();  				LLWorldMapMessage::getInstance()->mSLURLRegionHandle = 0; diff --git a/indra/newview/skins/default/xui/en/floater_model_preview.xml b/indra/newview/skins/default/xui/en/floater_model_preview.xml index fbaf4f0a8a..eebc5ddc72 100755 --- a/indra/newview/skins/default/xui/en/floater_model_preview.xml +++ b/indra/newview/skins/default/xui/en/floater_model_preview.xml @@ -6,6 +6,7 @@    <string name="status_idle"></string>    <string name="status_parse_error">Error: Dae parsing issue - see log for details.</string> +  <string name="status_material_mismatch">Error: Material of model is not a subset of reference model.</string>    <string name="status_reading_file">Loading...</string>    <string name="status_generating_meshes">Generating Meshes...</string>    <string name="status_vertex_number_overflow">Error: Vertex number is more than 65534, aborted!</string> @@ -789,7 +790,7 @@                      <check_box name="physics_use_hull" follows="left|top" width="130" left_pad="5" height="20" label="Use Convex Hull"/> -->                  </panel> -            <!-- ==== STEP 2: Analyse ==== --> +            <!-- ==== STEP 2: Analyze ==== -->              <view_border                bevel_style="none"                follows="top|left" @@ -818,7 +819,7 @@                        name="method_label"                        text_color="White"                        top_pad="0"> -                      Step 2: Analyse +                      Step 2: Analyze                      </text>                      <text                        follows="top|left" diff --git a/indra/newview/skins/default/xui/en/floater_world_map.xml b/indra/newview/skins/default/xui/en/floater_world_map.xml index 4314c8a9e2..56d79f62c7 100644 --- a/indra/newview/skins/default/xui/en/floater_world_map.xml +++ b/indra/newview/skins/default/xui/en/floater_world_map.xml @@ -468,7 +468,7 @@       left="3"       top_pad="7"       mouse_opaque="true" -     name="region_icon" +     name="location_icon"       width="16" />      <search_editor       follows="top|right" diff --git a/indra/newview/skins/default/xui/en/menu_login.xml b/indra/newview/skins/default/xui/en/menu_login.xml index 80e310a873..8ac1ac9e09 100644 --- a/indra/newview/skins/default/xui/en/menu_login.xml +++ b/indra/newview/skins/default/xui/en/menu_login.xml @@ -167,13 +167,6 @@               function="Floater.Show"               parameter="message_critical" />          </menu_item_call> -        <menu_item_call -         label="Media Browser Test" -         name="Web Browser Test"> -          <menu_item_call.on_click -           function="Advanced.WebBrowserTest" -           parameter="http://join.secondlife.com/"/> -        </menu_item_call>        <menu_item_call         label="Web Content Floater Debug Test"         name="Web Content Floater Debug Test"> diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml index 263d961be1..575e3673c6 100644 --- a/indra/newview/skins/default/xui/en/menu_viewer.xml +++ b/indra/newview/skins/default/xui/en/menu_viewer.xml @@ -533,6 +533,14 @@                   function="World.EnvSettings"                   parameter="midnight" />              </menu_item_call> +            <menu_item_separator/> +            <menu_item_call +             label="Use Region Settings" +             name="Use Region Settings"> +                <menu_item_call.on_click +                 function="World.EnvSettings" +                 parameter="region" /> +            </menu_item_call>          </menu> diff --git a/indra/newview/skins/default/xui/en/widgets/chiclet_im_adhoc.xml b/indra/newview/skins/default/xui/en/widgets/chiclet_im_adhoc.xml index f47e9874b4..0e29ed0d0b 100644 --- a/indra/newview/skins/default/xui/en/widgets/chiclet_im_adhoc.xml +++ b/indra/newview/skins/default/xui/en/widgets/chiclet_im_adhoc.xml @@ -22,6 +22,7 @@        draw_border="false"        height="24"        left="25" +      bottom="1"              name="speaker"        visible="false"        width="20" /> diff --git a/indra/newview/skins/default/xui/en/widgets/chiclet_im_group.xml b/indra/newview/skins/default/xui/en/widgets/chiclet_im_group.xml index 8dfdf95e80..77011139bf 100644 --- a/indra/newview/skins/default/xui/en/widgets/chiclet_im_group.xml +++ b/indra/newview/skins/default/xui/en/widgets/chiclet_im_group.xml @@ -22,6 +22,7 @@        draw_border="false"        height="24"        left="25" +      bottom="1"              name="speaker"        visible="false"        width="20" /> diff --git a/indra/newview/skins/default/xui/en/widgets/chiclet_im_p2p.xml b/indra/newview/skins/default/xui/en/widgets/chiclet_im_p2p.xml index cef698e577..8b56a8f0f6 100644 --- a/indra/newview/skins/default/xui/en/widgets/chiclet_im_p2p.xml +++ b/indra/newview/skins/default/xui/en/widgets/chiclet_im_p2p.xml @@ -22,6 +22,7 @@        draw_border="false"        height="24"        left="25" +      bottom="1"        name="speaker"        visible="false"        width="20" /> diff --git a/indra/newview/skins/default/xui/es/panel_people.xml b/indra/newview/skins/default/xui/es/panel_people.xml index 2fcbb00aed..a9d38dca25 100644 --- a/indra/newview/skins/default/xui/es/panel_people.xml +++ b/indra/newview/skins/default/xui/es/panel_people.xml @@ -76,7 +76,7 @@  				<button label="Compartir" name="share_btn" tool_tip="Compartir un objeto del inventario"/>  			</layout_panel>  			<layout_panel name="teleport_btn_lp"> -				<button label="Teleportarte" name="teleport_btn" tool_tip="Ofrecer teleporte"/> +				<button label="Teleporte" name="teleport_btn" tool_tip="Ofrecer teleporte"/>  			</layout_panel>  		</layout_stack>  		<layout_stack name="bottom_bar_ls1"> diff --git a/indra/newview/skins/default/xui/es/strings.xml b/indra/newview/skins/default/xui/es/strings.xml index 83747b85c0..4cae6ce5e8 100644 --- a/indra/newview/skins/default/xui/es/strings.xml +++ b/indra/newview/skins/default/xui/es/strings.xml @@ -3841,6 +3841,9 @@ Si sigues recibiendo este mensaje, contacta con [SUPPORT_SITE].  	<string name="inventory_item_offered-im">  		Ofrecido el item del inventario  	</string> +	<string name="share_alert"> +		Arrastra los ítems desde el invenbtario hasta aquí +	</string>  	<string name="no_session_message">  		(La sesión de MI no existe)  	</string> diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/fr/panel_preferences_privacy.xml index 3123a4c6fe..b122db9502 100644 --- a/indra/newview/skins/default/xui/fr/panel_preferences_privacy.xml +++ b/indra/newview/skins/default/xui/fr/panel_preferences_privacy.xml @@ -20,7 +20,7 @@  	<check_box label="Inclure la date et l'heure pour chaque ligne du journal de chat" name="show_timestamps_check_im"/>  	<check_box label="Inclure la date dans le nom du fichier journal" name="logfile_name_datestamp"/>  	<text name="log_path_desc"> -		Emplacement : +		Emplacement des journaux :  	</text>  	<line_editor left="308" name="log_path_string" right="-20"/>  	<button label="Parcourir" label_selected="Parcourir" name="log_path_button" width="150"/> diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_sound.xml b/indra/newview/skins/default/xui/fr/panel_preferences_sound.xml index deaec2e14f..37eb6bbeb0 100644 --- a/indra/newview/skins/default/xui/fr/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/fr/panel_preferences_sound.xml @@ -17,9 +17,9 @@  	<check_box label="Activé" name="enable_media"/>  	<slider label="Chat vocal" name="Voice Volume"/>  	<check_box label="Activé" name="enable_voice_check"/> -	<check_box label="Autoriser la lecture automatique du média" name="media_auto_play_btn" tool_tip="Cochez pour autoriser la lecture automatique du média" value="true"/> -	<check_box label="Lecture du média aux autres avatars" name="media_show_on_others_btn" tool_tip="Décochez pour masquer le média aux autres avatars près de vous" value="true"/> -	<check_box label="Lire les sons des gestes" name="gesture_audio_play_btn" tool_tip="Cochez cette case pour entendre les sons associés aux gestes." value="true"/> +	<check_box label="Autoriser la lecture automatique du média" name="media_auto_play_btn" tool_tip="Cocher pour autoriser la lecture automatique du média." value="true"/> +	<check_box label="Lire le média attaché aux autres avatars" name="media_show_on_others_btn" tool_tip="Décocher pour masquer le média attaché aux autres avatars près de vous." value="true"/> +	<check_box label="Lire les sons des gestes" name="gesture_audio_play_btn" tool_tip="Cocher cette case pour entendre les sons associés aux gestes." value="true"/>  	<text name="voice_chat_settings">  		Paramètres du chat vocal  	</text> diff --git a/indra/newview/skins/default/xui/fr/panel_region_debug.xml b/indra/newview/skins/default/xui/fr/panel_region_debug.xml index cb4a74e142..733c3f9a22 100644 --- a/indra/newview/skins/default/xui/fr/panel_region_debug.xml +++ b/indra/newview/skins/default/xui/fr/panel_region_debug.xml @@ -1,5 +1,5 @@  <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel label="Débugger" name="Debug"> +<panel label="Débogage" name="Debug">  	<text name="region_text_lbl">  		Région :  	</text> diff --git a/indra/newview/skins/default/xui/fr/strings.xml b/indra/newview/skins/default/xui/fr/strings.xml index daa31c980a..f9f3366f63 100644 --- a/indra/newview/skins/default/xui/fr/strings.xml +++ b/indra/newview/skins/default/xui/fr/strings.xml @@ -4837,7 +4837,7 @@ Essayez avec le chemin d'accès à l'éditeur entre guillemets doubles  		Parler  	</string>  	<string name="Command_View_Label"> -		Vue +		Affichage  	</string>  	<string name="Command_Voice_Label">  		Chat près de vous diff --git a/indra/newview/skins/default/xui/ru/floater_about_land.xml b/indra/newview/skins/default/xui/ru/floater_about_land.xml index 488d2cda17..3c278fce52 100644 --- a/indra/newview/skins/default/xui/ru/floater_about_land.xml +++ b/indra/newview/skins/default/xui/ru/floater_about_land.xml @@ -141,16 +141,16 @@  		</panel>  		<panel label="СОГЛАШЕНИЕ" name="land_covenant_panel">  			<panel.string name="can_resell"> -				Приобретенная в этом регионе земля может быть перепродана. +				Купленная в этом регионе земля может быть перепродана.  			</panel.string>  			<panel.string name="can_not_resell"> -				Приобретенная в этом регионе земля не может быть перепродана. +				Купленная в этом регионе земля не может быть перепродана.  			</panel.string>  			<panel.string name="can_change"> -				Приобретенная в этом регионе земля может быть объединена или разделена. +				Купленная в этом регионе земля может быть объединена или разделена.  			</panel.string>  			<panel.string name="can_not_change"> -				Приобретенная в этом регионе земля не может быть объединена или разделена. +				Купленная в этом регионе земля не может быть объединена или разделена.  			</panel.string>  			<text name="estate_section_lbl">  				Землевладение: @@ -270,7 +270,7 @@  			<name_list name="owner list">  				<name_list.columns label="Тип" name="type"/>  				<name_list.columns label="Название" name="name"/> -				<name_list.columns label="Количество" name="count"/> +				<name_list.columns label="Кол-во" name="count"/>  				<name_list.columns label="Последний объект" name="mostrecent"/>  			</name_list>  		</panel> @@ -286,10 +286,10 @@  				Этот параметр недоступен, потому что вы не можете изменять его на этом участке.  			</panel.string>  			<panel.string name="mature_check_mature"> -				Moderate-контент +				Умеренный контент  			</panel.string>  			<panel.string name="mature_check_adult"> -				Содержимое для взрослых +				Контент для взрослых  			</panel.string>  			<panel.string name="mature_check_mature_tooltip">  				Информация или содержимое вашего участка расценивается как moderate. @@ -366,7 +366,7 @@  				<combo_box.item label="Аренда" name="item13"/>  				<combo_box.item label="Другое" name="item12"/>  			</combo_box> -			<check_box label="Moderate-контент" name="MatureCheck" tool_tip=" "/> +			<check_box label="Умеренный контент" name="MatureCheck" tool_tip=" "/>  			<text name="Snapshot:">  				Снимок:  			</text> @@ -374,7 +374,7 @@  			<text name="allow_label5">  				Позволить жителям с других участков:  			</text> -			<check_box label="Видеть аватары" name="SeeAvatarsCheck" tool_tip="Жители с других участков могут видеть жителей этого участка и общаться с ними в чате (вы также сможете видеть жителей с других участков и общаться с ними)."/> +			<check_box label="Видны аватары" name="SeeAvatarsCheck" tool_tip="Жители с других участков могут видеть жителей этого участка и общаться с ними в чате (вы также сможете видеть жителей с других участков и общаться с ними)."/>  			<text name="landing_point">  				В точку телепортации: [LANDING]  			</text> @@ -395,7 +395,7 @@  			</text>  			<combo_box name="media type" tool_tip="Укажите, чем является ссылка – видео, веб-страница или другое медиа"/>  			<text name="at URL:"> -				Домашняя страница: +				Дом. страница:  			</text>  			<button label="Задать" name="set_media_url"/>  			<text name="Description:"> @@ -403,7 +403,7 @@  			</text>  			<line_editor name="url_description" tool_tip="Текст, показываемый рядом с кнопкой проигрывания/загрузки"/>  			<text name="Media texture:"> -				Заменяемая текстура: +				Замена текстуры:  			</text>  			<texture_picker name="media texture" tool_tip="Щелкните для выбора изображения"/>  			<text name="replace_texture_help"> @@ -416,7 +416,7 @@  			<spinner name="media_size_width" tool_tip="Размер отображения веб-медиа, по умолчанию – 0."/>  			<spinner name="media_size_height" tool_tip="Размер отображения веб-медиа, по умолчанию – 0."/>  			<text name="pixels"> -				пикселей +				пикс.  			</text>  			<text name="Options:">  				Опции: @@ -425,7 +425,7 @@  		</panel>  		<panel label="ЗВУК" name="land_audio_panel">  			<text name="MusicURL:"> -				URL-адрес для музыки: +				URL музыки:  			</text>  			<text name="Sound:">  				Звук: @@ -448,18 +448,18 @@  				(Определено на землевладении)  			</panel.string>  			<panel.string name="allow_public_access"> -				Разрешить публичный доступ ([MATURITY]) (Примечание. Снятие приведет к созданию линий запрета) +				Разрешить общий доступ ([MATURITY]) (Снятие приведет к созданию линий запрета)  			</panel.string>  			<panel.string name="estate_override"> -				Часть этих параметров установлены на уровне землевладения +				Часть этих параметров установлена на уровне землевладения  			</panel.string>  			<text name="Limit access to this parcel to:">  				Доступ на этот участок  			</text>  			<text name="Only Allow"> -				Ограничить жителям доступ проверкой: +				Разрешить доступ только жителям, у которых:  			</text> -			<check_box label="Информация об оплате в файле [ESTATE_PAYMENT_LIMIT]" name="limit_payment" tool_tip="Банить нераспознанных жителей."/> +			<check_box label="Записана информация об оплате [ESTATE_PAYMENT_LIMIT]" name="limit_payment" tool_tip="Банить нераспознанных жителей."/>  			<check_box label="Проверка возраста [ESTATE_AGE_LIMIT]" name="limit_age_verified" tool_tip="Банить жителей, не прошедших проверку возраста. Более подробная информация находится здесь: [SUPPORT_SITE]."/>  			<check_box label="Разрешить доступ группе: [GROUP]" name="GroupCheck" tool_tip="Группа устанавливается на основной вкладке."/>  			<check_box label="Продать доступ:" name="PassCheck" tool_tip="Разрешить временный доступ к участку."/> diff --git a/indra/newview/skins/default/xui/ru/floater_bulk_perms.xml b/indra/newview/skins/default/xui/ru/floater_bulk_perms.xml index a497c14cac..ccf13cf02a 100644 --- a/indra/newview/skins/default/xui/ru/floater_bulk_perms.xml +++ b/indra/newview/skins/default/xui/ru/floater_bulk_perms.xml @@ -24,7 +24,7 @@  	<button label="√ Все" name="check_all"/>  	<button label="Очистить" label_selected="Нет" name="check_none"/>  	<text name="newperms"> -		Новые разрешения на использование контента +		Новые разрешения на контент  	</text>  	<text name="GroupLabel">  		Группа: diff --git a/indra/newview/skins/default/xui/ru/floater_buy_currency.xml b/indra/newview/skins/default/xui/ru/floater_buy_currency.xml index 197a2a3327..7690ff2a6c 100644 --- a/indra/newview/skins/default/xui/ru/floater_buy_currency.xml +++ b/indra/newview/skins/default/xui/ru/floater_buy_currency.xml @@ -60,7 +60,7 @@  	<button label="Приобрести" name="buy_btn"/>  	<button label="Отмена" name="cancel_btn"/>  	<text name="info_cannot_buy"> -		Невозможно приобрести +		Нельзя купить  	</text>  	<button label="Продолжить в Интернете" name="error_web"/>  </floater> diff --git a/indra/newview/skins/default/xui/ru/floater_color_picker.xml b/indra/newview/skins/default/xui/ru/floater_color_picker.xml index d6e737d584..b7034bef0b 100644 --- a/indra/newview/skins/default/xui/ru/floater_color_picker.xml +++ b/indra/newview/skins/default/xui/ru/floater_color_picker.xml @@ -13,7 +13,7 @@  		Оттенок:  	</text>  	<text name="s_val_text"> -		Насыщенность: +		Насыщен.:  	</text>  	<text name="l_val_text">  		Яркость: diff --git a/indra/newview/skins/default/xui/ru/floater_destinations.xml b/indra/newview/skins/default/xui/ru/floater_destinations.xml index e769812beb..5ba0841564 100644 --- a/indra/newview/skins/default/xui/ru/floater_destinations.xml +++ b/indra/newview/skins/default/xui/ru/floater_destinations.xml @@ -1,2 +1,2 @@  <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Destinations" title="МЕСТА"/> +<floater name="Destinations" title="ПУНКТЫ"/>
\ No newline at end of file diff --git a/indra/newview/skins/default/xui/ru/floater_edit_day_cycle.xml b/indra/newview/skins/default/xui/ru/floater_edit_day_cycle.xml index 1adc8173c6..61d708c567 100644 --- a/indra/newview/skins/default/xui/ru/floater_edit_day_cycle.xml +++ b/indra/newview/skins/default/xui/ru/floater_edit_day_cycle.xml @@ -16,25 +16,25 @@  		-Выбор настройки-  	</string>  	<text name="label"> -		Название настройки: +		Имя настройки:  	</text>  	<text name="note">  		Примечание. Если изменить имя настройки, будет создана новая настройка, а изменения в существующей не будут сохранены.  	</text>  	<text name="hint_item1"> -		- Чтобы изменить определенные настройки неба и времени, выберите соответствующую вкладку. +		- Для изменения настроек неба и времени выберите соответствующую вкладку.  	</text>  	<text name="hint_item2"> -		- Чтобы задать время переходов, вабирайте и перетаскивайте вкладки. +		- Чтобы задать время переходов, перетаскивайте вкладки.  	</text>  	<text name="hint_item3"> -		- Используйте скребок для предварительного просмотра суточного цикла. +		- Скребок служит для просмотра суточного цикла.  	</text>  	<panel name="day_cycle_slider_panel">  		<multi_slider initial_value="0" name="WLTimeSlider"/>  		<multi_slider initial_value="0" name="WLDayCycleKeys"/> -		<button label="Добавить отметку" label_selected="Добавить отметку" name="WLAddKey"/> -		<button label="Удалить отметку" label_selected="Удалить отметку" name="WLDeleteKey"/> +		<button label="+ отметку" label_selected="+ отметку" name="WLAddKey"/> +		<button label="- отметку" label_selected="- отметку" name="WLDeleteKey"/>  		<text name="WL12am">  			12 ночи  		</text> @@ -91,14 +91,14 @@  		</text>  	</panel>  	<text name="WLCurKeyPresetText"> -		Настройка неба: +		Небо:  	</text> -	<combo_box label="Стандартная" name="WLSkyPresets"/> +	<combo_box label="Стандарт" name="WLSkyPresets"/>  	<text name="WLCurKeyTimeText">  		Время:  	</text>  	<time name="time" value="6:00"/> -	<check_box label="Установить в качестве нового суточного цикла" name="make_default_cb"/> +	<check_box label="Установить как новый суточный цикл" name="make_default_cb"/>  	<button label="Сохранить" name="save"/>  	<button label="Отмена" name="cancel"/>  </floater> diff --git a/indra/newview/skins/default/xui/ru/floater_edit_sky_preset.xml b/indra/newview/skins/default/xui/ru/floater_edit_sky_preset.xml index aa60cb6337..354120ea72 100644 --- a/indra/newview/skins/default/xui/ru/floater_edit_sky_preset.xml +++ b/indra/newview/skins/default/xui/ru/floater_edit_sky_preset.xml @@ -19,7 +19,7 @@  		Чтобы изменить настройку, задайте ее параметры с помощью элементов управления и нажмите кнопку «Сохранить».  	</text>  	<text name="label"> -		Название настройки: +		Имя настройки:  	</text>  	<text name="note">  		Примечание. Если изменить имя настройки, будет создана новая настройка, а изменения в существующей не будут сохранены. @@ -58,7 +58,7 @@  			<text name="SunGlowText">  				Сияние солнца  			</text> -			<slider label="Отчетливость" name="WLGlowB"/> +			<slider label="Фокус" name="WLGlowB"/>  			<slider label="Размер" name="WLGlowR"/>  			<text name="WLStarText">  				Яркость звезд @@ -102,7 +102,7 @@  			</text>  			<time name="WLDayTime" value="6:00"/>  			<text name="WLEastAngleText"> -				Смещение относительно востока +				Смещение отн. востока  			</text>  		</panel>  		<panel label="ОБЛАКА" name="Clouds"> @@ -122,7 +122,7 @@  				Размеры  			</text>  			<text name="WLCloudDetailText"> -				Детализация (положение/плотность) +				Детали (положение/плотность)  			</text>  			<slider label="X" name="WLCloudDetailX"/>  			<slider label="Y" name="WLCloudDetailY"/> diff --git a/indra/newview/skins/default/xui/ru/floater_edit_water_preset.xml b/indra/newview/skins/default/xui/ru/floater_edit_water_preset.xml index 3befe4b038..f6def86380 100644 --- a/indra/newview/skins/default/xui/ru/floater_edit_water_preset.xml +++ b/indra/newview/skins/default/xui/ru/floater_edit_water_preset.xml @@ -19,7 +19,7 @@  		Чтобы изменить настройку, задайте ее параметры с помощью элементов управления и нажмите кнопку «Сохранить».  	</text>  	<text name="label"> -		Название настройки: +		Имя настройки:  	</text>  	<text name="note">  		Примечание. Если изменить имя настройки, будет создана новая настройка, а изменения в существующей не будут сохранены. diff --git a/indra/newview/skins/default/xui/ru/floater_god_tools.xml b/indra/newview/skins/default/xui/ru/floater_god_tools.xml index ec64a5c7af..81329475aa 100644 --- a/indra/newview/skins/default/xui/ru/floater_god_tools.xml +++ b/indra/newview/skins/default/xui/ru/floater_god_tools.xml @@ -72,10 +72,10 @@  		</panel>  		<panel label="Запрос" name="request">  			<text name="Destination:"> -				Место назначения: +				Пункт назначения:  			</text>  			<combo_box name="destination"> -				<combo_box.item label="назначенное" name="item1"/> +				<combo_box.item label="назначенный" name="item1"/>  				<combo_box.item label="текущий регион" name="item2"/>  			</combo_box>  			<text name="Request:"> diff --git a/indra/newview/skins/default/xui/ru/floater_image_preview.xml b/indra/newview/skins/default/xui/ru/floater_image_preview.xml index ae7c77ea0e..dbc4c32b98 100644 --- a/indra/newview/skins/default/xui/ru/floater_image_preview.xml +++ b/indra/newview/skins/default/xui/ru/floater_image_preview.xml @@ -23,7 +23,7 @@  	</combo_box>  	<text name="bad_image_text">  		Невозможно прочитать изображение. -Попробуйте сохранить изображение как 24-разрядный TGA-файл (Targa). +Попробуйте сохранить изображение как 24-битный TGA-файл (Targa).  	</text>  	<check_box label="Использовать сжатие без потерь" name="lossless_check"/>  	<button label="Отмена" name="cancel_btn"/> diff --git a/indra/newview/skins/default/xui/ru/floater_joystick.xml b/indra/newview/skins/default/xui/ru/floater_joystick.xml index cc93152225..66568563da 100644 --- a/indra/newview/skins/default/xui/ru/floater_joystick.xml +++ b/indra/newview/skins/default/xui/ru/floater_joystick.xml @@ -3,7 +3,7 @@  	<floater.string name="NoDevice">  		устройство не выбрано  	</floater.string> -	<check_box label="Включить джойстик:" name="enable_joystick"/> +	<check_box label="Вкл. джойстик:" name="enable_joystick"/>  	<spinner label="Наложение по X" name="JoystickAxis1"/>  	<spinner label="Наложение по Y" name="JoystickAxis2"/>  	<spinner label="Наложение по Z" name="JoystickAxis0"/> diff --git a/indra/newview/skins/default/xui/ru/floater_lagmeter.xml b/indra/newview/skins/default/xui/ru/floater_lagmeter.xml index 48f7dd969f..c420006a03 100644 --- a/indra/newview/skins/default/xui/ru/floater_lagmeter.xml +++ b/indra/newview/skins/default/xui/ru/floater_lagmeter.xml @@ -106,7 +106,7 @@  		Возможная причина: слишком много физических объектов  	</floater.string>  	<floater.string name="server_scripts_cause_msg"> -		Возможная причина: слишком мало физических объектов +		Возможная причина: слишком много скриптовых объектов  	</floater.string>  	<floater.string name="server_net_cause_msg">  		Возможная причина: слишком большой сетевой трафик diff --git a/indra/newview/skins/default/xui/ru/floater_land_holdings.xml b/indra/newview/skins/default/xui/ru/floater_land_holdings.xml index c88c88988b..17d347867d 100644 --- a/indra/newview/skins/default/xui/ru/floater_land_holdings.xml +++ b/indra/newview/skins/default/xui/ru/floater_land_holdings.xml @@ -9,7 +9,7 @@  		<scroll_list.columns label="Тип" name="type"/>  		<scroll_list.columns label="Площадь" name="area"/>  	</scroll_list> -	<button label="Телепортация" label_selected="Телепортация" name="Teleport" tool_tip="Телепортироваться в центр этой земли."/> +	<button label="Телепорт" label_selected="Телепорт" name="Teleport" tool_tip="Телепортироваться в центр этой земли."/>  	<button label="Карта" label_selected="Карта" name="Show on Map" tool_tip="Показать эту землю на карте мира."/>  	<text name="contrib_label">  		Ваши вложения в группы: diff --git a/indra/newview/skins/default/xui/ru/floater_model_wizard.xml b/indra/newview/skins/default/xui/ru/floater_model_wizard.xml index 204f752cd9..ef2fe8e5a5 100644 --- a/indra/newview/skins/default/xui/ru/floater_model_wizard.xml +++ b/indra/newview/skins/default/xui/ru/floater_model_wizard.xml @@ -13,7 +13,7 @@  		</panel>  		<panel name="content">  			<text name="advanced_users_text"> -				Пользователям, работающим в расширенном режиме: если вы умеете создавать трехмерные графические объекты, то, возможно, захотите воспользоваться средством Advanced Uploader, которое предоставляет расширенные возможности передачи объектов. +				Пользователям в расширенном режиме: если вы умеете создавать трехмерные графические объекты, то, возможно, захотите воспользоваться средством Advanced Uploader, которое предоставляет расширенные возможности передачи объектов.  			</text>  			<button label="Перейти в расширенный режим" name="switch_to_advanced"/>  			<text name="Cache location"> @@ -78,17 +78,17 @@  	<panel name="physics_panel">  		<panel name="header_panel">  			<text name="header_text"> -				Настроить физические параметры +				Настроить физику  			</text>  		</panel>  		<text name="description">  			Мы создадим форму для внешнего каркаса модели. Настройте уровень детализации формы в соответствии с целями, для которых предназначена модель.  		</text>  		<panel name="content"> -			<button label="Пересчитать физические данные" name="recalculate_physics_btn"/> +			<button label="Пересчитать физику" name="recalculate_physics_btn"/>  			<button label="Пересчет..." name="recalculating_physics_btn"/>  			<text name="lod_label"> -				Просмотр физических данных +				Просмотр физики  			</text>  			<combo_box name="preview_lod_combo2" tool_tip="Уровень детализации при предварительном просмотре">  				<combo_item name="high"> diff --git a/indra/newview/skins/default/xui/ru/floater_select_key.xml b/indra/newview/skins/default/xui/ru/floater_select_key.xml index 84cc4a3ef3..99c2b9a2c4 100644 --- a/indra/newview/skins/default/xui/ru/floater_select_key.xml +++ b/indra/newview/skins/default/xui/ru/floater_select_key.xml @@ -1,7 +1,7 @@  <?xml version="1.0" encoding="utf-8" standalone="yes"?>  <floater name="modal container">  	<text name="Save item as:"> -		Нажмите кнопку для установки триггера включения разговора. +			Нажмите клавишу для включения/выключения речи.  	</text>  	<button label="Отмена" label_selected="Отмена" name="Cancel"/>  </floater> diff --git a/indra/newview/skins/default/xui/ru/floater_snapshot.xml b/indra/newview/skins/default/xui/ru/floater_snapshot.xml index a3b40a4f1c..f85d602be7 100644 --- a/indra/newview/skins/default/xui/ru/floater_snapshot.xml +++ b/indra/newview/skins/default/xui/ru/floater_snapshot.xml @@ -1,7 +1,7 @@  <?xml version="1.0" encoding="utf-8" standalone="yes"?>  <floater name="Snapshot" title="ПРОСМОТР СНИМКА">  	<floater.string name="unknown"> -		неизвестен +		неизвестно  	</floater.string>  	<radio_group label="Тип снимка" name="snapshot_type_radio">  		<radio_item label="Электронная почта" name="postcard"/> diff --git a/indra/newview/skins/default/xui/ru/floater_tools.xml b/indra/newview/skins/default/xui/ru/floater_tools.xml index 660eca51c6..eb9083f7fc 100644 --- a/indra/newview/skins/default/xui/ru/floater_tools.xml +++ b/indra/newview/skins/default/xui/ru/floater_tools.xml @@ -1,28 +1,28 @@  <?xml version="1.0" encoding="utf-8" standalone="yes"?>  <floater name="toolbox floater" short_title="ИНСТРУМЕНТЫ ДЛЯ СТРОИТЕЛЬСТВА">  	<floater.string name="status_rotate"> -		Перемещайте цветные полосы для вращения объекта +		Перетягивайте цветные полосы для вращения объекта  	</floater.string>  	<floater.string name="status_scale"> -		Щелкните и переместите для растяжения выбранной стороны +		Щелкните и перетащите для растяжения выбранной стороны  	</floater.string>  	<floater.string name="status_move"> -		Переместите для перемещения, переместите с одновременным нажатием клавиши Shift для копирования +		Перемещение: перетащить, копирование: перетащить при нажатой клавише Shift  	</floater.string>  	<floater.string name="status_modifyland">  		Щелкните и удерживайте для изменения земли  	</floater.string>  	<floater.string name="status_camera"> -		Щелкните и переместите для перемещения камеры +		Щелкните и перетащите для перемещения камеры  	</floater.string>  	<floater.string name="status_grab"> -		Переместите для перемещения, нажмите клавишу Ctrl для подъема, нажмите клавиши Ctrl+Shift для вращения +		Перемещение: перетащить, подъем: нажать Ctrl, вращение: нажать Ctrl+Shift  	</floater.string>  	<floater.string name="status_place">  		Щелкните для создания  	</floater.string>  	<floater.string name="status_selectland"> -		Щелкните и переместите для выделения земли +		Щелкните и перетащите для выделения земли  	</floater.string>  	<floater.string name="status_selectcount">  		Выбрано объектов: [OBJ_COUNT], влияние на землю [LAND_IMPACT] @@ -30,13 +30,13 @@  	<floater.string name="status_remaining_capacity">  		Остаток емкости [LAND_CAPACITY].  	</floater.string> -	<button name="button focus" tool_tip="Отчетливость"/> +	<button name="button focus" tool_tip="Фокус"/>  	<button name="button move" tool_tip="Переместить"/>  	<button name="button edit" tool_tip="Изменить"/>  	<button name="button create" tool_tip="Создать"/>  	<button name="button land" tool_tip="Земля"/>  	<text name="text status"> -		Переместите для перемещения, переместите с одновременным нажатием клавиши Shift для копирования +		Перемещение: перетащить, копирование: перетащить при нажатой клавише Shift  	</text>  	<radio_group name="focus_radio_group">  		<radio_item label="Увеличение" name="radio zoom"/> @@ -52,14 +52,14 @@  	<radio_group name="edit_radio_group">  		<radio_item label="Переместить" name="radio position"/>  		<radio_item label="Вращение (Ctrl)" name="radio rotate"/> -		<radio_item label="Растягивание (Ctrl+Shift)" name="radio stretch"/> +		<radio_item label="Растяжка (Ctrl+Shift)" name="radio stretch"/>  		<radio_item label="Выбор грани" name="radio select face"/>  	</radio_group>  	<check_box label="Редактировать объединенные" name="checkbox edit linked parts"/>  	<button label="Объединить" name="link_btn"/>  	<button label="Разъединить" name="unlink_btn"/> -	<text label="Растягивать в обе стороны" name="checkbox uniform label"> -		Растягивать в обе стороны +	<text label="Растяжка обеих сторон" name="checkbox uniform label"> +		Растяжка обеих сторон  	</text>  	<check_box initial_value="истина" label="Растягивать текстуры" name="checkbox stretch textures"/>  	<check_box initial_value="истина" label="Привязка" name="checkbox snap to grid"/> @@ -79,9 +79,9 @@  	<button name="ToolRing" tool_tip="Кольцо"/>  	<button name="ToolTree" tool_tip="Дерево"/>  	<button name="ToolGrass" tool_tip="Трава"/> -	<check_box label="Оставить инструмент выбранным" name="checkbox sticky"/> -	<check_box label="Копировать выделенное" name="checkbox copy selection"/> -	<check_box initial_value="истина" label="Центрировать копию" name="checkbox copy centers"/> +	<check_box label="Держать инструмент" name="checkbox sticky"/> +	<check_box label="Копировать выдел." name="checkbox copy selection"/> +	<check_box initial_value="истина" label="Центрир. копию" name="checkbox copy centers"/>  	<check_box label="Повернуть копию" name="checkbox copy rotates"/>  	<radio_group name="land_radio_group">  		<radio_item label="Выбрать землю" name="radio select land"/> @@ -105,7 +105,7 @@  	<slider_bar initial_value="0.00" name="slider force"/>  	<button label="Применить" label_selected="Применить" name="button apply to selection" tool_tip="Изменить выбранную землю"/>  	<text name="selection_empty"> -		Ничего не выбрано. +		Не выбрано.  	</text>  	<text name="remaining_capacity">  		[CAPACITY_STRING] [secondlife:///app/openfloater/object_weights Дополнительная информация] @@ -168,7 +168,7 @@  			<check_box label="Поделиться" name="checkbox share with group" tool_tip="Позволить всем участникам выбранной группы получить установленные вам права на этот объект. Для включения ролевых ограничений необходимо произвести сделку."/>  			<button label="Сделка" label_selected="Сделка" name="button deed" tool_tip="В результате сделки объект передается группе, при этом права на него будут соответствовать правам следующего владельца. Переданный группе объект может передаваться должностным лицом группы."/>  			<text name="label click action"> -				Действие по щелчку: +				По щелчку:  			</text>  			<combo_box name="clickaction">  				<combo_box.item label="Коснуться (по умолчанию)" name="Touch/grab(default)"/> @@ -185,7 +185,7 @@  				<combo_box.item label="Оригинал" name="Original"/>  			</combo_box>  			<spinner label="Цена: L$" name="Edit Cost"/> -			<check_box label="Показать в результатах поиска" name="search_check" tool_tip="Показывать объект в результатах поиска"/> +			<check_box label="Показать в поиске" name="search_check" tool_tip="Показывать объект в результатах поиска"/>  			<panel name="perms_build">  				<text name="perm_modify">  					Этот объект можно изменять @@ -349,9 +349,9 @@  			<spinner label="Парусность" name="FlexFriction"/>  			<spinner label="Ветер" name="FlexWind"/>  			<spinner label="Упругость" name="FlexTension"/> -			<spinner label="Действие по X" name="FlexForceX"/> -			<spinner label="Действие по Y" name="FlexForceY"/> -			<spinner label="Действие по Z" name="FlexForceZ"/> +			<spinner label="X-действие" name="FlexForceX"/> +			<spinner label="Y-действие" name="FlexForceY"/> +			<spinner label="Z-действие" name="FlexForceZ"/>  			<check_box label="Свет" name="Light Checkbox Ctrl" tool_tip="Объект будет излучать свет"/>  			<color_swatch name="colorswatch" tool_tip="Щелкните для выбора цвета"/>  			<texture_picker label="" name="light texture control" tool_tip="Щелкните для выбора проецируемого изображения (действует только с включенной отложенной отрисовкой)"/> @@ -362,7 +362,7 @@  			<spinner label="Ослабление" name="Light Falloff"/>  			<spinner label="Окружение" name="Light Ambiance"/>  			<text name="label physicsshapetype"> -				Тип физической формы: +				Тип физич. формы:  			</text>  			<combo_box name="Physics Shape Type Combo Ctrl" tool_tip="Выберите тип физической формы"/>  			<combo_box name="material"> @@ -394,7 +394,7 @@  			<text name="glow label">  				Свечение  			</text> -			<check_box label="Собственная яркость" name="checkbox fullbright"/> +			<check_box label="Собств. яркость" name="checkbox fullbright"/>  			<text name="tex gen">  				Наложение  			</text> @@ -476,7 +476,7 @@  			Площадь: [AREA] м²  		</text>  		<button label="О земле" label_selected="О земле" name="button about land"/> -		<check_box label="Показать владельцев" name="checkbox show owners" tool_tip="Цвет участка в зависимости от типа владения:  зеленый = ваша земля голубой = земля вашей группы красный = чужая земля желтый = для продажи фиолетовый = для аукциона серый = общая"/> +		<check_box label="Показать владельцев" name="checkbox show owners" tool_tip="Цвет участка в зависимости от типа владения: зеленый = ваша земля; голубой = земля вашей группы; красный = чужая земля; желтый = для продажи; фиолетовый = для аукциона; серый = общая"/>  		<text name="label_parcel_modify">  			Изменение участка  		</text> diff --git a/indra/newview/skins/default/xui/ru/floater_toybox.xml b/indra/newview/skins/default/xui/ru/floater_toybox.xml index eb03e8c8bf..8d7431d393 100644 --- a/indra/newview/skins/default/xui/ru/floater_toybox.xml +++ b/indra/newview/skins/default/xui/ru/floater_toybox.xml @@ -6,5 +6,5 @@  	<text name="toybox label 2">  		Кнопки будут отображены в исходном виде или в виде значков, в зависимости от настроек каждой панели инструментов.  	</text> -	<button label="Восстановить умолчания" label_selected="Восстановить умолчания" name="btn_restore_defaults"/> +	<button label="Вернуть стандартные" label_selected="Вернуть стандартные" name="btn_restore_defaults"/>  </floater> diff --git a/indra/newview/skins/default/xui/ru/floater_voice_controls.xml b/indra/newview/skins/default/xui/ru/floater_voice_controls.xml index 6520a4342c..c1fb858d48 100644 --- a/indra/newview/skins/default/xui/ru/floater_voice_controls.xml +++ b/indra/newview/skins/default/xui/ru/floater_voice_controls.xml @@ -1,7 +1,7 @@  <?xml version="1.0" encoding="utf-8" standalone="yes"?>  <floater name="floater_voice_controls" title="УПРАВЛЕНИЕ ГОЛОСОМ">  	<string name="title_nearby"> -		Голоса собеседников +		Настройки голоса  	</string>  	<string name="title_group">  		Звонок группе [GROUP] diff --git a/indra/newview/skins/default/xui/ru/floater_windlight_options.xml b/indra/newview/skins/default/xui/ru/floater_windlight_options.xml index 6667e6b19a..bbb37aaaa0 100644 --- a/indra/newview/skins/default/xui/ru/floater_windlight_options.xml +++ b/indra/newview/skins/default/xui/ru/floater_windlight_options.xml @@ -98,7 +98,7 @@  			<text name="SunGlowText">  				Сияние солнца  			</text> -			<slider label="Отчетливость" name="WLGlowB"/> +			<slider label="Фокус" name="WLGlowB"/>  			<slider label="Размер" name="WLGlowR"/>  			<text name="SceneGammaText">  				Гамма-коррекция сцены diff --git a/indra/newview/skins/default/xui/ru/floater_world_map.xml b/indra/newview/skins/default/xui/ru/floater_world_map.xml index 5fa45bd5e5..ef8dfe22ae 100644 --- a/indra/newview/skins/default/xui/ru/floater_world_map.xml +++ b/indra/newview/skins/default/xui/ru/floater_world_map.xml @@ -37,7 +37,7 @@  		</text>  		<check_box initial_value="истина" name="events_mature_chk"/>  		<text name="events_mature_label"> -			Умеренный +			Умеренные  		</text>  		<text name="events_adult_label">  			Для взрослых @@ -62,7 +62,7 @@  			Место:  		</text>  		<button label="Телепортация" name="Teleport" tool_tip="Телепортация в выбранное место"/> -		<button label="Копировать URL-адрес SL" name="copy_slurl" tool_tip="Копировать текущее место в виде URL-адреса SL для использования в Интернете."/> +		<button label="Копировать URL SL" name="copy_slurl" tool_tip="Копировать текущее место в виде URL-адреса SL для использования в интернете."/>  		<button label="Показать выбранное" name="Show Destination" tool_tip="Центрировать карту на выбранном месте"/>  	</panel>  	<panel name="layout_panel_5"> diff --git a/indra/newview/skins/default/xui/ru/menu_attachment_other.xml b/indra/newview/skins/default/xui/ru/menu_attachment_other.xml index 72063737eb..fb1c24448b 100644 --- a/indra/newview/skins/default/xui/ru/menu_attachment_other.xml +++ b/indra/newview/skins/default/xui/ru/menu_attachment_other.xml @@ -4,7 +4,7 @@  	<menu_item_call label="Смотреть профиль" name="Profile..."/>  	<menu_item_call label="В друзья" name="Add Friend"/>  	<menu_item_call label="IM" name="Send IM..."/> -	<menu_item_call label="Позвонить" name="Call"/> +	<menu_item_call label="Звонок" name="Call"/>  	<menu_item_call label="Пригласить в группу" name="Invite..."/>  	<menu_item_call label="Заблокировать" name="Avatar Mute"/>  	<menu_item_call label="Пожаловаться" name="abuse"/> diff --git a/indra/newview/skins/default/xui/ru/menu_gesture_gear.xml b/indra/newview/skins/default/xui/ru/menu_gesture_gear.xml index 78b1768761..d0b68cefbd 100644 --- a/indra/newview/skins/default/xui/ru/menu_gesture_gear.xml +++ b/indra/newview/skins/default/xui/ru/menu_gesture_gear.xml @@ -1,6 +1,6 @@  <?xml version="1.0" encoding="utf-8" standalone="yes"?>  <toggleable_menu name="menu_gesture_gear"> -	<menu_item_call label="Добавить/удалить из избранного" name="activate"/> +	<menu_item_call label="Добавить в избранное/удалить" name="activate"/>  	<menu_item_call label="Копировать" name="copy_gesture"/>  	<menu_item_call label="Вставить" name="paste"/>  	<menu_item_call label="Копировать UUID" name="copy_uuid"/> diff --git a/indra/newview/skins/default/xui/ru/menu_inventory_gear_default.xml b/indra/newview/skins/default/xui/ru/menu_inventory_gear_default.xml index d500f0fac6..9fc0b6d44e 100644 --- a/indra/newview/skins/default/xui/ru/menu_inventory_gear_default.xml +++ b/indra/newview/skins/default/xui/ru/menu_inventory_gear_default.xml @@ -8,7 +8,7 @@  	<menu_item_call label="Показать фильтры" name="show_filters"/>  	<menu_item_call label="Сбросить фильтры" name="reset_filters"/>  	<menu_item_call label="Закрыть все папки" name="close_folders"/> -	<menu_item_call label="Очистить Lost and Found" name="empty_lostnfound"/> +	<menu_item_call label="Очистить бюро находок" name="empty_lostnfound"/>  	<menu_item_call label="Сохранить текстуру как" name="Save Texture As"/>  	<menu_item_call label="Поделиться" name="Share"/>  	<menu_item_call label="Найти оригинал" name="Find Original"/> diff --git a/indra/newview/skins/default/xui/ru/menu_landmark.xml b/indra/newview/skins/default/xui/ru/menu_landmark.xml index 11d6e37e81..24b60f9d86 100644 --- a/indra/newview/skins/default/xui/ru/menu_landmark.xml +++ b/indra/newview/skins/default/xui/ru/menu_landmark.xml @@ -1,6 +1,6 @@  <?xml version="1.0" encoding="utf-8" standalone="yes"?>  <toggleable_menu name="landmark_overflow_menu"> -	<menu_item_call label="Копировать URL-адрес SL" name="copy"/> +	<menu_item_call label="Копировать URL SL" name="copy"/>  	<menu_item_call label="Удалить" name="delete"/>  	<menu_item_call label="Создать подборку" name="pick"/>  	<menu_item_call label="Добавить в любимые" name="add_to_favbar"/> diff --git a/indra/newview/skins/default/xui/ru/menu_model_import_gear_default.xml b/indra/newview/skins/default/xui/ru/menu_model_import_gear_default.xml index b7949b30d9..5ae5e7dfbc 100644 --- a/indra/newview/skins/default/xui/ru/menu_model_import_gear_default.xml +++ b/indra/newview/skins/default/xui/ru/menu_model_import_gear_default.xml @@ -1,7 +1,7 @@  <?xml version="1.0" encoding="utf-8" standalone="yes"?>  <toggleable_menu name="model_menu_gear_default">  	<menu_item_check label="Показать грани" name="show_edges"/> -	<menu_item_check label="Показать физические параметры" name="show_physics"/> +	<menu_item_check label="Показать физику" name="show_physics"/>  	<menu_item_check label="Показать текстуры" name="show_textures"/>  	<menu_item_check label="Показать вес кожи" name="show_skin_weight"/>  	<menu_item_check label="Показать положение сочленений" name="show_joint_positions"/> diff --git a/indra/newview/skins/default/xui/ru/menu_participant_list.xml b/indra/newview/skins/default/xui/ru/menu_participant_list.xml index 8bbf2d52bf..932ad5bacf 100644 --- a/indra/newview/skins/default/xui/ru/menu_participant_list.xml +++ b/indra/newview/skins/default/xui/ru/menu_participant_list.xml @@ -5,7 +5,7 @@  	<menu_item_call label="Открыть профиль" name="View Profile"/>  	<menu_item_call label="Добавить в друзья" name="Add Friend"/>  	<menu_item_call label="IM" name="IM"/> -	<menu_item_call label="Позвонить" name="Call"/> +	<menu_item_call label="Звонок" name="Call"/>  	<menu_item_call label="Поделиться" name="Share"/>  	<menu_item_call label="Заплатить" name="Pay"/>  	<menu_item_check label="Показывать значки участников" name="View Icons"/> diff --git a/indra/newview/skins/default/xui/ru/menu_places_gear_landmark.xml b/indra/newview/skins/default/xui/ru/menu_places_gear_landmark.xml index a838dd5c42..b1ebd4af83 100644 --- a/indra/newview/skins/default/xui/ru/menu_places_gear_landmark.xml +++ b/indra/newview/skins/default/xui/ru/menu_places_gear_landmark.xml @@ -8,7 +8,7 @@  	<menu_item_call label="Восстановить вещь" name="restore_item"/>  	<menu_item_call label="Вырезать" name="cut"/>  	<menu_item_call label="Копировать закладку" name="copy_landmark"/> -	<menu_item_call label="Копировать URL-адрес SL" name="copy_slurl"/> +	<menu_item_call label="Копировать URL SL" name="copy_slurl"/>  	<menu_item_call label="Вставить" name="paste"/>  	<menu_item_call label="Переименовать" name="rename"/>  	<menu_item_call label="Удалить" name="delete"/> diff --git a/indra/newview/skins/default/xui/ru/menu_viewer.xml b/indra/newview/skins/default/xui/ru/menu_viewer.xml index 322a27003f..b9f403c04b 100644 --- a/indra/newview/skins/default/xui/ru/menu_viewer.xml +++ b/indra/newview/skins/default/xui/ru/menu_viewer.xml @@ -54,7 +54,7 @@  			<menu_item_check label="Владельцы земли" name="Land Owners"/>  			<menu_item_check label="Координаты" name="Coordinates"/>  			<menu_item_check label="Свойства участка" name="Parcel Properties"/> -			<menu_item_check label="Дополнительное меню" name="Show Advanced Menu"/> +			<menu_item_check label="Меню «Дополнительно»" name="Show Advanced Menu"/>  		</menu>  		<menu_item_call label="Телепортироваться домой" name="Teleport Home"/>  		<menu_item_call label="Установить дом здесь" name="Set Home to Here"/> @@ -203,7 +203,7 @@  			<menu_item_check label="Поиск" name="Search"/>  			<menu_item_call label="Освободить клавиши" name="Release Keys"/>  			<menu_item_call label="Сбросить размер интерфейса" name="Set UI Size to Default"/> -			<menu_item_check label="Показать дополнительное меню – устаревшее сочетание клавиш" name="Show Advanced Menu - legacy shortcut"/> +			<menu_item_check label="Показать меню «Дополнительно» - старое сочетание клавиш" name="Show Advanced Menu - legacy shortcut"/>  			<menu_item_call label="Закрыть окно" name="Close Window"/>  			<menu_item_call label="Закрыть все окна" name="Close All Windows"/>  			<menu_item_call label="Сохранить снимок на диске" name="Snapshot to Disk"/> diff --git a/indra/newview/skins/default/xui/ru/notifications.xml b/indra/newview/skins/default/xui/ru/notifications.xml index 87ae9d06dd..d43d907164 100644 --- a/indra/newview/skins/default/xui/ru/notifications.xml +++ b/indra/newview/skins/default/xui/ru/notifications.xml @@ -724,13 +724,13 @@  		Телепортация сейчас заблокирована. Повторите попытку позже.  Если все равно не удается телепортироваться, выйдите из программы и войдите снова, чтобы устранить проблему.  	</notification>  	<notification name="nolandmark_tport"> -		Системе не удалось определить место назначения закладки. +		Системе не удалось определить пункт назначения закладки.  	</notification>  	<notification name="timeout_tport">  		Системе не удалось выполнить подключение телепорта.  Повторите попытку позже.  	</notification>  	<notification name="noaccess_tport"> -		У вас нет доступа к точке назначения этого телепорта. +		У вас нет доступа в пункт назначения этого телепорта.  	</notification>  	<notification name="missing_attach_tport">  		Ваши присоединения еще не доставлены. Подождите несколько секунд либо выйдите из программы и войдите снова, прежде чем повторить попытку телепортации. @@ -745,7 +745,7 @@  		Системе не удалось своевременно выполнить ваше пересечение границы. Повторите попытку через несколько минут.  	</notification>  	<notification name="no_host"> -		Не удалось найти точку назначения телепорта. Возможно, место назначения временно недоступно или уже не существует. Повторите попытку через несколько минут. +		Не удалось найти точку назначения телепорта. Возможно, пункт назначения временно недоступен или уже не существует. Повторите попытку через несколько минут.  	</notification>  	<notification name="no_inventory_host">  		Система инвентаря сейчас недоступна. @@ -2381,7 +2381,7 @@ http://secondlife.com/download.  		Не найден регион назначения.  	</notification>  	<notification name="NotAllowedInDest"> -		Вам не разрешен доступ к месту назначения. +		Вам не разрешен доступ в пункт назначения.  	</notification>  	<notification name="RegionParcelBan">  		Нельзя пересечь границу региона по пути на забаненный участок. Выберите другой путь. @@ -2390,7 +2390,7 @@ http://secondlife.com/download.  		Вы перенаправлены на телехаб.  	</notification>  	<notification name="CouldntTPCloser"> -		Не удалось телепортироваться ближе к месту назначения. +		Не удалось телепортироваться ближе к пункту назначения.  	</notification>  	<notification name="TPCancelled">  		Телепортация отменена. @@ -2904,7 +2904,7 @@ http://secondlife.com/download.  При скрытии кнопки «Говорить» голосовая функция отключается.  	</notification>  	<notification label="Исследование мира" name="HintDestinationGuide"> -		Путеводитель по местам назначения содержит тысячи новых мест, в которых вы можете побывать. Выберите место и нажмите кнопку «Телепортация», чтобы начать исследование. +		Путеводитель по пунктам назначения содержит тысячи новых мест, в которых вы можете побывать. Выберите место и нажмите кнопку «Телепортация», чтобы начать исследование.  	</notification>  	<notification label="Боковая панель" name="HintSidePanel">  		Быстрый доступ к вашему инвентарю, костюмам, профилю и многому другому открывается на боковой панели. diff --git a/indra/newview/skins/default/xui/ru/panel_edit_alpha.xml b/indra/newview/skins/default/xui/ru/panel_edit_alpha.xml index 38789c1c5e..7cde4099ef 100644 --- a/indra/newview/skins/default/xui/ru/panel_edit_alpha.xml +++ b/indra/newview/skins/default/xui/ru/panel_edit_alpha.xml @@ -2,8 +2,8 @@  <panel name="edit_alpha_panel">  	<scroll_container name="avatar_alpha_color_panel_scroll">  		<panel name="avatar_alpha_color_panel"> -			<texture_picker label="Альфа нижних частей тела" name="Lower Alpha" tool_tip="Щелкните для выбора изображения"/> -			<texture_picker label="Альфа верхних частей тела" name="Upper Alpha" tool_tip="Щелкните для выбора изображения"/> +			<texture_picker label="Альфа низа" name="Lower Alpha" tool_tip="Щелкните для выбора изображения"/> +			<texture_picker label="Альфа верха" name="Upper Alpha" tool_tip="Щелкните для выбора изображения"/>  			<texture_picker label="Альфа головы" name="Head Alpha" tool_tip="Щелкните для выбора изображения"/>  			<texture_picker label="Альфа глаз" name="Eye Alpha" tool_tip="Щелкните для выбора изображения"/>  			<texture_picker label="Альфа волос" name="Hair Alpha" tool_tip="Щелкните для выбора изображения"/> diff --git a/indra/newview/skins/default/xui/ru/panel_edit_shape.xml b/indra/newview/skins/default/xui/ru/panel_edit_shape.xml index b185ce1d45..312ad593a1 100644 --- a/indra/newview/skins/default/xui/ru/panel_edit_shape.xml +++ b/indra/newview/skins/default/xui/ru/panel_edit_shape.xml @@ -1,7 +1,7 @@  <?xml version="1.0" encoding="utf-8" standalone="yes"?>  <panel name="edit_shape_panel">  	<string name="meters"> -		метров +		м  	</string>  	<string name="feet">  		футов diff --git a/indra/newview/skins/default/xui/ru/panel_im_control_panel.xml b/indra/newview/skins/default/xui/ru/panel_im_control_panel.xml index f1cba0d3be..2a23cdb800 100644 --- a/indra/newview/skins/default/xui/ru/panel_im_control_panel.xml +++ b/indra/newview/skins/default/xui/ru/panel_im_control_panel.xml @@ -17,7 +17,7 @@  			<button label="Заплатить" name="pay_btn"/>  		</layout_panel>  		<layout_panel name="call_btn_panel"> -			<button label="Позвонить" name="call_btn"/> +			<button label="Звонок" name="call_btn"/>  		</layout_panel>  		<layout_panel name="end_call_btn_panel">  			<button label="Завершить звонок" name="end_call_btn"/> diff --git a/indra/newview/skins/default/xui/ru/panel_landmarks.xml b/indra/newview/skins/default/xui/ru/panel_landmarks.xml index 66c5b3b574..7d684cd479 100644 --- a/indra/newview/skins/default/xui/ru/panel_landmarks.xml +++ b/indra/newview/skins/default/xui/ru/panel_landmarks.xml @@ -1,7 +1,7 @@  <?xml version="1.0" encoding="utf-8" standalone="yes"?>  <panel name="Landmarks">  	<accordion name="landmarks_accordion"> -		<accordion_tab name="tab_favorites" title="Панель «Избранное»"/> +		<accordion_tab name="tab_favorites" title="Избранное"/>  		<accordion_tab name="tab_landmarks" title="Мои закладки"/>  		<accordion_tab name="tab_inventory" title="Мой инвентарь"/>  		<accordion_tab name="tab_library" title="Библиотека"/> diff --git a/indra/newview/skins/default/xui/ru/panel_navigation_bar.xml b/indra/newview/skins/default/xui/ru/panel_navigation_bar.xml index d9890acff2..5e3de180f9 100644 --- a/indra/newview/skins/default/xui/ru/panel_navigation_bar.xml +++ b/indra/newview/skins/default/xui/ru/panel_navigation_bar.xml @@ -12,7 +12,7 @@  		<layout_panel name="favorites_layout_panel">  			<favorites_bar name="favorite" tool_tip="Перетаскивайте сюда закладки, чтобы было удобнее переходить в любимые места в Second Life!">  				<label name="favorites_bar_label" tool_tip="Перетаскивайте сюда закладки, чтобы было удобнее переходить в любимые места в Second Life!"> -					Панель «Избранное» +					Избранное  				</label>  				<more_button name=">>" tool_tip="Показать больше избранного">  					Больше ▼ diff --git a/indra/newview/skins/default/xui/ru/panel_notes.xml b/indra/newview/skins/default/xui/ru/panel_notes.xml index f88b4f13c3..aa74383349 100644 --- a/indra/newview/skins/default/xui/ru/panel_notes.xml +++ b/indra/newview/skins/default/xui/ru/panel_notes.xml @@ -21,7 +21,7 @@  					<button label="IM" name="im" tool_tip="Начать сеанс IM"/>  				</layout_panel>  				<layout_panel name="call_btn_lp"> -					<button label="Позвонить" name="call" tool_tip="Позвонить этому жителю"/> +					<button label="Звонок" name="call" tool_tip="Позвонить этому жителю"/>  				</layout_panel>  				<layout_panel name="show_on_map_btn_lp">  					<button label="Карта" name="show_on_map_btn" tool_tip="Показать жителя на карте"/> diff --git a/indra/newview/skins/default/xui/ru/panel_outfit_edit.xml b/indra/newview/skins/default/xui/ru/panel_outfit_edit.xml index 0657e6ff40..91c03342a7 100644 --- a/indra/newview/skins/default/xui/ru/panel_outfit_edit.xml +++ b/indra/newview/skins/default/xui/ru/panel_outfit_edit.xml @@ -2,7 +2,7 @@  <!-- Side tray Outfit Edit panel -->  <panel name="outfit_edit">  	<string name="No Outfit" value="Нет костюма"/> -	<string name="unsaved_changes" value="Не сохраненные изменения"/> +	<string name="unsaved_changes" value="Несохраненные изменения"/>  	<string name="now_editing" value="Сейчас редактируется"/>  	<panel.string name="not_available">  		(нет) @@ -35,7 +35,7 @@  			</layout_stack>  		</layout_panel>  		<layout_panel name="add_wearables_panel"> -			<button label="Вещь, которая носится" name="plus_btn"/> +			<button label="Носимая вещь" name="plus_btn"/>  		</layout_panel>  	</layout_stack>  	<panel name="no_add_wearables_button_bar"> diff --git a/indra/newview/skins/default/xui/ru/panel_people.xml b/indra/newview/skins/default/xui/ru/panel_people.xml index e8a25d5349..607921f2d6 100644 --- a/indra/newview/skins/default/xui/ru/panel_people.xml +++ b/indra/newview/skins/default/xui/ru/panel_people.xml @@ -64,13 +64,13 @@  	<panel name="button_bar">  		<layout_stack name="bottom_bar_ls">  			<layout_panel name="view_profile_btn_lp"> -				<button label="Профиль" name="view_profile_btn" tool_tip="Показывает изображение, группы и прочую информацию о жителе"/> +				<button label="Профиль" name="view_profile_btn" tool_tip="Показать изображение, группы и прочую информацию о жителе"/>  			</layout_panel>  			<layout_panel name="im_btn_lp">  				<button label="IM" name="im_btn" tool_tip="Начать сеанс IM"/>  			</layout_panel>  			<layout_panel name="call_btn_lp"> -				<button label="Позвонить" name="call_btn" tool_tip="Позвонить этому жителю"/> +				<button label="Звонок" name="call_btn" tool_tip="Позвонить этому жителю"/>  			</layout_panel>  			<layout_panel name="share_btn_lp">  				<button label="Поделиться" name="share_btn" tool_tip="Поделиться объектом из инвентаря"/> @@ -81,13 +81,13 @@  		</layout_stack>  		<layout_stack name="bottom_bar_ls1">  			<layout_panel name="group_info_btn_lp"> -				<button label="Профиль группы" name="group_info_btn" tool_tip="Показывает информацию о группе"/> +				<button label="Профиль группы" name="group_info_btn" tool_tip="Показать информацию о группе"/>  			</layout_panel>  			<layout_panel name="chat_btn_lp"> -				<button label="Групповой чат" name="chat_btn" tool_tip="Открывает сеанс чата"/> +				<button label="Групповой чат" name="chat_btn" tool_tip="Открыть сеанс чата"/>  			</layout_panel>  			<layout_panel name="group_call_btn_lp"> -				<button label="Звонок группе" name="group_call_btn" tool_tip="Звонок этой группе"/> +				<button label="Звонок группе" name="group_call_btn" tool_tip="Позвонить этой группе"/>  			</layout_panel>  		</layout_stack>  	</panel> diff --git a/indra/newview/skins/default/xui/ru/panel_preferences_chat.xml b/indra/newview/skins/default/xui/ru/panel_preferences_chat.xml index fb368b8b5e..a3ee5b7815 100644 --- a/indra/newview/skins/default/xui/ru/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/ru/panel_preferences_chat.xml @@ -30,7 +30,7 @@  	<spinner label="Время отображения всплывающих реплик:" name="nearby_toasts_lifetime"/>  	<spinner label="Время затухания всплывающих реплик:" name="nearby_toasts_fadingtime"/>  	<text name="translate_chb_label"> -		Использовать машинный перевод во время общения +		Использовать машинный перевод при общении  	</text>  	<text name="translate_language_text">  		Переводить чат на: diff --git a/indra/newview/skins/default/xui/ru/panel_preferences_move.xml b/indra/newview/skins/default/xui/ru/panel_preferences_move.xml index 878a729113..a6e9b00f2a 100644 --- a/indra/newview/skins/default/xui/ru/panel_preferences_move.xml +++ b/indra/newview/skins/default/xui/ru/panel_preferences_move.xml @@ -5,12 +5,12 @@  	<text name="heading2">  		Автоматическая установка позиции для:  	</text> -	<check_box label="создания/редактирования" name="edit_camera_movement" tool_tip="Производить автоматическое позиционирование камеры при входе в режим редактирования и выходе из него"/> -	<check_box label="внешности" name="appearance_camera_movement" tool_tip="Производить автоматическое позиционирование камеры в режиме изменения внешности"/> +	<check_box label="создания/редактирования" name="edit_camera_movement" tool_tip="Автоматическое позиционирование камеры при входе в режим редактирования и выходе из него"/> +	<check_box label="внешности" name="appearance_camera_movement" tool_tip="Автоматическое позиционирование камеры в режиме редактирования"/>  	<text name="keyboard_lbl">  		Клавиатура:  	</text> -	<check_box label="Клавиши стрелок всегда перемещают меня" name="arrow_keys_move_avatar_check"/> +	<check_box label="Клавиши со стрелками всегда перемещают меня" name="arrow_keys_move_avatar_check"/>  	<check_box label="Бег после двойного нажатия клавиши" name="tap_tap_hold_to_run"/>  	<text name="mouse_lbl">  		Мышь: diff --git a/indra/newview/skins/default/xui/ru/panel_profile.xml b/indra/newview/skins/default/xui/ru/panel_profile.xml index 79c060c050..fab57d678c 100644 --- a/indra/newview/skins/default/xui/ru/panel_profile.xml +++ b/indra/newview/skins/default/xui/ru/panel_profile.xml @@ -53,10 +53,10 @@  					<button label="IM" name="im" tool_tip="Начать сеанс IM"/>  				</layout_panel>  				<layout_panel name="call_btn_lp"> -					<button label="Позвонить" name="call" tool_tip="Позвонить этому жителю"/> +					<button label="Звонок" name="call" tool_tip="Позвонить этому жителю"/>  				</layout_panel>  				<layout_panel name="chat_btn_lp"> -					<button label="Телепортироваться" name="teleport" tool_tip="Предложить телепортацию"/> +					<button label="Телепортация" name="teleport" tool_tip="Предложить телепортацию"/>  				</layout_panel>  				<layout_panel name="overflow_btn_lp">  					<menu_button label="▼" name="overflow_btn" tool_tip="Заплатить жителю или поделиться с ним вещами"/> diff --git a/indra/newview/skins/default/xui/ru/panel_region_estate.xml b/indra/newview/skins/default/xui/ru/panel_region_estate.xml index d957274026..27ec10b323 100644 --- a/indra/newview/skins/default/xui/ru/panel_region_estate.xml +++ b/indra/newview/skins/default/xui/ru/panel_region_estate.xml @@ -18,16 +18,16 @@  	<check_box label="Глобальное время" name="use_global_time_check"/>  	<check_box label="Фиксированное" name="fixed_sun_check"/>  	<slider label="Фаза" name="sun_hour_slider"/> -	<check_box label="Разрешить публичный доступ" name="externally_visible_check"/> +	<check_box label="Разрешить общий доступ" name="externally_visible_check"/>  	<text name="Only Allow"> -		Ограничить доступ проверкой: +		Разрешить доступ только аккаунтам с подтверждением:  	</text>  	<check_box label="Информации об оплате в файле" name="limit_payment" tool_tip="Банить нераспознанных жителей"/>  	<check_box label="Проверка возраста" name="limit_age_verified" tool_tip="Банить жителей, не прошедших проверку возраста. Более подробная информация находится здесь: [SUPPORT_SITE]."/>  	<check_box label="Разрешить голосовое общение" name="voice_chat_check"/>  	<check_box label="Разрешить прямой телепорт" name="allow_direct_teleport"/>  	<button label="Применить" name="apply_btn"/> -	<button label="Отправить сообщение в землевладение..." name="message_estate_btn"/> +	<button label="Сообщение в землевладение..." name="message_estate_btn"/>  	<button label="Выкинуть жителя с землевладения..." name="kick_user_from_estate_btn"/>  	<text name="estate_manager_label">  		Менеджеры землевладения: diff --git a/indra/newview/skins/default/xui/ru/panel_region_general.xml b/indra/newview/skins/default/xui/ru/panel_region_general.xml index 97bfbbeeea..8559be6c9e 100644 --- a/indra/newview/skins/default/xui/ru/panel_region_general.xml +++ b/indra/newview/skins/default/xui/ru/panel_region_general.xml @@ -31,10 +31,10 @@  	<text label="Дозволенность" name="access_text">  		Категория:  	</text> -	<icons_combo_box label="Умеренная" name="access_combo"> +	<icons_combo_box label="Умеренный" name="access_combo">  		<icons_combo_box.item label="Для взрослых" name="Adult" value="42"/> -		<icons_combo_box.item label="Умеренная" name="Mature" value="21"/> -		<icons_combo_box.item label="Общая" name="PG" value="13"/> +		<icons_combo_box.item label="Умеренный" name="Mature" value="21"/> +		<icons_combo_box.item label="Общий" name="PG" value="13"/>  	</icons_combo_box>  	<button label="Применить" name="apply_btn"/>  	<button label="Телепортировать домой одного жителя..." name="kick_btn"/> diff --git a/indra/newview/skins/default/xui/ru/panel_region_terrain.xml b/indra/newview/skins/default/xui/ru/panel_region_terrain.xml index 08258b5034..af25565226 100644 --- a/indra/newview/skins/default/xui/ru/panel_region_terrain.xml +++ b/indra/newview/skins/default/xui/ru/panel_region_terrain.xml @@ -7,13 +7,13 @@  		неизвестен  	</text>  	<spinner label="Уровень воды" name="water_height_spin"/> -	<spinner label="Верхняя точка ландшафта" name="terrain_raise_spin"/> -	<spinner label="Нижняя точка ландшафта" name="terrain_lower_spin"/> +	<spinner label="Верх. точка ландшафта" name="terrain_raise_spin"/> +	<spinner label="Ниж. точка ландшафта" name="terrain_lower_spin"/>  	<text name="detail_texture_text"> -		Текстуры ландшафта (требования: 512x512, 24-разрядные, TGA) +		Текстуры ландшафта (требования: 512x512, 24-битные, TGA)  	</text>  	<text name="height_text_lbl"> -		1 (Нижняя) +		1 (Низ)  	</text>  	<text name="height_text_lbl2">  		2 @@ -22,7 +22,7 @@  		3  	</text>  	<text name="height_text_lbl4"> -		4 (Верхняя) +		4 (Верх)  	</text>  	<text name="height_text_lbl5">  		Диапазон высот текстур @@ -31,7 +31,7 @@  		Эти значения определяют степень смешивания наложенных текстур.  	</text>  	<text name="height_text_lbl11"> -		Измеряются в метрах. Значение «Нижняя» – это МАКСИМАЛЬНАЯ высота текстуры №1, а значение «Верхняя» – это МИНИМАЛЬНАЯ высота текстуры №4. +		Измеряются в метрах. Значение «Низ» – это МАКСИМАЛЬНАЯ высота текстуры №1, а значение «Верх» – это МИНИМАЛЬНАЯ высота текстуры №4.  	</text>  	<text name="height_text_lbl6">  		Северо-запад @@ -39,20 +39,20 @@  	<text name="height_text_lbl7">  		Северо-восток  	</text> -	<spinner label="Нижняя" name="height_start_spin_1"/> -	<spinner label="Нижняя" name="height_start_spin_3"/> -	<spinner label="Верхняя" name="height_range_spin_1"/> -	<spinner label="Верхняя" name="height_range_spin_3"/> +	<spinner label="Низ" name="height_start_spin_1"/> +	<spinner label="Низ" name="height_start_spin_3"/> +	<spinner label="Верх" name="height_range_spin_1"/> +	<spinner label="Верх" name="height_range_spin_3"/>  	<text name="height_text_lbl8">  		Юго-запад  	</text>  	<text name="height_text_lbl9">  		Юго-восток  	</text> -	<spinner label="Нижняя" name="height_start_spin_0"/> -	<spinner label="Нижняя" name="height_start_spin_2"/> -	<spinner label="Верхняя" name="height_range_spin_0"/> -	<spinner label="Верхняя" name="height_range_spin_2"/> +	<spinner label="Низ" name="height_start_spin_0"/> +	<spinner label="Низ" name="height_start_spin_2"/> +	<spinner label="Верх" name="height_range_spin_0"/> +	<spinner label="Верх" name="height_range_spin_2"/>  	<button label="Загрузить ландшафт RAW..." name="download_raw_btn" tool_tip="Доступно только землевладельцам, не менеджерам"/>  	<button label="Передать ландшафт RAW..." name="upload_raw_btn" tool_tip="Доступно только землевладельцам, не менеджерам"/>  	<button label="Зафиксировать пределы" name="bake_terrain_btn" tool_tip="Установить высоту ландшафта по средней точке между верхней и нижней точками"/> diff --git a/indra/newview/skins/default/xui/ru/panel_region_texture.xml b/indra/newview/skins/default/xui/ru/panel_region_texture.xml index 369beb1e9b..c4b35a536d 100644 --- a/indra/newview/skins/default/xui/ru/panel_region_texture.xml +++ b/indra/newview/skins/default/xui/ru/panel_region_texture.xml @@ -7,10 +7,10 @@  		неизвестен  	</text>  	<text name="detail_texture_text"> -		Текстуры ландшафта (требования: 512x512, 24-разрядные TGA-файлы) +		Текстуры ландшафта (требования: 512x512, 24-битные TGA-файлы)  	</text>  	<text name="height_text_lbl"> -		1 (нижняя) +		1 (низ)  	</text>  	<text name="height_text_lbl2">  		2 @@ -19,7 +19,7 @@  		3  	</text>  	<text name="height_text_lbl4"> -		4 (верхняя) +		4 (верх)  	</text>  	<text name="height_text_lbl5">  		Диапазон высот текстур @@ -30,25 +30,25 @@  	<text name="height_text_lbl7">  		Северо-восток  	</text> -	<spinner label="Низко" name="height_start_spin_1"/> -	<spinner label="Низко" name="height_start_spin_3"/> -	<spinner label="Высоко" name="height_range_spin_1"/> -	<spinner label="Высоко" name="height_range_spin_3"/> +	<spinner label="Низ" name="height_start_spin_1"/> +	<spinner label="Низ" name="height_start_spin_3"/> +	<spinner label="Верх" name="height_range_spin_1"/> +	<spinner label="Верх" name="height_range_spin_3"/>  	<text name="height_text_lbl8">  		Юго-запад  	</text>  	<text name="height_text_lbl9">  		Юго-восток  	</text> -	<spinner label="Низко" name="height_start_spin_0"/> -	<spinner label="Низко" name="height_start_spin_2"/> -	<spinner label="Высоко" name="height_range_spin_0"/> -	<spinner label="Высоко" name="height_range_spin_2"/> +	<spinner label="Низ" name="height_start_spin_0"/> +	<spinner label="Низ" name="height_start_spin_2"/> +	<spinner label="Верх" name="height_range_spin_0"/> +	<spinner label="Верх" name="height_range_spin_2"/>  	<text name="height_text_lbl10">  		Эти значения отображают диапазон перекрытия вышеуказанных текстур.  	</text>  	<text name="height_text_lbl11"> -		Измеряется в метрах, НИЖНЕЕ значение – это МАКСИМАЛЬНАЯ высота текстуры №1, ВЕРХНЕЕ значение – это МИНИМАЛЬНАЯ высота текстуры №4. +		Измеряется в метрах, значение «Низ» – это МАКСИМАЛЬНАЯ высота текстуры №1, значение «Верх» – это МИНИМАЛЬНАЯ высота текстуры №4.  	</text>  	<button label="Применить" name="apply_btn"/>  </panel> diff --git a/indra/newview/skins/default/xui/ru/strings.xml b/indra/newview/skins/default/xui/ru/strings.xml index df657b39c6..7fef5797a9 100644 --- a/indra/newview/skins/default/xui/ru/strings.xml +++ b/indra/newview/skins/default/xui/ru/strings.xml @@ -872,7 +872,7 @@ support@secondlife.com.  		Новое сопоставление элементов управления  	</string>  	<string name="AnimateYourAvatar"> -		Анимация аватара +		Анимировать ваш аватар  	</string>  	<string name="AttachToYourAvatar">  		Прикрепить к аватару @@ -899,10 +899,10 @@ support@secondlife.com.  		Нет подключения  	</string>  	<string name="SIM_ACCESS_PG"> -		Общая +		Общий  	</string>  	<string name="SIM_ACCESS_MATURE"> -		Умеренная +		Умеренный  	</string>  	<string name="SIM_ACCESS_ADULT">  		Для взрослых @@ -1073,7 +1073,7 @@ support@secondlife.com.  		Тату не надето  	</string>  	<string name="physics_not_worn"> -		Физические данные не учитываются +		Физика не учитывается  	</string>  	<string name="invalid_not_worn">  		ошибка @@ -1124,7 +1124,7 @@ support@secondlife.com.  		Создать тату  	</string>  	<string name="create_new_physics"> -		Создать физические данные +		Создать физику  	</string>  	<string name="create_new_invalid">  		ошибка @@ -1437,7 +1437,7 @@ support@secondlife.com.  		Резина  	</string>  	<string name="Light"> -		Освещение +		Светлый  	</string>  	<string name="KBShift">  		SHIFT @@ -1617,7 +1617,7 @@ support@secondlife.com.  		Есть информация о платежах  	</string>  	<string name="PaymentInfoOnFile"> -		Есть информация в файле о платежах +		Есть зарегистрир. информация о платежах  	</string>  	<string name="NoPaymentInfoOnFile">  		Нет информации о платежах @@ -2340,13 +2340,13 @@ support@secondlife.com.  		Не удается получить описание формата пикселей  	</string>  	<string name="MBTrueColorWindow"> -		Для работы [APP_NAME] необходим режим True Color (32 разряда). -Задайте в настройках дисплея 32-разрядный режим цвета. +		Для работы [APP_NAME] необходим режим True Color (32 бита). +Задайте в настройках дисплея 32-битный режим цвета.  	</string>  	<string name="MBAlpha"> -		Не удается запустить [APP_NAME] из-за отсутствия доступа к 8-разрядному альфа-каналу.  Обычно эта проблема возникает из-за неполадок с драйвером видеокарты. +		Не удается запустить [APP_NAME] из-за отсутствия доступа к 8-битному альфа-каналу.  Обычно эта проблема возникает из-за неполадок с драйвером видеокарты.  Установите новые драйверы видеокарты. -Также задайте для монитора 32-разрядный режим True Color (Панель управления > Экран > Параметры). +Также задайте для монитора 32-битный режим True Color (Панель управления > Экран > Параметры).  Если это сообщение продолжает отображаться, обратитесь на сайт [SUPPORT_SITE].  	</string>  	<string name="MBPixelFmtSetErr"> @@ -2363,7 +2363,7 @@ support@secondlife.com.  Если это сообщение продолжает отображаться, обратитесь на сайт [SUPPORT_SITE].  	</string>  	<string name="5 O'Clock Shadow"> -		Легкие сумерки +		Жидкие  	</string>  	<string name="All White">  		Полностью белые @@ -2381,10 +2381,10 @@ support@secondlife.com.  		Прикреплено  	</string>  	<string name="Attached Earlobes"> -		Примыкающие мочки +		Приросшие мочки  	</string>  	<string name="Back Fringe"> -		Черная челка +		Затылок  	</string>  	<string name="Baggy">  		С мешками @@ -2417,7 +2417,7 @@ support@secondlife.com.  		Большая голова  	</string>  	<string name="Big Pectorals"> -		Большие грудные мышцы +		Выпуклая грудь  	</string>  	<string name="Big Spikes">  		Большие «шипы» @@ -2603,7 +2603,7 @@ support@secondlife.com.  		Кустистые брови  	</string>  	<string name="Bushy Hair"> -		Вьющиеся волосы +		Пышные  	</string>  	<string name="Butt Size">  		Размер зада @@ -2636,7 +2636,7 @@ support@secondlife.com.  		Ямка на подбородке  	</string>  	<string name="Chin Curtains"> -		Борода в стиле Линкольна +		Шкиперская бородка  	</string>  	<string name="Chin Depth">  		Толщина подбородка @@ -2654,10 +2654,10 @@ support@secondlife.com.  		Переход от подбородка к шее  	</string>  	<string name="Clear"> -		Очистить +		Чистый  	</string>  	<string name="Cleft"> -		Щелкой +		Ямка  	</string>  	<string name="Close Set Eyes">  		Близко посаженные @@ -2711,7 +2711,7 @@ support@secondlife.com.  		Темнее  	</string>  	<string name="Deep"> -		Глубокий +		Глубоко  	</string>  	<string name="Default Heels">  		Стандартные каблуки @@ -2726,7 +2726,7 @@ support@secondlife.com.  		Вниз  	</string>  	<string name="Duffle Bag"> -		Сумка из плотной ткани +		Больше  	</string>  	<string name="Ear Angle">  		Оттопыренность ушей @@ -2756,7 +2756,7 @@ support@secondlife.com.  		Открытость глаз  	</string>  	<string name="Eye Pop"> -		Взмах ресницами +		Вытаращить глаз  	</string>  	<string name="Eye Size">  		Размер глаз @@ -2774,7 +2774,7 @@ support@secondlife.com.  		Высота бровей  	</string>  	<string name="Eyebrow Points"> -		Точки бровей +		Кончики бровей  	</string>  	<string name="Eyebrow Size">  		Размер бровей @@ -2792,10 +2792,10 @@ support@secondlife.com.  		Выпученные глаза  	</string>  	<string name="Face Shear"> -		Овал лица +		Перекос лица  	</string>  	<string name="Facial Definition"> -		Описание лица +		Черты лица  	</string>  	<string name="Far Set Eyes">  		Широко расставленные глаза @@ -2816,7 +2816,7 @@ support@secondlife.com.  		С манжетами  	</string>  	<string name="Flat"> -		Плоский +		Плоские  	</string>  	<string name="Flat Butt">  		Плоский зад @@ -2903,7 +2903,7 @@ support@secondlife.com.  		Размер кисти  	</string>  	<string name="Handlebars"> -		Рули +		Длинные усы  	</string>  	<string name="Head Length">  		Длина головы @@ -2924,10 +2924,10 @@ support@secondlife.com.  		Форма каблука  	</string>  	<string name="Height"> -		Высота +		Рост  	</string>  	<string name="High"> -		высокий +		Высокие  	</string>  	<string name="High Heels">  		Высокий каблук @@ -2939,7 +2939,7 @@ support@secondlife.com.  		Высокая платформа  	</string>  	<string name="High and Tight"> -		Высокое и плотное +		Высокий и плотный  	</string>  	<string name="Higher">  		Выше @@ -2951,13 +2951,13 @@ support@secondlife.com.  		Ширина бедер  	</string>  	<string name="In"> -		Внутри +		Внутрь  	</string>  	<string name="In Shdw Color">  		Цвет внутренних теней  	</string>  	<string name="In Shdw Opacity"> -		Прозрачность внутренних теней +		Прозрачность внутр. теней  	</string>  	<string name="Inner Eye Corner">  		Внутренние уголки глаз @@ -2990,13 +2990,13 @@ support@secondlife.com.  		Щеки  	</string>  	<string name="Knee Angle"> -		Угол коленей +		Угол колен  	</string>  	<string name="Knock Kneed"> -		Ровность ног +		Колченогие  	</string>  	<string name="Large"> -		Большие +		Больше  	</string>  	<string name="Large Hands">  		Большие кисти @@ -3029,7 +3029,7 @@ support@secondlife.com.  		Меньше притяжения  	</string>  	<string name="Less Love"> -		Меньше любви +		Меньше  	</string>  	<string name="Less Muscles">  		Меньше мышц @@ -3044,7 +3044,7 @@ support@secondlife.com.  		Меньше округлости  	</string>  	<string name="Less Saddle"> -		Меньше седлообразности +		Меньше  	</string>  	<string name="Less Square">  		Меньше угловатости @@ -3053,16 +3053,16 @@ support@secondlife.com.  		Меньше объема  	</string>  	<string name="Less soul"> -		Меньше энергичности +		Меньше  	</string>  	<string name="Lighter">  		Светлее  	</string>  	<string name="Lip Cleft"> -		Зазор между губ +		Ямка между губ  	</string>  	<string name="Lip Cleft Depth"> -		Глубина зазора +		Глубина ямки  	</string>  	<string name="Lip Fullness">  		Полнота губ @@ -3128,28 +3128,28 @@ support@secondlife.com.  		Отложения на талии  	</string>  	<string name="Low"> -		Низкое +		Низкие  	</string>  	<string name="Low Heels">  		Низкий каблук  	</string>  	<string name="Low Jaw"> -		Низкая челюсть +		Челюсть низко  	</string>  	<string name="Low Platforms">  		Низкая платформа  	</string>  	<string name="Low and Loose"> -		Низкое и свободное +		Низкий и свободный  	</string>  	<string name="Lower">  		Ниже  	</string>  	<string name="Lower Bridge"> -		Ниже переносицу +		Спинка носа  	</string>  	<string name="Lower Cheeks"> -		Ниже щеки +		Щеки ниже  	</string>  	<string name="Male">  		Мужчина @@ -3185,7 +3185,7 @@ support@secondlife.com.  		Больше помады  	</string>  	<string name="More Love"> -		Больше любви +		Больше  	</string>  	<string name="More Lower Lip">  		Больше нижняя губа @@ -3194,7 +3194,7 @@ support@secondlife.com.  		Больше мышц  	</string>  	<string name="More Muscular"> -		Более мускулистое +		Больше мышц  	</string>  	<string name="More Rosy">  		Больше румянца @@ -3203,7 +3203,7 @@ support@secondlife.com.  		Больше округлости  	</string>  	<string name="More Saddle"> -		Более седлообразно +		Больше  	</string>  	<string name="More Sloped">  		Более наклонный @@ -3218,10 +3218,10 @@ support@secondlife.com.  		Более вертикальный  	</string>  	<string name="More Volume"> -		Больший объем +		Больше объема  	</string>  	<string name="More soul"> -		Больше духа +		Больше  	</string>  	<string name="Moustache">  		Усы @@ -3251,7 +3251,7 @@ support@secondlife.com.  		Узко  	</string>  	<string name="Narrow Back"> -		Узкая спина +		Узко сзади  	</string>  	<string name="Narrow Front">  		Узкий перед @@ -3260,7 +3260,7 @@ support@secondlife.com.  		Узкие губы  	</string>  	<string name="Natural"> -		Естественно +		Естественный  	</string>  	<string name="Neck Length">  		Длина шеи @@ -3356,13 +3356,13 @@ support@secondlife.com.  		Оранжевый  	</string>  	<string name="Out"> -		Снаружи +		Наружу  	</string>  	<string name="Out Shdw Color">  		Цвет внешних теней  	</string>  	<string name="Out Shdw Opacity"> -		Прозрачность внешних теней +		Прозрачность внеш. теней  	</string>  	<string name="Outer Eye Corner">  		Внешние уголки глаз @@ -3377,7 +3377,7 @@ support@secondlife.com.  		Глубокий прикус  	</string>  	<string name="Package"> -		Пакет +		Гульфик  	</string>  	<string name="Painted Nails">  		Покрашенные @@ -3386,7 +3386,7 @@ support@secondlife.com.  		Бледный  	</string>  	<string name="Pants Crotch"> -		Мотня +		Шаг  	</string>  	<string name="Pants Fit">  		Облегающие брюки @@ -3404,13 +3404,13 @@ support@secondlife.com.  		Пробор  	</string>  	<string name="Part Bangs"> -		Челки с пробором +		Челка с пробором  	</string>  	<string name="Pectorals">  		Грудные мышцы  	</string>  	<string name="Pigment"> -		Пигмент +		Пигментация  	</string>  	<string name="Pigtails">  		Хвосты по бокам @@ -3428,7 +3428,7 @@ support@secondlife.com.  		Ширина платформы  	</string>  	<string name="Pointy"> -		Острый +		Острые  	</string>  	<string name="Pointy Heels">  		Острый каблук @@ -3440,13 +3440,13 @@ support@secondlife.com.  		Пышная юбка  	</string>  	<string name="Pop Left Eye"> -		Хлопнуть левым глазом +		Левый глаз  	</string>  	<string name="Pop Right Eye"> -		Хлопнуть правым глазом +		Правый глаз  	</string>  	<string name="Puffy"> -		Припухшие +		Пухлые  	</string>  	<string name="Puffy Eyelids">  		Припухлость век @@ -3473,13 +3473,13 @@ support@secondlife.com.  		Румянец  	</string>  	<string name="Ruddy"> -		Румяное +		Румяный  	</string>  	<string name="Rumpled Hair">  		Взъерошенные  	</string>  	<string name="Saddle Bags"> -		Седельные сумки +		Галифе  	</string>  	<string name="Scrawny Leg">  		Сухопарая нога @@ -3488,25 +3488,25 @@ support@secondlife.com.  		Разделить  	</string>  	<string name="Shallow"> -		Мелкий +		Мелко  	</string>  	<string name="Shear Back"> -		Очертание спины +		Скос сзади  	</string>  	<string name="Shear Face"> -		Овал лица +		Перекос лица  	</string>  	<string name="Shear Front"> -		Очертание спереди +		Скос спереди  	</string>  	<string name="Shear Left Up"> -		Очертание левой верхней части +		Скос влево вверх  	</string>  	<string name="Shear Right Up"> -		Очертание правой верхней части +		Скос вправо вверх  	</string>  	<string name="Sheared Back"> -		Уменьшенная спина +		Уменьшено сзади  	</string>  	<string name="Sheared Front">  		Уменьшено спереди @@ -3533,7 +3533,7 @@ support@secondlife.com.  		Высота обуви  	</string>  	<string name="Short"> -		Короче +		Ниже  	</string>  	<string name="Short Arms">  		Короткие руки @@ -3608,7 +3608,7 @@ support@secondlife.com.  		Разрез: справа  	</string>  	<string name="Small"> -		Маленький +		Меньше  	</string>  	<string name="Small Hands">  		Маленькие кисти @@ -3620,13 +3620,13 @@ support@secondlife.com.  		Гладко  	</string>  	<string name="Smooth Hair"> -		Приглаженные волосы +		Приглаженные  	</string>  	<string name="Socks Length">  		Длина носков  	</string>  	<string name="Soulpatch"> -		Бородка под губой +		Эспаньолка  	</string>  	<string name="Sparse">  		Жидкие @@ -3662,13 +3662,13 @@ support@secondlife.com.  		Зачесанные вперед  	</string>  	<string name="Tall"> -		Высокие +		Выше  	</string>  	<string name="Taper Back"> -		Градуировка сзади +		Конус сзади  	</string>  	<string name="Taper Front"> -		Градуировка спереди +		Конус спереди  	</string>  	<string name="Thick Heels">  		Широкий каблук @@ -3737,16 +3737,16 @@ support@secondlife.com.  		Неестественный  	</string>  	<string name="Upper Bridge"> -		Переносицу выше +		Переносица  	</string>  	<string name="Upper Cheeks">  		Щеки выше  	</string>  	<string name="Upper Chin Cleft"> -		Ямку на подбородке выше +		Ямка на подбородке выше  	</string>  	<string name="Upper Eyelid Fold"> -		Складку века выше +		Складка верхнего века  	</string>  	<string name="Upturned">  		Вверх @@ -3758,7 +3758,7 @@ support@secondlife.com.  		Высота талии  	</string>  	<string name="Well-Fed"> -		Упитанное +		Упитанные  	</string>  	<string name="White Hair">  		Белые волосы @@ -3767,7 +3767,7 @@ support@secondlife.com.  		Широко  	</string>  	<string name="Wide Back"> -		Широкая спина +		Широко сзади  	</string>  	<string name="Wide Front">  		Широкий перед @@ -4252,7 +4252,7 @@ support@secondlife.com.  		Женщина – ух ты!  	</string>  	<string name="/bow"> -		/поклон +		/поклониться  	</string>  	<string name="/clap">  		/хлопнуть @@ -4794,7 +4794,7 @@ support@secondlife.com.  		Компас  	</string>  	<string name="Command_Destinations_Label"> -		Места +		Пункты  	</string>  	<string name="Command_Gestures_Label">  		Жесты @@ -4845,16 +4845,16 @@ support@secondlife.com.  		Вид  	</string>  	<string name="Command_Voice_Label"> -		Голоса собеседников +		Настройки голоса  	</string>  	<string name="Command_AboutLand_Tooltip">  		Информация о посещаемой вами земле  	</string>  	<string name="Command_Appearance_Tooltip"> -		Сменить аватар +		Изменить аватар  	</string>  	<string name="Command_Avatar_Tooltip"> -		Выберите весь аватар +		Выбор аватара  	</string>  	<string name="Command_Build_Tooltip">  		Построение объектов и формирование ландшафта @@ -4917,7 +4917,7 @@ support@secondlife.com.  		Изменение угла камеры  	</string>  	<string name="Command_Voice_Tooltip"> -		Люди около вас с оспособностью говорить +		Громкость звонков и голосов окружающих вас людей  	</string>  	<string name="Retain%">  		Остаток% diff --git a/indra/newview/skins/default/xui/tr/floater_about.xml b/indra/newview/skins/default/xui/tr/floater_about.xml index 998890b85c..993ec42958 100644 --- a/indra/newview/skins/default/xui/tr/floater_about.xml +++ b/indra/newview/skins/default/xui/tr/floater_about.xml @@ -46,16 +46,16 @@ Ses Sunucusu Sürümü: [VOICE_VERSION]  		</panel>  		<panel label="Katkıda Bulunanlar" name="credits_panel">  			<text name="linden_intro"> -				Second Life, Lindens'lar tarafından geliştirilmiştir: +				Second Life, Linden'lar tarafından geliştirilmiştir:  			</text>  			<text name="contrib_intro"> -				açık kaynak kod katkısında bulunanlar: +				Açık kaynak kod katkısında bulunanlar:  			</text>  			<text_editor name="contrib_names">  				Geçici Ad çalıştırma sırasında değiştirilir  			</text_editor>  			<text name="trans_intro"> -				çevirileri yapanlar: +				Çevirileri yapanlar:  			</text>  			<text_editor name="trans_names">  				Geçici Ad çalıştırma sırasında değiştirilir diff --git a/indra/newview/skins/default/xui/tr/floater_about_land.xml b/indra/newview/skins/default/xui/tr/floater_about_land.xml index c44722f4ba..e0350964b5 100644 --- a/indra/newview/skins/default/xui/tr/floater_about_land.xml +++ b/indra/newview/skins/default/xui/tr/floater_about_land.xml @@ -102,7 +102,7 @@  			<text name="For Sale: Price L$[PRICE].">  				Fiyat: L$[PRICE] (L$[PRICE_PER_SQM]/m²)  			</text> -			<button label="Arazi Sat" name="Sell Land..."/> +			<button label="Araziyi Sat" name="Sell Land..."/>  			<text name="For sale to">  				Şu Alıcıya Satılık: [BUYER]  			</text> @@ -307,7 +307,7 @@ Sadece büyük parseller aramada görünür.  				İtme Yok (Bölge Geçersiz Kılma)  			</panel.string>  			<panel.string name="see_avs_text"> -				Bu parseldeki sakinleri gör ve onlarla sohbet et +				Parseldeki sakinleri gör ve onlarla sohbet et  			</panel.string>  			<text name="allow_label">  				Sakinlere şunun için izin ver: @@ -336,7 +336,7 @@ Sadece büyük parseller aramada görünür.  			<check_box label="İtme Yok" name="PushRestrictCheck" tool_tip="Komut dosyalarının itmesini önler Bu seçeneğin işaretlenmesi arazinizdeki bozucu davranışları önlemeye yardımcı olabilir."/>  			<check_box label="Konumu Arama sonuçlarında göster (L$30/hafta)" name="ShowDirectoryCheck" tool_tip="Arama sonuçlarında bu parsel görünsün"/>  			<combo_box name="land category with adult"> -				<combo_box.item label="Herhangi Bir Kategori" name="item0"/> +				<combo_box.item label="Herh. Bir Kategori" name="item0"/>  				<combo_box.item label="Linden Konumu" name="item1"/>  				<combo_box.item label="Yetişkin" name="item2"/>  				<combo_box.item label="Sanat ve Kültür" name="item3"/> @@ -352,7 +352,7 @@ Sadece büyük parseller aramada görünür.  				<combo_box.item label="Diğer" name="item12"/>  			</combo_box>  			<combo_box name="land category"> -				<combo_box.item label="Herhangi Bir Kategori" name="item0"/> +				<combo_box.item label="Herh. Bir Kategori" name="item0"/>  				<combo_box.item label="Linden Konumu" name="item1"/>  				<combo_box.item label="Sanat ve Kültür" name="item3"/>  				<combo_box.item label="İş" name="item4"/> @@ -372,7 +372,7 @@ Sadece büyük parseller aramada görünür.  			</text>  			<texture_picker name="snapshot_ctrl" tool_tip="Bir resim seçmek için tıklayın"/>  			<text name="allow_label5"> -				Diğer parsellerdeki Sakinlere şunun için izin verin: +				Diğer parsel Sakinlerine şunun için izin verin:  			</text>  			<check_box label="Avatarları Gör" name="SeeAvatarsCheck" tool_tip="Diğer parsellerdeki sakinlerin bu parseldeki sakinleri görmesine ve onlarla sohbet etmesine, sizin de onları görüp, onlarla sohbet etmenize imkan tanır."/>  			<text name="landing_point"> @@ -419,7 +419,7 @@ Sadece büyük parseller aramada görünür.  				piksel  			</text>  			<text name="Options:"> -				Seçenekler: +				Seçenklr.:  			</text>  			<check_box label="Döngü" name="media_loop" tool_tip="Ortamı döngüsel olarak oynat.  Ortamın oynatılması bittiğinde baştan tekrar başlayacaktır."/>  		</panel> @@ -448,7 +448,7 @@ Sadece büyük parseller aramada görünür.  				(Gayrimenkul tarafından tanımlanır)  			</panel.string>  			<panel.string name="allow_public_access"> -				Kamusal Erişime İzin Ver ([MATURITY]) (Not: Bunun işaretinin kaldırılması yasaklama çizgileri oluşturacaktır) +				Kamusal Erişime İzin Ver ([MATURITY]) (Not: İşaret kaldırılırsa yasaklama çizgileri oluşur)  			</panel.string>  			<panel.string name="estate_override">  				Bu seçeneklerden biri veya daha fazlası gayrimenkul düzeyinde ayarlanır @@ -462,7 +462,7 @@ Sadece büyük parseller aramada görünür.  			<check_box label="Dosyadaki ödeme bilgileri [ESTATE_PAYMENT_LIMIT]" name="limit_payment" tool_tip="Tanınmayan Sakinleri Yasakla."/>  			<check_box label="Yaş doğrulama [ESTATE_AGE_LIMIT]" name="limit_age_verified" tool_tip="Yaşını doğrulamayan Sakinleri yasakla Daha fazla bilgi için [SUPPORT_SITE] adresini ziyaret edin."/>  			<check_box label="Grup Erişimine İzin Ver: [GROUP]" name="GroupCheck" tool_tip="Genel sekmesinde grup ayarla."/> -			<check_box label="Geçiş haklarını şuna sat:" name="PassCheck" tool_tip="Bu parsele geçici erişim verir"/> +			<check_box label="Geçiş haklr. şuna sat:" name="PassCheck" tool_tip="Bu parsele geçici erişim verir"/>  			<combo_box name="pass_combo">  				<combo_box.item label="Herkes" name="Anyone"/>  				<combo_box.item label="Grup" name="Group"/> diff --git a/indra/newview/skins/default/xui/tr/floater_buy_land.xml b/indra/newview/skins/default/xui/tr/floater_buy_land.xml index 4d43157f99..7b43af2ea4 100644 --- a/indra/newview/skins/default/xui/tr/floater_buy_land.xml +++ b/indra/newview/skins/default/xui/tr/floater_buy_land.xml @@ -53,7 +53,7 @@ Daha küçük bir alan seçmeyi deneyin.  		Arazi alma bilgileri çekilirken hata oluştu.  	</floater.string>  	<floater.string name="buying_will"> -		Bu arazinin satın alınması sonucu: +		Arazinin satın alınması sonucu:  	</floater.string>  	<floater.string name="buying_for_group">  		Bu arazinin grup için satın alınması sonucu: @@ -185,7 +185,7 @@ Daha küçük bir alan seçmeyi deneyin.  nesnelerle satılır  	</text>  	<text name="info_action"> -		Bu arazinin satın alınması sonucu: +		Arazinin satın alınması sonucu:  	</text>  	<text name="error_message">  		Bir şeyler yolunda değil. diff --git a/indra/newview/skins/default/xui/tr/floater_edit_day_cycle.xml b/indra/newview/skins/default/xui/tr/floater_edit_day_cycle.xml index e2e87ddf1e..4be1068dcc 100644 --- a/indra/newview/skins/default/xui/tr/floater_edit_day_cycle.xml +++ b/indra/newview/skins/default/xui/tr/floater_edit_day_cycle.xml @@ -22,10 +22,10 @@  		Not: Ön ayarınızın adını değiştirirseniz, yeni bir ön ayar oluşturursunuz ve mevcut ön ayar değişmez.  	</text>  	<text name="hint_item1"> -		- Belirli gökyüzü ayarlarını ve zamanı düzenlemek için bir sekmeye tıklayın. +		- Birine tıklayarak gökyüzü ayarlarını/zamanı düzenleyin.  	</text>  	<text name="hint_item2"> -		- Geçiş sürelerini ayarlamak için sekmelere tıklayın ve bunları sürükleyin. +		- Sekmelere tıklayıp sürükleyerek geçiş sürlrn. ayarlayın.  	</text>  	<text name="hint_item3">  		- Gün döngünüzü önizlemek için fırçayı kullanın. diff --git a/indra/newview/skins/default/xui/tr/floater_environment_settings.xml b/indra/newview/skins/default/xui/tr/floater_environment_settings.xml index 943e1e810d..e702da7e1b 100644 --- a/indra/newview/skins/default/xui/tr/floater_environment_settings.xml +++ b/indra/newview/skins/default/xui/tr/floater_environment_settings.xml @@ -18,7 +18,7 @@  			<combo_box.item label="-Bir ön ayar seçin-" name="item0"/>  		</combo_box>  		<text name="sky_dayc_settings_title"> -			Gökyüzü / Gün Döngüsü +			Gökyüzü/Gün Dön.  		</text>  		<radio_group name="sky_dayc_settings_radio_group">  			<radio_item label="Sabit gökyüzü" name="my_sky_settings"/> diff --git a/indra/newview/skins/default/xui/tr/floater_god_tools.xml b/indra/newview/skins/default/xui/tr/floater_god_tools.xml index ce7f7badcc..26e5ebd18b 100644 --- a/indra/newview/skins/default/xui/tr/floater_god_tools.xml +++ b/indra/newview/skins/default/xui/tr/floater_god_tools.xml @@ -67,7 +67,7 @@  			<button label="Hedefin *Herhangi Bir* Arazideki Komut Dosyalı Nesnelerini Sil" label_selected="Hedefin *Herhangi Bir* Arazideki Komut Dosyalı Nesnelerini Sil" name="Delete Target's Scripted Objects On *Any* Land" tool_tip="Bu bölgede hedefe ait olan tüm komut dosyalı nesneleri silin. (kopya yok) nesneler geri döndürülür."/>  			<button label="Hedefin *TÜM* Nesnelerini Sil" label_selected="Hedefin *TÜM* Nesnelerini Sil" name="Delete *ALL* Of Target's Objects" tool_tip="Bu bölgede hedefe ait olan tüm nesneleri silin. (kopya yok) nesneler geri döndürülür."/>  			<button label="En Çok Çarpışanlar" label_selected="En Çok Çarpışanlar" name="Get Top Colliders" tool_tip="En dar fazda geri aramaları yaşayan nesnelerin listesini alır"/> -			<button label="En Çok Komut Dosyası Çalıştıranlar" label_selected="En Çok Komut Dosyası Çalıştıranlar" name="Get Top Scripts" tool_tip="Komut dosyalarını çalıştırırken en çok zaman harcayan nesnelerin listesini alır"/> +			<button label="En Çok Komut Dsy. Çalştr." label_selected="En Çok Komut Dsy. Çalştr." name="Get Top Scripts" tool_tip="Komut dosyalarını çalıştırırken en çok zaman harcayan nesnelerin listesini alır"/>  			<button label="Komut dosyaları özeti" label_selected="Komut dosyaları özeti" name="Scripts digest" tool_tip="Tüm komut dosyalarının ve her birinin ne kadar kullanıldığının listesini alır"/>  		</panel>  		<panel label="Talep" name="request"> diff --git a/indra/newview/skins/default/xui/tr/floater_joystick.xml b/indra/newview/skins/default/xui/tr/floater_joystick.xml index 31d819743c..4a27aac3c1 100644 --- a/indra/newview/skins/default/xui/tr/floater_joystick.xml +++ b/indra/newview/skins/default/xui/tr/floater_joystick.xml @@ -3,10 +3,10 @@  	<floater.string name="NoDevice">  		cihaz tespit edilmedi  	</floater.string> -	<check_box label="Oyun Çubuğunu Etkinleştir:" name="enable_joystick"/> -	<spinner label="X Eksen Haritalama" name="JoystickAxis1"/> -	<spinner label="Y Eksen Haritalama" name="JoystickAxis2"/> -	<spinner label="Z Eksen Haritalama" name="JoystickAxis0"/> +	<check_box label="Oyun Çub. Etkşt:" name="enable_joystick"/> +	<spinner label="X Eks. Haritalama" name="JoystickAxis1"/> +	<spinner label="Y Eks. Haritalama" name="JoystickAxis2"/> +	<spinner label="Z Eks. Haritalama" name="JoystickAxis0"/>  	<spinner label="Eğim Haritalama" name="JoystickAxis4"/>  	<spinner label="Düşey Sapma Haritalama" name="JoystickAxis5"/>  	<spinner label="Tilt Haritalama" name="JoystickAxis3"/> diff --git a/indra/newview/skins/default/xui/tr/floater_preferences.xml b/indra/newview/skins/default/xui/tr/floater_preferences.xml index a0be9dc53f..edb3c19b81 100644 --- a/indra/newview/skins/default/xui/tr/floater_preferences.xml +++ b/indra/newview/skins/default/xui/tr/floater_preferences.xml @@ -7,7 +7,7 @@  		<panel label="Grafikler" name="display"/>  		<panel label="Ses ve Ortamlar" name="audio"/>  		<panel label="Sohbet" name="chat"/> -		<panel label="Hareketler ve Görünümler" name="move"/> +		<panel label="Hareket ve Görünümler" name="move"/>  		<panel label="Bildirimler" name="msgs"/>  		<panel label="Renkler" name="colors"/>  		<panel label="Gizlilik" name="im"/> diff --git a/indra/newview/skins/default/xui/tr/floater_preview_gesture.xml b/indra/newview/skins/default/xui/tr/floater_preview_gesture.xml index fa9fd37e6c..dc6f66f657 100644 --- a/indra/newview/skins/default/xui/tr/floater_preview_gesture.xml +++ b/indra/newview/skins/default/xui/tr/floater_preview_gesture.xml @@ -65,7 +65,7 @@  	<check_box label="tüm animasyonlar bitinceye kadar" name="wait_anim_check"/>  	<check_box label="saniye olarak zaman:" name="wait_time_check"/>  	<text name="help_label"> -		Bekleme adımlar eklemediğiniz sürece tüm adımlar aynı anda gerçekleşir. +		Bekleme adımları eklemediğiniz sürece tüm adımlar aynı anda gerçekleşir.  	</text>  	<check_box label="Etkin" name="active_check" tool_tip="Etkin mimikleri tetiklemek için tetikleme fazları için sohbet gerçekleştirebilir veya kısayol tuşlarına basabilirsiniz.  Bir anahtar bağlama ihtilafı olduğunda mimikler genellikle inaktif hale geçer."/>  	<button label="Önizleme" name="preview_btn"/> diff --git a/indra/newview/skins/default/xui/tr/floater_report_abuse.xml b/indra/newview/skins/default/xui/tr/floater_report_abuse.xml index ae4c3cc75e..c5765883c4 100644 --- a/indra/newview/skins/default/xui/tr/floater_report_abuse.xml +++ b/indra/newview/skins/default/xui/tr/floater_report_abuse.xml @@ -81,7 +81,7 @@  		Özet:  	</text>  	<text name="dscr_title"> -		Ayrıntılar: +		Ayrıntl:  	</text>  	<text name="bug_aviso">  		Mümkün olduğunca spesifik olun diff --git a/indra/newview/skins/default/xui/tr/floater_tools.xml b/indra/newview/skins/default/xui/tr/floater_tools.xml index cd5e6b7fac..d4ee9995dd 100644 --- a/indra/newview/skins/default/xui/tr/floater_tools.xml +++ b/indra/newview/skins/default/xui/tr/floater_tools.xml @@ -55,7 +55,7 @@  		<radio_item label="Uzat (Ctrl+Shift)" name="radio stretch"/>  		<radio_item label="Yüzü Seç" name="radio select face"/>  	</radio_group> -	<check_box label="Bağlantılı olanları düzenle" name="checkbox edit linked parts"/> +	<check_box label="Bağlantılıları düzenle" name="checkbox edit linked parts"/>  	<button label="Bağla" name="link_btn"/>  	<button label="Bağlantıyı Kopar" name="unlink_btn"/>  	<text label="Her İki Tarafı Uzat" name="checkbox uniform label"> @@ -81,7 +81,7 @@  	<button name="ToolGrass" tool_tip="Çimen"/>  	<check_box label="Seçili Aracı tut" name="checkbox sticky"/>  	<check_box label="Seçimi kopyala" name="checkbox copy selection"/> -	<check_box initial_value="true" label="Kopyayı Merkeze Al" name="checkbox copy centers"/> +	<check_box initial_value="true" label="Kopyayı Merkezle" name="checkbox copy centers"/>  	<check_box label="Kopyayı Döndür" name="checkbox copy rotates"/>  	<radio_group name="land_radio_group">  		<radio_item label="Araziyi Seç" name="radio select land"/> @@ -376,7 +376,7 @@  			</combo_box>  			<spinner label="Yerçekimi" name="Physics Gravity"/>  			<spinner label="Sürtünme" name="Physics Friction"/> -			<spinner label="100 kg/m^3 cinsinden yoğunluk" name="Physics Density"/> +			<spinner label="100 kg/m3 cinsinden yoğunluk" name="Physics Density"/>  			<spinner label="Restitüsyon" name="Physics Restitution"/>  		</panel>  		<panel label="Doku" name="Texture"> diff --git a/indra/newview/skins/default/xui/tr/menu_viewer.xml b/indra/newview/skins/default/xui/tr/menu_viewer.xml index efeed833a5..75294e38d5 100644 --- a/indra/newview/skins/default/xui/tr/menu_viewer.xml +++ b/indra/newview/skins/default/xui/tr/menu_viewer.xml @@ -93,7 +93,7 @@  			<menu_item_call label="Arazi Aracı" name="Land"/>  		</menu>  		<menu_item_call label="Bağla" name="Link"/> -		<menu_item_call label="Bağlantıyı Kopar" name="Unlink"/> +		<menu_item_call label="Bağlnty. Kopar" name="Unlink"/>  		<menu_item_check label="Bağlantılı Parçaları Düzenle" name="Edit Linked Parts"/>  		<menu label="Bağlantılı Parçaları Seç" name="Select Linked Parts">  			<menu_item_call label="Sonraki Parçayı Seç" name="Select Next Part"/> @@ -118,7 +118,7 @@  			<menu_item_call label="Komut Dosyalarını Çalışıyor Olarak Ayarla" name="Set Scripts to Running"/>  			<menu_item_call label="Komut Dosyalarını Çalışmıyor Olarak Ayarla" name="Set Scripts to Not Running"/>  		</menu> -		<menu label="Seçenekler" name="Options"> +		<menu label="Seçenklr." name="Options">  			<menu_item_check label="Gelişmiş İzinleri Göster" name="DebugPermissions"/>  			<menu_item_check label="Sadece Nesnelerimi Seç" name="Select Only My Objects"/>  			<menu_item_check label="Sadece Hareket Ettirilebilir Nesneleri Seç" name="Select Only Movable Objects"/> diff --git a/indra/newview/skins/default/xui/tr/notifications.xml b/indra/newview/skins/default/xui/tr/notifications.xml index a268c103a6..b62ff01ab9 100644 --- a/indra/newview/skins/default/xui/tr/notifications.xml +++ b/indra/newview/skins/default/xui/tr/notifications.xml @@ -2270,7 +2270,7 @@ Daha küçük bir arazi parçası seçmeyi deneyin.  [NAME]  [DATE]  		<form name="form"> -			<button name="Details" text="Ayrıntılar"/> +			<button name="Details" text="Ayrıntl"/>  			<button name="Cancel" text="İptal"/>  		</form>  	</notification> diff --git a/indra/newview/skins/default/xui/tr/panel_people.xml b/indra/newview/skins/default/xui/tr/panel_people.xml index 7d42e3ab79..1a1e53bac2 100644 --- a/indra/newview/skins/default/xui/tr/panel_people.xml +++ b/indra/newview/skins/default/xui/tr/panel_people.xml @@ -24,7 +24,7 @@ Birlikte takılacak kişiler mi arıyorsunuz? [secondlife:///app/worldmap Dünya  	<tab_container name="tabs">  		<panel label="YAKIN" name="nearby_panel">  			<panel label="bottom_panel" name="bottom_panel"> -				<menu_button name="nearby_view_sort_btn" tool_tip="Seçenekler"/> +				<menu_button name="nearby_view_sort_btn" tool_tip="Seçenklr."/>  				<button name="add_friend_btn" tool_tip="Seçilen Sakini arkadaş listene ekle"/>  			</panel>  		</panel> @@ -49,14 +49,14 @@ Birlikte takılacak kişiler mi arıyorsunuz? [secondlife:///app/worldmap Dünya  		</panel>  		<panel label="GRUPLARIM" name="groups_panel">  			<panel label="bottom_panel" name="bottom_panel"> -				<menu_button name="groups_viewsort_btn" tool_tip="Seçenekler"/> +				<menu_button name="groups_viewsort_btn" tool_tip="Seçenklr."/>  				<button name="plus_btn" tool_tip="Gruba katıl/yeni grup oluştur"/>  				<button name="activate_btn" tool_tip="Seçilen grubu etkinleştir"/>  			</panel>  		</panel>  		<panel label="SON" name="recent_panel">  			<panel label="bottom_panel" name="bottom_panel"> -				<menu_button name="recent_viewsort_btn" tool_tip="Seçenekler"/> +				<menu_button name="recent_viewsort_btn" tool_tip="Seçenklr."/>  				<button name="add_friend_btn" tool_tip="Seçilen Sakini arkadaş listene ekle"/>  			</panel>  		</panel> diff --git a/indra/newview/skins/default/xui/tr/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/tr/panel_preferences_advanced.xml index 787efa32f4..770cdc6efd 100644 --- a/indra/newview/skins/default/xui/tr/panel_preferences_advanced.xml +++ b/indra/newview/skins/default/xui/tr/panel_preferences_advanced.xml @@ -6,11 +6,11 @@  	<text name="Cache:">  		Önbellek:  	</text> -	<spinner label="Önbellek büyüklüğü (64 - 9984 MB)" name="cachesizespinner"/> +	<spinner label="Önbellek boyutu (64-9984 MB)" name="cachesizespinner"/>  	<text name="text_box5">  		MB  	</text> -	<button label="Önbelleği Temizle" label_selected="Önbelleği Temizle" name="clear_cache"/> +	<button label="Önbelleği Sil" label_selected="Önbelleği Sil" name="clear_cache"/>  	<text name="Cache location">  		Önbellek konumu:  	</text> diff --git a/indra/newview/skins/default/xui/tr/panel_preferences_chat.xml b/indra/newview/skins/default/xui/tr/panel_preferences_chat.xml index 9c9e960715..f7f0698a31 100644 --- a/indra/newview/skins/default/xui/tr/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/tr/panel_preferences_chat.xml @@ -16,9 +16,9 @@  		Aİ'leri şurada göster:  	</text>  	<text name="requires_restart_label"> -		(yeniden başlatma gerektirir) +		(tekrar başlatma gerekir)  	</text> -	<radio_group name="chat_window" tool_tip="Anlık İletilerinizi ayrı gezdiricilerde veya birden çok sekmeye sahip tek bir gezdiricide gösterin (Yeniden başlatma gerektirir)"> +	<radio_group name="chat_window" tool_tip="Anlık İletileri ayrı gezdiricilerde veya çoklu sekmelere sahip tek bir gezdiricide gösterin (tekrar başlatma gerekir)">  		<radio_item label="Ayrı Pencereler" name="radio" value="0"/>  		<radio_item label="Sekmeler" name="radio2" value="1"/>  	</radio_group> diff --git a/indra/newview/skins/default/xui/tr/panel_preferences_general.xml b/indra/newview/skins/default/xui/tr/panel_preferences_general.xml index fbfc07c4b8..4a48b1588c 100644 --- a/indra/newview/skins/default/xui/tr/panel_preferences_general.xml +++ b/indra/newview/skins/default/xui/tr/panel_preferences_general.xml @@ -22,7 +22,7 @@  		(Yeniden başlatma gerekir)  	</text>  	<text name="maturity_desired_prompt"> -		Seviyelendirdiğim şu içeriğe erişim istiyorum: +		Seviyelndrl. içeriğe erişim istiyorum::  	</text>  	<combo_box name="maturity_desired_combobox">  		<combo_box.item label="Genel, Orta, Yetişkin" name="Desired_Adult"/> diff --git a/indra/newview/skins/default/xui/tr/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/tr/panel_preferences_graphics1.xml index ba31640e9c..ddb83ffc69 100644 --- a/indra/newview/skins/default/xui/tr/panel_preferences_graphics1.xml +++ b/indra/newview/skins/default/xui/tr/panel_preferences_graphics1.xml @@ -51,7 +51,7 @@  			<combo_box.item label="Tüm avatarlar ve nesneler" name="3"/>  			<combo_box.item label="Her şey" name="4"/>  		</combo_box> -		<slider label="Avatarın Fiziksel Özellikleri:" name="AvatarPhysicsDetail"/> +		<slider label="Avatar Fzk. Özlk.:" name="AvatarPhysicsDetail"/>  		<text name="AvatarPhysicsDetailText">  			Düşük  		</text> @@ -60,7 +60,7 @@  			m  		</text>  		<slider label="Maks. parçacık sayısı:" name="MaxParticleCount"/> -		<slider label="Düşük grafik özellikli olmayan maks. avatar sayısı:" name="MaxNumberAvatarDrawn"/> +		<slider label="Düşük gr. özl. olmayan mks. avatar:" name="MaxNumberAvatarDrawn"/>  		<slider label="Son işleme kalitesi:" name="RenderPostProcess"/>  		<text name="MeshDetailText">  			Örgü detayı: diff --git a/indra/newview/skins/default/xui/tr/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/tr/panel_preferences_privacy.xml index e76616f667..9111594979 100644 --- a/indra/newview/skins/default/xui/tr/panel_preferences_privacy.xml +++ b/indra/newview/skins/default/xui/tr/panel_preferences_privacy.xml @@ -11,7 +11,7 @@  	<check_box label="Çevrimiçi olduğumu sadece arkadaşlar ve gruplar bilsin" name="online_visibility"/>  	<check_box label="Sadece arkadaşlar ve gruplar beni arasın veya Aİ göndersin" name="voice_call_friends_only_check"/>  	<check_box label="Aramaları sonlandırırken mikrofonu kapat" name="auto_disengage_mic_check"/> -	<check_box label="Oturum Açarken Favori Yer İmlerimi Göster ('Buradan başla' açılır menüsünden)" name="favorites_on_login_check"/> +	<check_box label="Oturum Açarken Favori Yer İmlerimi Göster ('Buradan başla' menüsünden)" name="favorites_on_login_check"/>  	<text name="Logs:">  		Sohbet Günlükleri:  	</text> diff --git a/indra/newview/skins/default/xui/tr/panel_region_debug.xml b/indra/newview/skins/default/xui/tr/panel_region_debug.xml index f16c666e86..6e15e0f6f6 100644 --- a/indra/newview/skins/default/xui/tr/panel_region_debug.xml +++ b/indra/newview/skins/default/xui/tr/panel_region_debug.xml @@ -21,14 +21,14 @@  	</line_editor>  	<button label="Seç" name="choose_avatar_btn"/>  	<text name="options_text_lbl"> -		Seçenekler: +		Seçenklr.:  	</text>  	<check_box label="Komut dosyaları ile" name="return_scripts" tool_tip="Sadece komut dosyaları olan nesneler iade edilsin"/>  	<check_box label="Başkasına ait arazi üzerinde" name="return_other_land" tool_tip="Sadece başkasına ait arazi üzerinde olan nesneler iade edilsin"/>  	<check_box label="Bu gayrimenkulu oluşturan bölgelerin tümünde" name="return_estate_wide" tool_tip="Bu gayrimenkulu oluşturan bölgelerin tümündeki nesneler iade edilsin"/>  	<button label="İade Et" name="return_btn"/>  	<button label="En Çok Çarpışanlar..." name="top_colliders_btn" tool_tip="En çok potansiyel çarpışma yaşayan nesnelerin listesi"/> -	<button label="En Çok Komut Dosyası Çalıştıranlar..." name="top_scripts_btn" tool_tip="Komut dosyalarını çalıştırırken en çok zaman harcayan nesnelerin listesi"/> +	<button label="En Çok Komut Dsy. Çalştr...." name="top_scripts_btn" tool_tip="Komut dosyalarını çalıştırırken en çok zaman harcayan nesnelerin listesi"/>  	<button label="Bölgeyi Yeniden Başlat" name="restart_btn" tool_tip="2 dakikalık bir geri sayımdan sonra bölgeyi yeniden başlat"/>  	<button label="Yeniden Başlatmayı Ertele" name="cancel_restart_btn" tool_tip="Bölgenin yeniden başlatılmasını 1 saat ertele"/>  </panel> diff --git a/indra/newview/skins/default/xui/tr/panel_region_environment.xml b/indra/newview/skins/default/xui/tr/panel_region_environment.xml index 851cd23f30..058ea91b70 100644 --- a/indra/newview/skins/default/xui/tr/panel_region_environment.xml +++ b/indra/newview/skins/default/xui/tr/panel_region_environment.xml @@ -15,7 +15,7 @@  			<combo_box.item label="-Bir ön ayar seçin-" name="item0"/>  		</combo_box>  		<text name="sky_dayc_settings_title"> -			Gökyüzü / Gün Döngüsü +			Gökyüzü/Gün Dön.  		</text>  		<radio_group name="sky_dayc_settings_radio_group">  			<radio_item label="Sabit gökyüzü" name="my_sky_settings"/> diff --git a/indra/newview/skins/default/xui/tr/panel_region_terrain.xml b/indra/newview/skins/default/xui/tr/panel_region_terrain.xml index 874d27abfb..3226ee008e 100644 --- a/indra/newview/skins/default/xui/tr/panel_region_terrain.xml +++ b/indra/newview/skins/default/xui/tr/panel_region_terrain.xml @@ -7,7 +7,7 @@  		bilinmiyor  	</text>  	<spinner label="Su Yüksekliği" name="water_height_spin"/> -	<spinner label="Yüzey Yükseltme Limiti" name="terrain_raise_spin"/> +	<spinner label="Yüzey Yükslt. Limiti" name="terrain_raise_spin"/>  	<spinner label="Yüzey Alçatma Limiti" name="terrain_lower_spin"/>  	<text name="detail_texture_text">  		Yüzey Dokuları (512x512, 24 bit .tga dosyalar gerektirir) diff --git a/indra/newview/skins/default/xui/tr/role_actions.xml b/indra/newview/skins/default/xui/tr/role_actions.xml index 18f7d6dca2..655ac64172 100644 --- a/indra/newview/skins/default/xui/tr/role_actions.xml +++ b/indra/newview/skins/default/xui/tr/role_actions.xml @@ -44,7 +44,7 @@  	<action_set description="Bu Yeteneklere, grubun sahip olduğu parsellere erişime izin verme veya buralara erişimi yasaklama ve Second Life Sakinlerini dondurma veya parselden dışarı çıkarma da dahildir." name="Parcel Access">  		<action description="Parselin Erişim listelerini yönet" longdescription="Parselin Erişim listelerini Arazi Hakkında > Erişim sekmesinden yönetin." name="land manage allowed" value="29"/>  		<action description="Parselin Yasaklama listelerini yönet" longdescription="Parselin Yasaklama listelerini Arazi Hakkında > Erişim sekmesinden yönetin." name="land manage banned" value="30"/> -		<action description="Parselin 'Geçiş haklarını şuna sat' ayarlarını değiştir" longdescription="Parselin 'Geçiş haklarını şuna sat' ayarlarını Arazi Hakkında > Erişim sekmesinden değiştirin." name="land manage passes" value="31"/> +		<action description="Parselin 'Geçiş haklr. şuna sat' ayarlarını değiştir" longdescription="Parselin 'Geçiş haklr. şuna sat' ayarlarını Arazi Hakkında > Erişim sekmesinden değiştirin." name="land manage passes" value="31"/>  		<action description="Parsel üzerindeki Second Life Sakinlerini dışarı çıkar veya dondur" longdescription="Bu Yeteneğe sahip olan bir Roldeki Üyeler, grubun sahip olduğu bir parsel üzerinde olmasını istemedikleri bir Second Life sakininin üzerini sağ tıklatıp 'Dışarı Çıkar' veya 'Dondur'u seçebilirler." name="land admin" value="32"/>  	</action_set>  	<action_set description="Bu Yeteneklere üyelerin nesneleri iade etmelerine, Linden bitkilerini yerleştirmelerine ve bu bitkilerin yerlerini değiştirmelerine izin veren güçler de dahildir. Bu özellik, Üyelerin çöpleri temizlemeleri ve bahçe düzenlemesi yapmaları için kullanışlıdır; fakat dikkatle kullanılmalıdır, çünkü nesneleri iade etmenin geri alınma imkanı yoktur." name="Parcel Content"> diff --git a/indra/newview/skins/default/xui/tr/sidepanel_task_info.xml b/indra/newview/skins/default/xui/tr/sidepanel_task_info.xml index 28eeef02d3..2fa6281f05 100644 --- a/indra/newview/skins/default/xui/tr/sidepanel_task_info.xml +++ b/indra/newview/skins/default/xui/tr/sidepanel_task_info.xml @@ -118,6 +118,6 @@  		<button label="Aç" name="open_btn"/>  		<button label="Öde" name="pay_btn"/>  		<button label="Satın Al" name="buy_btn"/> -		<button label="Ayrıntılar" name="details_btn"/> +		<button label="Ayrıntl" name="details_btn"/>  	</panel>  </panel> diff --git a/indra/newview/skins/default/xui/tr/strings.xml b/indra/newview/skins/default/xui/tr/strings.xml index a17d78486d..bf331dc3cf 100644 --- a/indra/newview/skins/default/xui/tr/strings.xml +++ b/indra/newview/skins/default/xui/tr/strings.xml @@ -2160,7 +2160,7 @@ Lütfen bir dakika içerisinde tekrar oturum açmayı deneyin.  		Aşağı  	</string>  	<string name="Any Category"> -		Herhangi Bir Kategori +		Herh. Bir Kategori  	</string>  	<string name="Shopping">  		Alışveriş @@ -2190,7 +2190,7 @@ Lütfen bir dakika içerisinde tekrar oturum açmayı deneyin.  		Kişisel  	</string>  	<string name="None"> -		Hiçbiri +		Renksiz  	</string>  	<string name="Linden Location">  		Linden Konumu @@ -2390,7 +2390,7 @@ Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne başvurun.  		Arka Perçem  	</string>  	<string name="Baggy"> -		Lüleler +		Torbalı  	</string>  	<string name="Bangs">  		Kahküller @@ -2480,7 +2480,7 @@ Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne başvurun.  		Geniş  	</string>  	<string name="Brow Size"> -		Kaş Büyüklüğü +		Alın Genişliği  	</string>  	<string name="Bug Eyes">  		Patlak Gözlü @@ -2777,7 +2777,7 @@ Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne başvurun.  		Kaş Yüksekliği  	</string>  	<string name="Eyebrow Points"> -		Kaş Noktaları +		Kaş Yapısı  	</string>  	<string name="Eyebrow Size">  		Kaş Büyüklüğü @@ -2846,13 +2846,13 @@ Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne başvurun.  		Ön Perçem  	</string>  	<string name="Full Back"> -		Saçlar Arkada +		Arkası Düz  	</string>  	<string name="Full Eyeliner">  		Çift Taraflı Göz Kalemi  	</string>  	<string name="Full Front"> -		Saçlar Önde +		Önü Düz  	</string>  	<string name="Full Hair Sides">  		Saçlar Yanda @@ -2936,13 +2936,13 @@ Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne başvurun.  		Yüksek Topuklar  	</string>  	<string name="High Jaw"> -		Yüksek Çene Ucu +		Ayrık  	</string>  	<string name="High Platforms"> -		Yüksek Topuklu Ayakkabılar +		Yüksek Topuklu  	</string>  	<string name="High and Tight"> -		Tepede Bırakılmış Saç +		Düşük  	</string>  	<string name="Higher">  		Daha Yüksek @@ -2954,7 +2954,7 @@ Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne başvurun.  		Kalça Genişliği  	</string>  	<string name="In"> -		İç +		İçeri  	</string>  	<string name="In Shdw Color">  		İç Gölge Rengi @@ -2978,19 +2978,19 @@ Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne başvurun.  		Ceket Kırışıklıkları  	</string>  	<string name="Jaw Angle"> -		Çene Ucu Açısı +		Çenenin Boyuna Uzaklığı  	</string>  	<string name="Jaw Jut"> -		Çene Ucu Çıkıntısı +		Alt Çene Uzunluğu  	</string>  	<string name="Jaw Shape"> -		Çene Ucu Şekli +		Çene Kemiği Genişliği  	</string>  	<string name="Join"> -		Birleştir +		Birleşik  	</string>  	<string name="Jowls"> -		Gıdıklar +		Avurtlar  	</string>  	<string name="Knee Angle">  		Diz Açısı @@ -3029,7 +3029,7 @@ Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne başvurun.  		Daha Az Dolgun  	</string>  	<string name="Less Gravity"> -		Daha Az Yerçekimi +		Dik Göğüs  	</string>  	<string name="Less Love">  		Daha İnce Bel @@ -3047,7 +3047,7 @@ Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne başvurun.  		Daha Az Yuvarlak  	</string>  	<string name="Less Saddle"> -		Daha Dar Kalça +		Basensiz  	</string>  	<string name="Less Square">  		Daha Az Küt @@ -3098,7 +3098,7 @@ Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne başvurun.  		Uzun Kafa  	</string>  	<string name="Long Hips"> -		Geniş Kalçalar +		Yüksek kalça  	</string>  	<string name="Long Legs">  		Uzun Bacaklar @@ -3107,7 +3107,7 @@ Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne başvurun.  		Uzun Boyun  	</string>  	<string name="Long Pigtails"> -		Uzun Saç Örgüleri +		Yandan Uzun Kuyruk  	</string>  	<string name="Long Ponytail">  		Uzun Atkuyruğu @@ -3137,13 +3137,13 @@ Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne başvurun.  		Alçak Topuklar  	</string>  	<string name="Low Jaw"> -		Düşük Çene Ucu +		Bitişik  	</string>  	<string name="Low Platforms">  		Alçak Topuklu  	</string>  	<string name="Low and Loose"> -		Serbest At Kuyruğu +		Yüksek  	</string>  	<string name="Lower">  		Daha Alçak @@ -3182,7 +3182,7 @@ Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne başvurun.  		Daha Dolgun  	</string>  	<string name="More Gravity"> -		Daha Çok Yerçekimi +		Sarkık Göğüs  	</string>  	<string name="More Lipstick">  		Daha Çok Ruj @@ -3191,7 +3191,7 @@ Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne başvurun.  		Daha Kalın Bel  	</string>  	<string name="More Lower Lip"> -		Daha Çok Alt Dudak +		Daha Dolgun Alt Dudak  	</string>  	<string name="More Muscles">  		Daha Çok Kas @@ -3206,7 +3206,7 @@ Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne başvurun.  		Daha Yuvarlak  	</string>  	<string name="More Saddle"> -		Daha Geniş Kalça +		Basenli  	</string>  	<string name="More Sloped">  		Daha Eğimli @@ -3215,7 +3215,7 @@ Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne başvurun.  		Daha Küt  	</string>  	<string name="More Upper Lip"> -		Daha Çok Üst Dudak +		Daha Dolgun Üst Dudak  	</string>  	<string name="More Vertical">  		Daha Dikey @@ -3260,7 +3260,7 @@ Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne başvurun.  		Önü Dar  	</string>  	<string name="Narrow Lips"> -		İnce Dudaklar +		Küçük Dudaklar  	</string>  	<string name="Natural">  		Doğal @@ -3359,7 +3359,7 @@ Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne başvurun.  		Turuncu  	</string>  	<string name="Out"> -		Dış +		Dışarı  	</string>  	<string name="Out Shdw Color">  		Dış Gölge Rengi @@ -3377,7 +3377,7 @@ Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne başvurun.  		Dış Gölge  	</string>  	<string name="Overbite"> -		Üst Dişler Önde +		Öne Doğru  	</string>  	<string name="Package">  		Apış Arası Şişkinliği @@ -3416,7 +3416,7 @@ Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne başvurun.  		Pigment  	</string>  	<string name="Pigtails"> -		Saç Örgüleri +		Yan Kuyruklar  	</string>  	<string name="Pink">  		Pembe @@ -3431,7 +3431,7 @@ Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne başvurun.  		Topuk Genişliği  	</string>  	<string name="Pointy"> -		Sivri +		Dar  	</string>  	<string name="Pointy Heels">  		Sivri Topuklar @@ -3482,25 +3482,25 @@ Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne başvurun.  		Dağınık Saç  	</string>  	<string name="Saddle Bags"> -		Kalça Kalınlığı +		Basen Genişliği  	</string>  	<string name="Scrawny Leg">  		Sıska Bacak  	</string>  	<string name="Separate"> -		Ayrı +		Ayrık  	</string>  	<string name="Shallow">  		Sığ  	</string>  	<string name="Shear Back"> -		Arkayı Dikey Kaydır +		Arka Dolgunluğu  	</string>  	<string name="Shear Face">  		Yüzü Dikey Kaydır  	</string>  	<string name="Shear Front"> -		Önü Dikey Kaydır +		Ön Dolgunluğu  	</string>  	<string name="Shear Left Up">  		Solu Yukarı Kaydır @@ -3509,10 +3509,10 @@ Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne başvurun.  		Sağı Yukarı Kaydır  	</string>  	<string name="Sheared Back"> -		Arkası Dikey Kaydırılmış +		Arkası Dolgun  	</string>  	<string name="Sheared Front"> -		Önü Dikey Kaydırılmış +		Önü Dolgun  	</string>  	<string name="Shift Left">  		Sola Kaydır @@ -3548,7 +3548,7 @@ Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne başvurun.  		Kısa Boyun  	</string>  	<string name="Short Pigtails"> -		Kısa Atkuyrukları +		Yandan Kısa Kuyruk  	</string>  	<string name="Short Ponytail">  		Kısa Atkuyruğu @@ -3560,7 +3560,7 @@ Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne başvurun.  		Kısa Gövde  	</string>  	<string name="Short hips"> -		Dar kalçalar +		Düşük kalça  	</string>  	<string name="Shoulders">  		Omuzlar @@ -3638,7 +3638,7 @@ Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne başvurun.  		Dikleştirilmiş Saç  	</string>  	<string name="Square"> -		Kare +		Geniş  	</string>  	<string name="Square Toe">  		Küt Burunlu @@ -3680,7 +3680,7 @@ Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne başvurun.  		Kalın Boyun  	</string>  	<string name="Thick Toe"> -		Kalın kabu Burnu +		Kalın Ayak Ucu  	</string>  	<string name="Thin">  		İnce @@ -3695,7 +3695,7 @@ Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne başvurun.  		İnce Burun  	</string>  	<string name="Tight Chin"> -		Dar Çene +		Çift Çene  	</string>  	<string name="Tight Cuffs">  		Dar Paçalar @@ -3710,7 +3710,7 @@ Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne başvurun.  		Dar Etek  	</string>  	<string name="Tight Sleeves"> -		Dar Kollar +		Dar Kollu  	</string>  	<string name="Toe Shape">  		Ayakkabu Burnu Şekli @@ -3728,13 +3728,13 @@ Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne başvurun.  		Sıska Gövde  	</string>  	<string name="Unattached"> -		Bağımsız +		Ayrık  	</string>  	<string name="Uncreased">  		Buruşuk olmayan  	</string>  	<string name="Underbite"> -		Alt Dişler Önde +		Geriye Doğru  	</string>  	<string name="Unnatural">  		Doğal Olmayan @@ -3770,7 +3770,7 @@ Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne başvurun.  		Geniş  	</string>  	<string name="Wide Back"> -		Geniş Sırt +		Geniş Arka  	</string>  	<string name="Wide Front">  		Geniş Ön diff --git a/indra/test/CMakeLists.txt b/indra/test/CMakeLists.txt index e9eb3c1884..328ab4ca51 100644 --- a/indra/test/CMakeLists.txt +++ b/indra/test/CMakeLists.txt @@ -4,7 +4,6 @@ project (test)  include(00-Common)  include(LLCommon) -include(LLDatabase)  include(LLInventory)  include(LLMath)  include(LLMessage) @@ -32,7 +31,7 @@ include_directories(  set(test_SOURCE_FILES      io.cpp -#    llapp_tut.cpp                      # Temporarily removed until thread issues can be solved +    llapp_tut.cpp      llblowfish_tut.cpp      llbuffer_tut.cpp      lldoubledispatch_tut.cpp @@ -53,8 +52,6 @@ set(test_SOURCE_FILES      llservicebuilder_tut.cpp      llstreamtools_tut.cpp      lltemplatemessagebuilder_tut.cpp -    lltimestampcache_tut.cpp -    lltranscode_tut.cpp      lltut.cpp      lluuidhashmap_tut.cpp      message_tut.cpp @@ -76,12 +73,6 @@ if (NOT WINDOWS)         )  endif (NOT WINDOWS) -if (NOT DARWIN) -  list(APPEND test_SOURCE_FILES -    lldatabase_tut.cpp -    ) -endif (NOT DARWIN) -  set_source_files_properties(${test_HEADER_FILES}                              PROPERTIES HEADER_FILE_ONLY TRUE) @@ -100,7 +91,6 @@ target_link_libraries(test      ${LLCOMMON_LIBRARIES}      ${EXPAT_LIBRARIES}      ${GOOGLEMOCK_LIBRARIES} -    ${APRICONV_LIBRARIES}      ${PTHREAD_LIBRARY}      ${WINDOWS_LIBRARIES}      ${BOOST_PROGRAM_OPTIONS_LIBRARY} @@ -119,38 +109,28 @@ endif (WINDOWS)  get_target_property(TEST_EXE test LOCATION) -SET_TEST_PATH(LD_LIBRARY_PATH) -LL_TEST_COMMAND(command "${LD_LIBRARY_PATH}" -  "${TEST_EXE}" "--output=${CMAKE_CURRENT_BINARY_DIR}/cpp_test_results.txt" "--touch=${CMAKE_CURRENT_BINARY_DIR}/cpp_tests_ok.txt") +SET_TEST_PATH(DYLD_LIBRARY_PATH) + +LL_TEST_COMMAND(command  +  "${DYLD_LIBRARY_PATH}" +  "${TEST_EXE}" +  "--output=${CMAKE_CURRENT_BINARY_DIR}/cpp_test_results.txt"  +  "--touch=${CMAKE_CURRENT_BINARY_DIR}/cpp_tests_ok.txt") +  ADD_CUSTOM_COMMAND(    OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/cpp_tests_ok.txt    COMMAND ${command}    DEPENDS test    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}    COMMENT "C++ unit tests" - ) +  )  set(test_results ${CMAKE_CURRENT_BINARY_DIR}/cpp_tests_ok.txt) -if (EXISTS /etc/debian_version_FAIL) -  # The Python tests have all kinds of wacky non-portable assumptions -  # built in. - -  add_custom_command( -    OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/py_tests_ok.txt -    COMMAND ${PYTHON_EXECUTABLE} -    ARGS -      ${CMAKE_CURRENT_SOURCE_DIR}/test.py -      --mode=static -      --output=${CMAKE_CURRENT_BINARY_DIR}/py_test_results.txt -      --touch=${CMAKE_CURRENT_BINARY_DIR}/py_tests_ok.txt -      --mode=static -    DEPENDS test.py -    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} -    COMMENT "Python unit tests" -    ) - -  list(APPEND test_results ${CMAKE_CURRENT_BINARY_DIR}/py_tests_ok.txt) -endif (EXISTS /etc/debian_version_FAIL) -     -add_custom_target(tests_ok ALL DEPENDS ${test_results}) +# This should cause the test executable to be built, but not  +# run if LL_TESTS is disabled. This will hopefully keep the +# tests up to date with any code changes changes even if  +# developers choose to disable LL_TESTS. +if (LL_TESTS)   +    add_custom_target(tests_ok ALL DEPENDS ${test_results}) +endif (LL_TESTS) diff --git a/indra/test/io.cpp b/indra/test/io.cpp index c06c1b153b..ce747f667d 100644 --- a/indra/test/io.cpp +++ b/indra/test/io.cpp @@ -909,7 +909,7 @@ namespace tut  		pipe_and_pump_fitness()  		{ -			LLFrameTimer::updateFrameTime();			 +			LLFrameTimer::updateFrameTime();  			apr_pool_create(&mPool, NULL);  			mPump = new LLPumpIO(mPool);  			mSocket = LLSocket::create( diff --git a/indra/test/llapp_tut.cpp b/indra/test/llapp_tut.cpp new file mode 100644 index 0000000000..aa5c0672e6 --- /dev/null +++ b/indra/test/llapp_tut.cpp @@ -0,0 +1,162 @@ +/**  + * @file llapp_tut.cpp + * @author Phoenix + * @date 2006-09-12 + * + * $LicenseInfo:firstyear=2006&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2006-2011, Linden Research, Inc. + *  + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + *  + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * Lesser General Public License for more details. + *  + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA + *  + * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA + * $/LicenseInfo$ + */ + +#include <tut/tut.hpp> + +#include "linden_common.h" +#include "llapp.h" +#include "lltut.h" + + +namespace tut +{ +	struct application +	{ +		class LLTestApp : public LLApp +		{ +		public: +			virtual bool init() { return true; } +			virtual bool cleanup() { return true; } +			virtual bool mainLoop() { return true; } +		}; +		LLTestApp* mApp; +		application() +		{ +			mApp = new LLTestApp; +		} +		~application() +		{ +			delete mApp; +		} +	}; + +	typedef test_group<application> application_t; +	typedef application_t::object application_object_t; +	tut::application_t tut_application("application"); + +	template<> template<> +	void application_object_t::test<1>() +	{ +		LLSD defaults; +		defaults["template"] = "../../../scripts/messages/message_template.msg"; +		defaults["configdir"] = "."; +		defaults["datadir"] = "data"; +		mApp->setOptionData(LLApp::PRIORITY_DEFAULT, defaults); + +		LLSD datadir_sd = mApp->getOption("datadir"); +		ensure_equals("data type", datadir_sd.type(), LLSD::TypeString); +		ensure_equals( +			"data value", datadir_sd.asString(), std::string("data")); +	} + +	template<> template<> +	void application_object_t::test<2>() +	{ +		const int ARGC = 13; +		const char* ARGV[ARGC] = +		{ +			"", // argv[0] is usually the application name +			"-crashcount", +			"2", +			"-space", +			"spaceserver.grid.lindenlab.com", +			"-db_host", +			"localhost", +			"--allowlslhttprequests", +			"-asset-uri", +			"http://test.lindenlab.com/assets", +			"-data", +			"127.0.0.1", +			"--smtp" +		}; +		bool ok = mApp->parseCommandOptions(ARGC, const_cast<char**>(ARGV)); +		ensure("command line parsed", ok); +		ensure_equals( +			"crashcount", mApp->getOption("crashcount").asInteger(), 2); +		ensure_equals( +			"space", +			mApp->getOption("space").asString(), +			std::string("spaceserver.grid.lindenlab.com")); +		ensure_equals( +			"db_host", +			mApp->getOption("db_host").asString(), +			std::string("localhost")); +		ensure("allowlshlttprequests", mApp->getOption("smtp")); +		ensure_equals( +			"asset-uri", +			mApp->getOption("asset-uri").asString(), +			std::string("http://test.lindenlab.com/assets")); +		ensure_equals( +			"data", +			mApp->getOption("data").asString(), +			std::string("127.0.0.1")); +		ensure("smtp", mApp->getOption("smtp")); +	} + +	template<> template<> +	void application_object_t::test<3>() +	{ +		const int ARGC = 4; +		const char* ARGV[ARGC] = +		{ +			"", // argv[0] is usually the application name +			"crashcount", +			"2", +			"--space" +		}; +		bool ok = mApp->parseCommandOptions(ARGC, const_cast<char**>(ARGV)); +		ensure("command line parse failure", !ok); +	} + +	template<> template<> +	void application_object_t::test<4>() +	{ +		const int ARGC = 4; +		const char* ARGV[ARGC] = +		{ +			"", // argv[0] is usually the application name +			"--crashcount", +			"2", +			"space" +		}; +		bool ok = mApp->parseCommandOptions(ARGC, const_cast<char**>(ARGV)); +		ensure("command line parse failure", !ok); +	} + + +	template<> template<> +	void application_object_t::test<5>() +	{ +		LLSD options; +		options["boolean-test"] = true; +		mApp->setOptionData(LLApp::PRIORITY_GENERAL_CONFIGURATION, options); +		ensure("bool set", mApp->getOption("boolean-test").asBoolean()); +		options["boolean-test"] = false; +		mApp->setOptionData(LLApp::PRIORITY_RUNTIME_OVERRIDE, options); +		ensure("bool unset", !mApp->getOption("boolean-test").asBoolean()); +	} +} diff --git a/indra/test/llevents_tut.cpp b/indra/test/llevents_tut.cpp index 57e22bbb56..4699bb1827 100644 --- a/indra/test/llevents_tut.cpp +++ b/indra/test/llevents_tut.cpp @@ -54,686 +54,730 @@  using boost::assign::list_of; +#ifdef LL_LINUX +#define CATCH_MISSED_LINUX_EXCEPTION(exception, threw)										\ +catch (const std::runtime_error& ex)														\ +{																							\ +	/* This clause is needed on Linux, on the viewer side, because the	*/					\ +	/* exception isn't caught by the clause above. Warn the user...		*/					\ +	std::cerr << "Failed to catch " << typeid(ex).name() << std::endl;						\ +	/* But if the expected exception was thrown, allow the test to		*/					\ +	/* succeed anyway. Not sure how else to handle this odd case.		*/					\ +	/* This approach is also used in llsdmessage_test.cpp. 				*/					\ +	if (std::string(typeid(ex).name()) == typeid(exception).name())							\ +	{																						\ +		threw = ex.what();																	\ +		/*std::cout << ex.what() << std::endl;*/											\ +	}																						\ +	else																					\ +	{																						\ +		/* We don't even recognize this exception. Let it propagate		*/					\ +		/* out to TUT to fail the test.									*/					\ +		throw;																				\ +	}																						\ +}																							\ +catch (...)																					\ +{																							\ +	std::cerr << "Utterly failed to catch expected exception " << #exception << "!" <<		\ +	std::endl;																				\ +	/* This indicates a problem in the test that should be addressed.   */					\ +	throw;																					\ +} + +#else // LL_LINUX +#define CATCH_MISSED_LINUX_EXCEPTION(exception, threw)										\ +	/* Not needed on other platforms */ +#endif // LL_LINUX +  template<typename T> -T make(const T& value) { return value; } +T make(const T& value) +{ +	return value; +}  /***************************************************************************** -*   tut test group -*****************************************************************************/ + *   tut test group + *****************************************************************************/  namespace tut  { -    struct events_data -    { -        events_data(): -            pumps(LLEventPumps::instance()), -            listener0("first"), -            listener1("second") -        {} -        LLEventPumps& pumps; -        Listener listener0; -        Listener listener1; - -        void check_listener(const std::string& desc, const Listener& listener, LLSD::Integer got) -        { -            ensure_equals(STRINGIZE(listener << ' ' << desc), -                          listener.getLastEvent().asInteger(), got); -        } -    }; -    typedef test_group<events_data> events_group; -    typedef events_group::object events_object; -    tut::events_group evgr("events"); - -    template<> template<> -    void events_object::test<1>() -    { -        set_test_name("basic operations"); -        // Now there's a static constructor in llevents.cpp that registers on -        // the "mainloop" pump to call LLEventPumps::flush(). -        // Actually -- having to modify this to track the statically- -        // constructed pumps in other TUT modules in this giant monolithic test -        // executable isn't such a hot idea. -//      ensure_equals("initial pump", pumps.mPumpMap.size(), 1); -        size_t initial_pumps(pumps.mPumpMap.size()); -        LLEventPump& per_frame(pumps.obtain("per-frame")); -        ensure_equals("first explicit pump", pumps.mPumpMap.size(), initial_pumps+1); -        // Verify that per_frame was instantiated as an LLEventStream. -        ensure("LLEventStream leaf class", dynamic_cast<LLEventStream*>(&per_frame)); -        ensure("enabled", per_frame.enabled()); -        // Trivial test, but posting an event to an EventPump with no -        // listeners should not blow up. The test is relevant because defining -        // a boost::signal with a non-void return signature, using the default -        // combiner, blows up if there are no listeners. This is because the -        // default combiner is defined to return the value returned by the -        // last listener, which is meaningless if there were no listeners. -        per_frame.post(0); -        LLBoundListener connection = listener0.listenTo(per_frame); -        ensure("connected", connection.connected()); -        ensure("not blocked", ! connection.blocked()); -        per_frame.post(1); -        check_listener("received", listener0, 1); -        { // block the connection -            LLEventPump::Blocker block(connection); -            ensure("blocked", connection.blocked()); -            per_frame.post(2); -            check_listener("not updated", listener0, 1); -        } // unblock -        ensure("unblocked", ! connection.blocked()); -        per_frame.post(3); -        check_listener("unblocked", listener0, 3); -        LLBoundListener sameConnection = per_frame.getListener(listener0.getName()); -        ensure("still connected", sameConnection.connected()); -        ensure("still not blocked", ! sameConnection.blocked()); -        { // block it again -            LLEventPump::Blocker block(sameConnection); -            ensure("re-blocked", sameConnection.blocked()); -            per_frame.post(4); -            check_listener("re-blocked", listener0, 3); -        } // unblock -        bool threw = false; -        try -        { -            // NOTE: boost::bind() saves its arguments by VALUE! If you pass -            // an object instance rather than a pointer, you'll end up binding -            // to an internal copy of that instance! Use boost::ref() to -            // capture a reference instead. -            per_frame.listen(listener0.getName(), // note bug, dup name -                             boost::bind(&Listener::call, boost::ref(listener1), _1)); -        } -        catch (const LLEventPump::DupListenerName& e) -        { -            threw = true; -            ensure_equals(e.what(), -                          std::string("DupListenerName: " -                                      "Attempt to register duplicate listener name '") + -                          listener0.getName() + -                          "' on " + typeid(per_frame).name() + " '" + per_frame.getName() + "'"); -        } -        ensure("threw DupListenerName", threw); -        // do it right this time -        listener1.listenTo(per_frame); -        per_frame.post(5); -        check_listener("got", listener0, 5); -        check_listener("got", listener1, 5); -        per_frame.enable(false); -        per_frame.post(6); -        check_listener("didn't get", listener0, 5); -        check_listener("didn't get", listener1, 5); -        per_frame.enable(); -        per_frame.post(7); -        check_listener("got", listener0, 7); -        check_listener("got", listener1, 7); -        per_frame.stopListening(listener0.getName()); -        ensure("disconnected 0", ! connection.connected()); -        ensure("disconnected 1", ! sameConnection.connected()); -        per_frame.post(8); -        check_listener("disconnected", listener0, 7); -        check_listener("still connected", listener1, 8); -        per_frame.stopListening(listener1.getName()); -        per_frame.post(9); -        check_listener("disconnected", listener1, 8); -    } - -    template<> template<> -    void events_object::test<2>() -    { -        set_test_name("callstop() returning true"); -        LLEventPump& per_frame(pumps.obtain("per-frame")); -        listener0.reset(0); -        listener1.reset(0); -        LLBoundListener bound0 = listener0.listenTo(per_frame, &Listener::callstop); -        LLBoundListener bound1 = listener1.listenTo(per_frame, &Listener::call, -                                                    // after listener0 -                                                    make<LLEventPump::NameList>(list_of(listener0.getName()))); -        ensure("enabled", per_frame.enabled()); -        ensure("connected 0", bound0.connected()); -        ensure("unblocked 0", ! bound0.blocked()); -        ensure("connected 1", bound1.connected()); -        ensure("unblocked 1", ! bound1.blocked()); -        per_frame.post(1); -        check_listener("got", listener0, 1); -        // Because listener0.callstop() returns true, control never reaches listener1.call(). -        check_listener("got", listener1, 0); -    } - -    bool chainEvents(Listener& someListener, const LLSD& event) -    { -        // Make this call so we can watch for side effects for test purposes. -        someListener.call(event); -        // This function represents a recursive event chain -- or some other -        // scenario in which an event handler raises additional events. -        int value = event.asInteger(); -        if (value) -        { -            LLEventPumps::instance().obtain("login").post(value - 1); -        } -        return false; -    } - -    template<> template<> -    void events_object::test<3>() -    { -        set_test_name("LLEventQueue delayed action"); -        // This access is NOT legal usage: we can do it only because we're -        // hacking private for test purposes. Normally we'd either compile in -        // a particular name, or (later) edit a config file. -        pumps.mQueueNames.insert("login"); -        LLEventPump& login(pumps.obtain("login")); -        // The "mainloop" pump is special: posting on that implicitly calls -        // LLEventPumps::flush(), which in turn should flush our "login" -        // LLEventQueue. -        LLEventPump& mainloop(pumps.obtain("mainloop")); -        ensure("LLEventQueue leaf class", dynamic_cast<LLEventQueue*>(&login)); -        listener0.listenTo(login); -        listener0.reset(0); -        login.post(1); -        check_listener("waiting for queued event", listener0, 0); -        mainloop.post(LLSD()); -        check_listener("got queued event", listener0, 1); -        login.stopListening(listener0.getName()); -        // Verify that when an event handler posts a new event on the same -        // LLEventQueue, it doesn't get processed in the same flush() call -- -        // it waits until the next flush() call. -        listener0.reset(17); -        login.listen("chainEvents", boost::bind(chainEvents, boost::ref(listener0), _1)); -        login.post(1); -        check_listener("chainEvents(1) not yet called", listener0, 17); -        mainloop.post(LLSD()); -        check_listener("chainEvents(1) called", listener0, 1); -        mainloop.post(LLSD()); -        check_listener("chainEvents(0) called", listener0, 0); -        mainloop.post(LLSD()); -        check_listener("chainEvents(-1) not called", listener0, 0); -        login.stopListening("chainEvents"); -    } - -    template<> template<> -    void events_object::test<4>() -    { -        set_test_name("explicitly-instantiated LLEventStream"); -        // Explicitly instantiate an LLEventStream, and verify that it -        // self-registers with LLEventPumps -        size_t registered = pumps.mPumpMap.size(); -        size_t owned = pumps.mOurPumps.size(); -        LLEventPump* localInstance; -        { -            LLEventStream myEventStream("stream"); -            localInstance = &myEventStream; -            LLEventPump& stream(pumps.obtain("stream")); -            ensure("found named LLEventStream instance", &stream == localInstance); -            ensure_equals("registered new instance", pumps.mPumpMap.size(), registered + 1); -            ensure_equals("explicit instance not owned", pumps.mOurPumps.size(), owned); -        } // destroy myEventStream -- should unregister -        ensure_equals("destroyed instance unregistered", pumps.mPumpMap.size(), registered); -        ensure_equals("destroyed instance not owned", pumps.mOurPumps.size(), owned); -        LLEventPump& stream(pumps.obtain("stream")); -        ensure("new LLEventStream instance", &stream != localInstance); -        ensure_equals("obtain()ed instance registered", pumps.mPumpMap.size(), registered + 1); -        ensure_equals("obtain()ed instance owned", pumps.mOurPumps.size(), owned + 1); -    } - -    template<> template<> -    void events_object::test<5>() -    { -        set_test_name("stopListening()"); -        LLEventPump& login(pumps.obtain("login")); -        listener0.listenTo(login); -        login.stopListening(listener0.getName()); -        // should not throw because stopListening() should have removed name -        listener0.listenTo(login, &Listener::callstop); -        LLBoundListener wrong = login.getListener("bogus"); -        ensure("bogus connection disconnected", ! wrong.connected()); -        ensure("bogus connection blocked", wrong.blocked()); -    } - -    template<> template<> -    void events_object::test<6>() -    { -        set_test_name("chaining LLEventPump instances"); -        LLEventPump& upstream(pumps.obtain("upstream")); -        // One potentially-useful construct is to chain LLEventPumps together. -        // Among other things, this allows you to turn subsets of listeners on -        // and off in groups. -        LLEventPump& filter0(pumps.obtain("filter0")); -        LLEventPump& filter1(pumps.obtain("filter1")); -        upstream.listen(filter0.getName(), -                        boost::bind(&LLEventPump::post, boost::ref(filter0), _1)); -        upstream.listen(filter1.getName(), -                        boost::bind(&LLEventPump::post, boost::ref(filter1), _1)); -        listener0.listenTo(filter0); -        listener1.listenTo(filter1); -        listener0.reset(0); -        listener1.reset(0); -        upstream.post(1); -        check_listener("got unfiltered", listener0, 1); -        check_listener("got unfiltered", listener1, 1); -        filter0.enable(false); -        upstream.post(2); -        check_listener("didn't get filtered", listener0, 1); -        check_listener("got filtered", listener1, 2); -    } - -    template<> template<> -    void events_object::test<7>() -    { -        set_test_name("listener dependency order"); -        typedef LLEventPump::NameList NameList; -        typedef Collect::StringList StringList; -        LLEventPump& button(pumps.obtain("button")); -        Collect collector; -        button.listen("Mary", -                      boost::bind(&Collect::add, boost::ref(collector), "Mary", _1), -                      // state that "Mary" must come after "checked" -                      make<NameList>(list_of("checked"))); -        button.listen("checked", -                      boost::bind(&Collect::add, boost::ref(collector), "checked", _1), -                      // "checked" must come after "spot" -                      make<NameList>(list_of("spot"))); -        button.listen("spot", -                      boost::bind(&Collect::add, boost::ref(collector), "spot", _1)); -        button.post(1); -        ensure_equals(collector.result, make<StringList>(list_of("spot")("checked")("Mary"))); -        collector.clear(); -        button.stopListening("Mary"); -        button.listen("Mary", -                      boost::bind(&Collect::add, boost::ref(collector), "Mary", _1), -                      LLEventPump::empty, // no after dependencies -                      // now "Mary" must come before "spot" -                      make<NameList>(list_of("spot"))); -        button.post(2); -        ensure_equals(collector.result, make<StringList>(list_of("Mary")("spot")("checked"))); -        collector.clear(); -        button.stopListening("spot"); -        std::string threw; -        try -        { -            button.listen("spot", -                          boost::bind(&Collect::add, boost::ref(collector), "spot", _1), -                          // after "Mary" and "checked" -- whoops! -                          make<NameList>(list_of("Mary")("checked"))); -        } -        catch (const LLEventPump::Cycle& e) -        { -            threw = e.what(); -//          std::cout << "Caught: " << e.what() << '\n'; -        } -        // Obviously the specific wording of the exception text can -        // change; go ahead and change the test to match. -        // Establish that it contains: -        // - the name and runtime type of the LLEventPump -        ensure_contains("LLEventPump type", threw, typeid(button).name()); -        ensure_contains("LLEventPump name", threw, "'button'"); -        // - the name of the new listener that caused the problem -        ensure_contains("new listener name", threw, "'spot'"); -        // - a synopsis of the problematic dependencies. -        ensure_contains("cyclic dependencies", threw, -                        "\"Mary\" -> before (\"spot\")"); -        ensure_contains("cyclic dependencies", threw, -                        "after (\"spot\") -> \"checked\""); -        ensure_contains("cyclic dependencies", threw, -                        "after (\"Mary\", \"checked\") -> \"spot\""); -        button.listen("yellow", -                      boost::bind(&Collect::add, boost::ref(collector), "yellow", _1), -                      make<NameList>(list_of("checked"))); -        button.listen("shoelaces", -                      boost::bind(&Collect::add, boost::ref(collector), "shoelaces", _1), -                      make<NameList>(list_of("checked"))); -        button.post(3); -        ensure_equals(collector.result, make<StringList>(list_of("Mary")("checked")("yellow")("shoelaces"))); -        collector.clear(); -        threw.clear(); -        try -        { -            button.listen("of", -                          boost::bind(&Collect::add, boost::ref(collector), "of", _1), -                          make<NameList>(list_of("shoelaces")), -                          make<NameList>(list_of("yellow"))); -        } -        catch (const LLEventPump::OrderChange& e) -        { -            threw = e.what(); -//          std::cout << "Caught: " << e.what() << '\n'; -        } -        // Same remarks about the specific wording of the exception. Just -        // ensure that it contains enough information to clarify the -        // problem and what must be done to resolve it. -        ensure_contains("LLEventPump type", threw, typeid(button).name()); -        ensure_contains("LLEventPump name", threw, "'button'"); -        ensure_contains("new listener name", threw, "'of'"); -        ensure_contains("prev listener name", threw, "'yellow'"); -        ensure_contains("old order", threw, "was: Mary, checked, yellow, shoelaces"); -        ensure_contains("new order", threw, "now: Mary, checked, shoelaces, of, yellow"); -        button.post(4); -        ensure_equals(collector.result, make<StringList>(list_of("Mary")("checked")("yellow")("shoelaces"))); -    } - -    template<> template<> -    void events_object::test<8>() -    { -        set_test_name("tweaked and untweaked LLEventPump instance names"); -        {   // nested scope -            // Hand-instantiate an LLEventStream... -            LLEventStream bob("bob"); -            bool threw = false; -            try -            { -                // then another with a duplicate name. -                LLEventStream bob2("bob"); -            } -            catch (const LLEventPump::DupPumpName& /*e*/) -            { -                threw = true; -//              std::cout << "Caught: " << e.what() << '\n'; -            } -            ensure("Caught DupPumpName", threw); -        }   // delete first 'bob' -        LLEventStream bob("bob");   // should work, previous one unregistered -        LLEventStream bob1("bob", true); // allowed to tweak name -        ensure_equals("tweaked LLEventStream name", bob1.getName(), "bob1"); -        std::vector< boost::shared_ptr<LLEventStream> > streams; -        for (int i = 2; i <= 10; ++i) -        { -            streams.push_back(boost::shared_ptr<LLEventStream>(new LLEventStream("bob", true))); -        } -        ensure_equals("last tweaked LLEventStream name", streams.back()->getName(), "bob10"); -    } - -    // Define a function that accepts an LLListenerOrPumpName -    void eventSource(const LLListenerOrPumpName& listener) -    { -        // Pretend that some time has elapsed. Call listener immediately. -        listener(17); -    } - -    template<> template<> -    void events_object::test<9>() -    { -        set_test_name("LLListenerOrPumpName"); -        // Passing a boost::bind() expression to LLListenerOrPumpName -        listener0.reset(0); -        eventSource(boost::bind(&Listener::call, boost::ref(listener0), _1)); -        check_listener("got by listener", listener0, 17); -        // Passing a string LLEventPump name to LLListenerOrPumpName -        listener0.reset(0); -        LLEventStream random("random"); -        listener0.listenTo(random); -        eventSource("random"); -        check_listener("got by pump name", listener0, 17); -        bool threw = false; -        try -        { -            LLListenerOrPumpName empty; -            empty(17); -        } -        catch (const LLListenerOrPumpName::Empty&) -        { -            threw = true; -        } -        ensure("threw Empty", threw); -    } - -    class TempListener: public Listener -    { -    public: -        TempListener(const std::string& name, bool& liveFlag): -            Listener(name), -            mLiveFlag(liveFlag) -        { -            mLiveFlag = true; -        } - -        virtual ~TempListener() -        { -            mLiveFlag = false; -        } - -    private: -        bool& mLiveFlag; -    }; - -    template<> template<> -    void events_object::test<10>() -    { -        set_test_name("listen(boost::bind(...TempListener...))"); -        // listen() can't do anything about a plain TempListener instance: -        // it's not managed with shared_ptr, nor is it an LLEventTrackable subclass -        bool live = false; -        LLEventPump& heaptest(pumps.obtain("heaptest")); -        LLBoundListener connection; -        { -            TempListener tempListener("temp", live); -            ensure("TempListener constructed", live); -            connection = heaptest.listen(tempListener.getName(), -                                         boost::bind(&Listener::call, -                                                     boost::ref(tempListener), -                                                     _1)); -            heaptest.post(1); -            check_listener("received", tempListener, 1); -        } // presumably this will make newListener go away? -        // verify that -        ensure("TempListener destroyed", ! live); -        // This is the case against which we can't defend. Don't even try to -        // post to heaptest -- that would engage Undefined Behavior. -        // Cautiously inspect connection... -        ensure("misleadingly connected", connection.connected()); -        // then disconnect by hand. -        heaptest.stopListening("temp"); -    } - -    template<> template<> -    void events_object::test<11>() -    { -        set_test_name("listen(boost::bind(...weak_ptr...))"); -        // listen() detecting weak_ptr<TempListener> in boost::bind() object -        bool live = false; -        LLEventPump& heaptest(pumps.obtain("heaptest")); -        LLBoundListener connection; -        ensure("default state", ! connection.connected()); -        { -            boost::shared_ptr<TempListener> newListener(new TempListener("heap", live)); -            newListener->reset(); -            ensure("TempListener constructed", live); -            connection = heaptest.listen(newListener->getName(), -                                         boost::bind(&Listener::call, weaken(newListener), _1)); -            ensure("new connection", connection.connected()); -            heaptest.post(1); -            check_listener("received", *newListener, 1); -        } // presumably this will make newListener go away? -        // verify that -        ensure("TempListener destroyed", ! live); -        ensure("implicit disconnect", ! connection.connected()); -        // now just make sure we don't blow up trying to access a freed object! -        heaptest.post(2); -    } - -    template<> template<> -    void events_object::test<12>() -    { -        set_test_name("listen(boost::bind(...shared_ptr...))"); -/*==========================================================================*| -        // DISABLED because I've made this case produce a compile error. -        // Following the error leads the disappointed dev to a comment -        // instructing her to use the weaken() function to bind a weak_ptr<T> -        // instead of binding a shared_ptr<T>, and explaining why. I know of -        // no way to use TUT to code a repeatable test in which the expected -        // outcome is a compile error. The interested reader is invited to -        // uncomment this block and build to see for herself. - -        // listen() detecting shared_ptr<TempListener> in boost::bind() object -        bool live = false; -        LLEventPump& heaptest(pumps.obtain("heaptest")); -        LLBoundListener connection; -        std::string listenerName("heap"); -        ensure("default state", ! connection.connected()); -        { -            boost::shared_ptr<TempListener> newListener(new TempListener(listenerName, live)); -            ensure_equals("use_count", newListener.use_count(), 1); -            newListener->reset(); -            ensure("TempListener constructed", live); -            connection = heaptest.listen(newListener->getName(), -                                         boost::bind(&Listener::call, newListener, _1)); -            ensure("new connection", connection.connected()); -            ensure_equals("use_count", newListener.use_count(), 2); -            heaptest.post(1); -            check_listener("received", *newListener, 1); -        } // this should make newListener go away... -        // Unfortunately, the fact that we've bound a shared_ptr by value into -        // our LLEventPump means that copy will keep the referenced object alive. -        ensure("TempListener still alive", live); -        ensure("still connected", connection.connected()); -        // disconnecting explicitly should delete the TempListener... -        heaptest.stopListening(listenerName); +struct events_data +{ +	events_data() : +		pumps(LLEventPumps::instance()), +		listener0("first"), +		listener1("second") +	{ +	} +	LLEventPumps& pumps; +	Listener listener0; +	Listener listener1; + +	void check_listener(const std::string& desc, const Listener& listener, LLSD::Integer got) +	{ +		ensure_equals(STRINGIZE(listener << ' ' << desc), +					  listener.getLastEvent().asInteger(), got); +	} +}; +typedef test_group<events_data> events_group; +typedef events_group::object events_object; +tut::events_group evgr("events"); + +template<> template<> +void events_object::test<1>() +{ +	set_test_name("basic operations"); +	// Now there's a static constructor in llevents.cpp that registers on +	// the "mainloop" pump to call LLEventPumps::flush(). +	// Actually -- having to modify this to track the statically- +	// constructed pumps in other TUT modules in this giant monolithic test +	// executable isn't such a hot idea. +	// ensure_equals("initial pump", pumps.mPumpMap.size(), 1); +	size_t initial_pumps(pumps.mPumpMap.size()); +	LLEventPump& per_frame(pumps.obtain("per-frame")); +	ensure_equals("first explicit pump", pumps.mPumpMap.size(), initial_pumps + 1); +	// Verify that per_frame was instantiated as an LLEventStream. +	ensure("LLEventStream leaf class", dynamic_cast<LLEventStream*> (&per_frame)); +	ensure("enabled", per_frame.enabled()); +	// Trivial test, but posting an event to an EventPump with no +	// listeners should not blow up. The test is relevant because defining +	// a boost::signal with a non-void return signature, using the default +	// combiner, blows up if there are no listeners. This is because the +	// default combiner is defined to return the value returned by the +	// last listener, which is meaningless if there were no listeners. +	per_frame.post(0); +	LLBoundListener connection = listener0.listenTo(per_frame); +	ensure("connected", connection.connected()); +	ensure("not blocked", !connection.blocked()); +	per_frame.post(1); +	check_listener("received", listener0, 1); +	{ // block the connection +		LLEventPump::Blocker block(connection); +		ensure("blocked", connection.blocked()); +		per_frame.post(2); +		check_listener("not updated", listener0, 1); +	} // unblock +	ensure("unblocked", !connection.blocked()); +	per_frame.post(3); +	check_listener("unblocked", listener0, 3); +	LLBoundListener sameConnection = per_frame.getListener(listener0.getName()); +	ensure("still connected", sameConnection.connected()); +	ensure("still not blocked", !sameConnection.blocked()); +	{ // block it again +		LLEventPump::Blocker block(sameConnection); +		ensure("re-blocked", sameConnection.blocked()); +		per_frame.post(4); +		check_listener("re-blocked", listener0, 3); +	} // unblock +	std::string threw; +	try +	{ +		// NOTE: boost::bind() saves its arguments by VALUE! If you pass +		// an object instance rather than a pointer, you'll end up binding +		// to an internal copy of that instance! Use boost::ref() to +		// capture a reference instead. +		per_frame.listen(listener0.getName(), // note bug, dup name +						 boost::bind(&Listener::call, boost::ref(listener1), _1)); +	} +	catch (const LLEventPump::DupListenerName& e) +	{ +		threw = e.what(); +	} +	CATCH_MISSED_LINUX_EXCEPTION(LLEventPump::DupListenerName, threw) +	ensure_equals(threw, +				  std::string("DupListenerName: " +							  "Attempt to register duplicate listener name '") + +							  listener0.getName() + "' on " + typeid(per_frame).name() + +							  " '" + per_frame.getName() + "'"); +	// do it right this time +	listener1.listenTo(per_frame); +	per_frame.post(5); +	check_listener("got", listener0, 5); +	check_listener("got", listener1, 5); +	per_frame.enable(false); +	per_frame.post(6); +	check_listener("didn't get", listener0, 5); +	check_listener("didn't get", listener1, 5); +	per_frame.enable(); +	per_frame.post(7); +	check_listener("got", listener0, 7); +	check_listener("got", listener1, 7); +	per_frame.stopListening(listener0.getName()); +	ensure("disconnected 0", ! connection.connected()); +	ensure("disconnected 1", ! sameConnection.connected()); +	per_frame.post(8); +	check_listener("disconnected", listener0, 7); +	check_listener("still connected", listener1, 8); +	per_frame.stopListening(listener1.getName()); +	per_frame.post(9); +	check_listener("disconnected", listener1, 8); +} + +template<> template<> +void events_object::test<2>() +{ +	set_test_name("callstop() returning true"); +	LLEventPump& per_frame(pumps.obtain("per-frame")); +	listener0.reset(0); +	listener1.reset(0); +	LLBoundListener bound0 = listener0.listenTo(per_frame, &Listener::callstop); +	LLBoundListener bound1 = listener1.listenTo(per_frame, &Listener::call, +												// after listener0 +												make<LLEventPump::NameList>(list_of(listener0.getName()))); +	ensure("enabled", per_frame.enabled()); +	ensure("connected 0", bound0.connected()); +	ensure("unblocked 0", !bound0.blocked()); +	ensure("connected 1", bound1.connected()); +	ensure("unblocked 1", !bound1.blocked()); +	per_frame.post(1); +	check_listener("got", listener0, 1); +	// Because listener0.callstop() returns true, control never reaches listener1.call(). +	check_listener("got", listener1, 0); +} + +bool chainEvents(Listener& someListener, const LLSD& event) +{ +	// Make this call so we can watch for side effects for test purposes. +	someListener.call(event); +	// This function represents a recursive event chain -- or some other +	// scenario in which an event handler raises additional events. +	int value = event.asInteger(); +	if (value) +	{ +		LLEventPumps::instance().obtain("login").post(value - 1); +	} +	return false; +} + +template<> template<> +void events_object::test<3>() +{ +	set_test_name("LLEventQueue delayed action"); +	// This access is NOT legal usage: we can do it only because we're +	// hacking private for test purposes. Normally we'd either compile in +	// a particular name, or (later) edit a config file. +	pumps.mQueueNames.insert("login"); +	LLEventPump& login(pumps.obtain("login")); +	// The "mainloop" pump is special: posting on that implicitly calls +	// LLEventPumps::flush(), which in turn should flush our "login" +	// LLEventQueue. +	LLEventPump& mainloop(pumps.obtain("mainloop")); +	ensure("LLEventQueue leaf class", dynamic_cast<LLEventQueue*> (&login)); +	listener0.listenTo(login); +	listener0.reset(0); +	login.post(1); +	check_listener("waiting for queued event", listener0, 0); +	mainloop.post(LLSD()); +	check_listener("got queued event", listener0, 1); +	login.stopListening(listener0.getName()); +	// Verify that when an event handler posts a new event on the same +	// LLEventQueue, it doesn't get processed in the same flush() call -- +	// it waits until the next flush() call. +	listener0.reset(17); +	login.listen("chainEvents", boost::bind(chainEvents, boost::ref(listener0), _1)); +	login.post(1); +	check_listener("chainEvents(1) not yet called", listener0, 17); +	mainloop.post(LLSD()); +	check_listener("chainEvents(1) called", listener0, 1); +	mainloop.post(LLSD()); +	check_listener("chainEvents(0) called", listener0, 0); +	mainloop.post(LLSD()); +	check_listener("chainEvents(-1) not called", listener0, 0); +	login.stopListening("chainEvents"); +} + +template<> template<> +void events_object::test<4>() +{ +	set_test_name("explicitly-instantiated LLEventStream"); +	// Explicitly instantiate an LLEventStream, and verify that it +	// self-registers with LLEventPumps +	size_t registered = pumps.mPumpMap.size(); +	size_t owned = pumps.mOurPumps.size(); +	LLEventPump* localInstance; +	{ +		LLEventStream myEventStream("stream"); +		localInstance = &myEventStream; +		LLEventPump& stream(pumps.obtain("stream")); +		ensure("found named LLEventStream instance", &stream == localInstance); +		ensure_equals("registered new instance", pumps.mPumpMap.size(), registered + 1); +		ensure_equals("explicit instance not owned", pumps.mOurPumps.size(), owned); +	} // destroy myEventStream -- should unregister +	ensure_equals("destroyed instance unregistered", pumps.mPumpMap.size(), registered); +	ensure_equals("destroyed instance not owned", pumps.mOurPumps.size(), owned); +	LLEventPump& stream(pumps.obtain("stream")); +	ensure("new LLEventStream instance", &stream != localInstance); +	ensure_equals("obtain()ed instance registered", pumps.mPumpMap.size(), registered + 1); +	ensure_equals("obtain()ed instance owned", pumps.mOurPumps.size(), owned + 1); +} + +template<> template<> +void events_object::test<5>() +{ +	set_test_name("stopListening()"); +	LLEventPump& login(pumps.obtain("login")); +	listener0.listenTo(login); +	login.stopListening(listener0.getName()); +	// should not throw because stopListening() should have removed name +	listener0.listenTo(login, &Listener::callstop); +	LLBoundListener wrong = login.getListener("bogus"); +	ensure("bogus connection disconnected", !wrong.connected()); +	ensure("bogus connection blocked", wrong.blocked()); +} + +template<> template<> +void events_object::test<6>() +{ +	set_test_name("chaining LLEventPump instances"); +	LLEventPump& upstream(pumps.obtain("upstream")); +	// One potentially-useful construct is to chain LLEventPumps together. +	// Among other things, this allows you to turn subsets of listeners on +	// and off in groups. +	LLEventPump& filter0(pumps.obtain("filter0")); +	LLEventPump& filter1(pumps.obtain("filter1")); +	upstream.listen(filter0.getName(), boost::bind(&LLEventPump::post, boost::ref(filter0), _1)); +	upstream.listen(filter1.getName(), boost::bind(&LLEventPump::post, boost::ref(filter1), _1)); +	listener0.listenTo(filter0); +	listener1.listenTo(filter1); +	listener0.reset(0); +	listener1.reset(0); +	upstream.post(1); +	check_listener("got unfiltered", listener0, 1); +	check_listener("got unfiltered", listener1, 1); +	filter0.enable(false); +	upstream.post(2); +	check_listener("didn't get filtered", listener0, 1); +	check_listener("got filtered", listener1, 2); +} + +template<> template<> +void events_object::test<7>() +{ +	set_test_name("listener dependency order"); +	typedef LLEventPump::NameList NameList; +	typedef Collect::StringList StringList; +	LLEventPump& button(pumps.obtain("button")); +	Collect collector; +	button.listen("Mary", +				  boost::bind(&Collect::add, boost::ref(collector), "Mary", _1), +				  // state that "Mary" must come after "checked" +				  make<NameList> (list_of("checked"))); +	button.listen("checked", +				  boost::bind(&Collect::add, boost::ref(collector), "checked", _1), +				  // "checked" must come after "spot" +				  make<NameList> (list_of("spot"))); +	button.listen("spot", +				  boost::bind(&Collect::add, boost::ref(collector), "spot", _1)); +	button.post(1); +	ensure_equals(collector.result, make<StringList>(list_of("spot")("checked")("Mary"))); +	collector.clear(); +	button.stopListening("Mary"); +	button.listen("Mary", +			boost::bind(&Collect::add, boost::ref(collector), "Mary", _1), +			LLEventPump::empty, // no after dependencies +			// now "Mary" must come before "spot" +			make<NameList>(list_of("spot"))); +	button.post(2); +	ensure_equals(collector.result, make<StringList>(list_of("Mary")("spot")("checked"))); +	collector.clear(); +	button.stopListening("spot"); +	std::string threw; +	try +	{ +		button.listen("spot", +					  boost::bind(&Collect::add, boost::ref(collector), "spot", _1), +					  // after "Mary" and "checked" -- whoops! +			 		  make<NameList>(list_of("Mary")("checked"))); +	} +	catch (const LLEventPump::Cycle& e) +	{ +		threw = e.what(); +		// std::cout << "Caught: " << e.what() << '\n'; +	} +	CATCH_MISSED_LINUX_EXCEPTION(LLEventPump::Cycle, threw) +	// Obviously the specific wording of the exception text can +	// change; go ahead and change the test to match. +	// Establish that it contains: +	// - the name and runtime type of the LLEventPump +	ensure_contains("LLEventPump type", threw, typeid(button).name()); +	ensure_contains("LLEventPump name", threw, "'button'"); +	// - the name of the new listener that caused the problem +	ensure_contains("new listener name", threw, "'spot'"); +	// - a synopsis of the problematic dependencies. +	ensure_contains("cyclic dependencies", threw, +					"\"Mary\" -> before (\"spot\")"); +	ensure_contains("cyclic dependencies", threw, +					"after (\"spot\") -> \"checked\""); +	ensure_contains("cyclic dependencies", threw, +					"after (\"Mary\", \"checked\") -> \"spot\""); +	button.listen("yellow", +				  boost::bind(&Collect::add, boost::ref(collector), "yellow", _1), +				  make<NameList>(list_of("checked"))); +	button.listen("shoelaces", +				  boost::bind(&Collect::add, boost::ref(collector), "shoelaces", _1), +				  make<NameList>(list_of("checked"))); +	button.post(3); +	ensure_equals(collector.result, make<StringList>(list_of("Mary")("checked")("yellow")("shoelaces"))); +	collector.clear(); +	threw.clear(); +	try +	{ +		button.listen("of", +					  boost::bind(&Collect::add, boost::ref(collector), "of", _1), +					  make<NameList>(list_of("shoelaces")), +					  make<NameList>(list_of("yellow"))); +	} +	catch (const LLEventPump::OrderChange& e) +	{ +		threw = e.what(); +		// std::cout << "Caught: " << e.what() << '\n'; +	} +	CATCH_MISSED_LINUX_EXCEPTION(LLEventPump::OrderChange, threw) +	// Same remarks about the specific wording of the exception. Just +	// ensure that it contains enough information to clarify the +	// problem and what must be done to resolve it. +	ensure_contains("LLEventPump type", threw, typeid(button).name()); +	ensure_contains("LLEventPump name", threw, "'button'"); +	ensure_contains("new listener name", threw, "'of'"); +	ensure_contains("prev listener name", threw, "'yellow'"); +	// std::cout << "Thrown Exception: " << threw << std::endl; +	ensure_contains("old order", threw, "was: Mary, checked, yellow, shoelaces"); +	ensure_contains("new order", threw, "now: Mary, checked, shoelaces, of, yellow"); +	button.post(4); +	ensure_equals(collector.result, make<StringList>(list_of("Mary")("checked")("yellow")("shoelaces"))); +} + +template<> template<> +void events_object::test<8>() +{ +	set_test_name("tweaked and untweaked LLEventPump instance names"); +	{ 	// nested scope +		// Hand-instantiate an LLEventStream... +		LLEventStream bob("bob"); +		std::string threw; +		try +		{ +			// then another with a duplicate name. +			LLEventStream bob2("bob"); +		} +		catch (const LLEventPump::DupPumpName& e) +		{ +			threw = e.what(); +			// std::cout << "Caught: " << e.what() << '\n'; +		} +		CATCH_MISSED_LINUX_EXCEPTION(LLEventPump::DupPumpName, threw) +		ensure("Caught DupPumpName", !threw.empty()); +	} 	// delete first 'bob' +	LLEventStream bob("bob"); 		// should work, previous one unregistered +	LLEventStream bob1("bob", true);// allowed to tweak name +	ensure_equals("tweaked LLEventStream name", bob1.getName(), "bob1"); +	std::vector<boost::shared_ptr<LLEventStream> > streams; +	for (int i = 2; i <= 10; ++i) +	{ +		streams.push_back(boost::shared_ptr<LLEventStream>(new LLEventStream("bob", true))); +	} +	ensure_equals("last tweaked LLEventStream name", streams.back()->getName(), "bob10"); +} + +// Define a function that accepts an LLListenerOrPumpName +void eventSource(const LLListenerOrPumpName& listener) +{ +	// Pretend that some time has elapsed. Call listener immediately. +	listener(17); +} + +template<> template<> +void events_object::test<9>() +{ +	set_test_name("LLListenerOrPumpName"); +	// Passing a boost::bind() expression to LLListenerOrPumpName +	listener0.reset(0); +	eventSource(boost::bind(&Listener::call, boost::ref(listener0), _1)); +	check_listener("got by listener", listener0, 17); +	// Passing a string LLEventPump name to LLListenerOrPumpName +	listener0.reset(0); +	LLEventStream random("random"); +	listener0.listenTo(random); +	eventSource("random"); +	check_listener("got by pump name", listener0, 17); +	std::string threw; +	try +	{ +		LLListenerOrPumpName empty; +		empty(17); +	} +	catch (const LLListenerOrPumpName::Empty& e) +	{ +		threw = e.what(); +	} +	CATCH_MISSED_LINUX_EXCEPTION(LLListenerOrPumpName::Empty, threw) + +	ensure("threw Empty", !threw.empty()); +} + +class TempListener: public Listener +{ +public: +	TempListener(const std::string& name, bool& liveFlag) : +		Listener(name), mLiveFlag(liveFlag) +	{ +		mLiveFlag = true; +	} + +	virtual ~TempListener() +	{ +		mLiveFlag = false; +	} + +private: +	bool& mLiveFlag; +}; + +template<> template<> +void events_object::test<10>() +{ +	set_test_name("listen(boost::bind(...TempListener...))"); +	// listen() can't do anything about a plain TempListener instance: +	// it's not managed with shared_ptr, nor is it an LLEventTrackable subclass +	bool live = false; +	LLEventPump& heaptest(pumps.obtain("heaptest")); +	LLBoundListener connection; +	{ +		TempListener tempListener("temp", live); +		ensure("TempListener constructed", live); +		connection = heaptest.listen(tempListener.getName(), +									 boost::bind(&Listener::call, +												 boost::ref(tempListener), +												 _1)); +		heaptest.post(1); +		check_listener("received", tempListener, 1); +	} // presumably this will make newListener go away? +	// verify that +	ensure("TempListener destroyed", !live); +	// This is the case against which we can't defend. Don't even try to +	// post to heaptest -- that would engage Undefined Behavior. +	// Cautiously inspect connection... +	ensure("misleadingly connected", connection.connected()); +	// then disconnect by hand. +	heaptest.stopListening("temp"); +} + +template<> template<> +void events_object::test<11>() +{ +	set_test_name("listen(boost::bind(...weak_ptr...))"); +	// listen() detecting weak_ptr<TempListener> in boost::bind() object +	bool live = false; +	LLEventPump& heaptest(pumps.obtain("heaptest")); +	LLBoundListener connection; +	ensure("default state", !connection.connected()); +	{ +		boost::shared_ptr<TempListener> newListener(new TempListener("heap", live)); +		newListener->reset(); +		ensure("TempListener constructed", live); +		connection = heaptest.listen(newListener->getName(), +									 boost::bind(&Listener::call,  +												 weaken(newListener),  +												 _1)); +		ensure("new connection", connection.connected()); +		heaptest.post(1); +		check_listener("received", *newListener, 1); +	} // presumably this will make newListener go away? +	// verify that +	ensure("TempListener destroyed", !live); +	ensure("implicit disconnect", !connection.connected()); +	// now just make sure we don't blow up trying to access a freed object! +	heaptest.post(2); +} + +template<> template<> +void events_object::test<12>() +{ +	set_test_name("listen(boost::bind(...shared_ptr...))"); +	/*==========================================================================*| +	// DISABLED because I've made this case produce a compile error. +	// Following the error leads the disappointed dev to a comment +	// instructing her to use the weaken() function to bind a weak_ptr<T> +	// instead of binding a shared_ptr<T>, and explaining why. I know of +	// no way to use TUT to code a repeatable test in which the expected +	// outcome is a compile error. The interested reader is invited to +	// uncomment this block and build to see for herself. + +	// listen() detecting shared_ptr<TempListener> in boost::bind() object +	bool live = false; +	LLEventPump& heaptest(pumps.obtain("heaptest")); +	LLBoundListener connection; +	std::string listenerName("heap"); +	ensure("default state", !connection.connected()); +	{ +		boost::shared_ptr<TempListener> newListener(new TempListener(listenerName, live)); +		ensure_equals("use_count", newListener.use_count(), 1); +		newListener->reset(); +		ensure("TempListener constructed", live); +		connection = heaptest.listen(newListener->getName(), +									 boost::bind(&Listener::call, newListener, _1)); +		ensure("new connection", connection.connected()); +		ensure_equals("use_count", newListener.use_count(), 2); +		heaptest.post(1); +		check_listener("received", *newListener, 1); +	} // this should make newListener go away... +	// Unfortunately, the fact that we've bound a shared_ptr by value into +	// our LLEventPump means that copy will keep the referenced object alive. +	ensure("TempListener still alive", live); +	ensure("still connected", connection.connected()); +	// disconnecting explicitly should delete the TempListener... +	heaptest.stopListening(listenerName);  #if 0   // however, in my experience, it does not. I don't know why not. -        // Ah: on 2009-02-19, Frank Mori Hess, author of the Boost.Signals2 -        // library, stated on the boost-users mailing list: -        // http://www.nabble.com/Re%3A--signals2--review--The-review-of-the-signals2-library-(formerly-thread_safe_signals)-begins-today%2C-Nov-1st-p22102367.html -        // "It will get destroyed eventually. The signal cleans up its slot -        // list little by little during connect/invoke. It doesn't immediately -        // remove disconnected slots from the slot list since other threads -        // might be using the same slot list concurrently. It might be -        // possible to make it immediately reset the shared_ptr owning the -        // slot though, leaving an empty shared_ptr in the slot list, since -        // that wouldn't invalidate any iterators." -        ensure("TempListener destroyed", ! live); -        ensure("implicit disconnect", ! connection.connected()); +	// Ah: on 2009-02-19, Frank Mori Hess, author of the Boost.Signals2 +	// library, stated on the boost-users mailing list: +	// http://www.nabble.com/Re%3A--signals2--review--The-review-of-the-signals2-library-(formerly-thread_safe_signals)-begins-today%2C-Nov-1st-p22102367.html +	// "It will get destroyed eventually. The signal cleans up its slot +	// list little by little during connect/invoke. It doesn't immediately +	// remove disconnected slots from the slot list since other threads +	// might be using the same slot list concurrently. It might be +	// possible to make it immediately reset the shared_ptr owning the +	// slot though, leaving an empty shared_ptr in the slot list, since +	// that wouldn't invalidate any iterators." +	ensure("TempListener destroyed", ! live); +	ensure("implicit disconnect", ! connection.connected());  #endif  // 0 -        // now just make sure we don't blow up trying to access a freed object! -        heaptest.post(2); +	// now just make sure we don't blow up trying to access a freed object! +	heaptest.post(2);  |*==========================================================================*/ -    } - -    class TempTrackableListener: public TempListener, public LLEventTrackable -    { -    public: -        TempTrackableListener(const std::string& name, bool& liveFlag): -            TempListener(name, liveFlag) -        {} -    }; - -    template<> template<> -    void events_object::test<13>() -    { -        set_test_name("listen(boost::bind(...TempTrackableListener ref...))"); -        bool live = false; -        LLEventPump& heaptest(pumps.obtain("heaptest")); -        LLBoundListener connection; -        { -            TempTrackableListener tempListener("temp", live); -            ensure("TempTrackableListener constructed", live); -            connection = heaptest.listen(tempListener.getName(), -                                         boost::bind(&TempTrackableListener::call, -                                                     boost::ref(tempListener), _1)); -            heaptest.post(1); -            check_listener("received", tempListener, 1); -        } // presumably this will make tempListener go away? -        // verify that -        ensure("TempTrackableListener destroyed", ! live); -        ensure("implicit disconnect", ! connection.connected()); -        // now just make sure we don't blow up trying to access a freed object! -        heaptest.post(2); -    } - -    template<> template<> -    void events_object::test<14>() -    { -        set_test_name("listen(boost::bind(...TempTrackableListener pointer...))"); -        bool live = false; -        LLEventPump& heaptest(pumps.obtain("heaptest")); -        LLBoundListener connection; -        { -            TempTrackableListener* newListener(new TempTrackableListener("temp", live)); -            ensure("TempTrackableListener constructed", live); -            connection = heaptest.listen(newListener->getName(), -                                         boost::bind(&TempTrackableListener::call, -                                                     newListener, _1)); -            heaptest.post(1); -            check_listener("received", *newListener, 1); -            // explicitly destroy newListener -            delete newListener; -        } -        // verify that -        ensure("TempTrackableListener destroyed", ! live); -        ensure("implicit disconnect", ! connection.connected()); -        // now just make sure we don't blow up trying to access a freed object! -        heaptest.post(2); -    } - -    template<> template<> -    void events_object::test<15>() -    { -        // This test ensures that using an LLListenerWrapper subclass doesn't -        // block Boost.Signals2 from recognizing a bound LLEventTrackable -        // subclass. -        set_test_name("listen(llwrap<LLLogListener>(boost::bind(...TempTrackableListener ref...)))"); -        bool live = false; -        LLEventPump& heaptest(pumps.obtain("heaptest")); -        LLBoundListener connection; -        { -            TempTrackableListener tempListener("temp", live); -            ensure("TempTrackableListener constructed", live); -            connection = heaptest.listen(tempListener.getName(), -                                         llwrap<LLLogListener>( -                                         boost::bind(&TempTrackableListener::call, -                                                     boost::ref(tempListener), _1))); -            heaptest.post(1); -            check_listener("received", tempListener, 1); -        } // presumably this will make tempListener go away? -        // verify that -        ensure("TempTrackableListener destroyed", ! live); -        ensure("implicit disconnect", ! connection.connected()); -        // now just make sure we don't blow up trying to access a freed object! -        heaptest.post(2); -    } - -    class TempSharedListener: public TempListener, -                              public boost::enable_shared_from_this<TempSharedListener> -    { -    public: -        TempSharedListener(const std::string& name, bool& liveFlag): -            TempListener(name, liveFlag) -        {} -    }; - -    template<> template<> -    void events_object::test<16>() -    { -        set_test_name("listen(boost::bind(...TempSharedListener ref...))"); +} + +class TempTrackableListener: public TempListener, public LLEventTrackable +{ +public: +TempTrackableListener(const std::string& name, bool& liveFlag): +	TempListener(name, liveFlag) +{} +}; + +template<> template<> +void events_object::test<13>() +{ +set_test_name("listen(boost::bind(...TempTrackableListener ref...))"); +bool live = false; +LLEventPump& heaptest(pumps.obtain("heaptest")); +LLBoundListener connection; +{ +	TempTrackableListener tempListener("temp", live); +	ensure("TempTrackableListener constructed", live); +	connection = heaptest.listen(tempListener.getName(), +								 boost::bind(&TempTrackableListener::call, +											 boost::ref(tempListener), _1)); +	heaptest.post(1); +	check_listener("received", tempListener, 1); +} // presumably this will make tempListener go away? +// verify that +ensure("TempTrackableListener destroyed", ! live); +ensure("implicit disconnect", ! connection.connected()); +// now just make sure we don't blow up trying to access a freed object! +heaptest.post(2); +} + +template<> template<> +void events_object::test<14>() +{ +set_test_name("listen(boost::bind(...TempTrackableListener pointer...))"); +bool live = false; +LLEventPump& heaptest(pumps.obtain("heaptest")); +LLBoundListener connection; +{ +	TempTrackableListener* newListener(new TempTrackableListener("temp", live)); +	ensure("TempTrackableListener constructed", live); +	connection = heaptest.listen(newListener->getName(), +								 boost::bind(&TempTrackableListener::call, +											 newListener, _1)); +	heaptest.post(1); +	check_listener("received", *newListener, 1); +	// explicitly destroy newListener +	delete newListener; +} +// verify that +ensure("TempTrackableListener destroyed", ! live); +ensure("implicit disconnect", ! connection.connected()); +// now just make sure we don't blow up trying to access a freed object! +heaptest.post(2); +} + +template<> template<> +void events_object::test<15>() +{ +// This test ensures that using an LLListenerWrapper subclass doesn't +// block Boost.Signals2 from recognizing a bound LLEventTrackable +// subclass. +set_test_name("listen(llwrap<LLLogListener>(boost::bind(...TempTrackableListener ref...)))"); +bool live = false; +LLEventPump& heaptest(pumps.obtain("heaptest")); +LLBoundListener connection; +{ +	TempTrackableListener tempListener("temp", live); +	ensure("TempTrackableListener constructed", live); +	connection = heaptest.listen(tempListener.getName(), +								 llwrap<LLLogListener>( +								 boost::bind(&TempTrackableListener::call, +											 boost::ref(tempListener), _1))); +	heaptest.post(1); +	check_listener("received", tempListener, 1); +} // presumably this will make tempListener go away? +// verify that +ensure("TempTrackableListener destroyed", ! live); +ensure("implicit disconnect", ! connection.connected()); +// now just make sure we don't blow up trying to access a freed object! +heaptest.post(2); +} + +class TempSharedListener: public TempListener, +public boost::enable_shared_from_this<TempSharedListener> +{ +public: +TempSharedListener(const std::string& name, bool& liveFlag): +	TempListener(name, liveFlag) +{} +}; + +template<> template<> +void events_object::test<16>() +{ +	set_test_name("listen(boost::bind(...TempSharedListener ref...))");  #if 0 -        bool live = false; -        LLEventPump& heaptest(pumps.obtain("heaptest")); -        LLBoundListener connection; -        { -            // We MUST have at least one shared_ptr to an -            // enable_shared_from_this subclass object before -            // shared_from_this() can work. -            boost::shared_ptr<TempSharedListener> -                tempListener(new TempSharedListener("temp", live)); -            ensure("TempSharedListener constructed", live); -            // However, we're not passing either the shared_ptr or its -            // corresponding weak_ptr -- instead, we're passing a reference to -            // the TempSharedListener. +bool live = false; +LLEventPump& heaptest(pumps.obtain("heaptest")); +LLBoundListener connection; +{ +	// We MUST have at least one shared_ptr to an +	// enable_shared_from_this subclass object before +	// shared_from_this() can work. +	boost::shared_ptr<TempSharedListener> +		tempListener(new TempSharedListener("temp", live)); +	ensure("TempSharedListener constructed", live); +	// However, we're not passing either the shared_ptr or its +	// corresponding weak_ptr -- instead, we're passing a reference to +	// the TempSharedListener.  /*==========================================================================*| -            std::cout << "Capturing const ref" << std::endl; -            const boost::enable_shared_from_this<TempSharedListener>& cref(*tempListener); -            std::cout << "Capturing const ptr" << std::endl; -            const boost::enable_shared_from_this<TempSharedListener>* cp(&cref); -            std::cout << "Capturing non-const ptr" << std::endl; -            boost::enable_shared_from_this<TempSharedListener>* p(const_cast<boost::enable_shared_from_this<TempSharedListener>*>(cp)); -            std::cout << "Capturing shared_from_this()" << std::endl; -            boost::shared_ptr<TempSharedListener> sp(p->shared_from_this()); -            std::cout << "Capturing weak_ptr" << std::endl; -            boost::weak_ptr<TempSharedListener> wp(weaken(sp)); -            std::cout << "Binding weak_ptr" << std::endl; +	 std::cout << "Capturing const ref" << std::endl; +	 const boost::enable_shared_from_this<TempSharedListener>& cref(*tempListener); +	 std::cout << "Capturing const ptr" << std::endl; +	 const boost::enable_shared_from_this<TempSharedListener>* cp(&cref); +	 std::cout << "Capturing non-const ptr" << std::endl; +	 boost::enable_shared_from_this<TempSharedListener>* p(const_cast<boost::enable_shared_from_this<TempSharedListener>*>(cp)); +	 std::cout << "Capturing shared_from_this()" << std::endl; +	 boost::shared_ptr<TempSharedListener> sp(p->shared_from_this()); +	 std::cout << "Capturing weak_ptr" << std::endl; +	 boost::weak_ptr<TempSharedListener> wp(weaken(sp)); +	 std::cout << "Binding weak_ptr" << std::endl;  |*==========================================================================*/ -            connection = heaptest.listen(tempListener->getName(), -                                         boost::bind(&TempSharedListener::call, *tempListener, _1)); -            heaptest.post(1); -            check_listener("received", *tempListener, 1); -        } // presumably this will make tempListener go away? -        // verify that -        ensure("TempSharedListener destroyed", ! live); -        ensure("implicit disconnect", ! connection.connected()); -        // now just make sure we don't blow up trying to access a freed object! -        heaptest.post(2); +	connection = heaptest.listen(tempListener->getName(), +								 boost::bind(&TempSharedListener::call, *tempListener, _1)); +	heaptest.post(1); +	check_listener("received", *tempListener, 1); +} // presumably this will make tempListener go away? +// verify that +ensure("TempSharedListener destroyed", ! live); +ensure("implicit disconnect", ! connection.connected()); +// now just make sure we don't blow up trying to access a freed object! +heaptest.post(2);  #endif // 0 -    } +}  } // namespace tut diff --git a/indra/test/llhttpclient_tut.cpp b/indra/test/llhttpclient_tut.cpp index 03759001ae..4b4046632c 100644 --- a/indra/test/llhttpclient_tut.cpp +++ b/indra/test/llhttpclient_tut.cpp @@ -40,6 +40,7 @@  #include "llhttpclient.h"  #include "llformat.h"  #include "llpipeutil.h" +#include "llproxy.h"  #include "llpumpio.h"  #include "llsdhttpserver.h" @@ -85,9 +86,10 @@ namespace tut  		HTTPClientTestData()  		{  			apr_pool_create(&mPool, NULL); +			LLCurl::initClass(false);  			mServerPump = new LLPumpIO(mPool);  			mClientPump = new LLPumpIO(mPool); -			 +  			LLHTTPClient::setPump(*mClientPump);  		} @@ -95,6 +97,7 @@ namespace tut  		{  			delete mServerPump;  			delete mClientPump; +			LLProxy::cleanupClass();  			apr_pool_destroy(mPool);  		} diff --git a/indra/test/llsd_new_tut.cpp b/indra/test/llsd_new_tut.cpp index dd93b36f04..b2fa54a688 100644 --- a/indra/test/llsd_new_tut.cpp +++ b/indra/test/llsd_new_tut.cpp @@ -5,7 +5,7 @@   *   * $LicenseInfo:firstyear=2006&license=viewerlgpl$   * Second Life Viewer Source Code - * Copyright (C) 2010, Linden Research, Inc. + * Copyright (C) 2006-2011, Linden Research, Inc.   *    * This library is free software; you can redistribute it and/or   * modify it under the terms of the GNU Lesser General Public @@ -32,6 +32,19 @@  #include "llsdtraits.h"  #include "llstring.h" +#if LL_WINDOWS +#include <float.h> +namespace +{ +	int fpclassify(double x) +	{ +		return _fpclass(x); +	} +} +#else +using std::fpclassify; +#endif +  namespace tut  {  	class SDCleanupCheck @@ -218,19 +231,16 @@ namespace tut  		}  		else  		{ -// TODO: Fix on windows.... -#ifndef LL_WINDOWS -# if !defined(fpclassify) && __GNUC__ >= 3 -#   define FPCLASSIFY_NAMESPACE std:: -# else -#   define FPCLASSIFY_NAMESPACE -# endif -			int left  = FPCLASSIFY_NAMESPACE fpclassify(v.asReal()); -			int right = FPCLASSIFY_NAMESPACE fpclassify(eReal); +			int left  = fpclassify(v.asReal()); +			int right = fpclassify(eReal);  			ensure_equals(s+" to real", 	left, 			right); -			ensure_equals(s+" to string",	v.asString(),	eString); -#endif +			// ensure_equals(s+" to string", v.asString(), eString); +			// I've commented this check out, since there doesn't +			// seem to be uniform string representation for NaN on +			// all platforms. For example, on my Ubuntu 8.10 laptop +			// with libc 2.11.1, sqrt(-1.0) will return '-nan', not +			// 'nan'.  		}  	} @@ -742,6 +752,42 @@ namespace tut  			LLSD w = v;  			w = "nice day";  		} + +		{ +			SDAllocationCheck check("shared values test for threaded work", 9); + +			//U32 start_llsd_count = LLSD::outstandingCount(); + +			LLSD m = LLSD::emptyMap(); + +			m["one"] = 1; +			m["two"] = 2; +			m["one_copy"] = m["one"];			// 3 (m, "one" and "two") + +			m["undef_one"] = LLSD(); +			m["undef_two"] = LLSD(); +			m["undef_one_copy"] = m["undef_one"]; + +			{	// Ensure first_array gets freed to avoid counting it +				LLSD first_array = LLSD::emptyArray(); +				first_array.append(1.0f); +				first_array.append(2.0f);			 +				first_array.append(3.0f);			// 7 + +				m["array"] = first_array; +				m["array_clone"] = first_array; +				m["array_copy"] = m["array"];		// 7 +			} + +			m["string_one"] = "string one value"; +			m["string_two"] = "string two value"; +			m["string_one_copy"] = m["string_one"];		// 9 + +			//U32 llsd_object_count = LLSD::outstandingCount(); +			//std::cout << "Using " << (llsd_object_count - start_llsd_count) << " LLSD objects" << std::endl; + +			//m.dumpStats(); +		}  	}  	template<> template<> @@ -769,4 +815,3 @@ namespace tut  		test serializations  	*/  } - diff --git a/indra/test/llsdmessagebuilder_tut.cpp b/indra/test/llsdmessagebuilder_tut.cpp index cc6f78decd..be0692557a 100644 --- a/indra/test/llsdmessagebuilder_tut.cpp +++ b/indra/test/llsdmessagebuilder_tut.cpp @@ -33,6 +33,7 @@  #include "llsdmessagebuilder.h"  #include "llsdmessagereader.h"  #include "llsdtraits.h" +#include "llmath.h"  #include "llquaternion.h"  #include "u64.h"  #include "v3dmath.h" @@ -86,17 +87,17 @@ namespace tut  			return createTemplateBlock(_PREHASH_Test0, type, size, block);  		} -		static LLMessageBlock* createTemplateBlock(char* name, const EMsgVariableType type = MVT_NULL, const S32 size = 0, EMsgBlockType block = MBT_VARIABLE) +		static LLMessageBlock* createTemplateBlock(const char* name, const EMsgVariableType type = MVT_NULL, const S32 size = 0, EMsgBlockType block = MBT_VARIABLE)  		{  			LLMessageBlock* result = new LLMessageBlock(name, block);  			if(type != MVT_NULL)  			{ -				result->addVariable(_PREHASH_Test0, type, size); +				result->addVariable(const_cast<char*>(_PREHASH_Test0), type, size);  			}  			return result;  		} -		static LLTemplateMessageBuilder* defaultTemplateBuilder(LLMessageTemplate& messageTemplate, char* name = _PREHASH_Test0) +		static LLTemplateMessageBuilder* defaultTemplateBuilder(LLMessageTemplate& messageTemplate, char* name = const_cast<char*>(_PREHASH_Test0))  		{  			templateNameMap[_PREHASH_TestMessage] = &messageTemplate;  			LLTemplateMessageBuilder* builder = new LLTemplateMessageBuilder(templateNameMap); diff --git a/indra/test/lltemplatemessagebuilder_tut.cpp b/indra/test/lltemplatemessagebuilder_tut.cpp index 09beb53869..6e1c82bb24 100644 --- a/indra/test/lltemplatemessagebuilder_tut.cpp +++ b/indra/test/lltemplatemessagebuilder_tut.cpp @@ -31,6 +31,7 @@  #include "llapr.h"  #include "llmessagetemplate.h" +#include "llmath.h"  #include "llquaternion.h"  #include "lltemplatemessagebuilder.h"  #include "lltemplatemessagereader.h" @@ -75,7 +76,7 @@ namespace tut  		static LLMessageBlock* defaultBlock(const EMsgVariableType type = MVT_NULL, const S32 size = 0, EMsgBlockType block = MBT_VARIABLE)  		{ -			return createBlock(_PREHASH_Test0, type, size, block); +			return createBlock(const_cast<char*>(_PREHASH_Test0), type, size, block);  		}  		static LLMessageBlock* createBlock(char* name, const EMsgVariableType type = MVT_NULL, const S32 size = 0, EMsgBlockType block = MBT_VARIABLE) @@ -83,12 +84,12 @@ namespace tut  			LLMessageBlock* result = new LLMessageBlock(name, block);  			if(type != MVT_NULL)  			{ -				result->addVariable(_PREHASH_Test0, type, size); +				result->addVariable(const_cast<char*>(_PREHASH_Test0), type, size);  			}  			return result;  		} -		static LLTemplateMessageBuilder* defaultBuilder(LLMessageTemplate& messageTemplate, char* name = _PREHASH_Test0) +		static LLTemplateMessageBuilder* defaultBuilder(LLMessageTemplate& messageTemplate, char* name = const_cast<char*>(_PREHASH_Test0))  		{  			nameMap[_PREHASH_TestMessage] = &messageTemplate;  			LLTemplateMessageBuilder* builder = new LLTemplateMessageBuilder(nameMap); @@ -403,11 +404,11 @@ namespace tut  		// build template: Test0 before Test1  		LLMessageTemplate messageTemplate = defaultTemplate(); -		messageTemplate.addBlock(createBlock(_PREHASH_Test0, MVT_U32, 4, MBT_SINGLE)); -		messageTemplate.addBlock(createBlock(_PREHASH_Test1, MVT_U32, 4, MBT_SINGLE)); +		messageTemplate.addBlock(createBlock(const_cast<char*>(_PREHASH_Test0), MVT_U32, 4, MBT_SINGLE)); +		messageTemplate.addBlock(createBlock(const_cast<char*>(_PREHASH_Test1), MVT_U32, 4, MBT_SINGLE));  		// build message: 1st declared block var == 0xaaaa, 2nd declared block var == 0xbbbb -		LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate, _PREHASH_Test0); +		LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate, const_cast<char*>(_PREHASH_Test0));  		builder->addU32(_PREHASH_Test0, 0xaaaa);  		builder->nextBlock(_PREHASH_Test1);  		builder->addU32(_PREHASH_Test0, 0xbbbb); @@ -416,11 +417,11 @@ namespace tut  		// build template: Test1 before Test0  		messageTemplate = defaultTemplate(); -		messageTemplate.addBlock(createBlock(_PREHASH_Test1, MVT_U32, 4, MBT_SINGLE)); -		messageTemplate.addBlock(createBlock(_PREHASH_Test0, MVT_U32, 4, MBT_SINGLE)); +		messageTemplate.addBlock(createBlock(const_cast<char*>(_PREHASH_Test1), MVT_U32, 4, MBT_SINGLE)); +		messageTemplate.addBlock(createBlock(const_cast<char*>(_PREHASH_Test0), MVT_U32, 4, MBT_SINGLE));  		// build message: 1st declared block var == 0xaaaa, 2nd declared block var == 0xbbbb -		builder = defaultBuilder(messageTemplate, _PREHASH_Test1); +		builder = defaultBuilder(messageTemplate, const_cast<char*>(_PREHASH_Test1));  		builder->addU32(_PREHASH_Test0, 0xaaaa);  		builder->nextBlock(_PREHASH_Test0);  		builder->addU32(_PREHASH_Test0, 0xbbbb); @@ -443,11 +444,11 @@ namespace tut  		// build template: Test0 before Test1  		LLMessageTemplate messageTemplate = defaultTemplate(); -		messageTemplate.addBlock(createBlock(_PREHASH_Test0, MVT_U32, 4, MBT_SINGLE)); -		messageTemplate.addBlock(createBlock(_PREHASH_Test1, MVT_U32, 4, MBT_SINGLE)); +		messageTemplate.addBlock(createBlock(const_cast<char*>(_PREHASH_Test0), MVT_U32, 4, MBT_SINGLE)); +		messageTemplate.addBlock(createBlock(const_cast<char*>(_PREHASH_Test1), MVT_U32, 4, MBT_SINGLE));  		// build message: 1st declared block var == 0xaaaa, 2nd declared block var == 0xbbbb -		LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate, _PREHASH_Test0); +		LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate, const_cast<char*>(_PREHASH_Test0));  		builder->addU32(_PREHASH_Test0, 0xaaaa);  		builder->nextBlock(_PREHASH_Test1);  		builder->addU32(_PREHASH_Test0, 0xbbbb); @@ -455,7 +456,7 @@ namespace tut  		delete builder;  		// build message: 1st declared block var == 0xaaaa, 2nd declared block var == 0xbbbb -		builder = defaultBuilder(messageTemplate, _PREHASH_Test1); +		builder = defaultBuilder(messageTemplate, const_cast<char*>(_PREHASH_Test1));  		builder->addU32(_PREHASH_Test0, 0xbbbb);  		builder->nextBlock(_PREHASH_Test0);  		builder->addU32(_PREHASH_Test0, 0xaaaa); @@ -478,21 +479,21 @@ namespace tut  		// Build template: Test0 only  		LLMessageTemplate messageTemplate = defaultTemplate(); -		messageTemplate.addBlock(createBlock(_PREHASH_Test0, MVT_U32, 4, MBT_SINGLE)); +		messageTemplate.addBlock(createBlock(const_cast<char*>(_PREHASH_Test0), MVT_U32, 4, MBT_SINGLE));  		// Build message -		LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate, _PREHASH_Test0); +		LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate, const_cast<char*>(_PREHASH_Test0));  		builder->addU32(_PREHASH_Test0, 0xaaaa);  		bufferSize1 = builder->buildMessage(buffer1, MAX_BUFFER_SIZE, 0);  		delete builder;  		// Build template: Test0 before Test1  		messageTemplate = defaultTemplate(); -		messageTemplate.addBlock(createBlock(_PREHASH_Test0, MVT_U32, 4, MBT_SINGLE)); -		messageTemplate.addBlock(createBlock(_PREHASH_Test1, MVT_U32, 4, MBT_SINGLE)); +		messageTemplate.addBlock(createBlock(const_cast<char*>(_PREHASH_Test0), MVT_U32, 4, MBT_SINGLE)); +		messageTemplate.addBlock(createBlock(const_cast<char*>(_PREHASH_Test1), MVT_U32, 4, MBT_SINGLE));  		// Build message -		builder = defaultBuilder(messageTemplate, _PREHASH_Test0); +		builder = defaultBuilder(messageTemplate, const_cast<char*>(_PREHASH_Test0));  		builder->addU32(_PREHASH_Test0, 0xaaaa);  		builder->nextBlock(_PREHASH_Test1);  		builder->addU32(_PREHASH_Test0, 0xbbbb); @@ -511,8 +512,8 @@ namespace tut  		U32 inTest00 = 0, inTest01 = 1, inTest1 = 2;  		U32 outTest00, outTest01, outTest1;  		LLMessageTemplate messageTemplate = defaultTemplate(); -		messageTemplate.addBlock(createBlock(_PREHASH_Test0, MVT_U32, 4)); -		messageTemplate.addBlock(createBlock(_PREHASH_Test1, MVT_U32, 4)); +		messageTemplate.addBlock(createBlock(const_cast<char*>(_PREHASH_Test0), MVT_U32, 4)); +		messageTemplate.addBlock(createBlock(const_cast<char*>(_PREHASH_Test1), MVT_U32, 4));  		LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate);  		builder->addU32(_PREHASH_Test0, inTest00);  		builder->nextBlock(_PREHASH_Test0); @@ -536,15 +537,15 @@ namespace tut  		U32 inTest = 1, outTest;  		LLMessageTemplate messageTemplate = defaultTemplate();  		messageTemplate.addBlock( -			createBlock(_PREHASH_Test0, MVT_U32, 4, MBT_SINGLE)); -		messageTemplate.addBlock(createBlock(_PREHASH_Test1, MVT_U32, 4)); +			createBlock(const_cast<char*>(_PREHASH_Test0), MVT_U32, 4, MBT_SINGLE)); +		messageTemplate.addBlock(createBlock(const_cast<char*>(_PREHASH_Test1), MVT_U32, 4));  		LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate);  		builder->addU32(_PREHASH_Test0, inTest);  		LLTemplateMessageReader* reader = setReader(messageTemplate, builder);  		reader->getU32(_PREHASH_Test0, _PREHASH_Test0, outTest); -		S32 blockCount = reader->getNumberOfBlocks(_PREHASH_Test1); +		S32 blockCount = reader->getNumberOfBlocks(const_cast<char*>(_PREHASH_Test1));  		ensure_equals("Ensure block count", blockCount, 0);  		ensure_equals("Ensure Test0", inTest, outTest);  		delete reader; @@ -556,7 +557,7 @@ namespace tut  	{  		// build template  		LLMessageTemplate messageTemplate = defaultTemplate(); -		messageTemplate.addBlock(createBlock(_PREHASH_Test0, MVT_U32, 4)); +		messageTemplate.addBlock(createBlock(const_cast<char*>(_PREHASH_Test0), MVT_U32, 4));  		// build message  		LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate); @@ -881,7 +882,7 @@ namespace tut  		delete builder;  		// add block to reader template -		messageTemplate.addBlock(createBlock(_PREHASH_Test1, MVT_U32, 4, MBT_SINGLE)); +		messageTemplate.addBlock(createBlock(const_cast<char*>(_PREHASH_Test1), MVT_U32, 4, MBT_SINGLE));  		// read message value and default value  		numberMap[1] = &messageTemplate; @@ -914,7 +915,7 @@ namespace tut  		delete builder;  		// add variable block to reader template -		messageTemplate.addBlock(createBlock(_PREHASH_Test1, MVT_U32, 4)); +		messageTemplate.addBlock(createBlock(const_cast<char*>(_PREHASH_Test1), MVT_U32, 4));  		// read message value and check block repeat count  		numberMap[1] = &messageTemplate; @@ -947,7 +948,7 @@ namespace tut  		delete builder;  		// add variable block to reader template -		messageTemplate.addBlock(createBlock(_PREHASH_Test1, MVT_VARIABLE, 4,  +		messageTemplate.addBlock(createBlock(const_cast<char*>(_PREHASH_Test1), MVT_VARIABLE, 4,  											 MBT_SINGLE));  		// read message value and default string | 
