diff options
| author | Yuri Chebotarev <ychebotarev@productengine.com> | 2010-06-14 15:34:39 +0300 | 
|---|---|---|
| committer | Yuri Chebotarev <ychebotarev@productengine.com> | 2010-06-14 15:34:39 +0300 | 
| commit | 0573e7e584236a7f7092ca068a6f816bc7f18c6f (patch) | |
| tree | f044e6efb1f6368ae1ec5455acae004c5915cab7 | |
| parent | fdeb1a5c76e532ad8035963094a7fe98c998b176 (diff) | |
| parent | e96544ff266849207adfc3823adfc2dcfe42ce72 (diff) | |
merge
--HG--
branch : product-engine
86 files changed, 1270 insertions, 1817 deletions
diff --git a/indra/cmake/CARes.cmake b/indra/cmake/CARes.cmake index 8a2dc01561..1850b706ac 100644 --- a/indra/cmake/CARes.cmake +++ b/indra/cmake/CARes.cmake @@ -9,6 +9,7 @@ if (STANDALONE)    include(FindCARes)  else (STANDALONE)      use_prebuilt_binary(ares) +    add_definitions("-DCARES_STATICLIB")      if (WINDOWS)          set(CARES_LIBRARIES areslib)      elseif (DARWIN) diff --git a/indra/cmake/Copy3rdPartyLibs.cmake b/indra/cmake/Copy3rdPartyLibs.cmake index faf9da8b14..89422fbdb2 100644 --- a/indra/cmake/Copy3rdPartyLibs.cmake +++ b/indra/cmake/Copy3rdPartyLibs.cmake @@ -19,7 +19,7 @@ if(WINDOWS)      set(vivox_src_dir "${CMAKE_SOURCE_DIR}/newview/vivox-runtime/i686-win32")      set(vivox_files          SLVoice.exe -	libsndfile-1.dll +        libsndfile-1.dll          vivoxplatform.dll          vivoxsdk.dll          ortp.dll @@ -167,6 +167,7 @@ elseif(DARWIN)          libexpat.dylib          libllqtwebkit.dylib          libndofdev.dylib +        libexception_handler.dylib         )      # fmod is statically linked on darwin @@ -216,6 +217,7 @@ elseif(LINUX)          libapr-1.so.0          libaprutil-1.so.0          libatk-1.0.so +        libbreakpad_client.so.0          libcrypto.so.0.9.7          libdb-4.2.so          libexpat.so diff --git a/indra/cmake/GoogleBreakpad.cmake b/indra/cmake/GoogleBreakpad.cmake new file mode 100644 index 0000000000..8270c0fabb --- /dev/null +++ b/indra/cmake/GoogleBreakpad.cmake @@ -0,0 +1,19 @@ +# -*- cmake -*- +include(Prebuilt) + +if (STANDALONE) +  MESSAGE(FATAL_ERROR "*TODO standalone support for google breakad is unimplemented") +  # *TODO - implement this include(FindGoogleBreakpad) +else (STANDALONE) +  use_prebuilt_binary(google_breakpad) +  if (DARWIN) +    set(BREAKPAD_EXCEPTION_HANDLER_LIBRARIES exception_handler) +  endif (DARWIN) +  if (LINUX) +    set(BREAKPAD_EXCEPTION_HANDLER_LIBRARIES breakpad_client) +  endif (LINUX) +  if (WINDOWS) +    set(BREAKPAD_EXCEPTION_HANDLER_LIBRARIES exception_handler crash_generation_client common) +  endif (WINDOWS) +endif (STANDALONE) + diff --git a/indra/linux_crash_logger/llcrashloggerlinux.cpp b/indra/linux_crash_logger/llcrashloggerlinux.cpp index 039b70ec4a..ce03ea0d6f 100644 --- a/indra/linux_crash_logger/llcrashloggerlinux.cpp +++ b/indra/linux_crash_logger/llcrashloggerlinux.cpp @@ -120,7 +120,6 @@ LLCrashLoggerLinux::~LLCrashLoggerLinux(void)  void LLCrashLoggerLinux::gatherPlatformSpecificFiles()  { -	mFileMap["CrashLog"] = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"stack_trace.log").c_str();  }  bool LLCrashLoggerLinux::mainLoop() diff --git a/indra/llcommon/CMakeLists.txt b/indra/llcommon/CMakeLists.txt index 527ab42fc9..2a036df06e 100644 --- a/indra/llcommon/CMakeLists.txt +++ b/indra/llcommon/CMakeLists.txt @@ -9,6 +9,7 @@ include(Linking)  include(Boost)  include(Pth)  include(LLSharedLibs) +include(GoogleBreakpad)  include(GooglePerfTools)  include(Copy3rdPartyLibs) @@ -258,6 +259,7 @@ endif(LLCOMMON_LINK_SHARED)  target_link_libraries(      llcommon +    ${BREAKPAD_EXCEPTION_HANDLER_LIBRARIES}      ${APRUTIL_LIBRARIES}      ${APR_LIBRARIES}      ${EXPAT_LIBRARIES} diff --git a/indra/llcommon/llapp.cpp b/indra/llcommon/llapp.cpp index 6b2d1b7c20..eedec0b24e 100644 --- a/indra/llcommon/llapp.cpp +++ b/indra/llcommon/llapp.cpp @@ -30,6 +30,8 @@   * $/LicenseInfo$   */ +#include <cstdlib> +  #include "linden_common.h"  #include "llapp.h" @@ -41,8 +43,11 @@  #include "lllivefile.h"  #include "llmemory.h"  #include "llstl.h" // for DeletePointer() +#include "llstring.h"  #include "lleventtimer.h" +#include "google_breakpad/exception_handler.h" +  //  // Signal handling  // @@ -51,11 +56,22 @@  #if LL_WINDOWS  LONG WINAPI default_windows_exception_handler(struct _EXCEPTION_POINTERS *exception_infop);  BOOL ConsoleCtrlHandler(DWORD fdwCtrlType); +bool windows_post_minidump_callback(const wchar_t* dump_path, +									const wchar_t* minidump_id, +									void* context, +									EXCEPTION_POINTERS* exinfo, +									MDRawAssertionInfo* assertion, +									bool succeeded);  #else  # include <signal.h>  # include <unistd.h> // for fork()  void setup_signals();  void default_unix_signal_handler(int signum, siginfo_t *info, void *); + +// Called by breakpad exception handler after the minidump has been generated. +bool unix_post_minidump_callback(const char *dump_dir, +					  const char *minidump_id, +					  void *context, bool succeeded);  # if LL_DARWIN  /* OSX doesn't support SIGRT* */  S32 LL_SMACKDOWN_SIGNAL = SIGUSR1; @@ -81,7 +97,6 @@ BOOL LLApp::sLogInSignal = FALSE;  // static  LLApp::EAppStatus LLApp::sStatus = LLApp::APP_STATUS_STOPPED; // Keeps track of application status  LLAppErrorHandler LLApp::sErrorHandler = NULL; -LLAppErrorHandler LLApp::sSyncErrorHandler = NULL;  BOOL LLApp::sErrorThreadRunning = FALSE;  #if !LL_WINDOWS  LLApp::child_map LLApp::sChildMap; @@ -123,7 +138,12 @@ void LLApp::commonCtor()  	// Set the application to this instance.  	sApplication = this; - +	 +	mExceptionHandler = 0; +	 +	// initialize the buffer to write the minidump filename to +	// (this is used to avoid allocating memory in the crash handler) +	memset(minidump_path, 0, MAX_MINDUMP_PATH_LENGTH);  }  LLApp::LLApp(LLErrorThread *error_thread) : @@ -152,6 +172,8 @@ LLApp::~LLApp()  		delete mThreadErrorp;  		mThreadErrorp = NULL;  	} +	 +	if(mExceptionHandler != 0) delete mExceptionHandler;  	LLCommon::cleanupClass();  } @@ -262,19 +284,18 @@ void LLApp::setupErrorHandling()  	// occasionally checks to see if the app is in an error state, and sees if it needs to be run.  #if LL_WINDOWS -	// Windows doesn't have the same signal handling mechanisms as UNIX, thus APR doesn't provide -	// a signal handling thread implementation. -	// What we do is install an unhandled exception handler, which will try to do the right thing -	// in the case of an error (generate a minidump) - -	// Disable this until the viewer gets ported so server crashes can be JIT debugged. -	//LPTOP_LEVEL_EXCEPTION_FILTER prev_filter; -	//prev_filter = SetUnhandledExceptionFilter(default_windows_exception_handler); -  	// This sets a callback to handle w32 signals to the console window.  	// The viewer shouldn't be affected, sicne its a windowed app.  	SetConsoleCtrlHandler( (PHANDLER_ROUTINE) ConsoleCtrlHandler, TRUE); +	// Install the Google Breakpad crash handler for Windows +	if(mExceptionHandler == 0) +	{ +		llwarns << "adding breakpad exception handler" << llendl; +		mExceptionHandler = new google_breakpad::ExceptionHandler( +			L"C:\\Temp\\", 0, windows_post_minidump_callback, 0, google_breakpad::ExceptionHandler::HANDLER_ALL); +	} +  #else  	//  	// Start up signal handling. @@ -282,9 +303,14 @@ void LLApp::setupErrorHandling()  	// There are two different classes of signals.  Synchronous signals are delivered to a specific  	// thread, asynchronous signals can be delivered to any thread (in theory)  	// -  	setup_signals(); - +	 +	// Add google breakpad exception handler configured for Darwin/Linux. +	if(mExceptionHandler == 0) +	{ +		std::string dumpPath = "/tmp/"; +		mExceptionHandler = new google_breakpad::ExceptionHandler(dumpPath, 0, &unix_post_minidump_callback, 0, true); +	}  #endif  	startErrorThread(); @@ -310,21 +336,6 @@ void LLApp::setErrorHandler(LLAppErrorHandler handler)  	LLApp::sErrorHandler = handler;  } - -void LLApp::setSyncErrorHandler(LLAppErrorHandler handler) -{ -	LLApp::sSyncErrorHandler = handler; -} - -// static -void LLApp::runSyncErrorHandler() -{ -	if (LLApp::sSyncErrorHandler) -	{ -		LLApp::sSyncErrorHandler(); -	} -} -  // static  void LLApp::runErrorHandler()  { @@ -337,7 +348,6 @@ void LLApp::runErrorHandler()  	LLApp::setStopped();  } -  // static  void LLApp::setStatus(EAppStatus status)  { @@ -348,15 +358,27 @@ void LLApp::setStatus(EAppStatus status)  // static  void LLApp::setError()  { -	if (!isError()) -	{ -		// perform any needed synchronous error-handling -		runSyncErrorHandler(); -		// set app status to ERROR so that the LLErrorThread notices -		setStatus(APP_STATUS_ERROR); -	} +	// set app status to ERROR so that the LLErrorThread notices +	setStatus(APP_STATUS_ERROR);  } +void LLApp::setMiniDumpDir(const std::string &path) +{ +	llassert(mExceptionHandler); +#ifdef LL_WINDOWS +	wchar_t buffer[MAX_MINDUMP_PATH_LENGTH]; +	mbstowcs(buffer, path.c_str(), MAX_MINDUMP_PATH_LENGTH); +	mExceptionHandler->set_dump_path(std::wstring(buffer)); +#else +	mExceptionHandler->set_dump_path(path); +#endif +} + +void LLApp::writeMiniDump() +{ +	llassert(mExceptionHandler); +	mExceptionHandler->WriteMinidump(); +}  // static  void LLApp::setQuitting() @@ -587,6 +609,7 @@ void setup_signals()  	// Asynchronous signals that result in core  	sigaction(SIGQUIT, &act, NULL); +	  }  void clear_signals() @@ -765,4 +788,97 @@ void default_unix_signal_handler(int signum, siginfo_t *info, void *)  	}  } +bool unix_post_minidump_callback(const char *dump_dir, +					  const char *minidump_id, +					  void *context, bool succeeded) +{ +	// Copy minidump file path into fixed buffer in the app instance to avoid +	// heap allocations in a crash handler. +	 +	// path format: <dump_dir>/<minidump_id>.dmp +	int dirPathLength = strlen(dump_dir); +	int idLength = strlen(minidump_id); +	 +	// The path must not be truncated. +	llassert((dirPathLength + idLength + 5) <= LLApp::MAX_MINDUMP_PATH_LENGTH); +	 +	char * path = LLApp::instance()->getMiniDumpFilename(); +	S32 remaining = LLApp::MAX_MINDUMP_PATH_LENGTH; +	strncpy(path, dump_dir, remaining); +	remaining -= dirPathLength; +	path += dirPathLength; +	if (remaining > 0 && dirPathLength > 0 && path[-1] != '/') +	{ +		*path++ = '/'; +		--remaining; +	} +	if (remaining > 0) +	{ +		strncpy(path, minidump_id, remaining); +		remaining -= idLength; +		path += idLength; +		strncpy(path, ".dmp", remaining); +	} +	 +	llinfos << "generated minidump: " << LLApp::instance()->getMiniDumpFilename() << llendl; +	LLApp::runErrorHandler(); +	return true; +}  #endif // !WINDOWS + +#ifdef LL_WINDOWS +bool windows_post_minidump_callback(const wchar_t* dump_path, +									const wchar_t* minidump_id, +									void* context, +									EXCEPTION_POINTERS* exinfo, +									MDRawAssertionInfo* assertion, +									bool succeeded) +{ +	char * path = LLApp::instance()->getMiniDumpFilename(); +	S32 remaining = LLApp::MAX_MINDUMP_PATH_LENGTH; +	size_t bytesUsed; + +	bytesUsed = wcstombs(path, dump_path, static_cast<size_t>(remaining)); +	remaining -= bytesUsed; +	path += bytesUsed; +	if(remaining > 0 && bytesUsed > 0 && path[-1] != '\\') +	{ +		*path++ = '\\'; +		--remaining; +	} +	if(remaining > 0) +	{ +		bytesUsed = wcstombs(path, minidump_id, static_cast<size_t>(remaining)); +		remaining -= bytesUsed; +		path += bytesUsed; +	} +	if(remaining > 0) +	{ +		strncpy(path, ".dmp", remaining); +	} + +	llinfos << "generated minidump: " << LLApp::instance()->getMiniDumpFilename() << llendl; +    // *NOTE:Mani - this code is stolen from LLApp, where its never actually used. +	//OSMessageBox("Attach Debugger Now", "Error", OSMB_OK); +    // *TODO: Translate the signals/exceptions into cross-platform stuff +	// Windows implementation +	llinfos << "Entering Windows Exception Handler..." << llendl; + +	if (LLApp::isError()) +	{ +		llwarns << "Got another fatal signal while in the error handler, die now!" << llendl; +	} + +	// Flag status to error, so thread_error starts its work +	LLApp::setError(); + +	// Block in the exception handler until the app has stopped +	// This is pretty sketchy, but appears to work just fine +	while (!LLApp::isStopped()) +	{ +		ms_sleep(10); +	} + +	return true; +} +#endif diff --git a/indra/llcommon/llapp.h b/indra/llcommon/llapp.h index e5b8edf9c3..fef05a7939 100644 --- a/indra/llcommon/llapp.h +++ b/indra/llcommon/llapp.h @@ -66,6 +66,10 @@ public:  };  #endif +namespace google_breakpad { +	class ExceptionHandler; // See exception_handler.h +} +  class LL_COMMON_API LLApp : public LLOptionInterface  {  	friend class LLErrorThread; @@ -227,8 +231,20 @@ public:  	void setupErrorHandling();  	void setErrorHandler(LLAppErrorHandler handler); -	void setSyncErrorHandler(LLAppErrorHandler handler); +	static void runErrorHandler(); // run shortly after we detect an error, ran in the relatively robust context of the LLErrorThread - preferred.  	//@} +	 +	// the maximum length of the minidump filename returned by getMiniDumpFilename() +	static const U32 MAX_MINDUMP_PATH_LENGTH = 256; + +	// change the directory where Breakpad minidump files are written to +	void setMiniDumpDir(const std::string &path); + +	// Return the Google Breakpad minidump filename after a crash. +	char *getMiniDumpFilename() { return minidump_path; } + +	// Write out a Google Breakpad minidump file. +	void writeMiniDump();  #if !LL_WINDOWS  	// @@ -286,15 +302,14 @@ protected:  private:  	void startErrorThread(); -	static void runErrorHandler(); // run shortly after we detect an error, ran in the relatively robust context of the LLErrorThread - preferred. -	static void runSyncErrorHandler(); // run IMMEDIATELY when we get an error, ran in the context of the faulting thread. +	// Contains the filename of the minidump file after a crash. +	char minidump_path[MAX_MINDUMP_PATH_LENGTH];  	// *NOTE: On Windows, we need a routine to reset the structured  	// exception handler when some evil driver has taken it over for  	// their own purposes  	typedef int(*signal_handler_func)(int signum);  	static LLAppErrorHandler sErrorHandler; -	static LLAppErrorHandler sSyncErrorHandler;  	// Default application threads  	LLErrorThread* mThreadErrorp;		// Waits for app to go to status ERROR, then runs the error callback @@ -315,6 +330,8 @@ private:  private:  	// the static application instance if it was created.  	static LLApp* sApplication; +	 +	google_breakpad::ExceptionHandler * mExceptionHandler;  #if !LL_WINDOWS diff --git a/indra/llcommon/llversionserver.h b/indra/llcommon/llversionserver.h index e3663544db..87fe7001e0 100644 --- a/indra/llcommon/llversionserver.h +++ b/indra/llcommon/llversionserver.h @@ -33,10 +33,10 @@  #ifndef LL_LLVERSIONSERVER_H  #define LL_LLVERSIONSERVER_H -const S32 LL_VERSION_MAJOR = 1; -const S32 LL_VERSION_MINOR = 31; +const S32 LL_VERSION_MAJOR = 2; +const S32 LL_VERSION_MINOR = 1;  const S32 LL_VERSION_PATCH = 0; -const S32 LL_VERSION_BUILD = 203110; +const S32 LL_VERSION_BUILD = 0;  const char * const LL_CHANNEL = "Second Life Server"; diff --git a/indra/llcommon/llversionviewer.h b/indra/llcommon/llversionviewer.h index fc3ce6df7e..6e341b83a1 100644 --- a/indra/llcommon/llversionviewer.h +++ b/indra/llcommon/llversionviewer.h @@ -34,8 +34,8 @@  #define LL_LLVERSIONVIEWER_H  const S32 LL_VERSION_MAJOR = 2; -const S32 LL_VERSION_MINOR = 0; -const S32 LL_VERSION_PATCH = 2; +const S32 LL_VERSION_MINOR = 1; +const S32 LL_VERSION_PATCH = 0;  const S32 LL_VERSION_BUILD = 0;  const char * const LL_CHANNEL = "Second Life Developer"; diff --git a/indra/llcrashlogger/llcrashlogger.cpp b/indra/llcrashlogger/llcrashlogger.cpp index c1022c1195..51e5f14bfe 100755 --- a/indra/llcrashlogger/llcrashlogger.cpp +++ b/indra/llcrashlogger/llcrashlogger.cpp @@ -155,25 +155,6 @@ std::string getStartupStateFromLog(std::string& sllog)  void LLCrashLogger::gatherFiles()  { - -	/* -	//TODO:This function needs to be reimplemented somewhere in here... -	if(!previous_crash && is_crash_log) -	{ -		// Make sure the file isn't too old. -		double age = difftime(gLaunchTime, stat_data.st_mtimespec.tv_sec); -		 -		//			llinfos << "age is " << age << llendl; -		 -		if(age > 60.0) -		{ -				// The file was last modified more than 60 seconds before the crash reporter was launched.  Assume it's stale. -			llwarns << "File " << mFilename << " is too old!" << llendl; -			return; -		} -	} -	*/ -  	updateApplication("Gathering logs...");  	// Figure out the filename of the debug log @@ -209,11 +190,9 @@ void LLCrashLogger::gatherFiles()  		mFileMap["SettingsXml"] = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS,"settings.xml");  	} -#if !LL_DARWIN  	if(mCrashInPreviousExec) -#else -#endif  	{ +		// Restarting after freeze.  		// Replace the log file ext with .old, since the   		// instance that launched this process has overwritten  		// SecondLife.log @@ -225,7 +204,12 @@ void LLCrashLogger::gatherFiles()  	gatherPlatformSpecificFiles();  	//Use the debug log to reconstruct the URL to send the crash report to -	if(mDebugLog.has("CurrentSimHost")) +	if(mDebugLog.has("CrashHostUrl")) +	{ +		// Crash log receiver has been manually configured. +		mCrashHost = mDebugLog["CrashHostUrl"].asString(); +	} +	else if(mDebugLog.has("CurrentSimHost"))  	{  		mCrashHost = "https://";  		mCrashHost += mDebugLog["CurrentSimHost"].asString(); @@ -247,7 +231,6 @@ void LLCrashLogger::gatherFiles()  	mCrashInfo["DebugLog"] = mDebugLog;  	mFileMap["StatsLog"] = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"stats.log"); -	mFileMap["StackTrace"] = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"stack_trace.log");  	updateApplication("Encoding files..."); @@ -272,8 +255,30 @@ void LLCrashLogger::gatherFiles()  			trimSLLog(crash_info);  		} -		mCrashInfo[(*itr).first] = rawstr_to_utf8(crash_info); +		mCrashInfo[(*itr).first] = LLStringFn::strip_invalid_xml(rawstr_to_utf8(crash_info)); +	} +	 +	// Add minidump as binary. +	std::string minidump_path = mDebugLog["MinidumpPath"]; +	if(minidump_path != "") +	{ +		std::ifstream minidump_stream(minidump_path.c_str(), std::ios_base::in | std::ios_base::binary); +		if(minidump_stream.is_open()) +		{ +			minidump_stream.seekg(0, std::ios::end); +			size_t length = minidump_stream.tellg(); +			minidump_stream.seekg(0, std::ios::beg); +			 +			LLSD::Binary data; +			data.resize(length); +			 +			minidump_stream.read(reinterpret_cast<char *>(&(data[0])),length); +			minidump_stream.close(); +			 +			mCrashInfo["Minidump"] = data; +		}  	} +	mCrashInfo["DebugLog"].erase("MinidumpPath");  }  LLSD LLCrashLogger::constructPostData() diff --git a/indra/llmessage/llares.cpp b/indra/llmessage/llares.cpp index 00e77d20e9..78561b37aa 100644 --- a/indra/llmessage/llares.cpp +++ b/indra/llmessage/llares.cpp @@ -473,7 +473,7 @@ bool LLAres::process(U64 timeout)  		ll_init_apr();  	} -	int socks[ARES_GETSOCK_MAXNUM]; +	ares_socket_t socks[ARES_GETSOCK_MAXNUM];  	apr_pollfd_t aprFds[ARES_GETSOCK_MAXNUM];  	apr_int32_t nsds = 0;	  	int nactive = 0; diff --git a/indra/mac_crash_logger/llcrashloggermac.cpp b/indra/mac_crash_logger/llcrashloggermac.cpp index 16efa4fe2c..90de39ba27 100644 --- a/indra/mac_crash_logger/llcrashloggermac.cpp +++ b/indra/mac_crash_logger/llcrashloggermac.cpp @@ -211,89 +211,6 @@ bool LLCrashLoggerMac::init(void)  void LLCrashLoggerMac::gatherPlatformSpecificFiles()  {  	updateApplication("Gathering hardware information..."); -	char path[MAX_PATH];		 -	FSRef folder; -	 -	if(FSFindFolder(kUserDomain, kLogsFolderType, false, &folder) == noErr) -	{ -		// folder is an FSRef to ~/Library/Logs/ -		if(FSRefMakePath(&folder, (UInt8*)&path, sizeof(path)) == noErr) -		{ -			struct stat dw_stat; -			std::string mBuf; -			bool isLeopard = false; -			// Try the 10.3 path first... -			std::string dw_file_name = std::string(path) + std::string("/CrashReporter/Second Life.crash.log"); -			int res = stat(dw_file_name.c_str(), &dw_stat); - -			if (res) -			{ -				// Try the 10.2 one next... -				dw_file_name = std::string(path) + std::string("/Second Life.crash.log"); -				res = stat(dw_file_name.c_str(), &dw_stat); -			} -	 -			if(res) -			{ -				//10.5: Like 10.3+, except it puts the crash time in the file instead of dividing it up -				//using asterisks. Get a directory listing, search for files starting with second life, -				//use the last one found. -				std::string old_file_name, current_file_name, pathname, mask; -				pathname = std::string(path) + std::string("/CrashReporter/"); -				mask = "Second Life*"; -				while(gDirUtilp->getNextFileInDir(pathname, mask, current_file_name, false)) -				{ -					old_file_name = current_file_name; -				} -				if(old_file_name != "") -				{ -					dw_file_name = pathname + old_file_name; -					res=stat(dw_file_name.c_str(), &dw_stat); -					isLeopard = true; -				} -			} -			 -			if (!res) -			{ -				std::ifstream fp(dw_file_name.c_str()); -				std::stringstream str; -				if(!fp.is_open()) return; -				str << fp.rdbuf(); -				mBuf = str.str(); -				 -				if(!isLeopard) -				{ -					// Crash logs consist of a number of entries, one per crash. -					// Each entry is preceeded by "**********" on a line by itself. -					// We want only the most recent (i.e. last) one. -					const char *sep = "**********"; -					const char *start = mBuf.c_str(); -					const char *cur = start; -					const char *temp = strstr(cur, sep); -				 -					while(temp != NULL) -					{ -						// Skip past the marker we just found -						cur = temp + strlen(sep);		/* Flawfinder: ignore */ -						 -						// and try to find another -						temp = strstr(cur, sep); -					} -				 -					// If there's more than one entry in the log file, strip all but the last one. -					if(cur != start) -					{ -						mBuf.erase(0, cur - start); -					} -				} -				mCrashInfo["CrashLog"] = mBuf; -			} -			else -			{ -				llwarns << "Couldn't find any CrashReporter files..." << llendl; -			} -		} -	}  }  bool LLCrashLoggerMac::mainLoop() diff --git a/indra/media_plugins/gstreamer010/media_plugin_gstreamer010.cpp b/indra/media_plugins/gstreamer010/media_plugin_gstreamer010.cpp index 033c4ba2f3..e6d2ad3edc 100644 --- a/indra/media_plugins/gstreamer010/media_plugin_gstreamer010.cpp +++ b/indra/media_plugins/gstreamer010/media_plugin_gstreamer010.cpp @@ -544,8 +544,12 @@ MediaPluginGStreamer010::pause()  {  	DEBUGMSG("pausing media...");  	// todo: error-check this? -	llgst_element_set_state(mPlaybin, GST_STATE_PAUSED); -	return true; +	if (mDoneInit && mPlaybin) +	{ +		llgst_element_set_state(mPlaybin, GST_STATE_PAUSED); +		return true; +	} +	return false;  }  bool @@ -553,8 +557,12 @@ MediaPluginGStreamer010::stop()  {  	DEBUGMSG("stopping media...");  	// todo: error-check this? -	llgst_element_set_state(mPlaybin, GST_STATE_READY); -	return true; +	if (mDoneInit && mPlaybin) +	{ +		llgst_element_set_state(mPlaybin, GST_STATE_READY); +		return true; +	} +	return false;  }  bool @@ -564,8 +572,12 @@ MediaPluginGStreamer010::play(double rate)          DEBUGMSG("playing media... rate=%f", rate);  	// todo: error-check this? -	llgst_element_set_state(mPlaybin, GST_STATE_PLAYING); -	return true; +	if (mDoneInit && mPlaybin) +	{ +		llgst_element_set_state(mPlaybin, GST_STATE_PLAYING); +		return true; +	} +	return false;  }  bool @@ -608,7 +620,7 @@ bool  MediaPluginGStreamer010::getTimePos(double &sec_out)  {  	bool got_position = false; -	if (mPlaybin) +	if (mDoneInit && mPlaybin)  	{  		gint64 pos;  		GstFormat timefmt = GST_FORMAT_TIME; @@ -688,6 +700,7 @@ MediaPluginGStreamer010::load()  					   this);  	llgst_object_unref (bus); +#if 0 // not quite stable/correct yet  	// get a visualizer element (bonus feature!)  	char* vis_name = getenv("LL_GST_VIS_NAME");  	if (!vis_name || @@ -714,6 +727,7 @@ MediaPluginGStreamer010::load()  			}  		}  	} +#endif  	if (NULL == getenv("LL_GSTREAMER_EXTERNAL")) {  		// instantiate a custom video sink diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 3c98cd5b85..53c6369534 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -1072,7 +1072,6 @@ set(viewer_HEADER_FILES      llwearabletype.h      llweb.h      llwind.h -    llwindebug.h      llwlanimator.h      llwldaycycle.h      llwlparammanager.h @@ -1146,12 +1145,10 @@ endif (LINUX)  if (WINDOWS)      list(APPEND viewer_SOURCE_FILES           llappviewerwin32.cpp -         llwindebug.cpp           )      list(APPEND viewer_HEADER_FILES           llappviewerwin32.h -         llwindebug.h           )      # precompiled header configuration @@ -1708,6 +1705,29 @@ if (LINUX)      add_dependencies(package linux-updater-target)      check_message_template(package)    endif (NOT INSTALL) + +  add_custom_command( +    OUTPUT  ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/.${product}.copy_touched +    COMMAND ${PYTHON_EXECUTABLE} +    ARGS +      ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py +      --arch=${ARCH} +      --actions=copy +      --artwork=${ARTWORK_DIR} +      --build=${CMAKE_CURRENT_BINARY_DIR} +      --buildtype=${CMAKE_BUILD_TYPE} +      --configuration=${CMAKE_CFG_INTDIR} +      --dest=${CMAKE_CURRENT_BINARY_DIR}/packaged +      --grid=${GRID} +      --source=${CMAKE_CURRENT_SOURCE_DIR} +    DEPENDS  +      ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py +      ${COPY_INPUT_DEPENDENCIES} +    COMMENT "Performing viewer_manifest copy" +    ) +     +  add_custom_target(copy_l_viewer_manifest ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/.${product}.copy_touched)  +  add_dependencies(copy_l_viewer_manifest "${VIEWER_BINARY_NAME}" linux-crash-logger-target linux-updater-target)  endif (LINUX)  if (DARWIN) @@ -1742,12 +1762,11 @@ if (DARWIN)      DEPENDS ${VIEWER_BINARY_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py      ) -  add_dependencies(${VIEWER_BINARY_NAME} SLPlugin media_plugin_quicktime media_plugin_webkit) +  add_dependencies(${VIEWER_BINARY_NAME} SLPlugin media_plugin_quicktime media_plugin_webkit mac-updater mac-crash-logger)    if (PACKAGE)        add_custom_target(package ALL DEPENDS ${VIEWER_BINARY_NAME})         check_message_template(package) -      add_dependencies(package mac-updater mac-crash-logger)        add_custom_command(          TARGET package POST_BUILD @@ -1795,6 +1814,45 @@ if (INSTALL)    include(${CMAKE_CURRENT_SOURCE_DIR}/ViewerInstall.cmake)  endif (INSTALL) +if (PACKAGE) +  if (WINDOWS) +    set(VIEWER_DIST_DIR "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}") +    set(VIEWER_SYMBOL_FILE "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/secondlife-symbols-windows.tar.bz2") +    set(VIEWER_EXE_GLOBS "${VIEWER_BINARY_NAME}${CMAKE_EXECUTABLE_SUFFIX} slplugin.exe") +    set(VIEWER_LIB_GLOB "*${CMAKE_SHARED_MODULE_SUFFIX}") +    set(VIEWER_COPY_MANIFEST copy_w_viewer_manifest) +  endif (WINDOWS) +  if (DARWIN) +    set(VIEWER_DIST_DIR "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/${product}.app") +    set(VIEWER_SYMBOL_FILE "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/secondlife-symbols-darwin.tar.bz2") +    set(VIEWER_EXE_GLOBS "'Second Life' SLPlugin") +    set(VIEWER_LIB_GLOB "*.dylib") +  endif (DARWIN) +  if (LINUX) +    set(VIEWER_DIST_DIR "${CMAKE_CURRENT_BINARY_DIR}/packaged") +    set(VIEWER_SYMBOL_FILE "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/secondlife-symbols-linux.tar.bz2") +    set(VIEWER_EXE_GLOBS "do-not-directly-run-secondlife-bin SLPlugin") +    set(VIEWER_LIB_GLOB "*${CMAKE_SHARED_MODULE_SUFFIX}*") +    set(VIEWER_COPY_MANIFEST copy_l_viewer_manifest) +  endif (LINUX) + +  add_custom_command(OUTPUT "${VIEWER_SYMBOL_FILE}" +    COMMAND "${PYTHON_EXECUTABLE}" +    ARGS +      "${CMAKE_CURRENT_SOURCE_DIR}/generate_breakpad_symbols.py" +      "${VIEWER_DIST_DIR}" +      "${VIEWER_EXE_GLOBS}" +      "${VIEWER_LIB_GLOB}" +      "${LIBS_PREBUILT_DIR}/${LL_ARCH_DIR}/bin/dump_syms" +      "${VIEWER_SYMBOL_FILE}" +    DEPENDS generate_breakpad_symbols.py +    VERBATIM +  ) +  add_custom_target(generate_breakpad_symbols ALL DEPENDS "${VIEWER_SYMBOL_FILE}") +  add_dependencies(generate_breakpad_symbols "${VIEWER_BINARY_NAME}" "${VIEWER_COPY_MANIFEST}") +  add_dependencies(package generate_breakpad_symbols) +endif (PACKAGE) +  if (LL_TESTS)    # To add a viewer unit test, just add the test .cpp file below    # This creates a separate test project per file listed. diff --git a/indra/newview/English.lproj/InfoPlist.strings b/indra/newview/English.lproj/InfoPlist.strings index 4831dc7273..fc531f93d4 100644 --- a/indra/newview/English.lproj/InfoPlist.strings +++ b/indra/newview/English.lproj/InfoPlist.strings @@ -2,6 +2,6 @@  CFBundleName = "Second Life"; -CFBundleShortVersionString = "Second Life version 2.0.2.0"; -CFBundleGetInfoString = "Second Life version 2.0.2.0, Copyright 2004-2009 Linden Research, Inc."; +CFBundleShortVersionString = "Second Life version 2.1.0.0"; +CFBundleGetInfoString = "Second Life version 2.1.0.0, Copyright 2004-2009 Linden Research, Inc."; diff --git a/indra/newview/Info-SecondLife.plist b/indra/newview/Info-SecondLife.plist index fa2adac10c..97e24a0bd5 100644 --- a/indra/newview/Info-SecondLife.plist +++ b/indra/newview/Info-SecondLife.plist @@ -60,7 +60,7 @@  		</dict>  	</array>  	<key>CFBundleVersion</key> -	<string>2.0.2.0</string> +	<string>2.1.0.0</string>  	<key>CSResourcesFileMapped</key>  	<true/>  </dict> diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index d4aebe6cb1..4506ee6e0c 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -1,6 +1,17 @@  <?xml version="1.0" ?>  <llsd>  <map> +	<key>CrashHostUrl</key> +    <map> +      <key>Comment</key> +      <string>A URL pointing to a crash report handler; overrides cluster negotiation to locate crash handler.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string /> +    </map>      <key>AFKTimeout</key>      <map>        <key>Comment</key> diff --git a/indra/newview/generate_breakpad_symbols.py b/indra/newview/generate_breakpad_symbols.py new file mode 100644 index 0000000000..1f42004bb7 --- /dev/null +++ b/indra/newview/generate_breakpad_symbols.py @@ -0,0 +1,135 @@ +#!/usr/bin/env python +# @file generate_breakpad_symbols.py +# @author Brad Kittenbrink <brad@lindenlab.com> +# @brief Simple tool for generating google_breakpad symbol information +#        for the crash reporter. +# +# $LicenseInfo:firstyear=2010&license=viewergpl$ +#  +# Copyright (c) 2010-2010, Linden Research, Inc. +#  +# Second Life Viewer Source Code +# The source code in this file ("Source Code") is provided by Linden Lab +# to you under the terms of the GNU General Public License, version 2.0 +# ("GPL"), unless you have obtained a separate licensing agreement +# ("Other License"), formally executed by you and Linden Lab.  Terms of +# the GPL can be found in doc/GPL-license.txt in this distribution, or +# online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 +#  +# There are special exceptions to the terms and conditions of the GPL as +# it is applied to this Source Code. View the full text of the exception +# in the file doc/FLOSS-exception.txt in this software distribution, or +# online at +# http://secondlifegrid.net/programs/open_source/licensing/flossexception +#  +# By copying, modifying or distributing this software, you acknowledge +# that you have read and understood your obligations described above, +# and agree to abide by those obligations. +#  +# ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO +# WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, +# COMPLETENESS OR PERFORMANCE. +# $/LicenseInfo$ + + +import collections +import fnmatch +import itertools +import operator +import os +import sys +import shlex +import subprocess +import tarfile +import StringIO + +def usage(): +    print >>sys.stderr, "usage: %s viewer_dir viewer_exes libs_suffix dump_syms_tool viewer_symbol_file" % sys.argv[0] + +class MissingModuleError(Exception): +    def __init__(self, modules): +        Exception.__init__(self, "Failed to find required modules: %r" % modules) +        self.modules = modules + +def main(viewer_dir, viewer_exes, libs_suffix, dump_syms_tool, viewer_symbol_file): +    print "generate_breakpad_symbols run with args: %s" % str((viewer_dir, viewer_exes, libs_suffix, dump_syms_tool, viewer_symbol_file)) + +    # split up list of viewer_exes +    # "'Second Life' SLPlugin" becomes ['Second Life', 'SLPlugin'] +    viewer_exes = shlex.split(viewer_exes) + +    found_required = dict([(module, False) for module in viewer_exes]) + +    def matches(f): +        if f in viewer_exes: +            found_required[f] = True +            return True +        return fnmatch.fnmatch(f, libs_suffix) + +    def list_files(): +        for (dirname, subdirs, filenames) in os.walk(viewer_dir): +            #print "scanning '%s' for modules..." % dirname +            for f in itertools.ifilter(matches, filenames): +                yield os.path.join(dirname, f) + +    def dump_module(m): +        print "dumping module '%s' with '%s'..." % (m, dump_syms_tool) +        child = subprocess.Popen([dump_syms_tool, m] , stdout=subprocess.PIPE) +        out, err = child.communicate() +        return (m,child.returncode, out, err) + +    out = tarfile.open(viewer_symbol_file, 'w:bz2') + +    for (filename,status,symbols,err) in itertools.imap(dump_module, list_files()): +        if status == 0: +            module_line = symbols[:symbols.index('\n')] +            module_line = module_line.split() +            hash_id = module_line[3] +            module = ' '.join(module_line[4:]) +            if sys.platform in ['win32', 'cygwin']: +                mod_name = module[:module.rindex('.pdb')] +            else: +                mod_name = module +            symbolfile = StringIO.StringIO(symbols) +            info = tarfile.TarInfo("%(module)s/%(hash_id)s/%(mod_name)s.sym" % dict(module=module, hash_id=hash_id, mod_name=mod_name)) +            info.size = symbolfile.len +            out.addfile(info, symbolfile) +        else: +            print >>sys.stderr, "warning: failed to dump symbols for '%s': %s" % (filename, err) + +    out.close() + +    missing_modules = [m for (m,_) in +        itertools.ifilter(lambda (k,v): not v, found_required.iteritems()) +    ] +    if missing_modules: +        print >> sys.stderr, "failed to generate %s" % viewer_symbol_file +        os.remove(viewer_symbol_file) +        raise MissingModuleError(missing_modules) + +    symbols = tarfile.open(viewer_symbol_file, 'r:bz2') +    tarfile_members = symbols.getnames() +    symbols.close() + +    for required_module in viewer_exes: +        def match_module_basename(m): +            return os.path.splitext(required_module)[0].lower() \ +                   == os.path.splitext(os.path.basename(m))[0].lower() +        # there must be at least one .sym file in tarfile_members that matches +        # each required module (ignoring file extensions) +        if not reduce(operator.or_, itertools.imap(match_module_basename, tarfile_members)): +            print >> sys.stderr, "failed to find required %s in generated %s" \ +                    % (required_module, viewer_symbol_file) +            os.remove(viewer_symbol_file) +            raise MissingModuleError([required_module]) + +    print "successfully generated %s including required modules '%s'" % (viewer_symbol_file, viewer_exes) + +    return 0 + +if __name__ == "__main__": +    if len(sys.argv) != 6: +        usage() +        sys.exit(1) +    sys.exit(main(*sys.argv[1:])) + diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 82bd59d25c..f4004d5664 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -103,8 +103,8 @@  // Third party library includes  #include <boost/bind.hpp> +  #if LL_WINDOWS -	#include "llwindebug.h"  #	include <share.h> // For _SH_DENYWR in initMarkerFile  #else  #   include <sys/file.h> // For initMarkerFile support @@ -599,6 +599,11 @@ bool LLAppViewer::init()  	if (!initConfiguration())  		return false; +	// write Google Breakpad minidump files to our log directory +	std::string logdir = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, ""); +	logdir += gDirUtilp->getDirDelimiter(); +	setMiniDumpDir(logdir); +  	// Although initLogging() is the right place to mess with  	// setFatalFunction(), we can't query gSavedSettings until after  	// initConfiguration(). @@ -1239,6 +1244,14 @@ bool LLAppViewer::cleanup()  	// workaround for DEV-35406 crash on shutdown  	LLEventPumps::instance().reset(); +	// remove any old breakpad minidump files from the log directory +	if (! isError()) +	{ +		std::string logdir = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, ""); +		logdir += gDirUtilp->getDirDelimiter(); +		gDirUtilp->deleteFilesInDir(logdir, "*-*-*-*-*.dmp"); +	} +  	// *TODO - generalize this and move DSO wrangling to a helper class -brad  	std::set<struct apr_dso_handle_t *>::const_iterator i;  	for(i = mPlugins.begin(); i != mPlugins.end(); ++i) @@ -2295,17 +2308,7 @@ void LLAppViewer::checkForCrash(void)  {  #if LL_SEND_CRASH_REPORTS -	//*NOTE:Mani The current state of the crash handler has the MacOSX -	// sending all crash reports as freezes, in order to let  -	// the MacOSX CrashRepoter generate stacks before spawning the  -	// SL crash logger. -	// The Linux and Windows clients generate their own stacks and -	// spawn the SL crash logger immediately. This may change in the future.  -#if LL_DARWIN -	if(gLastExecEvent != LAST_EXEC_NORMAL) -#else		  	if (gLastExecEvent == LAST_EXEC_FROZE) -#endif      {          llinfos << "Last execution froze, requesting to send crash report." << llendl;          // @@ -2515,6 +2518,15 @@ void LLAppViewer::writeSystemInfo()  	// If the crash is handled by LLAppViewer::handleViewerCrash, ie not a freeze,  	// then the value of "CrashNotHandled" will be set to true.  	gDebugInfo["CrashNotHandled"] = (LLSD::Boolean)true; + +	// Insert crash host url (url to post crash log to) if configured. This insures +	// that the crash report will go to the proper location in the case of a  +	// prior freeze. +	std::string crashHostUrl = gSavedSettings.get<std::string>("CrashHostUrl"); +	if(crashHostUrl != "") +	{ +		gDebugInfo["CrashHostUrl"] = crashHostUrl; +	}  	// Dump some debugging info  	LL_INFOS("SystemInfo") << LLTrans::getString("APP_NAME") @@ -2536,13 +2548,6 @@ void LLAppViewer::writeSystemInfo()  	writeDebugInfo(); // Save out debug_info.log early, in case of crash.  } -void LLAppViewer::handleSyncViewerCrash() -{ -	LLAppViewer* pApp = LLAppViewer::instance(); -	// Call to pure virtual, handled by platform specific llappviewer instance. -	pApp->handleSyncCrashTrace();  -} -  void LLAppViewer::handleViewerCrash()  {  	llinfos << "Handle viewer crash entry." << llendl; @@ -2566,9 +2571,13 @@ void LLAppViewer::handleViewerCrash()  		return;  	}  	pApp->mReportedCrash = TRUE; - -	// Make sure the watchdog gets turned off... -// 	pApp->destroyMainloopTimeout(); // SJB: Bah. This causes the crash handler to hang, not sure why. +	 +	// Insert crash host url (url to post crash log to) if configured. +	std::string crashHostUrl = gSavedSettings.get<std::string>("CrashHostUrl"); +	if(crashHostUrl != "") +	{ +		gDebugInfo["CrashHostUrl"] = crashHostUrl; +	}  	//We already do this in writeSystemInfo(), but we do it again here to make /sure/ we have a version  	//to check against no matter what @@ -2600,6 +2609,12 @@ void LLAppViewer::handleViewerCrash()  	gDebugInfo["FirstLogin"] = (LLSD::Boolean) gAgent.isFirstLogin();  	gDebugInfo["FirstRunThisInstall"] = gSavedSettings.getBOOL("FirstRunThisInstall"); +	char *minidump_file = pApp->getMiniDumpFilename(); +	if(minidump_file && minidump_file[0] != 0) +	{ +		gDebugInfo["MinidumpPath"] = minidump_file; +	} +	  	if(gLogoutInProgress)  	{  		gDebugInfo["LastExecEvent"] = LAST_EXEC_LOGOUT_CRASH; @@ -2677,10 +2692,6 @@ void LLAppViewer::handleViewerCrash()  	LLError::logToFile(""); -// On Mac, we send the report on the next run, since we need macs crash report -// for a stack trace, so we have to let it the app fail. -#if !LL_DARWIN -  	// Remove the marker file, since otherwise we'll spawn a process that'll keep it locked  	if(gDebugInfo["LastExecEvent"].asInteger() == LAST_EXEC_LOGOUT_CRASH)  	{ @@ -2693,8 +2704,6 @@ void LLAppViewer::handleViewerCrash()  	// Call to pure virtual, handled by platform specific llappviewer instance.  	pApp->handleCrashReporting();  - -#endif //!LL_DARWIN  	return;  } @@ -3338,13 +3347,6 @@ void LLAppViewer::badNetworkHandler()  	mPurgeOnExit = TRUE; -#if LL_WINDOWS -	// Generates the minidump. -	LLWinDebug::generateCrashStacks(NULL); -#endif -	LLAppViewer::handleSyncViewerCrash(); -	LLAppViewer::handleViewerCrash(); -  	std::ostringstream message;  	message <<  		"The viewer has detected mangled network data indicative\n" @@ -3357,6 +3359,8 @@ void LLAppViewer::badNetworkHandler()  		"If the problem continues, see the Tech Support FAQ at: \n"  		"www.secondlife.com/support";  	forceDisconnect(message.str()); +	 +	LLApp::instance()->writeMiniDump();  }  // This routine may get called more than once during the shutdown process. diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h index 5acd6e11c4..0b862a92a1 100644 --- a/indra/newview/llappviewer.h +++ b/indra/newview/llappviewer.h @@ -92,9 +92,7 @@ public:  	virtual bool restoreErrorTrap() = 0; // Require platform specific override to reset error handling mechanism.  	                                     // return false if the error trap needed restoration.  	virtual void handleCrashReporting(bool reportFreeze = false) = 0; // What to do with crash report? -	virtual void handleSyncCrashTrace() = 0; // any low-level crash-prep that has to happen in the context of the crashing thread before the crash report is delivered.  	static void handleViewerCrash(); // Hey! The viewer crashed. Do this, soon. -	static void handleSyncViewerCrash(); // Hey! The viewer crashed. Do this right NOW in the context of the crashing thread.      void checkForCrash();  	// Thread accessors diff --git a/indra/newview/llappviewerlinux.cpp b/indra/newview/llappviewerlinux.cpp index 78b0f7ba83..78afdc8995 100644 --- a/indra/newview/llappviewerlinux.cpp +++ b/indra/newview/llappviewerlinux.cpp @@ -46,23 +46,6 @@  #include <exception> -#if LL_LINUX -# include <dlfcn.h>		// RTLD_LAZY -# include <execinfo.h>  // backtrace - glibc only -#elif LL_SOLARIS -# include <sys/types.h> -# include <unistd.h> -# include <fcntl.h> -# include <ucontext.h> -#endif - -#ifdef LL_ELFBIN -# ifdef __GNUC__ -#  include <cxxabi.h>			// for symbol demangling -# endif -# include "ELFIO/ELFIO.h"		// for better backtraces -#endif -  #if LL_DBUS_ENABLED  # include "llappviewerlinux_api_dbus.h" @@ -86,7 +69,6 @@ static void exceptionTerminateHandler()  	// reinstall default terminate() handler in case we re-terminate.  	if (gOldTerminateHandler) std::set_terminate(gOldTerminateHandler);  	// treat this like a regular viewer crash, with nice stacktrace etc. -	LLAppViewer::handleSyncViewerCrash();  	LLAppViewer::handleViewerCrash();  	// we've probably been killed-off before now, but...  	gOldTerminateHandler(); // call old terminate() handler @@ -109,7 +91,6 @@ int main( int argc, char **argv )  	gOldTerminateHandler = std::set_terminate(exceptionTerminateHandler);  	// install crash handlers  	viewer_app_ptr->setErrorHandler(LLAppViewer::handleViewerCrash); -	viewer_app_ptr->setSyncErrorHandler(LLAppViewer::handleSyncViewerCrash);  	bool ok = viewer_app_ptr->init();  	if(!ok) @@ -138,201 +119,6 @@ int main( int argc, char **argv )  	return 0;  } -#ifdef LL_SOLARIS -static inline BOOL do_basic_glibc_backtrace() -{ -	BOOL success = FALSE; - -	std::string strace_filename = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"stack_trace.log"); -	llinfos << "Opening stack trace file " << strace_filename << llendl; -	LLFILE* StraceFile = LLFile::fopen(strace_filename, "w"); -	if (!StraceFile) -	{ -		llinfos << "Opening stack trace file " << strace_filename << " failed. Using stderr." << llendl; -		StraceFile = stderr; -	} - -	printstack(fileno(StraceFile)); - -	if (StraceFile != stderr) -		fclose(StraceFile); - -	return success; -} -#else -#define MAX_STACK_TRACE_DEPTH 40 -// This uses glibc's basic built-in stack-trace functions for a not very -// amazing backtrace. -static inline BOOL do_basic_glibc_backtrace() -{ -	void *stackarray[MAX_STACK_TRACE_DEPTH]; -	size_t size; -	char **strings; -	size_t i; -	BOOL success = FALSE; - -	size = backtrace(stackarray, MAX_STACK_TRACE_DEPTH); -	strings = backtrace_symbols(stackarray, size); - -	std::string strace_filename = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"stack_trace.log"); -	llinfos << "Opening stack trace file " << strace_filename << llendl; -	LLFILE* StraceFile = LLFile::fopen(strace_filename, "w");		// Flawfinder: ignore -        if (!StraceFile) -	{ -		llinfos << "Opening stack trace file " << strace_filename << " failed. Using stderr." << llendl; -		StraceFile = stderr; -	} - -	if (size) -	{ -		for (i = 0; i < size; i++) -		{ -			// the format of the StraceFile is very specific, to allow (kludgy) machine-parsing -			fprintf(StraceFile, "%-3lu ", (unsigned long)i); -			fprintf(StraceFile, "%-32s\t", "unknown"); -			fprintf(StraceFile, "%p ", stackarray[i]); -			fprintf(StraceFile, "%s\n", strings[i]); -		} - -		success = TRUE; -	} -	 -	if (StraceFile != stderr) -		fclose(StraceFile); - -	free (strings); -	return success; -} - -#if LL_ELFBIN -// This uses glibc's basic built-in stack-trace functions together with -// ELFIO's ability to parse the .symtab ELF section for better symbol -// extraction without exporting symbols (which'd cause subtle, fatal bugs). -static inline BOOL do_elfio_glibc_backtrace() -{ -	void *stackarray[MAX_STACK_TRACE_DEPTH]; -	size_t btsize; -	char **strings; -	BOOL success = FALSE; - -	std::string appfilename = gDirUtilp->getExecutablePathAndName(); - -	std::string strace_filename = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"stack_trace.log"); -	llinfos << "Opening stack trace file " << strace_filename << llendl; -	LLFILE* StraceFile = LLFile::fopen(strace_filename, "w");		// Flawfinder: ignore -        if (!StraceFile) -	{ -		llinfos << "Opening stack trace file " << strace_filename << " failed. Using stderr." << llendl; -		StraceFile = stderr; -	} - -	// get backtrace address list and basic symbol info -	btsize = backtrace(stackarray, MAX_STACK_TRACE_DEPTH); -	strings = backtrace_symbols(stackarray, btsize); - -	// create ELF reader for our app binary -	IELFI* pReader; -	const IELFISection* pSec = NULL; -	IELFISymbolTable* pSymTbl = 0; -	if (ERR_ELFIO_NO_ERROR != ELFIO::GetInstance()->CreateELFI(&pReader) || -	    ERR_ELFIO_NO_ERROR != pReader->Load(appfilename.c_str()) || -	    // find symbol table, create reader-object -	    NULL == (pSec = pReader->GetSection( ".symtab" )) || -	    ERR_ELFIO_NO_ERROR != pReader->CreateSectionReader(IELFI::ELFI_SYMBOL, pSec, (void**)&pSymTbl) ) -	{ -		// Failed to open our binary and read its symbol table somehow -		llinfos << "Could not initialize ELF symbol reading - doing basic backtrace." << llendl; -		if (StraceFile != stderr) -			fclose(StraceFile); -		// note that we may be leaking some of the above ELFIO -		// objects now, but it's expected that we'll be dead soon -		// and we want to tread delicately until we get *some* kind -		// of useful backtrace. -		return do_basic_glibc_backtrace(); -	} - -	// iterate over trace and symtab, looking for plausible symbols -	std::string   name; -	Elf32_Addr    value; -	Elf32_Word    ssize; -	unsigned char bind; -	unsigned char type; -	Elf32_Half    section; -	int nSymNo = pSymTbl->GetSymbolNum(); -	size_t btpos; -	for (btpos = 0; btpos < btsize; ++btpos) -	{ -		// the format of the StraceFile is very specific, to allow (kludgy) machine-parsing -		fprintf(StraceFile, "%-3ld ", (long)btpos); -		int symidx; -		for (symidx = 0; symidx < nSymNo; ++symidx) -		{ -			if (ERR_ELFIO_NO_ERROR == -			    pSymTbl->GetSymbol(symidx, name, value, ssize, -					       bind, type, section)) -			{ -				// check if trace address within symbol range -				if (uintptr_t(stackarray[btpos]) >= value && -				    uintptr_t(stackarray[btpos]) < value+ssize) -				{ -					// symbol is inside viewer -					fprintf(StraceFile, "%-32s\t", "com.secondlife.indra.viewer"); -					fprintf(StraceFile, "%p ", stackarray[btpos]); - -					char *demangled_str = NULL; -					int demangle_result = 1; -					demangled_str = -						abi::__cxa_demangle -						(name.c_str(), NULL, NULL, -						 &demangle_result); -					if (0 == demangle_result && -					    NULL != demangled_str) { -						fprintf(StraceFile, -							"%s", demangled_str); -						free(demangled_str); -					} -					else // failed demangle; print it raw -					{ -						fprintf(StraceFile, -							"%s", name.c_str()); -					} -					// print offset from symbol start -					fprintf(StraceFile, -						" + %lu\n", -						uintptr_t(stackarray[btpos]) - -						value); -					goto got_sym; // early escape -				} -			} -		} -		// Fallback: -		// Didn't find a suitable symbol in the binary - it's probably -		// a symbol in a DSO; use glibc's idea of what it should be. -		fprintf(StraceFile, "%-32s\t", "unknown"); -		fprintf(StraceFile, "%p ", stackarray[btpos]); -		fprintf(StraceFile, "%s\n", strings[btpos]); -	got_sym:; -	} -	 -	if (StraceFile != stderr) -		fclose(StraceFile); - -	pSymTbl->Release(); -	pSec->Release(); -	pReader->Release(); - -	free(strings); - -	llinfos << "Finished generating stack trace." << llendl; - -	success = TRUE; -	return success; -} -#endif // LL_ELFBIN - -#endif // LL_SOLARIS - -  LLAppViewerLinux::LLAppViewerLinux()  {  } @@ -541,16 +327,6 @@ bool LLAppViewerLinux::sendURLToOtherInstance(const std::string& url)  }  #endif // LL_DBUS_ENABLED -void LLAppViewerLinux::handleSyncCrashTrace() -{ -	// This backtrace writes into stack_trace.log -#  if LL_ELFBIN -	do_elfio_glibc_backtrace(); // more useful backtrace -#  else -	do_basic_glibc_backtrace(); // only slightly useful backtrace -#  endif // LL_ELFBIN -} -  void LLAppViewerLinux::handleCrashReporting(bool reportFreeze)  {  	std::string cmd =gDirUtilp->getExecutableDir(); @@ -686,6 +462,8 @@ bool LLAppViewerLinux::beingDebugged()  bool LLAppViewerLinux::initLogging()  {  	// Remove the last stack trace, if any +	// This file is no longer created, since the move to Google Breakpad +	// The code is left here to clean out any old state in the log dir  	std::string old_stack_file =  		gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"stack_trace.log");  	LLFile::remove(old_stack_file); diff --git a/indra/newview/llappviewerlinux.h b/indra/newview/llappviewerlinux.h index 230c0dc24b..b17380d4d8 100644 --- a/indra/newview/llappviewerlinux.h +++ b/indra/newview/llappviewerlinux.h @@ -68,7 +68,6 @@ protected:  	virtual bool restoreErrorTrap();  	virtual void handleCrashReporting(bool reportFreeze); -	virtual void handleSyncCrashTrace();  	virtual bool initLogging();  	virtual bool initParseCommandLine(LLCommandLineParser& clp); diff --git a/indra/newview/llappviewermacosx.cpp b/indra/newview/llappviewermacosx.cpp index 0b5f18c330..1e66e55f3d 100644 --- a/indra/newview/llappviewermacosx.cpp +++ b/indra/newview/llappviewermacosx.cpp @@ -264,11 +264,6 @@ bool LLAppViewerMacOSX::restoreErrorTrap()  	return reset_count == 0;  } -void LLAppViewerMacOSX::handleSyncCrashTrace() -{ -	// do nothing -} -  static OSStatus CarbonEventHandler(EventHandlerCallRef inHandlerCallRef,   								   EventRef inEvent,   								   void* inUserData) @@ -384,38 +379,6 @@ void LLAppViewerMacOSX::handleCrashReporting(bool reportFreeze)  		}  	} - -	if(!reportFreeze) -	{ -		_exit(1); -	} -	 -	// TODO from palmer: Find a better way to handle managing old crash logs -	// when this is a separate imbedable module.  Ideally just sort crash stack -	// logs based on date, and grab the latest one as opposed to deleting them -	// for thoughts on what the module would look like. -	// See: https://wiki.lindenlab.com/wiki/Viewer_Crash_Reporter_Round_4 -	 -	// Remove the crash stack log from previous executions. -	// Since we've started logging a new instance of the app, we can assume  -	// The old crash stack is invalid for the next crash report. -	char path[MAX_PATH];		 -	FSRef folder; -	if(FSFindFolder(kUserDomain, kLogsFolderType, false, &folder) == noErr) -	{ -		// folder is an FSRef to ~/Library/Logs/ -		if(FSRefMakePath(&folder, (UInt8*)&path, sizeof(path)) == noErr) -		{ -			std::string pathname = std::string(path) + std::string("/CrashReporter/"); -			std::string mask = "Second Life*"; -			std::string file_name; -			while(gDirUtilp->getNextFileInDir(pathname, mask, file_name, false)) -			{ -				LLFile::remove(pathname + file_name); -			} -		} -	} -	  }  std::string LLAppViewerMacOSX::generateSerialNumber() diff --git a/indra/newview/llappviewermacosx.h b/indra/newview/llappviewermacosx.h index cbf7e6c209..3d7bb55556 100644 --- a/indra/newview/llappviewermacosx.h +++ b/indra/newview/llappviewermacosx.h @@ -55,7 +55,6 @@ public:  protected:  	virtual bool restoreErrorTrap();  	virtual void handleCrashReporting(bool reportFreeze);  -	virtual void handleSyncCrashTrace();  	std::string generateSerialNumber();  	virtual bool initParseCommandLine(LLCommandLineParser& clp); diff --git a/indra/newview/llappviewerwin32.cpp b/indra/newview/llappviewerwin32.cpp index 60a6d2f072..e3ef04d03d 100644 --- a/indra/newview/llappviewerwin32.cpp +++ b/indra/newview/llappviewerwin32.cpp @@ -57,8 +57,6 @@  #include "llweb.h"  #include "llsecondlifeurls.h" -#include "llwindebug.h" -  #include "llviewernetwork.h"  #include "llmd5.h"  #include "llfindlocale.h" @@ -81,51 +79,6 @@ extern "C" {  const std::string LLAppViewerWin32::sWindowClass = "Second Life"; -LONG WINAPI viewer_windows_exception_handler(struct _EXCEPTION_POINTERS *exception_infop) -{ -    // *NOTE:Mani - this code is stolen from LLApp, where its never actually used. -	//OSMessageBox("Attach Debugger Now", "Error", OSMB_OK); -    // *TODO: Translate the signals/exceptions into cross-platform stuff -	// Windows implementation -    _tprintf( _T("Entering Windows Exception Handler...\n") ); -	llinfos << "Entering Windows Exception Handler..." << llendl; - -	// Make sure the user sees something to indicate that the app crashed. -	LONG retval; - -	if (LLApp::isError()) -	{ -	    _tprintf( _T("Got another fatal signal while in the error handler, die now!\n") ); -		llwarns << "Got another fatal signal while in the error handler, die now!" << llendl; - -		retval = EXCEPTION_EXECUTE_HANDLER; -		return retval; -	} - -	// Generate a minidump if we can. -	// Before we wake the error thread... -	// Which will start the crash reporting. -	LLWinDebug::generateCrashStacks(exception_infop); -	 -	// Flag status to error, so thread_error starts its work -	LLApp::setError(); - -	// Block in the exception handler until the app has stopped -	// This is pretty sketchy, but appears to work just fine -	while (!LLApp::isStopped()) -	{ -		ms_sleep(10); -	} - -	// -	// At this point, we always want to exit the app.  There's no graceful -	// recovery for an unhandled exception. -	//  -	// Just kill the process. -	retval = EXCEPTION_EXECUTE_HANDLER;	 -	return retval; -} -  // Create app mutex creates a unique global windows object.   // If the object can be created it returns true, otherwise  // it returns false. The false result can be used to determine  @@ -191,8 +144,6 @@ int APIENTRY WINMAIN(HINSTANCE hInstance,  	gIconResource = MAKEINTRESOURCE(IDI_LL_ICON);  	LLAppViewerWin32* viewer_app_ptr = new LLAppViewerWin32(lpCmdLine); - -	LLWinDebug::initExceptionHandler(viewer_windows_exception_handler);   	viewer_app_ptr->setErrorHandler(LLAppViewer::handleViewerCrash); @@ -405,12 +356,6 @@ bool LLAppViewerWin32::cleanup()  bool LLAppViewerWin32::initLogging()  { -	// Remove the crash stack log from previous executions. -	// Since we've started logging a new instance of the app, we can assume  -	// *NOTE: This should happen before the we send a 'previous instance froze' -	// crash report, but it must happen after we initialize the DirUtil. -	LLWinDebug::clearCrashStacks(); -  	return LLAppViewer::initLogging();  } @@ -529,13 +474,9 @@ bool LLAppViewerWin32::initParseCommandLine(LLCommandLineParser& clp)  }  bool LLAppViewerWin32::restoreErrorTrap() -{ -	return LLWinDebug::checkExceptionHandler(); -} - -void LLAppViewerWin32::handleSyncCrashTrace() -{ -	// do nothing +{	 +	return true; +	//return LLWinDebug::checkExceptionHandler();  }  void LLAppViewerWin32::handleCrashReporting(bool reportFreeze) diff --git a/indra/newview/llappviewerwin32.h b/indra/newview/llappviewerwin32.h index 13454edeec..52dcc583a4 100644 --- a/indra/newview/llappviewerwin32.h +++ b/indra/newview/llappviewerwin32.h @@ -57,7 +57,6 @@ protected:  	virtual bool restoreErrorTrap();  	virtual void handleCrashReporting(bool reportFreeze);  -	virtual void handleSyncCrashTrace();  	virtual bool sendURLToOtherInstance(const std::string& url); diff --git a/indra/newview/llinventoryfunctions.h b/indra/newview/llinventoryfunctions.h index c82ebd1439..93c56e1b8a 100644 --- a/indra/newview/llinventoryfunctions.h +++ b/indra/newview/llinventoryfunctions.h @@ -271,6 +271,32 @@ public:  //  //  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +class LLFindByMask : public LLInventoryCollectFunctor +{ +public: +	LLFindByMask(U64 mask) +		: mFilterMask(mask) +	{} + +	virtual bool operator()(LLInventoryCategory* cat, LLInventoryItem* item) +	{ +		if(item && (mFilterMask & (1LL << item->getInventoryType())) ) +		{ +			return true; +		} + +		return false; +	} + +private: +	U64 mFilterMask; +}; + +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// Class LLFindNonLinksByMask +// +// +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  class LLFindNonLinksByMask : public LLInventoryCollectFunctor  {  public: diff --git a/indra/newview/llpaneloutfitedit.cpp b/indra/newview/llpaneloutfitedit.cpp index 32b209dd0d..1454a2f6af 100644 --- a/indra/newview/llpaneloutfitedit.cpp +++ b/indra/newview/llpaneloutfitedit.cpp @@ -65,6 +65,7 @@  #include "llsaveoutfitcombobtn.h"  #include "llscrolllistctrl.h"  #include "lltextbox.h" +#include "lltrans.h"  #include "lluictrlfactory.h"  #include "llsdutil.h"  #include "llsidepanelappearance.h" @@ -188,9 +189,8 @@ LLPanelOutfitEdit::LLPanelOutfitEdit()  	mCOFDragAndDropObserver(NULL),  	mInitialized(false),  	mAddWearablesPanel(NULL), -	mWearableListMaskCollector(NULL), -	mWearableListTypeCollector(NULL), -	mFilterComboBox(NULL) +	mFolderViewFilterCmbBox(NULL), +	mListViewFilterCmbBox(NULL)  {  	mSavedFolderState = new LLSaveFolderState();  	mSavedFolderState->setApply(FALSE); @@ -202,12 +202,11 @@ LLPanelOutfitEdit::LLPanelOutfitEdit()  	observer.addOutfitLockChangedCallback(boost::bind(&LLPanelOutfitEdit::updateVerbs, this));  	observer.addCOFChangedCallback(boost::bind(&LLPanelOutfitEdit::update, this)); -	mLookItemTypes.reserve(NUM_LOOK_ITEM_TYPES); -	for (U32 i = 0; i < NUM_LOOK_ITEM_TYPES; i++) +	mFolderViewItemTypes.reserve(NUM_FOLDER_VIEW_ITEM_TYPES); +	for (U32 i = 0; i < NUM_FOLDER_VIEW_ITEM_TYPES; i++)  	{ -		mLookItemTypes.push_back(LLLookItemType()); +		mFolderViewItemTypes.push_back(LLLookItemType());  	} -	  } @@ -217,17 +216,40 @@ LLPanelOutfitEdit::~LLPanelOutfitEdit()  	delete mCOFDragAndDropObserver; -	delete mWearableListMaskCollector; -	delete mWearableListTypeCollector; +	while (!mListViewItemTypes.empty()) { +		delete mListViewItemTypes.back(); +		mListViewItemTypes.pop_back(); +	}  }  BOOL LLPanelOutfitEdit::postBuild()  {  	// gInventory.isInventoryUsable() no longer needs to be tested per Richard's fix for race conditions between inventory and panels - -	mLookItemTypes[LIT_ALL] = LLLookItemType(getString("Filter.All"), ALL_ITEMS_MASK); -	mLookItemTypes[LIT_WEARABLE] = LLLookItemType(getString("Filter.Clothes/Body"), WEARABLE_MASK); -	mLookItemTypes[LIT_ATTACHMENT] = LLLookItemType(getString("Filter.Objects"), ATTACHMENT_MASK); +	 +	mFolderViewItemTypes[FVIT_ALL] = LLLookItemType(getString("Filter.All"), ALL_ITEMS_MASK); +	mFolderViewItemTypes[FVIT_WEARABLE] = LLLookItemType(getString("Filter.Clothes/Body"), WEARABLE_MASK); +	mFolderViewItemTypes[FVIT_ATTACHMENT] = LLLookItemType(getString("Filter.Objects"), ATTACHMENT_MASK); + +	//order is important, see EListViewItemType for order information +	mListViewItemTypes.push_back(new LLFilterItem(getString("Filter.All"), new LLFindByMask(ALL_ITEMS_MASK))); +	mListViewItemTypes.push_back(new LLFilterItem(getString("Filter.Clothing"), new LLIsType(LLAssetType::AT_CLOTHING))); +	mListViewItemTypes.push_back(new LLFilterItem(getString("Filter.Bodyparts"), new LLIsType(LLAssetType::AT_BODYPART))); +	mListViewItemTypes.push_back(new LLFilterItem(getString("Filter.Objects"), new LLFindByMask(ATTACHMENT_MASK)));; +	mListViewItemTypes.push_back(new LLFilterItem(LLTrans::getString("shape"), new LLFindActualWearablesOfType(LLWearableType::WT_SHAPE))); +	mListViewItemTypes.push_back(new LLFilterItem(LLTrans::getString("skin"), new LLFindActualWearablesOfType(LLWearableType::WT_SKIN))); +	mListViewItemTypes.push_back(new LLFilterItem(LLTrans::getString("hair"), new LLFindActualWearablesOfType(LLWearableType::WT_HAIR))); +	mListViewItemTypes.push_back(new LLFilterItem(LLTrans::getString("eyes"), new LLFindActualWearablesOfType(LLWearableType::WT_EYES))); +	mListViewItemTypes.push_back(new LLFilterItem(LLTrans::getString("shirt"), new LLFindActualWearablesOfType(LLWearableType::WT_SHIRT))); +	mListViewItemTypes.push_back(new LLFilterItem(LLTrans::getString("pants"), new LLFindActualWearablesOfType(LLWearableType::WT_PANTS))); +	mListViewItemTypes.push_back(new LLFilterItem(LLTrans::getString("shoes"), new LLFindActualWearablesOfType(LLWearableType::WT_SHOES))); +	mListViewItemTypes.push_back(new LLFilterItem(LLTrans::getString("socks"), new LLFindActualWearablesOfType(LLWearableType::WT_SOCKS))); +	mListViewItemTypes.push_back(new LLFilterItem(LLTrans::getString("jacket"), new LLFindActualWearablesOfType(LLWearableType::WT_JACKET))); +	mListViewItemTypes.push_back(new LLFilterItem(LLTrans::getString("gloves"), new LLFindActualWearablesOfType(LLWearableType::WT_GLOVES))); +	mListViewItemTypes.push_back(new LLFilterItem(LLTrans::getString("undershirt"), new LLFindActualWearablesOfType(LLWearableType::WT_UNDERSHIRT))); +	mListViewItemTypes.push_back(new LLFilterItem(LLTrans::getString("underpants"), new LLFindActualWearablesOfType(LLWearableType::WT_UNDERPANTS))); +	mListViewItemTypes.push_back(new LLFilterItem(LLTrans::getString("skirt"), new LLFindActualWearablesOfType(LLWearableType::WT_SKIRT))); +	mListViewItemTypes.push_back(new LLFilterItem(LLTrans::getString("alpha"), new LLFindActualWearablesOfType(LLWearableType::WT_ALPHA))); +	mListViewItemTypes.push_back(new LLFilterItem(LLTrans::getString("tattoo"), new LLFindActualWearablesOfType(LLWearableType::WT_TATTOO)));  	mCurrentOutfitName = getChild<LLTextBox>("curr_outfit_name");   	mStatus = getChild<LLTextBox>("status"); @@ -252,7 +274,7 @@ BOOL LLPanelOutfitEdit::postBuild()  	mAddWearablesPanel = getChild<LLPanel>("add_wearables_panel"); -	mInventoryItemsPanel = getChild<LLInventoryPanel>("inventory_items"); +	mInventoryItemsPanel = getChild<LLInventoryPanel>("folder_view");  	mInventoryItemsPanel->setFilterTypes(ALL_ITEMS_MASK);  	mInventoryItemsPanel->setShowFolderState(LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS);  	mInventoryItemsPanel->setSelectCallback(boost::bind(&LLPanelOutfitEdit::onInventorySelectionChange, this, _1, _2)); @@ -260,15 +282,24 @@ BOOL LLPanelOutfitEdit::postBuild()  	mCOFDragAndDropObserver = new LLCOFDragAndDropObserver(mInventoryItemsPanel->getModel()); -	mFilterComboBox = getChild<LLComboBox>("filter_wearables_combobox"); -	mFilterComboBox->setCommitCallback(boost::bind(&LLPanelOutfitEdit::onTypeFilterChanged, this, _1)); -	mFilterComboBox->removeall(); -	for (U32 i = 0; i < mLookItemTypes.size(); ++i) +	mFolderViewFilterCmbBox = getChild<LLComboBox>("folder_view_filter_combobox"); +	mFolderViewFilterCmbBox->setCommitCallback(boost::bind(&LLPanelOutfitEdit::onFolderViewFilterCommitted, this, _1)); +	mFolderViewFilterCmbBox->removeall(); +	for (U32 i = 0; i < mFolderViewItemTypes.size(); ++i)  	{ -		mFilterComboBox->add(mLookItemTypes[i].displayName); +		mFolderViewFilterCmbBox->add(mFolderViewItemTypes[i].displayName);  	} -	mFilterComboBox->setCurrentByIndex(LIT_ALL); +	mFolderViewFilterCmbBox->setCurrentByIndex(FVIT_ALL); +	mListViewFilterCmbBox = getChild<LLComboBox>("list_view_filter_combobox"); +	mListViewFilterCmbBox->setCommitCallback(boost::bind(&LLPanelOutfitEdit::onListViewFilterCommitted, this, _1)); +	mListViewFilterCmbBox->removeall(); +	for (U32 i = 0; i < mListViewItemTypes.size(); ++i) +	{ +		mListViewFilterCmbBox->add(mListViewItemTypes[i]->displayName); +	} +	mListViewFilterCmbBox->setCurrentByIndex(LVIT_ALL); +  	mSearchFilter = getChild<LLFilterEditor>("look_item_filter");  	mSearchFilter->setCommitCallback(boost::bind(&LLPanelOutfitEdit::onSearchEdit, this, _2)); @@ -283,11 +314,8 @@ BOOL LLPanelOutfitEdit::postBuild()  	childSetAction(REVERT_BTN, boost::bind(&LLAppearanceMgr::wearBaseOutfit, LLAppearanceMgr::getInstance())); -	mWearableListMaskCollector = new LLFindNonLinksByMask(ALL_ITEMS_MASK); -	mWearableListTypeCollector = new LLFindActualWearablesOfType(LLWearableType::WT_NONE); - -	mWearableItemsPanel = getChild<LLPanel>("filtered_wearables_panel"); -	mWearableItemsList = getChild<LLInventoryItemsList>("filtered_wearables_list"); +	mWearablesListViewPanel = getChild<LLPanel>("filtered_wearables_panel"); +	mWearableItemsList = getChild<LLInventoryItemsList>("list_view");  	mSaveComboBtn.reset(new LLSaveOutfitComboBtn(this));  	return TRUE; @@ -300,7 +328,7 @@ void LLPanelOutfitEdit::onOpen(const LLSD& key)  	{  		// *TODO: this method is called even panel is not visible to user because its parent layout panel is hidden.  		// So, we can defer initializing a bit. -		mWearableListManager = new LLFilteredWearableListManager(mWearableItemsList, mWearableListMaskCollector); +		mWearableListManager = new LLFilteredWearableListManager(mWearableItemsList, mListViewItemTypes[LVIT_ALL]->collector);  		mWearableListManager->populateList();  		displayCurrentOutfit();  		mInitialized = true; @@ -328,13 +356,17 @@ void LLPanelOutfitEdit::showAddWearablesPanel(bool show_add_wearables)  	childSetValue("show_add_wearables_btn", show_add_wearables); -	childSetVisible("filter_wearables_combobox", show_add_wearables); +	updateFiltersVisibility();  	childSetVisible("filter_button", show_add_wearables);  	//search filter should be disabled  	if (!show_add_wearables)  	{  		childSetValue("filter_button", false); + +		mFolderViewFilterCmbBox->setVisible(false); +		mListViewFilterCmbBox->setVisible(false); +  		showWearablesFilter();  	} @@ -358,33 +390,40 @@ void LLPanelOutfitEdit::showWearablesFilter()  void LLPanelOutfitEdit::showWearablesListView()  { -	if(switchPanels(mInventoryItemsPanel, mWearableItemsPanel)) +	if(switchPanels(mInventoryItemsPanel, mWearablesListViewPanel))  	{  		mFolderViewBtn->setToggleState(FALSE);  		mFolderViewBtn->setImageOverlay(getString("folder_view_off"), mFolderViewBtn->getImageOverlayHAlign());  		mListViewBtn->setImageOverlay(getString("list_view_on"), mListViewBtn->getImageOverlayHAlign()); +		updateFiltersVisibility();  	}  	mListViewBtn->setToggleState(TRUE);  }  void LLPanelOutfitEdit::showWearablesFolderView()  { -	if(switchPanels(mWearableItemsPanel, mInventoryItemsPanel)) +	if(switchPanels(mWearablesListViewPanel, mInventoryItemsPanel))  	{  		mListViewBtn->setToggleState(FALSE);  		mListViewBtn->setImageOverlay(getString("list_view_off"), mListViewBtn->getImageOverlayHAlign());  		mFolderViewBtn->setImageOverlay(getString("folder_view_on"), mFolderViewBtn->getImageOverlayHAlign()); +		updateFiltersVisibility();  	}  	mFolderViewBtn->setToggleState(TRUE);  } -void LLPanelOutfitEdit::onTypeFilterChanged(LLUICtrl* ctrl) +void LLPanelOutfitEdit::updateFiltersVisibility()  { -	U32 curr_filter_type = mFilterComboBox->getCurrentIndex(); -	mInventoryItemsPanel->setFilterTypes(mLookItemTypes[curr_filter_type].inventoryMask); +	mListViewFilterCmbBox->setVisible(mWearablesListViewPanel->getVisible()); +	mFolderViewFilterCmbBox->setVisible(mInventoryItemsPanel->getVisible()); +} -	mWearableListMaskCollector->setFilterMask(mLookItemTypes[curr_filter_type].inventoryMask); -	mWearableListManager->setFilterCollector(mWearableListMaskCollector); +void LLPanelOutfitEdit::onFolderViewFilterCommitted(LLUICtrl* ctrl) +{ +	S32 curr_filter_type = mFolderViewFilterCmbBox->getCurrentIndex(); +	if (curr_filter_type < 0) return; + +	mInventoryItemsPanel->setFilterTypes(mFolderViewItemTypes[curr_filter_type].inventoryMask);  	mSavedFolderState->setApply(TRUE);  	mInventoryItemsPanel->getRootFolder()->applyFunctorRecursively(*mSavedFolderState); @@ -396,6 +435,14 @@ void LLPanelOutfitEdit::onTypeFilterChanged(LLUICtrl* ctrl)  	LLInventoryModelBackgroundFetch::instance().start();  } +void LLPanelOutfitEdit::onListViewFilterCommitted(LLUICtrl* ctrl) +{ +	S32 curr_filter_type = mListViewFilterCmbBox->getCurrentIndex(); +	if (curr_filter_type < 0) return; + +	mWearableListManager->setFilterCollector(mListViewItemTypes[curr_filter_type]->collector); +} +  void LLPanelOutfitEdit::onSearchEdit(const std::string& string)  {  	if (mSearchString != string) @@ -453,7 +500,7 @@ void LLPanelOutfitEdit::onAddToOutfitClicked(void)  		selected_id = listenerp->getUUID();  	} -	else if (mWearableItemsPanel->getVisible()) +	else if (mWearablesListViewPanel->getVisible())  	{  		selected_id = mWearableItemsList->getSelectedUUID();  	} @@ -537,10 +584,16 @@ void LLPanelOutfitEdit::onInventorySelectionChange(const std::deque<LLFolderView  } -void LLPanelOutfitEdit::applyFilter(e_look_item_type type) +void LLPanelOutfitEdit::applyFolderViewFilter(EFolderViewItemType type)  { -	mFilterComboBox->setCurrentByIndex(type); -	mFilterComboBox->onCommit(); +	mFolderViewFilterCmbBox->setCurrentByIndex(type); +	mFolderViewFilterCmbBox->onCommit(); +} + +void LLPanelOutfitEdit::applyListViewFilter(EListViewItemType type) +{ +	mListViewFilterCmbBox->setCurrentByIndex(type); +	mListViewFilterCmbBox->onCommit();  }  void LLPanelOutfitEdit::filterWearablesBySelectedItem(void) @@ -561,14 +614,15 @@ void LLPanelOutfitEdit::filterWearablesBySelectedItem(void)  		if (nothing_selected)  		{  			showWearablesFolderView(); +			applyFolderViewFilter(FVIT_ALL);  		}  		if (more_than_one_selected)  		{  			showWearablesListView(); +			applyListViewFilter(LVIT_ALL);  		} -		 -		applyFilter(LIT_ALL); +  		return;  	} @@ -585,7 +639,7 @@ void LLPanelOutfitEdit::filterWearablesBySelectedItem(void)  	{  		//Inventory misses an item with non-zero id  		showWearablesListView(); -		applyFilter(LIT_ALL); +		applyListViewFilter(LVIT_ALL);  		return;  	} @@ -595,14 +649,13 @@ void LLPanelOutfitEdit::filterWearablesBySelectedItem(void)  		{  			//single clothing or bodypart item is selected  			showFilteredWearablesListView(item->getWearableType()); -			mFilterComboBox->setLabel(getString("Filter.Custom"));  			return;  		}  		else  		{  			//attachment is selected  			showWearablesListView(); -			applyFilter(LIT_ATTACHMENT); +			applyListViewFilter(LVIT_ATTACHMENT);  			return;  		}  	} @@ -740,11 +793,11 @@ void LLPanelOutfitEdit::onAddMoreButtonClicked()  void LLPanelOutfitEdit::showFilteredWearablesListView(LLWearableType::EType type)  { -	mFilterComboBox->setLabel(getString("Filter.Custom")); -	mWearableListTypeCollector->setType(type); -	mWearableListManager->setFilterCollector(mWearableListTypeCollector);  	showAddWearablesPanel(true);  	showWearablesListView(); + +	//e_list_view_item_type implicitly contains LLWearableType::EType starting from LVIT_SHAPE +	applyListViewFilter((EListViewItemType) (LVIT_SHAPE + type));  } diff --git a/indra/newview/llpaneloutfitedit.h b/indra/newview/llpaneloutfitedit.h index d19ede04f1..56c6c6d680 100644 --- a/indra/newview/llpaneloutfitedit.h +++ b/indra/newview/llpaneloutfitedit.h @@ -42,6 +42,7 @@  #include "llremoteparcelrequest.h"  #include "llinventory.h" +#include "llinventoryfunctions.h"  #include "llinventoryitemslist.h"  #include "llinventorymodel.h" @@ -69,21 +70,59 @@ class LLPanelOutfitEdit : public LLPanel  	LOG_CLASS(LLPanelOutfitEdit);  public: -	// NOTE: initialize mLookItemTypes at the index of any new enum you add in the LLPanelOutfitEdit() constructor -	typedef enum e_look_item_type +	// NOTE: initialize mFolderViewItemTypes at the index of any new enum you add in the LLPanelOutfitEdit() constructor +	typedef enum e_folder_view_item_type  	{ -		LIT_ALL = 0, -		LIT_WEARABLE, // clothing or shape -		LIT_ATTACHMENT, -		NUM_LOOK_ITEM_TYPES -	} ELookItemType;  +		FVIT_ALL = 0, +		FVIT_WEARABLE, // clothing or shape +		FVIT_ATTACHMENT, +		NUM_FOLDER_VIEW_ITEM_TYPES +	} EFolderViewItemType;  +	//should reflect order from LLWearableType::EType +	typedef enum e_list_view_item_type +	{ +		LVIT_ALL = 0, +		LVIT_CLOTHING, +		LVIT_BODYPART, +		LVIT_ATTACHMENT, +		LVIT_SHAPE, +		LVIT_SKIN, +		LVIT_HAIR, +		LVIT_EYES, +		LVIT_SHIRT, +		LVIT_PANTS, +		LVIT_SHOES, +		LVIT_SOCKS, +		LVIT_JACKET, +		LVIT_GLOVES, +		LVIT_UNDERSHIRT, +		LVIT_UNDERPANTS, +		LVIT_SKIRT, +		LVIT_ALPHA, +		LVIT_TATTOO, +		NUM_LIST_VIEW_ITEM_TYPES +	} EListViewItemType;  +  	struct LLLookItemType {  		std::string displayName;  		U64 inventoryMask;  		LLLookItemType() : displayName("NONE"), inventoryMask(0) {}  		LLLookItemType(std::string name, U64 mask) : displayName(name), inventoryMask(mask) {}  	}; + +	struct LLFilterItem { +		std::string displayName; +		LLInventoryCollectFunctor* collector; +		LLFilterItem() : displayName("NONE"), collector(NULL) {} +		LLFilterItem(std::string name, LLInventoryCollectFunctor* _collector) : displayName(name), collector(_collector) {} +		~LLFilterItem() { delete collector; } + +	//the struct is not supposed to by copied, either way the destructor kills collector +	//LLPointer is not used as it requires LLInventoryCollectFunctor to extend LLRefCount what it doesn't do +	private: +		LLFilterItem(const LLFilterItem& filter_item) {}; +	};  	LLPanelOutfitEdit();  	/*virtual*/ ~LLPanelOutfitEdit(); @@ -101,12 +140,16 @@ public:  	void showWearablesListView();  	void showWearablesFolderView(); -	void onTypeFilterChanged(LLUICtrl* ctrl); +	void updateFiltersVisibility(); + +	void onFolderViewFilterCommitted(LLUICtrl* ctrl); +	void onListViewFilterCommitted(LLUICtrl* ctrl);  	void onSearchEdit(const std::string& string);  	void onInventorySelectionChange(const std::deque<LLFolderViewItem*> &items, BOOL user_action);  	void onAddToOutfitClicked(void); -	void applyFilter(e_look_item_type type); +	void applyFolderViewFilter(EFolderViewItemType type); +	void applyListViewFilter(EListViewItemType type);  	/**  	 * Filter items in views of Add Wearables Panel and show appropriate view depending on currently selected COF item(s) @@ -159,18 +202,18 @@ private:  	LLButton*			mFolderViewBtn;  	LLButton*			mListViewBtn;  	LLPanel*			mAddWearablesPanel; -	LLComboBox*			mFilterComboBox; - -	LLFindNonLinksByMask*  mWearableListMaskCollector; -	LLFindWearablesOfType* mWearableListTypeCollector; +	 +	LLComboBox*			mFolderViewFilterCmbBox; +	LLComboBox*			mListViewFilterCmbBox;  	LLFilteredWearableListManager* 	mWearableListManager;  	LLInventoryItemsList* 			mWearableItemsList; -	LLPanel*						mWearableItemsPanel; +	LLPanel*						mWearablesListViewPanel;  	LLCOFDragAndDropObserver* mCOFDragAndDropObserver; -	std::vector<LLLookItemType> mLookItemTypes; +	std::vector<LLLookItemType> mFolderViewItemTypes; +	std::vector<LLFilterItem*> mListViewItemTypes;  	LLCOFWearables*		mCOFWearables;  	LLMenuGL*			mGearMenu; diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index ecf73635cf..df5be34e39 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -199,7 +199,6 @@  #include "llstartuplistener.h"  #if LL_WINDOWS -#include "llwindebug.h"  #include "lldxhardware.h"  #endif diff --git a/indra/newview/llviewerfoldertype.cpp b/indra/newview/llviewerfoldertype.cpp index 2859dabfba..56b5d7467c 100644 --- a/indra/newview/llviewerfoldertype.cpp +++ b/indra/newview/llviewerfoldertype.cpp @@ -45,10 +45,11 @@ struct ViewerFolderEntry : public LLDictionaryEntry  	ViewerFolderEntry(const std::string &new_category_name, // default name when creating a new category of this type  					  const std::string &icon_name_open,	// name of the folder icon  					  const std::string &icon_name_closed, -					  BOOL is_quiet							// folder doesn't need a UI update when changed +					  BOOL is_quiet,						// folder doesn't need a UI update when changed +					  const std::string &dictionary_name = empty_string // no reverse lookup needed on non-ensembles, so in most cases just leave this blank  		)   		: -		LLDictionaryEntry(empty_string), // no reverse lookup needed on non-ensembles, so just leave this blank +		LLDictionaryEntry(dictionary_name),  		mNewCategoryName(new_category_name),  		mIconNameOpen(icon_name_open),  		mIconNameClosed(icon_name_closed), @@ -65,8 +66,11 @@ struct ViewerFolderEntry : public LLDictionaryEntry  		)   		:  		LLDictionaryEntry(xui_name), +		/* Just use default icons until we actually support ensembles  		mIconNameOpen(icon_name),  		mIconNameClosed(icon_name), +		*/ +		mIconNameOpen("Inv_FolderOpen"), mIconNameClosed("Inv_FolderClosed"),  		mNewCategoryName(new_category_name),  		mIsQuiet(FALSE)  	{ @@ -132,7 +136,7 @@ LLViewerFolderDictionary::LLViewerFolderDictionary()  	addEntry(LLFolderType::FT_MY_OUTFITS, 			new ViewerFolderEntry("My Outfits",				"Inv_SysOpen",			"Inv_SysClosed",		TRUE));  	addEntry(LLFolderType::FT_INBOX, 				new ViewerFolderEntry("Inbox",					"Inv_SysOpen",			"Inv_SysClosed",		FALSE)); -	addEntry(LLFolderType::FT_NONE, 				new ViewerFolderEntry("New Folder",				"Inv_SysOpen",			"Inv_SysClosed",		FALSE)); +	addEntry(LLFolderType::FT_NONE, 				new ViewerFolderEntry("New Folder",				"Inv_FolderOpen",		"Inv_FolderClosed",		FALSE, "default"));  }  bool LLViewerFolderDictionary::initEnsemblesFromFile() diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index b00fa39815..3d107555bf 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -109,10 +109,6 @@  #include <boost/algorithm/string/split.hpp> //  #include <boost/regex.hpp> -#if LL_WINDOWS // For Windows specific error handler -#include "llwindebug.h"	// For the invalid message handler -#endif -  #include "llnotificationmanager.h" //  #if LL_MSVC diff --git a/indra/newview/llvoicevivox.cpp b/indra/newview/llvoicevivox.cpp index 39649f0370..4dc9edb247 100644 --- a/indra/newview/llvoicevivox.cpp +++ b/indra/newview/llvoicevivox.cpp @@ -402,19 +402,16 @@ void LLVivoxVoiceClient::init(LLPumpIO *pump)  void LLVivoxVoiceClient::terminate()  { - -//	leaveAudioSession(); -	logout(); -	// As of SDK version 4885, this should no longer be necessary.  It will linger after the socket close if it needs to. -	// ms_sleep(2000); -	connectorShutdown(); -	closeSocket();		// Need to do this now -- bad things happen if the destructor does it later. -	 -	// This will do unpleasant things on windows. -//	killGateway(); -	 - - +	if(mConnected) +	{ +		logout(); +		connectorShutdown(); +		closeSocket();		// Need to do this now -- bad things happen if the destructor does it later.	 +	} +	else +	{ +		killGateway(); +	}  }  const LLVoiceVersionInfo& LLVivoxVoiceClient::getVersion() diff --git a/indra/newview/llwindebug.cpp b/indra/newview/llwindebug.cpp deleted file mode 100644 index 59bc9dc62b..0000000000 --- a/indra/newview/llwindebug.cpp +++ /dev/null @@ -1,912 +0,0 @@ -/**  - * @file llwindebug.cpp - * @brief Windows debugging functions - * - * $LicenseInfo:firstyear=2004&license=viewergpl$ - *  - * Copyright (c) 2004-2009, Linden Research, Inc. - *  - * Second Life Viewer Source Code - * The source code in this file ("Source Code") is provided by Linden Lab - * to you under the terms of the GNU General Public License, version 2.0 - * ("GPL"), unless you have obtained a separate licensing agreement - * ("Other License"), formally executed by you and Linden Lab.  Terms of - * the GPL can be found in doc/GPL-license.txt in this distribution, or - * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 - *  - * There are special exceptions to the terms and conditions of the GPL as - * it is applied to this Source Code. View the full text of the exception - * in the file doc/FLOSS-exception.txt in this software distribution, or - * online at - * http://secondlifegrid.net/programs/open_source/licensing/flossexception - *  - * By copying, modifying or distributing this software, you acknowledge - * that you have read and understood your obligations described above, - * and agree to abide by those obligations. - *  - * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO - * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, - * COMPLETENESS OR PERFORMANCE. - * $/LicenseInfo$ - */ - -#include "llviewerprecompiledheaders.h" - -#include <tchar.h> -#include <tlhelp32.h> -#include "llwindebug.h" -#include "llviewercontrol.h" -#include "lldir.h" -#include "llsd.h" -#include "llsdserialize.h" - -#pragma warning(disable: 4200)	//nonstandard extension used : zero-sized array in struct/union -#pragma warning(disable: 4100)	//unreferenced formal parameter - - -/* -LLSD Block for Windows Dump Information -<llsd> -  <map> -    <key>Platform</key> -    <string></string> -    <key>Process</key> -    <string></string> -    <key>Module</key> -    <string></string> -    <key>DateModified</key> -    <string></string> -    <key>ExceptionCode</key> -    <string></string> -    <key>ExceptionRead/WriteAddress</key> -    <string></string> -    <key>Instruction</key> -    <string></string> -    <key>Registers</key> -    <map> -      <!-- Continued for all registers --> -      <key>EIP</key> -      <string>...</string> -      <!-- ... --> -    </map> -    <key>Call Stack</key> -    <array> -      <!-- One map per stack frame --> -      <map> -	<key>ModuleName</key> -	<string></string> -	<key>ModuleBaseAddress</key> -	<string></string> -	<key>ModuleOffsetAddress</key> -	<string></string> -	<key>Parameters</key> -	<array> -	  <string></string> -	</array> -      </map> -      <!-- ... --> -    </array> -  </map> -</llsd> - -*/ - - -extern void (*gCrashCallback)(void); - -// based on dbghelp.h -typedef BOOL (WINAPI *MINIDUMPWRITEDUMP)(HANDLE hProcess, DWORD dwPid, HANDLE hFile, MINIDUMP_TYPE DumpType, -									CONST PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam, -									CONST PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam, -									CONST PMINIDUMP_CALLBACK_INFORMATION CallbackParam -									); - -MINIDUMPWRITEDUMP f_mdwp = NULL; - -#undef UNICODE - -static LPTOP_LEVEL_EXCEPTION_FILTER gFilterFunc = NULL; - -HMODULE	hDbgHelp; - -// Tool Help functions. -typedef	HANDLE (WINAPI * CREATE_TOOL_HELP32_SNAPSHOT)(DWORD dwFlags, DWORD th32ProcessID); -typedef	BOOL (WINAPI * MODULE32_FIRST)(HANDLE hSnapshot, LPMODULEENTRY32 lpme); -typedef	BOOL (WINAPI * MODULE32_NEST)(HANDLE hSnapshot, LPMODULEENTRY32 lpme); - -CREATE_TOOL_HELP32_SNAPSHOT	CreateToolhelp32Snapshot_; -MODULE32_FIRST	Module32First_; -MODULE32_NEST	Module32Next_; - -#define	DUMP_SIZE_MAX	8000	//max size of our dump -#define	CALL_TRACE_MAX	((DUMP_SIZE_MAX - 2000) / (MAX_PATH + 40))	//max number of traced calls -#define	NL				L"\r\n"	//new line - - -typedef struct STACK -{ -	STACK *	Ebp; -	PBYTE	Ret_Addr; -	DWORD	Param[0]; -} STACK, * PSTACK; - -BOOL WINAPI Get_Module_By_Ret_Addr(PBYTE Ret_Addr, LPWSTR Module_Name, PBYTE & Module_Addr); -void WINAPI Get_Call_Stack(const EXCEPTION_RECORD* exception_record,  -						   const CONTEXT* context_record,  -						   LLSD& info); - -void printError( CHAR* msg ) -{ -  DWORD eNum; -  TCHAR sysMsg[256]; -  TCHAR* p; - -  eNum = GetLastError( ); -  FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, -         NULL, eNum, -         MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language -         sysMsg, 256, NULL ); - -  // Trim the end of the line and terminate it with a null -  p = sysMsg; -  while( ( *p > 31 ) || ( *p == 9 ) ) -    ++p; -  do { *p-- = 0; } while( ( p >= sysMsg ) && -                          ( ( *p == '.' ) || ( *p < 33 ) ) ); - -  // Display the message -  printf( "\n  WARNING: %s failed with error %d (%s)", msg, eNum, sysMsg ); -} - -BOOL GetProcessThreadIDs(DWORD process_id, std::vector<DWORD>& thread_ids)  -{  -  HANDLE hThreadSnap = INVALID_HANDLE_VALUE;  -  THREADENTRY32 te32;  -  -  // Take a snapshot of all running threads   -  hThreadSnap = CreateToolhelp32Snapshot( TH32CS_SNAPTHREAD, 0 );  -  if( hThreadSnap == INVALID_HANDLE_VALUE )  -    return( FALSE );  -  -  // Fill in the size of the structure before using it.  -  te32.dwSize = sizeof(THREADENTRY32 );  -  -  // Retrieve information about the first thread, -  // and exit if unsuccessful -  if( !Thread32First( hThreadSnap, &te32 ) )  -  { -    printError( "Thread32First" );  // Show cause of failure -    CloseHandle( hThreadSnap );     // Must clean up the snapshot object! -    return( FALSE ); -  } - -  // Now walk the thread list of the system, -  // and display information about each thread -  // associated with the specified process -  do  -  {  -    if( te32.th32OwnerProcessID == process_id ) -    { -      thread_ids.push_back(te32.th32ThreadID);  -    } -  } while( Thread32Next(hThreadSnap, &te32 ) );  - -//  Don't forget to clean up the snapshot object. -  CloseHandle( hThreadSnap ); -  return( TRUE ); -} - -BOOL GetThreadCallStack(DWORD thread_id, LLSD& info) -{ -    if(GetCurrentThreadId() == thread_id) -    { -        // Early exit for the current thread. -        // Suspending the current thread would be a bad idea. -        // Plus you can't retrieve a valid current thread context. -        return false; -    } - -    HANDLE thread_handle = INVALID_HANDLE_VALUE;  -    thread_handle = OpenThread(THREAD_ALL_ACCESS, FALSE, thread_id); -    if(INVALID_HANDLE_VALUE == thread_handle) -    { -        return FALSE; -    } - -    BOOL result = false; -    if(-1 != SuspendThread(thread_handle)) -    { -        CONTEXT context_struct; -        context_struct.ContextFlags = CONTEXT_FULL; -        if(GetThreadContext(thread_handle, &context_struct)) -        { -            Get_Call_Stack(NULL, &context_struct, info); -            result = true; -        } -        ResumeThread(thread_handle); -    } -    else -    { -        // Couldn't suspend thread. -    } - -    CloseHandle(thread_handle); -    return result; -} - - -//Windows Call Stack Construction idea from  -//http://www.codeproject.com/tools/minidump.asp - -//**************************************************************************************** -BOOL WINAPI Get_Module_By_Ret_Addr(PBYTE Ret_Addr, LPWSTR Module_Name, PBYTE & Module_Addr) -//**************************************************************************************** -// Find module by Ret_Addr (address in the module). -// Return Module_Name (full path) and Module_Addr (start address). -// Return TRUE if found. -{ -	MODULEENTRY32	M = {sizeof(M)}; -	HANDLE	hSnapshot; - -	bool found = false; -	 -	if (CreateToolhelp32Snapshot_) -	{ -		hSnapshot = CreateToolhelp32Snapshot_(TH32CS_SNAPMODULE, 0); -		 -		if ((hSnapshot != INVALID_HANDLE_VALUE) && -			Module32First_(hSnapshot, &M)) -		{ -			do -			{ -				if (DWORD(Ret_Addr - M.modBaseAddr) < M.modBaseSize) -				{ -					lstrcpyn(Module_Name, M.szExePath, MAX_PATH); -					Module_Addr = M.modBaseAddr; -					found = true; -					break; -				} -			} while (Module32Next_(hSnapshot, &M)); -		} - -		CloseHandle(hSnapshot); -	} - -	return found; -} //Get_Module_By_Ret_Addr - -bool has_valid_call_before(PDWORD cur_stack_loc) -{ -	PBYTE p_first_byte = (PBYTE)(*cur_stack_loc - 1); -	PBYTE p_second_byte = (PBYTE)(*cur_stack_loc -2); -	PBYTE p_fifth_byte = (PBYTE)(*cur_stack_loc - 5); -	PBYTE p_sixth_byte = (PBYTE)(*cur_stack_loc - 6); - -	// make sure we can read it -	if(IsBadReadPtr(p_sixth_byte, 6 * sizeof(BYTE))) -	{ -		return false; -	} - -	// check for 9a + 4 bytes -	if(*p_fifth_byte == 0x9A) -	{ -		return true; -	} - -	// Check for E8 + 4 bytes and last byte is 00 or FF -	if(*p_fifth_byte == 0xE8 && (*p_first_byte == 0x00 || *p_first_byte == 0xFF)) -	{ -		return true; -	} -	 -	// the other is six bytes -	if(*p_sixth_byte == 0xFF || *p_second_byte == 0xFF) -	{ -		return true; -	} - -	return false; -} - -PBYTE get_valid_frame(PBYTE esp) -{ -	PDWORD cur_stack_loc = NULL; -	const int max_search = 400; -	WCHAR	module_name[MAX_PATH]; -	PBYTE	module_addr = 0; - -	// round to highest multiple of four -	esp = (esp + (4 - ((int)esp % 4)) % 4); - -	// scroll through stack a few hundred places. -	for (cur_stack_loc = (PDWORD) esp; cur_stack_loc < (PDWORD)esp + max_search; cur_stack_loc += 1) -	{ -		// if you can read the pointer, -		if (IsBadReadPtr(cur_stack_loc, sizeof(PDWORD))) -		{ -			continue; -		} - -		//  check if it's in a module -		if (!Get_Module_By_Ret_Addr((PBYTE)*cur_stack_loc, module_name, module_addr)) -		{ -			continue; -		} - -		// check if the code before the instruction ptr is a call  -		if(!has_valid_call_before(cur_stack_loc)) -		{ -			continue; -		} -		 -		// if these all pass, return that ebp, otherwise continue till we're dead -		return (PBYTE)(cur_stack_loc - 1); -	} - -	return NULL; -} - -bool shouldUseStackWalker(PSTACK Ebp, int max_depth) -{ -	WCHAR	Module_Name[MAX_PATH]; -	PBYTE	Module_Addr = 0; -	int depth = 0; - -	while (depth < max_depth)  -	{ -		if (IsBadReadPtr(Ebp, sizeof(PSTACK)) ||  -			IsBadReadPtr(Ebp->Ebp, sizeof(PSTACK)) || -			Ebp->Ebp < Ebp || -			Ebp->Ebp - Ebp > 0xFFFFFF || -			IsBadCodePtr(FARPROC(Ebp->Ebp->Ret_Addr)) || -			!Get_Module_By_Ret_Addr(Ebp->Ebp->Ret_Addr, Module_Name, Module_Addr)) -		{ -			return true; -		} -		depth++; -		Ebp = Ebp->Ebp; -	} - -	return false; -} - -//****************************************************************** -void WINAPI Get_Call_Stack(const EXCEPTION_RECORD* exception_record,  -						   const CONTEXT* context_record,  -						   LLSD& info) -//****************************************************************** -// Fill Str with call stack info. -// pException can be either GetExceptionInformation() or NULL. -// If pException = NULL - get current call stack. -{ -	LPWSTR	Module_Name = new WCHAR[MAX_PATH]; -	PBYTE	Module_Addr = 0; -	LLSD params; -	PBYTE	Esp = NULL; -	LLSD tmp_info; - -	bool fake_frame = false; -	bool ebp_used = false; -	const int HEURISTIC_MAX_WALK = 20; -	int heuristic_walk_i = 0; -	int Ret_Addr_I = 0; - -	STACK	Stack = {0, 0}; -	PSTACK	Ebp; - -	if (exception_record && context_record)		//fake frame for exception address -	{ -		Stack.Ebp = (PSTACK)(context_record->Ebp); -		Stack.Ret_Addr = (PBYTE)exception_record->ExceptionAddress; -		Ebp = &Stack; -		Esp = (PBYTE) context_record->Esp; -		fake_frame = true; -	} -	else if(context_record) -	{ -        Ebp = (PSTACK)(context_record->Ebp); -		Esp = (PBYTE)(context_record->Esp); -	} -	else -	{ -		Ebp = (PSTACK)&exception_record - 1;	//frame addr of Get_Call_Stack() -		Esp = (PBYTE)&exception_record; - -		// Skip frame of Get_Call_Stack(). -		if (!IsBadReadPtr(Ebp, sizeof(PSTACK))) -			Ebp = Ebp->Ebp;		//caller ebp -	} - -	// Trace CALL_TRACE_MAX calls maximum - not to exceed DUMP_SIZE_MAX. -	// Break trace on wrong stack frame. -	for (Ret_Addr_I = 0; -		heuristic_walk_i < HEURISTIC_MAX_WALK &&  -		Ret_Addr_I < CALL_TRACE_MAX && !IsBadReadPtr(Ebp, sizeof(PSTACK)) && !IsBadCodePtr(FARPROC(Ebp->Ret_Addr)); -		Ret_Addr_I++) -	{ -		// If module with Ebp->Ret_Addr found. -		if (Get_Module_By_Ret_Addr(Ebp->Ret_Addr, Module_Name, Module_Addr)) -		{ -			// Save module's address and full path. -			tmp_info["CallStack"][Ret_Addr_I]["ModuleName"] = ll_convert_wide_to_string(Module_Name); -			tmp_info["CallStack"][Ret_Addr_I]["ModuleAddress"] = (int)Module_Addr; -			tmp_info["CallStack"][Ret_Addr_I]["CallOffset"] = (int)(Ebp->Ret_Addr - Module_Addr); - -			// Save 5 params of the call. We don't know the real number of params. -			if (fake_frame && !Ret_Addr_I)	//fake frame for exception address -				params[0] = "Exception Offset"; -			else if (!IsBadReadPtr(Ebp, sizeof(PSTACK) + 5 * sizeof(DWORD))) -			{ -				for(int j = 0; j < 5; ++j) -				{ -					params[j] = (int)Ebp->Param[j]; -				} -			} -			tmp_info["CallStack"][Ret_Addr_I]["Parameters"] = params; -		} - -		tmp_info["CallStack"][Ret_Addr_I]["ReturnAddress"] = (int)Ebp->Ret_Addr; - -		// get ready for next frame -		// Set ESP to just after return address.  Not the real esp, but just enough after the return address -		if(!fake_frame) { -			Esp = (PBYTE)Ebp + 8; -		}  -		else -		{ -			fake_frame = false; -		} - -		// is next ebp valid? -		// only run if we've never found a good ebp -		// and make sure the one after is valid as well -		if(	!ebp_used &&  -			shouldUseStackWalker(Ebp, 2)) -		{ -			heuristic_walk_i++; -			PBYTE new_ebp = get_valid_frame(Esp); -			if (new_ebp != NULL) -			{ -				Ebp = (PSTACK)new_ebp; -			} -		} -		else -		{ -			ebp_used = true; -			Ebp = Ebp->Ebp; -		} -	} -/* TODO remove or turn this code back on to edit the stack after i see a few raw ones. -Palmer -	// Now go back through and edit out heuristic stacks that could very well be bogus. -	// Leave the top and the last 3 stack chosen by the heuristic, however. -	if(heuristic_walk_i > 2) -	{ -		info["CallStack"][0] = tmp_info["CallStack"][0]; -		std::string ttest = info["CallStack"][0]["ModuleName"]; -		for(int cur_frame = 1;  -			(cur_frame + heuristic_walk_i - 2 < Ret_Addr_I);  -			++cur_frame) -		{ -			// edit out the middle heuristic found frames -			info["CallStack"][cur_frame] = tmp_info["CallStack"][cur_frame + heuristic_walk_i - 2]; -		} -	} -	else -	{ -		info = tmp_info; -	} -*/ -	info = tmp_info; -	info["HeuristicWalkI"] = heuristic_walk_i; -	info["EbpUsed"] = ebp_used; - -} //Get_Call_Stack - -//*********************************** -void WINAPI Get_Version_Str(LLSD& info) -//*********************************** -// Fill Str with Windows version. -{ -	OSVERSIONINFOEX	V = {sizeof(OSVERSIONINFOEX)};	//EX for NT 5.0 and later - -	if (!GetVersionEx((POSVERSIONINFO)&V)) -	{ -		ZeroMemory(&V, sizeof(V)); -		V.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); -		GetVersionEx((POSVERSIONINFO)&V); -	} - -	if (V.dwPlatformId != VER_PLATFORM_WIN32_NT) -		V.dwBuildNumber = LOWORD(V.dwBuildNumber);	//for 9x HIWORD(dwBuildNumber) = 0x04xx - -	info["Platform"] = llformat("Windows:  %d.%d.%d, SP %d.%d, Product Type %d",	//SP - service pack, Product Type - VER_NT_WORKSTATION,... -		V.dwMajorVersion, V.dwMinorVersion, V.dwBuildNumber, V.wServicePackMajor, V.wServicePackMinor, V.wProductType); -} //Get_Version_Str - -//************************************************************* -LLSD WINAPI Get_Exception_Info(PEXCEPTION_POINTERS pException) -//************************************************************* -// Allocate Str[DUMP_SIZE_MAX] and return Str with dump, if !pException - just return call stack in Str. -{ -	LLSD info; -	LPWSTR		Str; -	int			Str_Len; -//	int			i; -	LPWSTR		Module_Name = new WCHAR[MAX_PATH]; -	PBYTE		Module_Addr; -	HANDLE		hFile; -	FILETIME	Last_Write_Time; -	FILETIME	Local_File_Time; -	SYSTEMTIME	T; - -	Str = new WCHAR[DUMP_SIZE_MAX]; -	Str_Len = 0; -	if (!Str) -		return NULL; -	 -	Get_Version_Str(info); -	 -	GetModuleFileName(NULL, Str, MAX_PATH); -	info["Process"] = ll_convert_wide_to_string(Str); -	info["ThreadID"] = (S32)GetCurrentThreadId(); - -	// If exception occurred. -	if (pException) -	{ -		EXCEPTION_RECORD &	E = *pException->ExceptionRecord; -		CONTEXT &			C = *pException->ContextRecord; - -		// If module with E.ExceptionAddress found - save its path and date. -		if (Get_Module_By_Ret_Addr((PBYTE)E.ExceptionAddress, Module_Name, Module_Addr)) -		{ -			info["Module"] = ll_convert_wide_to_string(Module_Name); - -			if ((hFile = CreateFile(Module_Name, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, -				FILE_ATTRIBUTE_NORMAL, NULL)) != INVALID_HANDLE_VALUE) -			{ -				if (GetFileTime(hFile, NULL, NULL, &Last_Write_Time)) -				{ -					FileTimeToLocalFileTime(&Last_Write_Time, &Local_File_Time); -					FileTimeToSystemTime(&Local_File_Time, &T); - -					info["DateModified"] = llformat("%02d/%02d/%d", T.wMonth, T.wDay, T.wYear); -				} -				CloseHandle(hFile); -			} -		} -		else -		{ -			info["ExceptionAddr"] = (int)E.ExceptionAddress; -		} -		 -		info["ExceptionCode"] = (int)E.ExceptionCode; -		 -		/* -		//TODO: Fix this -		if (E.ExceptionCode == EXCEPTION_ACCESS_VIOLATION) -		{ -			// Access violation type - Write/Read. -			LLSD exception_info; -			exception_info["Type"] = E.ExceptionInformation[0] ? "Write" : "Read"; -			exception_info["Address"] = llformat("%08x", E.ExceptionInformation[1]); -			info["Exception Information"] = exception_info; -		} -		*/ - -		 -		// Save instruction that caused exception. -		/* -		std::string str; -		for (i = 0; i < 16; i++) -			str += llformat(" %02X", PBYTE(E.ExceptionAddress)[i]); -		info["Instruction"] = str; -		*/ -		LLSD registers; -		registers["EAX"] = (int)C.Eax; -		registers["EBX"] = (int)C.Ebx; -		registers["ECX"] = (int)C.Ecx; -		registers["EDX"] = (int)C.Edx; -		registers["ESI"] = (int)C.Esi; -		registers["EDI"] = (int)C.Edi; -		registers["ESP"] = (int)C.Esp; -		registers["EBP"] = (int)C.Ebp; -		registers["EIP"] = (int)C.Eip; -		registers["EFlags"] = (int)C.EFlags; -		info["Registers"] = registers; -	} //if (pException) -	 -	// Save call stack info. -	Get_Call_Stack(pException->ExceptionRecord, pException->ContextRecord, info); - -	return info; -} //Get_Exception_Info - -#define UNICODE - - -class LLMemoryReserve { -public: -	LLMemoryReserve(); -	~LLMemoryReserve(); -	void reserve(); -	void release(); -protected: -	unsigned char *mReserve; -	static const size_t MEMORY_RESERVATION_SIZE; -}; - -LLMemoryReserve::LLMemoryReserve() : -	mReserve(NULL) -{ -}; - -LLMemoryReserve::~LLMemoryReserve() -{ -	release(); -} - -// I dunno - this just seemed like a pretty good value. -const size_t LLMemoryReserve::MEMORY_RESERVATION_SIZE = 5 * 1024 * 1024; - -void LLMemoryReserve::reserve() -{ -	if(NULL == mReserve) -		mReserve = new unsigned char[MEMORY_RESERVATION_SIZE]; -}; - -void LLMemoryReserve::release() -{ -	delete [] mReserve; -	mReserve = NULL; -}; - -static LLMemoryReserve gEmergencyMemoryReserve; - -#ifndef _M_IX86 -	#error "The following code only works for x86!" -#endif -LPTOP_LEVEL_EXCEPTION_FILTER WINAPI MyDummySetUnhandledExceptionFilter( -	LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter) -{ -	if(lpTopLevelExceptionFilter ==  gFilterFunc) -		return gFilterFunc; - -	llinfos << "Someone tried to set the exception filter. Listing call stack modules" << llendl; -	LLSD cs_info; -	Get_Call_Stack(NULL, NULL, cs_info); -	 -	if(cs_info.has("CallStack") && cs_info["CallStack"].isArray()) -	{ -		LLSD cs = cs_info["CallStack"]; -		for(LLSD::array_iterator i = cs.beginArray();  -			i != cs.endArray();  -			++i) -		{ -			llinfos << "Module: " << (*i)["ModuleName"] << llendl; -		} -	} -	 -	return gFilterFunc; -} - -BOOL PreventSetUnhandledExceptionFilter() -{ -	HMODULE hKernel32 = LoadLibrary(_T("kernel32.dll")); -	if (hKernel32 == NULL)  -		return FALSE; - -	void *pOrgEntry = GetProcAddress(hKernel32, "SetUnhandledExceptionFilter"); -	if(pOrgEntry == NULL)  -		return FALSE; -	 -	unsigned char newJump[ 100 ]; -	DWORD dwOrgEntryAddr = (DWORD)pOrgEntry; -	dwOrgEntryAddr += 5; // add 5 for 5 op-codes for jmp far -	void *pNewFunc = &MyDummySetUnhandledExceptionFilter; -	DWORD dwNewEntryAddr = (DWORD) pNewFunc; -	DWORD dwRelativeAddr = dwNewEntryAddr - dwOrgEntryAddr; - -	newJump[ 0 ] = 0xE9;  // JMP absolute -	memcpy(&newJump[ 1 ], &dwRelativeAddr, sizeof(pNewFunc)); -	SIZE_T bytesWritten; -	BOOL bRet = WriteProcessMemory(GetCurrentProcess(), -	pOrgEntry, newJump, sizeof(pNewFunc) + 1, &bytesWritten); -	return bRet; -} - -// static -void  LLWinDebug::initExceptionHandler(LPTOP_LEVEL_EXCEPTION_FILTER filter_func) -{ - -	static bool s_first_run = true; -	// Load the dbghelp dll now, instead of waiting for the crash. -	// Less potential for stack mangling - -	if (s_first_run) -	{ -		// First, try loading from the directory that the app resides in. -		std::string local_dll_name = gDirUtilp->findFile("dbghelp.dll", gDirUtilp->getWorkingDir(), gDirUtilp->getExecutableDir()); - -		HMODULE hDll = NULL; -		hDll = LoadLibraryA(local_dll_name.c_str()); -		if (!hDll) -		{ -			hDll = LoadLibrary(L"dbghelp.dll"); -		} - -		if (!hDll) -		{ -			LL_WARNS("AppInit") << "Couldn't find dbghelp.dll!" << LL_ENDL; -		} -		else -		{ -			f_mdwp = (MINIDUMPWRITEDUMP) GetProcAddress(hDll, "MiniDumpWriteDump"); - -			if (!f_mdwp) -			{ -				FreeLibrary(hDll); -				hDll = NULL; -			} -		} - -		gEmergencyMemoryReserve.reserve(); - -		s_first_run = false; -	} - -	// Try to get Tool Help library functions. -	HMODULE hKernel32; -	hKernel32 = GetModuleHandle(_T("KERNEL32")); -	CreateToolhelp32Snapshot_ = (CREATE_TOOL_HELP32_SNAPSHOT)GetProcAddress(hKernel32, "CreateToolhelp32Snapshot"); -	Module32First_ = (MODULE32_FIRST)GetProcAddress(hKernel32, "Module32FirstW"); -	Module32Next_ = (MODULE32_NEST)GetProcAddress(hKernel32, "Module32NextW"); - -    LPTOP_LEVEL_EXCEPTION_FILTER prev_filter; -	prev_filter = SetUnhandledExceptionFilter(filter_func); - -	// *REMOVE:Mani -	//PreventSetUnhandledExceptionFilter(); - -	if(prev_filter != gFilterFunc) -	{ -		LL_WARNS("AppInit")  -			<< "Replacing unknown exception (" << (void *)prev_filter << ") with (" << (void *)filter_func << ") !" << LL_ENDL; -	} -	 -	gFilterFunc = filter_func; -} - -bool LLWinDebug::checkExceptionHandler() -{ -	bool ok = true; -	LPTOP_LEVEL_EXCEPTION_FILTER prev_filter; -	prev_filter = SetUnhandledExceptionFilter(gFilterFunc); - -	if (prev_filter != gFilterFunc) -	{ -		LL_WARNS("AppInit") << "Our exception handler (" << (void *)gFilterFunc << ") replaced with " << prev_filter << "!" << LL_ENDL; -		ok = false; -	} - -	if (prev_filter == NULL) -	{ -		ok = FALSE; -		if (gFilterFunc == NULL) -		{ -			LL_WARNS("AppInit") << "Exception handler uninitialized." << LL_ENDL; -		} -		else -		{ -			LL_WARNS("AppInit") << "Our exception handler (" << (void *)gFilterFunc << ") replaced with NULL!" << LL_ENDL; -		} -	} - -	return ok; -} - -void LLWinDebug::writeDumpToFile(MINIDUMP_TYPE type, MINIDUMP_EXCEPTION_INFORMATION *ExInfop, const std::string& filename) -{ -	if(f_mdwp == NULL || gDirUtilp == NULL)  -	{ -		return; -		//write_debug("No way to generate a minidump, no MiniDumpWriteDump function!\n"); -	} -	else -	{ -		std::string dump_path = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, filename); - -		HANDLE hFile = CreateFileA(dump_path.c_str(), -									GENERIC_WRITE, -									FILE_SHARE_WRITE, -									NULL, -									CREATE_ALWAYS, -									FILE_ATTRIBUTE_NORMAL, -									NULL); - -		if (hFile != INVALID_HANDLE_VALUE) -		{ -			// Write the dump, ignoring the return value -			f_mdwp(GetCurrentProcess(), -					GetCurrentProcessId(), -					hFile, -					type, -					ExInfop, -					NULL, -					NULL); - -			CloseHandle(hFile); -		} - -	} -} - -// static -void LLWinDebug::generateCrashStacks(struct _EXCEPTION_POINTERS *exception_infop) -{ -	// *NOTE:Mani - This method is no longer the exception handler. -	// Its called from viewer_windows_exception_handler() and other places. - -	//  -	// Let go of a bunch of reserved memory to give library calls etc -	// a chance to execute normally in the case that we ran out of -	// memory. -	// -	LLSD info; -	std::string dump_path = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, -												"SecondLifeException"); -	std::string log_path = dump_path + ".log"; - -	if (exception_infop) -	{ -		// Since there is exception info... Release the hounds. -		gEmergencyMemoryReserve.release(); - -		if(gSavedSettings.getControl("SaveMinidump").notNull() && gSavedSettings.getBOOL("SaveMinidump")) -		{ -			_MINIDUMP_EXCEPTION_INFORMATION ExInfo; - -			ExInfo.ThreadId = ::GetCurrentThreadId(); -			ExInfo.ExceptionPointers = exception_infop; -			ExInfo.ClientPointers = NULL; - -			writeDumpToFile(MiniDumpNormal, &ExInfo, "SecondLife.dmp"); -			writeDumpToFile((MINIDUMP_TYPE)(MiniDumpWithDataSegs | MiniDumpWithIndirectlyReferencedMemory), &ExInfo, "SecondLifePlus.dmp"); -		} - -		info = Get_Exception_Info(exception_infop); -	} - -	LLSD threads; -    std::vector<DWORD> thread_ids; -    GetProcessThreadIDs(GetCurrentProcessId(), thread_ids); - -    for(std::vector<DWORD>::iterator th_itr = thread_ids.begin();  -                th_itr != thread_ids.end(); -                ++th_itr) -    { -        LLSD thread_info; -        if(*th_itr != GetCurrentThreadId()) -        { -            GetThreadCallStack(*th_itr, thread_info); -        } - -        if(thread_info) -        { -            threads[llformat("ID %d", *th_itr)] = thread_info; -        } -    } - -    info["Threads"] = threads; - -	llofstream out_file(log_path); -	LLSDSerialize::toPrettyXML(info, out_file); -	out_file.close(); -} - -void LLWinDebug::clearCrashStacks() -{ -	LLSD info; -	std::string dump_path = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "SecondLifeException.log"); -	LLFile::remove(dump_path); -} diff --git a/indra/newview/llwindebug.h b/indra/newview/llwindebug.h deleted file mode 100644 index f4a6a2d54d..0000000000 --- a/indra/newview/llwindebug.h +++ /dev/null @@ -1,75 +0,0 @@ -/**  - * @file llwindebug.h - * @brief LLWinDebug class header file - * - * $LicenseInfo:firstyear=2004&license=viewergpl$ - *  - * Copyright (c) 2004-2009, Linden Research, Inc. - *  - * Second Life Viewer Source Code - * The source code in this file ("Source Code") is provided by Linden Lab - * to you under the terms of the GNU General Public License, version 2.0 - * ("GPL"), unless you have obtained a separate licensing agreement - * ("Other License"), formally executed by you and Linden Lab.  Terms of - * the GPL can be found in doc/GPL-license.txt in this distribution, or - * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 - *  - * There are special exceptions to the terms and conditions of the GPL as - * it is applied to this Source Code. View the full text of the exception - * in the file doc/FLOSS-exception.txt in this software distribution, or - * online at - * http://secondlifegrid.net/programs/open_source/licensing/flossexception - *  - * By copying, modifying or distributing this software, you acknowledge - * that you have read and understood your obligations described above, - * and agree to abide by those obligations. - *  - * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO - * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, - * COMPLETENESS OR PERFORMANCE. - * $/LicenseInfo$ - */ - -#ifndef LL_LLWINDEBUG_H -#define LL_LLWINDEBUG_H - -#include "stdtypes.h" -#include <dbghelp.h> - -class LLWinDebug -{ -public: - -	/**  -	* @brief initialize the llwindebug exception filter callback -	*  -	* Hand a windows unhandled exception filter to LLWinDebug -	* This method should only be called to change the -	* exception filter used by llwindebug. -	* -	* Setting filter_func to NULL will clear any custom filters. -	**/ -	static void initExceptionHandler(LPTOP_LEVEL_EXCEPTION_FILTER filter_func); - -	/**  -	* @brief check the status of the exception filter. -	* -	* Resets unhandled exception filter to the filter specified  -	* w/ initExceptionFilter).  -	* Returns false if the exception filter was modified. -	* -	* *NOTE:Mani In the past mozlib has been accused of -	* overriding the exception filter. If the mozlib filter  -	* is required, perhaps we can chain calls from our  -	* filter to mozlib's. -	**/ -	static bool checkExceptionHandler(); - -	static void generateCrashStacks(struct _EXCEPTION_POINTERS *pExceptionInfo = NULL); -	static void clearCrashStacks(); // Delete the crash stack file(s). - -	static void writeDumpToFile(MINIDUMP_TYPE type, MINIDUMP_EXCEPTION_INFORMATION *ExInfop, const std::string& filename); -private: -}; - -#endif // LL_LLWINDEBUG_H diff --git a/indra/newview/res/viewerRes.rc b/indra/newview/res/viewerRes.rc index 731953f9bb..df2fb2a6ea 100644 --- a/indra/newview/res/viewerRes.rc +++ b/indra/newview/res/viewerRes.rc @@ -129,8 +129,8 @@ TOOLSIT                 CURSOR                  "toolsit.cur"  //  VS_VERSION_INFO VERSIONINFO - FILEVERSION 2,0,2,0 - PRODUCTVERSION 2,0,2,0 + FILEVERSION 2,1,0,0 + PRODUCTVERSION 2,1,0,0   FILEFLAGSMASK 0x3fL  #ifdef _DEBUG   FILEFLAGS 0x1L @@ -147,12 +147,12 @@ BEGIN          BEGIN              VALUE "CompanyName", "Linden Lab"              VALUE "FileDescription", "Second Life" -            VALUE "FileVersion", "2.0.2.0" +            VALUE "FileVersion", "2.1.0.0"              VALUE "InternalName", "Second Life"              VALUE "LegalCopyright", "Copyright © 2001-2008, Linden Research, Inc."              VALUE "OriginalFilename", "SecondLife.exe"              VALUE "ProductName", "Second Life" -            VALUE "ProductVersion", "2.0.2.0" +            VALUE "ProductVersion", "2.1.0.0"          END      END      BLOCK "VarFileInfo" diff --git a/indra/newview/skins/default/xui/en/panel_body_parts_list_item.xml b/indra/newview/skins/default/xui/en/panel_body_parts_list_item.xml index 4e5f594ffe..4f989a6f6f 100644 --- a/indra/newview/skins/default/xui/en/panel_body_parts_list_item.xml +++ b/indra/newview/skins/default/xui/en/panel_body_parts_list_item.xml @@ -57,7 +57,8 @@       left="0"       height="23"       width="23" -     tab_stop="false"> +     tab_stop="false" +     tool_tip="You don't have permission to edit">          <icon            name="btn_lock1"           layout="topleft" @@ -88,7 +89,8 @@            left="0"            height="23"            width="23" -          tab_stop="false" /> +          tab_stop="false" +          tool_tip="Edit this shape"/>        </panel>      <icon       follows="left|right|top" diff --git a/indra/newview/skins/default/xui/en/panel_clothing_list_item.xml b/indra/newview/skins/default/xui/en/panel_clothing_list_item.xml index 5d81aebbd5..93d7720c57 100644 --- a/indra/newview/skins/default/xui/en/panel_clothing_list_item.xml +++ b/indra/newview/skins/default/xui/en/panel_clothing_list_item.xml @@ -37,7 +37,8 @@       left="0"       height="18"       width="18" -     tab_stop="false" /> +     tab_stop="false" +     tool_tip="Remove from outfit" />      <icon       height="16"       follows="top|left" @@ -88,7 +89,8 @@       left="0"       height="23"       width="23" -     tab_stop="false"> +     tab_stop="false" +     tool_tip="You don't have permission to edit">          <icon            name="btn_lock1"           layout="topleft" @@ -119,7 +121,8 @@           left="0"           height="23"           width="23" -         tab_stop="false" /> +         tab_stop="false" +         tool_tip="Edit this wearable"/>        </panel>      <icon       follows="left|right|top" diff --git a/indra/newview/skins/default/xui/en/panel_deletable_wearable_list_item.xml b/indra/newview/skins/default/xui/en/panel_deletable_wearable_list_item.xml index 45031859f1..75b5fd1532 100644 --- a/indra/newview/skins/default/xui/en/panel_deletable_wearable_list_item.xml +++ b/indra/newview/skins/default/xui/en/panel_deletable_wearable_list_item.xml @@ -37,7 +37,8 @@       left="0"       height="18"       width="18" -     tab_stop="false" /> +     tab_stop="false" +     tool_tip="Remove from outfit"/>      <icon       height="16"       follows="top|left" diff --git a/indra/newview/skins/default/xui/en/panel_dummy_clothing_list_item.xml b/indra/newview/skins/default/xui/en/panel_dummy_clothing_list_item.xml index b1f4cbb079..a5dd34bd22 100644 --- a/indra/newview/skins/default/xui/en/panel_dummy_clothing_list_item.xml +++ b/indra/newview/skins/default/xui/en/panel_dummy_clothing_list_item.xml @@ -67,7 +67,8 @@         left="0"         height="23"         width="23" -       tab_stop="false" /> +       tab_stop="false" +       tool_tip="Add more items of this type" />      </panel>      <icon       follows="left|right|top" diff --git a/indra/newview/skins/default/xui/en/panel_outfit_edit.xml b/indra/newview/skins/default/xui/en/panel_outfit_edit.xml index decdeca00d..ed3b176267 100644 --- a/indra/newview/skins/default/xui/en/panel_outfit_edit.xml +++ b/indra/newview/skins/default/xui/en/panel_outfit_edit.xml @@ -51,7 +51,8 @@      <string name="Filter.All" value="All"/>      <string name="Filter.Clothes/Body" value="Clothes/Body"/>      <string name="Filter.Objects" value="Objects"/> -    <string name="Filter.Custom" value="Custom filter"/> +    <string name="Filter.Clothing" value="Clothing"/> +    <string name="Filter.Bodyparts" value="Body parts"/>      <button @@ -211,6 +212,7 @@ It is calculated as border_size + 2*UIResizeBarOverlap                       left="2"                       name="show_add_wearables_btn"                       top_pad="2" +                     tool_tip="Open/Close"                       width="125" />                      <combo_box @@ -218,11 +220,20 @@ It is calculated as border_size + 2*UIResizeBarOverlap                       height="22"                       layout="topleft"                       left_pad="5" -                     name="filter_wearables_combobox" +                     name="list_view_filter_combobox"                       top_delta="0"                       visible="false"                       width="152"/> - +                    <combo_box +                     follows="left|right|bottom" +                     height="22" +                     layout="topleft" +                     left_delta="0" +                     name="folder_view_filter_combobox" +                     top_delta="0" +                     visible="false" +                     width="152"/> +                                          <button                       follows="bottom|right"                       height="22" @@ -300,7 +311,7 @@ It is calculated as border_size + 2*UIResizeBarOverlap               layout="topleft"               left="0"               mouse_opaque="false" -             name="inventory_items" +             name="folder_view"               top_pad="5"               width="310"               visible="false"/> @@ -319,7 +330,7 @@ It is calculated as border_size + 2*UIResizeBarOverlap               visible="true">                  <wearable_items_list                   color="0.107 0.107 0.107 1" -                 name="filtered_wearables_list" +                 name="list_view"                   allow_select="true"                   layout="topleft"                   follows="all" @@ -483,6 +494,7 @@ It is calculated as border_size + 2*UIResizeBarOverlap           layout="topleft"           name="revert_btn"           top="0" +         tool_tip="Revert to last saved version"           width="147" />      </panel>  </panel> diff --git a/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml b/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml index de1f2cf31b..37eb5eaa98 100644 --- a/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml +++ b/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml @@ -83,18 +83,18 @@        width="241"          /> -        <dnd_button -         follows="bottom|right" -         height="25" -         image_hover_unselected="Toolbar_Right_Over" -          image_overlay="TrashItem_Off" -          image_selected="Toolbar_Right_Selected" -          image_unselected="Toolbar_Right_Off" -         layout="topleft" -         left_pad="1" -         name="trash_btn" -         tool_tip="Remove selected item" -         width="31"/>          +     <dnd_button +      follows="bottom|right" +      height="25" +      image_hover_unselected="Toolbar_Right_Over" +      image_overlay="TrashItem_Off" +      image_selected="Toolbar_Right_Selected" +      image_unselected="Toolbar_Right_Off" +      layout="topleft" +      left_pad="1" +      name="trash_btn" +      tool_tip="Delete selected outfit" +      width="31"/>       <button         follows="bottom|left"         height="23" diff --git a/indra/newview/skins/default/xui/en/sidepanel_appearance.xml b/indra/newview/skins/default/xui/en/sidepanel_appearance.xml index 227c470d14..e189d11d35 100644 --- a/indra/newview/skins/default/xui/en/sidepanel_appearance.xml +++ b/indra/newview/skins/default/xui/en/sidepanel_appearance.xml @@ -92,6 +92,7 @@ width="333">        layout="topleft"        left="265"        name="edit_outfit_btn" +      tool_tip="Edit this outfit"        top="7"        width="30" />        <loading_indicator diff --git a/indra/newview/skins/default/xui/it/floater_about.xml b/indra/newview/skins/default/xui/it/floater_about.xml index 55e699612c..026b7b7616 100644 --- a/indra/newview/skins/default/xui/it/floater_about.xml +++ b/indra/newview/skins/default/xui/it/floater_about.xml @@ -27,9 +27,9 @@ Scheda grafica: [GRAPHICS_CARD]  Versione libcurl: [LIBCURL_VERSION]  Versione J2C Decoder: [J2C_VERSION] -Versione Audio Driver: [AUDIO_DRIVER_VERSION] +Versione Driver audio: [AUDIO_DRIVER_VERSION]  Versione Qt Webkit: [QT_WEBKIT_VERSION] -Versione Vivox: [VIVOX_VERSION] +Versione Server voice: [VOICE_VERSION]  	</floater.string>  	<floater.string name="none">  		(nessuno) diff --git a/indra/newview/skins/default/xui/it/floater_about_land.xml b/indra/newview/skins/default/xui/it/floater_about_land.xml index c55f79738e..942b79b7d3 100644 --- a/indra/newview/skins/default/xui/it/floater_about_land.xml +++ b/indra/newview/skins/default/xui/it/floater_about_land.xml @@ -63,6 +63,9 @@  				Nessun appezzamento selezionato.  Vai al menu Mondo > Informazioni sul terreno oppure seleziona un altro appezzamento per vederne i dettagli.  			</panel.string> +			<panel.string name="time_stamp_template"> +				[wkday,datetime,local] [day,datetime,local] [mth,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local] +			</panel.string>  			<text name="Name:">  				Nome:  			</text> diff --git a/indra/newview/skins/default/xui/it/floater_avatar_textures.xml b/indra/newview/skins/default/xui/it/floater_avatar_textures.xml index 2935f0fdb6..b6376973cd 100644 --- a/indra/newview/skins/default/xui/it/floater_avatar_textures.xml +++ b/indra/newview/skins/default/xui/it/floater_avatar_textures.xml @@ -3,41 +3,48 @@  	<floater.string name="InvalidAvatar">  		AVATAR NON VALIDO  	</floater.string> -	<text name="composite_label"> -		Texture Composite -	</text> -	<button label="Deposito" label_selected="Deposito" name="Dump"/>  	<scroll_container name="profile_scroll">  		<panel name="scroll_content_panel"> -			<texture_picker label="Capigliature" name="hair-baked"/> -			<texture_picker label="Capigliature" name="hair_grain"/> -			<texture_picker label="Alpha dei capelli" name="hair_alpha"/> -			<texture_picker label="Testa" name="head-baked"/> -			<texture_picker label="Makeup" name="head_bodypaint"/> -			<texture_picker label="Alpha della testa" name="head_alpha"/> -			<texture_picker label="Tatuaggio della testa" name="head_tattoo"/> -			<texture_picker label="Occhi" name="eyes-baked"/> -			<texture_picker label="Occhio" name="eyes_iris"/> -			<texture_picker label="Alpha degli occhi" name="eyes_alpha"/> -			<texture_picker label="Parte superiore del corpo" name="upper-baked"/> -			<texture_picker label="Bodypaint parte superiore del corpo" name="upper_bodypaint"/> -			<texture_picker label="Maglietta intima" name="upper_undershirt"/> -			<texture_picker label="Guanti" name="upper_gloves"/> -			<texture_picker label="Camicia" name="upper_shirt"/> -			<texture_picker label="Parte superiore della giacca" name="upper_jacket"/> -			<texture_picker label="Alpha superiore" name="upper_alpha"/> -			<texture_picker label="Tatuaggio superiore" name="upper_tattoo"/> -			<texture_picker label="Parte inferiore del corpo" name="lower-baked"/> -			<texture_picker label="Bodypaint parte inferiore del corpo" name="lower_bodypaint"/> -			<texture_picker label="Slip" name="lower_underpants"/> -			<texture_picker label="Calzini" name="lower_socks"/> -			<texture_picker label="Scarpe" name="lower_shoes"/> -			<texture_picker label="Pantaloni" name="lower_pants"/> -			<texture_picker label="Giacca" name="lower_jacket"/> -			<texture_picker label="Alpha inferiore" name="lower_alpha"/> -			<texture_picker label="Tattuaggio inferiore" name="lower_tattoo"/> -			<texture_picker label="Gonna" name="skirt-baked"/> -			<texture_picker label="Gonna" name="skirt"/> +			<text name="label"> +				Baking delle +texture +			</text> +			<text name="composite_label"> +				Composito +Texture +			</text> +			<button label="Memorizza gli ID sulla console" label_selected="Dump" name="Dump"/> +			<panel name="scroll_content_panel"> +				<texture_picker label="Capigliature" name="hair-baked"/> +				<texture_picker label="Capigliature" name="hair_grain"/> +				<texture_picker label="Alpha dei capelli" name="hair_alpha"/> +				<texture_picker label="Testa" name="head-baked"/> +				<texture_picker label="Makeup" name="head_bodypaint"/> +				<texture_picker label="Alpha della testa" name="head_alpha"/> +				<texture_picker label="Tatuaggio della testa" name="head_tattoo"/> +				<texture_picker label="Occhi" name="eyes-baked"/> +				<texture_picker label="Occhio" name="eyes_iris"/> +				<texture_picker label="Alpha degli occhi" name="eyes_alpha"/> +				<texture_picker label="Parte superiore del corpo" name="upper-baked"/> +				<texture_picker label="Bodypaint parte superiore del corpo" name="upper_bodypaint"/> +				<texture_picker label="Maglietta intima" name="upper_undershirt"/> +				<texture_picker label="Guanti" name="upper_gloves"/> +				<texture_picker label="Camicia" name="upper_shirt"/> +				<texture_picker label="Parte superiore della giacca" name="upper_jacket"/> +				<texture_picker label="Alpha superiore" name="upper_alpha"/> +				<texture_picker label="Tatuaggio superiore" name="upper_tattoo"/> +				<texture_picker label="Parte inferiore del corpo" name="lower-baked"/> +				<texture_picker label="BodyPaint parte inferiore del corpo" name="lower_bodypaint"/> +				<texture_picker label="Slip" name="lower_underpants"/> +				<texture_picker label="Calzini" name="lower_socks"/> +				<texture_picker label="Scarpe" name="lower_shoes"/> +				<texture_picker label="Pantaloni" name="lower_pants"/> +				<texture_picker label="Giacca" name="lower_jacket"/> +				<texture_picker label="Alpha inferiore" name="lower_alpha"/> +				<texture_picker label="Tattuaggio inferiore" name="lower_tattoo"/> +				<texture_picker label="Gonna" name="skirt-baked"/> +				<texture_picker label="Gonna" name="skirt"/> +			</panel>  		</panel>  	</scroll_container>  </floater> diff --git a/indra/newview/skins/default/xui/it/floater_buy_currency_html.xml b/indra/newview/skins/default/xui/it/floater_buy_currency_html.xml new file mode 100644 index 0000000000..4a1bf33403 --- /dev/null +++ b/indra/newview/skins/default/xui/it/floater_buy_currency_html.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_buy_currency_html" title="ACQUISTA VALUTA"/> diff --git a/indra/newview/skins/default/xui/it/floater_map.xml b/indra/newview/skins/default/xui/it/floater_map.xml index 70ab8dcb5a..d1e9c98e79 100644 --- a/indra/newview/skins/default/xui/it/floater_map.xml +++ b/indra/newview/skins/default/xui/it/floater_map.xml @@ -1,5 +1,5 @@  <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Map" title="Mini mappa"> +<floater name="Map" title="">  	<floater.string name="mini_map_north">  		N  	</floater.string> diff --git a/indra/newview/skins/default/xui/it/floater_moveview.xml b/indra/newview/skins/default/xui/it/floater_moveview.xml index 26d861c566..cdafdb0089 100644 --- a/indra/newview/skins/default/xui/it/floater_moveview.xml +++ b/indra/newview/skins/default/xui/it/floater_moveview.xml @@ -6,18 +6,48 @@  	<string name="walk_back_tooltip">  		Cammina indietro (premi freccia giù o S)  	</string> +	<string name="walk_left_tooltip"> +		Cammina a sinistra (premi Maiusc + freccia sinistra o A) +	</string> +	<string name="walk_right_tooltip"> +		Cammina a destra (premi Maiusc + freccia destra o D) +	</string>  	<string name="run_forward_tooltip">  		Corri in avanti (premi freccia su o W)  	</string>  	<string name="run_back_tooltip">  		Corri indietro (premi freccia giù o S)  	</string> +	<string name="run_left_tooltip"> +		Corri a sinistra (premi Maiusc + freccia sinistra o A) +	</string> +	<string name="run_right_tooltip"> +		Corri a destra (premi Maiusc + freccia destra o D) +	</string>  	<string name="fly_forward_tooltip">  		Vola in avanti (premi freccia su o W)  	</string>  	<string name="fly_back_tooltip">  		Vola indietro (premi freccia giù o S)  	</string> +	<string name="fly_left_tooltip"> +		Vola a sinistra (premi Maiusc + freccia sinistra o A) +	</string> +	<string name="fly_right_tooltip"> +		Vola a destra (premi Maiusc + freccia destra o D) +	</string> +	<string name="fly_up_tooltip"> +		Vola in alto (premi E) +	</string> +	<string name="fly_down_tooltip"> +		Vola in basso (premi C) +	</string> +	<string name="jump_tooltip"> +		Salta (premi E) +	</string> +	<string name="crouch_tooltip"> +		Accovacciarsi (premi C) +	</string>  	<string name="walk_title">  		Cammina  	</string> @@ -28,10 +58,12 @@  		Vola  	</string>  	<panel name="panel_actions"> +		<button label="" label_selected="" name="move up btn" tool_tip="Vola in alto (premi E)"/>  		<button label="" label_selected="" name="turn left btn" tool_tip="Gira a sinistra (premi freccia sinistra o A)"/> +		<joystick_slide name="move left btn" tool_tip="Cammina a sinistra (premi Maiusc + freccia sinistra o A)"/> +		<button label="" label_selected="" name="move down btn" tool_tip="Vola in basso (premi C)"/>  		<button label="" label_selected="" name="turn right btn" tool_tip="Gira a destra (premi freccia destra o D)"/> -		<button label="" label_selected="" name="move up btn" tool_tip="Vola in alto, premi E"/> -		<button label="" label_selected="" name="move down btn" tool_tip="Vola in basso, premi C"/> +		<joystick_slide name="move right btn" tool_tip="Cammina a destra (premi Maiusc + freccia destra o D)"/>  		<joystick_turn name="forward btn" tool_tip="Cammina in avanti (premi freccia su o W)"/>  		<joystick_turn name="backward btn" tool_tip="Cammina indietro (premi freccia giù o S)"/>  	</panel> diff --git a/indra/newview/skins/default/xui/it/floater_preview_notecard.xml b/indra/newview/skins/default/xui/it/floater_preview_notecard.xml index 70e28dde35..7ec229f9d3 100644 --- a/indra/newview/skins/default/xui/it/floater_preview_notecard.xml +++ b/indra/newview/skins/default/xui/it/floater_preview_notecard.xml @@ -9,9 +9,6 @@  	<floater.string name="Title">  		Biglietto: [NAME]  	</floater.string> -	<floater.string label="Salva" label_selected="Salva" name="Save"> -		Salva -	</floater.string>  	<text name="desc txt">  		Descrizione:  	</text> @@ -19,4 +16,5 @@  		In caricamento...  	</text_editor>  	<button label="Salva" label_selected="Salva" name="Save"/> +	<button label="Elimina" label_selected="Elimina" name="Delete"/>  </floater> diff --git a/indra/newview/skins/default/xui/it/floater_tools.xml b/indra/newview/skins/default/xui/it/floater_tools.xml index 04d61b97ff..68d193ff33 100644 --- a/indra/newview/skins/default/xui/it/floater_tools.xml +++ b/indra/newview/skins/default/xui/it/floater_tools.xml @@ -67,9 +67,9 @@  	<text name="RenderingCost" tool_tip="Mostra il costo di rendering calcolato per questo oggetto">  		þ: [COUNT]  	</text> -	<check_box name="checkbox uniform"/> -	<text name="checkbox uniform label"> -		Ridimens. simmetricamente +	<check_box label="" name="checkbox uniform"/> +	<text label="Allunga entrambi i lati" name="checkbox uniform label"> +		Allunga entrambi i lati  	</text>  	<check_box initial_value="true" label="Ridimensiona le texture" name="checkbox stretch textures"/>  	<check_box initial_value="true" label="Posiziona nella griglia" name="checkbox snap to grid"/> @@ -445,8 +445,8 @@  			<check_box label="Inverti" name="checkbox flip s"/>  			<spinner label="Verticale (V)" name="TexScaleV"/>  			<check_box label="Inverti" name="checkbox flip t"/> -			<spinner label="RotazioneËš" name="TexRot" /> -			<spinner label="Ripetizioni / Metro" name="rptctrl" /> +			<spinner label="RotazioneËš" name="TexRot"/> +			<spinner label="Ripetizioni / Metro" name="rptctrl"/>  			<button label="Applica" label_selected="Applica" name="button apply"/>  			<text name="tex offset">  				Bilanciamento della texture diff --git a/indra/newview/skins/default/xui/it/menu_attachment_self.xml b/indra/newview/skins/default/xui/it/menu_attachment_self.xml index 054f4802e6..c480a2fe0e 100644 --- a/indra/newview/skins/default/xui/it/menu_attachment_self.xml +++ b/indra/newview/skins/default/xui/it/menu_attachment_self.xml @@ -5,7 +5,7 @@  	<menu_item_call label="Stacca" name="Detach"/>  	<menu_item_call label="Lascia" name="Drop"/>  	<menu_item_call label="Alzati" name="Stand Up"/> -	<menu_item_call label="Il mio aspetto" name="Appearance..."/> +	<menu_item_call label="Cambia vestiario" name="Change Outfit"/>  	<menu_item_call label="I miei amici..." name="Friends..."/>  	<menu_item_call label="I miei gruppi" name="Groups..."/>  	<menu_item_call label="Il mio profilo" name="Profile..."/> diff --git a/indra/newview/skins/default/xui/it/menu_avatar_self.xml b/indra/newview/skins/default/xui/it/menu_avatar_self.xml index d73d97d499..7796d41286 100644 --- a/indra/newview/skins/default/xui/it/menu_avatar_self.xml +++ b/indra/newview/skins/default/xui/it/menu_avatar_self.xml @@ -20,7 +20,9 @@  		<context_menu label="Stacca  â–¶" name="Object Detach"/>  		<menu_item_call label="Stacca tutto" name="Detach All"/>  	</context_menu> -	<menu_item_call label="Il mio aspetto" name="Appearance..."/> +	<menu_item_call label="Cambia vestiario" name="Chenge Outfit"/> +	<menu_item_call label="Modifica il mio vestiario" name="Edit Outfit"/> +	<menu_item_call label="Modifica la figura corporea" name="Edit My Shape"/>  	<menu_item_call label="I miei amici..." name="Friends..."/>  	<menu_item_call label="I miei gruppi" name="Groups..."/>  	<menu_item_call label="Il mio profilo" name="Profile..."/> diff --git a/indra/newview/skins/default/xui/it/menu_bottomtray.xml b/indra/newview/skins/default/xui/it/menu_bottomtray.xml index 7203d002d2..8ca5b24b48 100644 --- a/indra/newview/skins/default/xui/it/menu_bottomtray.xml +++ b/indra/newview/skins/default/xui/it/menu_bottomtray.xml @@ -4,6 +4,11 @@  	<menu_item_check label="Tasto Movimento" name="ShowMoveButton"/>  	<menu_item_check label="Tasto Visuale" name="ShowCameraButton"/>  	<menu_item_check label="Tasto Foto" name="ShowSnapshotButton"/> +	<menu_item_check label="Pulsante barra laterale" name="ShowSidebarButton"/> +	<menu_item_check label="Pulsante Costruisci" name="ShowBuildButton"/> +	<menu_item_check label="Pulsante Cerca" name="ShowSearchButton"/> +	<menu_item_check label="Pulsante Mappa" name="ShowWorldMapButton"/> +	<menu_item_check label="Pulsante Mini mappa" name="ShowMiniMapButton"/>  	<menu_item_call label="Taglia" name="NearbyChatBar_Cut"/>  	<menu_item_call label="Copia" name="NearbyChatBar_Copy"/>  	<menu_item_call label="Incolla" name="NearbyChatBar_Paste"/> diff --git a/indra/newview/skins/default/xui/it/menu_inspect_self_gear.xml b/indra/newview/skins/default/xui/it/menu_inspect_self_gear.xml index 33229bb7c0..80edae8a2b 100644 --- a/indra/newview/skins/default/xui/it/menu_inspect_self_gear.xml +++ b/indra/newview/skins/default/xui/it/menu_inspect_self_gear.xml @@ -1,7 +1,7 @@  <?xml version="1.0" encoding="utf-8"?>  <menu name="Gear Menu">  	<menu_item_call label="Alzati" name="stand_up"/> -	<menu_item_call label="Il mio aspetto" name="my_appearance"/> +	<menu_item_call label="Cambia vestiario" name="change_outfit"/>  	<menu_item_call label="Il mio profilo" name="my_profile"/>  	<menu_item_call label="I miei amici..." name="my_friends"/>  	<menu_item_call label="I miei gruppi" name="my_groups"/> diff --git a/indra/newview/skins/default/xui/it/menu_inventory.xml b/indra/newview/skins/default/xui/it/menu_inventory.xml index 3b36198774..b127f8b816 100644 --- a/indra/newview/skins/default/xui/it/menu_inventory.xml +++ b/indra/newview/skins/default/xui/it/menu_inventory.xml @@ -54,6 +54,7 @@  	<menu_item_call label="Elimina oggetto" name="Purge Item"/>  	<menu_item_call label="Ripristina oggetto" name="Restore Item"/>  	<menu_item_call label="Apri" name="Open"/> +	<menu_item_call label="Apri originale" name="Open Original"/>  	<menu_item_call label="Proprietà" name="Properties"/>  	<menu_item_call label="Rinomina" name="Rename"/>  	<menu_item_call label="Copia UUID dell'oggetto" name="Copy Asset UUID"/> diff --git a/indra/newview/skins/default/xui/it/menu_login.xml b/indra/newview/skins/default/xui/it/menu_login.xml index 904b819198..0a6d803058 100644 --- a/indra/newview/skins/default/xui/it/menu_login.xml +++ b/indra/newview/skins/default/xui/it/menu_login.xml @@ -2,7 +2,7 @@  <menu_bar name="Login Menu">  	<menu label="Io" name="File">  		<menu_item_call label="Preferenze" name="Preferences..."/> -		<menu_item_call label="Chiudi" name="Quit"/> +		<menu_item_call label="Esci da [APP_NAME]" name="Quit"/>  	</menu>  	<menu label="Aiuto" name="Help">  		<menu_item_call label="Aiuto di [SECOND_LIFE]" name="Second Life Help"/> diff --git a/indra/newview/skins/default/xui/it/menu_participant_list.xml b/indra/newview/skins/default/xui/it/menu_participant_list.xml index 71f1a9a0da..f70b886a1e 100644 --- a/indra/newview/skins/default/xui/it/menu_participant_list.xml +++ b/indra/newview/skins/default/xui/it/menu_participant_list.xml @@ -14,8 +14,8 @@  	<context_menu label="Opzioni moderatore  >" name="Moderator Options">  		<menu_item_check label="Consenti chat di testo" name="AllowTextChat"/>  		<menu_item_call label="Disattiva audio di questo participante" name="ModerateVoiceMuteSelected"/> -		<menu_item_call label="Disattiva audio di tutti gli altri" name="ModerateVoiceMuteOthers"/>  		<menu_item_call label="Riattiva audio di questo participante" name="ModerateVoiceUnMuteSelected"/> -		<menu_item_call label="Riattiva audio di tutti gli altri" name="ModerateVoiceUnMuteOthers"/> +		<menu_item_call label="Disattiva audio di tutti" name="ModerateVoiceMute"/> +		<menu_item_call label="Riattiva audio di tutti" name="ModerateVoiceUnmute"/>  	</context_menu>  </context_menu> diff --git a/indra/newview/skins/default/xui/it/menu_viewer.xml b/indra/newview/skins/default/xui/it/menu_viewer.xml index a5923ac42b..999f89a80d 100644 --- a/indra/newview/skins/default/xui/it/menu_viewer.xml +++ b/indra/newview/skins/default/xui/it/menu_viewer.xml @@ -7,7 +7,7 @@  		</menu_item_call>  		<menu_item_call label="Compra L$" name="Buy and Sell L$"/>  		<menu_item_call label="Il mio profilo" name="Profile"/> -		<menu_item_call label="Il mio aspetto" name="Appearance"/> +		<menu_item_call label="Cambia vestiario" name="ChangeOutfit"/>  		<menu_item_check label="Il mio inventario" name="Inventory"/>  		<menu_item_check label="Il mio inventario" name="ShowSidetrayInventory"/>  		<menu_item_check label="Le mie gesture" name="Gestures"/> @@ -162,6 +162,7 @@  			<menu_item_check label="Oggetti flessibili" name="Flexible Objects"/>  		</menu>  		<menu_item_check label="Esegui thread multipli" name="Run Multiple Threads"/> +		<menu_item_check label="Usa thread lettura plugin" name="Use Plugin Read Thread"/>  		<menu_item_call label="Pulisci cache di gruppo" name="ClearGroupCache"/>  		<menu_item_check label="Fluidità mouse" name="Mouse Smoothing"/>  		<menu label="Scorciatoie" name="Shortcuts"> @@ -188,7 +189,6 @@  			<menu_item_call label="Zoom avanti" name="Zoom In"/>  			<menu_item_call label="Zoom predefinito" name="Zoom Default"/>  			<menu_item_call label="Zoom indietro" name="Zoom Out"/> -			<menu_item_call label="Alterna schermo intero" name="Toggle Fullscreen"/>  		</menu>  		<menu_item_call label="Mostra impostazioni di debug" name="Debug Settings"/>  		<menu_item_check label="Mostra menu sviluppo" name="Debug Mode"/> diff --git a/indra/newview/skins/default/xui/it/notifications.xml b/indra/newview/skins/default/xui/it/notifications.xml index 4739e5cce9..058353da38 100644 --- a/indra/newview/skins/default/xui/it/notifications.xml +++ b/indra/newview/skins/default/xui/it/notifications.xml @@ -326,6 +326,9 @@ Hai bisogno di un account per entrare in [SECOND_LIFE]. Ne vuoi creare uno adess  		</url>  		<usetemplate name="okcancelbuttons" notext="Riprova" yestext="Crea un nuovo account"/>  	</notification> +	<notification name="InvalidCredentialFormat"> +		Immetti sia il nome che il cognome del tuo avatar nel campo del nome utente, quindi effettua l'accesso. +	</notification>  	<notification name="AddClassified">  		L'inserzione comparirà nella sezione 'Annunci' della Ricerca e su [http://secondlife.com/community/classifieds secondlife.com] per una settimana.  Compila la tua inserzione, quindi clicca 'Pubblica...' per aggiungerla all'elenco degli annunci. @@ -608,6 +611,11 @@ Attese [VALIDS]  	<notification name="CannotEncodeFile">  		Impossibile codificare il file: [FILE]  	</notification> +	<notification name="CorruptedProtectedDataStore"> +		Poiché non è possibile leggere i dati protetti, ora verranno ripristinati. +   Ciò può succedere alla modifica delle impostazioni di rete. +		<usetemplate name="okbutton" yestext="OK"/> +	</notification>  	<notification name="CorruptResourceFile">  		File risorsa corrotto: [FILE]  	</notification> @@ -968,6 +976,12 @@ su TUTTI I TERRENI di questa sim?  Introduci un prezzo più alto.  	</notification> +	<notification name="ConfirmItemDeleteHasLinks"> +		Almeno uno degli oggetti selezionati è collegato tramite link ad altri oggetti.  Se elimini l'oggetto, i relativi link non funzioneranno più.  Pertanto si consiglia vivamente di eliminare prima i link. + +Sei sicuro di volere eliminare gli oggetti? +		<usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/> +	</notification>  	<notification name="ConfirmObjectDeleteLock">  		Almeno uno degli elementi selezionati è bloccato. @@ -1117,6 +1131,42 @@ Premi F1 in qualunque momento per la guida o per apprendere altre cose di [SECON  Scegli un avatar maschile o femminile. Puoi sempre cambiare idea più tardi.  		<usetemplate name="okcancelbuttons" notext="Femminile" yestext="Maschile"/>  	</notification> +	<notification name="CantTeleportToGrid"> +		Impossibile effettuare il teleport su [SLURL], in quanto si trova su una griglia ([GRID]) diversa da quella attuale ([CURRENT_GRID]).  Chiudi il viewer e prova nuovamente. +		<usetemplate name="okbutton" yestext="OK"/> +	</notification> +	<notification name="GeneralCertificateError"> +		Impossibile collegarsi al server. +[REASON] + +Nome oggetto: [SUBJECT_NAME_STRING] +Nome emittente: [ISSUER_NAME_STRING] +Valido da: [VALID_FROM] +Valido fino a: [VALID_TO] +Impronta MD5: [SHA1_DIGEST] +Impronta SHA1: [MD5_DIGEST] +Uso chiave: [KEYUSAGE] +Uso chiave estesa: [EXTENDEDKEYUSAGE] +Identificatore chiave oggetto: [SUBJECTKEYIDENTIFIER] +		<usetemplate name="okbutton" yestext="OK"/> +	</notification> +	<notification name="TrustCertificateError"> +		Autorità di certificazione di questo server sconosciuta. + +Informazioni sul certificato: +Nome oggetto: [SUBJECT_NAME_STRING] +Nome emittente: [ISSUER_NAME_STRING] +Valido da: [VALID_FROM] +Valido fino a: [VALID_TO] +Impronta MD5: [SHA1_DIGEST] +Impronta SHA1: [MD5_DIGEST] +Uso chiave: [KEYUSAGE] +Uso chiave estesa: [EXTENDEDKEYUSAGE] +Identificatore chiave oggetto: [SUBJECTKEYIDENTIFIER] + +Accettare questa autorità? +		<usetemplate name="okcancelbuttons" notext="Annulla" yestext="Accetta"/> +	</notification>  	<notification name="NotEnoughCurrency">  		[NAME] [PRICE]L$ Non hai abbastanza L$ per farlo.  	</notification> @@ -1512,7 +1562,7 @@ Vuoi andare alla Knowledge Base per ulteriori informazioni sulle categorie di ac  	<notification name="RegionEntryAccessBlocked_Change">  		Non ti è consentito entrare in quella regione a causa della tua categoria di accesso impostata nelle preferenze. -Puoi cliccare su Cambia preferenze per modificare la categoria di accesso e quindi riuscire ad entrare. Da adesso potrai accedere ai contenuti [REGIONMATURITY] ed effettuare ricerche in questa categoria. Se in seguito tu volessi cambiare di nuovo le tue impostazioni, apri la finestra di dialogo da Io > Preferenze > Generale. +Clicca su Cambia preferenze per modificare la categoria di accesso e potere entrare subito. Ciò ti consentirà di effettuare ricerche di contenuti di categoria [REGIONMATURITY]. Potrai modificare queste impostazioni in un secondo momento da Io > Preferenze > Generali.  		<form name="form">  			<button name="OK" text="Cambia preferenza"/>  			<button default="true" name="Cancel" text="Chiudi"/> @@ -2283,15 +2333,6 @@ Riprova tra qualche istante.  			<button name="Mute" text="Blocca"/>  		</form>  	</notification> -	<notification name="ObjectGiveItemUnknownUser"> -		Un oggetto chiamato [OBJECTFROMNAME] di proprietà di (residente sconosciuto) ti ha dato questo [OBJECTTYPE]: -[ITEM_SLURL] -		<form name="form"> -			<button name="Keep" text="Prendi"/> -			<button name="Discard" text="Rifiuta"/> -			<button name="Mute" text="Blocca"/> -		</form> -	</notification>  	<notification name="UserGiveItem">  		[NAME_SLURL] ti ha dato questo [OBJECTTYPE]:  [ITEM_SLURL] @@ -2604,8 +2645,52 @@ Il pulsante verrà visualizzato quando lo spazio sarà sufficiente.  	<notification name="ShareNotification">  		Trascina articoli dell'inventario su una persona nel selettore residenti  	</notification> +	<notification name="DeedToGroupFail"> +		Cessione al gruppo non riuscita. +	</notification>  	<notification name="AvatarRezNotification"> -		Avatar '[NAME]' rezzato in [TIME] secondi. +		( presente da [EXISTENCE] secondi ) +Nuvola avatar '[NAME]' risolta in [TIME] secondi. +	</notification> +	<notification name="AvatarRezSelfNotification"> +		( presente da [EXISTENCE] secondi ) +Baking dei vestiti eseguito in [TIME] secondi. +	</notification> +	<notification name="AvatarRezCloudNotification"> +		( presente da [EXISTENCE] secondi ) +Avatar '[NAME]' trasformato in nuvola. +	</notification> +	<notification name="AvatarRezArrivedNotification"> +		( presente da [EXISTENCE] secondi ) +È comparso l'avatar '[NAME]'. +	</notification> +	<notification name="AvatarRezLeftCloudNotification"> +		( presente da [EXISTENCE] secondi ) +Avatar '[NAME]' partito dopo [TIME] secondi sotto forma di nuvola. +	</notification> +	<notification name="AvatarRezEnteredAppearanceNotification"> +		( presente da [EXISTENCE] secondi ) +Avatar '[NAME]' è entrato nella modalità aspetto. +	</notification> +	<notification name="AvatarRezLeftAppearanceNotification"> +		( presente da [EXISTENCE] secondi ) +Avatar '[NAME]' ha lasciato la modalità aspetto. +	</notification> +	<notification name="AvatarRezLeftNotification"> +		( presente da [EXISTENCE] secondi ) +Avatar '[NAME]' è partito completamente caricato. +	</notification> +	<notification name="ConfirmLeaveCall"> +		Sei sicuro di volere uscire dalla chiamata? +		<usetemplate ignoretext="Conferma prima di uscire dalla chiamata" name="okcancelignore" notext="No" yestext="Sì"/> +	</notification> +	<notification name="ConfirmMuteAll"> +		Hai scelto di disattivare l'audio di tutti i partecipanti alla chiamata di gruppo. +In questo modo verrà disattivato l'audio anche di tutti i residenti che si +uniscono alla chiamata in un secondo momento, anche dopo che tu ti fossi scollegato. + +Disattiva audio di tutti? +		<usetemplate ignoretext="Conferma prima di disattivare l'audio di tutti i partecipanti alla chiamata di gruppo" name="okcancelignore" notext="Ok" yestext="Annulla"/>  	</notification>  	<global name="UnsupportedCPU">  		- La velocità della tua CPU non soddisfa i requisiti minimi. diff --git a/indra/newview/skins/default/xui/it/panel_body_parts_list_item.xml b/indra/newview/skins/default/xui/it/panel_body_parts_list_item.xml new file mode 100644 index 0000000000..de764d8025 --- /dev/null +++ b/indra/newview/skins/default/xui/it/panel_body_parts_list_item.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="wearable_item"> +	<text name="item_name" value="..."/> +</panel> diff --git a/indra/newview/skins/default/xui/it/panel_bodyparts_list_button_bar.xml b/indra/newview/skins/default/xui/it/panel_bodyparts_list_button_bar.xml new file mode 100644 index 0000000000..8fc23d34f1 --- /dev/null +++ b/indra/newview/skins/default/xui/it/panel_bodyparts_list_button_bar.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="clothing_list_button_bar_panel"> +	<button label="Cambia" name="switch_btn"/> +	<button label="Acquista >" name="bodyparts_shop_btn"/> +</panel> diff --git a/indra/newview/skins/default/xui/it/panel_bottomtray.xml b/indra/newview/skins/default/xui/it/panel_bottomtray.xml index c0218fad5e..e4d99cc402 100644 --- a/indra/newview/skins/default/xui/it/panel_bottomtray.xml +++ b/indra/newview/skins/default/xui/it/panel_bottomtray.xml @@ -1,11 +1,7 @@  <?xml version="1.0" encoding="utf-8" standalone="yes"?>  <panel name="bottom_tray"> -	<string name="SpeakBtnToolTip"> -		Accende o spegne il microfono -	</string> -	<string name="VoiceControlBtnToolTip"> -		Mostra o nasconde il pannello di regolazione voce -	</string> +	<string name="SpeakBtnToolTip" value="Accende o spegne il microfono"/> +	<string name="VoiceControlBtnToolTip" value="Mostra o nasconde il pannello di regolazione voce"/>  	<layout_stack name="toolbar_stack">  		<layout_panel name="speak_panel">  			<talk_button name="talk"> @@ -24,6 +20,21 @@  		<layout_panel name="snapshot_panel">  			<button label="" name="snapshots" tool_tip="Scatta una foto"/>  		</layout_panel> +		<layout_panel name="sidebar_btn_panel"> +			<button label="Barra laterale" name="sidebar_btn" tool_tip="Mostra o nasconde la barra laterale"/> +		</layout_panel> +		<layout_panel name="build_btn_panel"> +			<button label="Costruisci" name="build_btn" tool_tip="Mostra o nasconde gli strumenti di costruzione"/> +		</layout_panel> +		<layout_panel name="search_btn_panel"> +			<button label="Cerca" name="search_btn" tool_tip="Mostra o nasconde la ricerca"/> +		</layout_panel> +		<layout_panel name="world_map_btn_panel"> +			<button label="Mappa" name="world_map_btn" tool_tip="Mostra o nasconde la mappa del mondo"/> +		</layout_panel> +		<layout_panel name="mini_map_btn_panel"> +			<button label="Mini mappa" name="mini_map_btn" tool_tip="Mostra o nasconde la mini mappa"/> +		</layout_panel>  		<layout_panel name="im_well_panel">  			<chiclet_im_well name="im_well">  				<button name="Unread IM messages" tool_tip="Conversazioni"/> diff --git a/indra/newview/skins/default/xui/it/panel_clothing_list_button_bar.xml b/indra/newview/skins/default/xui/it/panel_clothing_list_button_bar.xml new file mode 100644 index 0000000000..e9d9795b3a --- /dev/null +++ b/indra/newview/skins/default/xui/it/panel_clothing_list_button_bar.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="clothing_list_button_bar_panel"> +	<button label="Aggiungi +" name="add_btn"/> +	<button label="Acquista >" name="clothing_shop_btn"/> +</panel> diff --git a/indra/newview/skins/default/xui/it/panel_clothing_list_item.xml b/indra/newview/skins/default/xui/it/panel_clothing_list_item.xml new file mode 100644 index 0000000000..de764d8025 --- /dev/null +++ b/indra/newview/skins/default/xui/it/panel_clothing_list_item.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="wearable_item"> +	<text name="item_name" value="..."/> +</panel> diff --git a/indra/newview/skins/default/xui/it/panel_cof_wearables.xml b/indra/newview/skins/default/xui/it/panel_cof_wearables.xml new file mode 100644 index 0000000000..d914a5740f --- /dev/null +++ b/indra/newview/skins/default/xui/it/panel_cof_wearables.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="cof_wearables"> +	<accordion name="cof_wearables_accordion"> +		<accordion_tab name="tab_attachments" title="Allegati"/> +		<accordion_tab name="tab_clothing" title="Vestiario"/> +		<accordion_tab name="tab_body_parts" title="Parti del corpo"/> +	</accordion> +</panel> diff --git a/indra/newview/skins/default/xui/it/panel_deletable_wearable_list_item.xml b/indra/newview/skins/default/xui/it/panel_deletable_wearable_list_item.xml new file mode 100644 index 0000000000..91d90a5660 --- /dev/null +++ b/indra/newview/skins/default/xui/it/panel_deletable_wearable_list_item.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="deletable_wearable_item"> +	<text name="item_name" value="..."/> +</panel> diff --git a/indra/newview/skins/default/xui/it/panel_dummy_clothing_list_item.xml b/indra/newview/skins/default/xui/it/panel_dummy_clothing_list_item.xml new file mode 100644 index 0000000000..6af84de0c7 --- /dev/null +++ b/indra/newview/skins/default/xui/it/panel_dummy_clothing_list_item.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="dummy_clothing_item"> +	<text name="item_name" value="..."/> +</panel> diff --git a/indra/newview/skins/default/xui/it/panel_edit_shape.xml b/indra/newview/skins/default/xui/it/panel_edit_shape.xml index 7e1ba43756..ab77548f26 100644 --- a/indra/newview/skins/default/xui/it/panel_edit_shape.xml +++ b/indra/newview/skins/default/xui/it/panel_edit_shape.xml @@ -1,14 +1,8 @@  <?xml version="1.0" encoding="utf-8" standalone="yes"?>  <panel name="edit_shape_panel"> -	<panel name="avatar_sex_panel"> -		<text name="gender_text"> -			Sesso: -		</text> -		<radio_group name="sex_radio"> -			<radio_item label="Femmina" name="radio"/> -			<radio_item label="Maschio" name="radio2"/> -		</radio_group> -	</panel> +	<text name="avatar_height"> +		Statura: [HEIGHT] metri +	</text>  	<panel label="Camicia" name="accordion_panel">  		<accordion name="wearable_accordion">  			<accordion_tab name="shape_body_tab" title="Corpo"/> diff --git a/indra/newview/skins/default/xui/it/panel_edit_tattoo.xml b/indra/newview/skins/default/xui/it/panel_edit_tattoo.xml index d8cfa15b25..d76fb62c53 100644 --- a/indra/newview/skins/default/xui/it/panel_edit_tattoo.xml +++ b/indra/newview/skins/default/xui/it/panel_edit_tattoo.xml @@ -4,5 +4,6 @@  		<texture_picker label="Tatuaggio della testa" name="Head Tattoo" tool_tip="Clicca per scegliere una fotografia"/>  		<texture_picker label="Tatuaggio superiore" name="Upper Tattoo" tool_tip="Clicca per scegliere una fotografia"/>  		<texture_picker label="Tattuaggio inferiore" name="Lower Tattoo" tool_tip="Clicca per scegliere una fotografia"/> +		<color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/>  	</panel>  </panel> diff --git a/indra/newview/skins/default/xui/it/panel_edit_wearable.xml b/indra/newview/skins/default/xui/it/panel_edit_wearable.xml index 1135a582f5..3d8aa858db 100644 --- a/indra/newview/skins/default/xui/it/panel_edit_wearable.xml +++ b/indra/newview/skins/default/xui/it/panel_edit_wearable.xml @@ -93,6 +93,12 @@  	<text name="edit_wearable_title" value="Modifica della figura corporea"/>  	<panel label="Camicia" name="wearable_type_panel">  		<text name="description_text" value="Figura corporea:"/> +		<radio_group name="sex_radio"> +			<radio_item label="" name="sex_male" tool_tip="Maschio" value="1"/> +			<radio_item label="" name="sex_female" tool_tip="Femmina" value="0"/> +		</radio_group> +		<icon name="male_icon" tool_tip="Maschio"/> +		<icon name="female_icon" tool_tip="Femmina"/>  	</panel>  	<panel label="gear_buttom_panel" name="gear_buttom_panel">  		<button name="friends_viewsort_btn" tool_tip="Opzioni"/> diff --git a/indra/newview/skins/default/xui/it/panel_group_land_money.xml b/indra/newview/skins/default/xui/it/panel_group_land_money.xml index 1e3ef5e657..16cc91cd9d 100644 --- a/indra/newview/skins/default/xui/it/panel_group_land_money.xml +++ b/indra/newview/skins/default/xui/it/panel_group_land_money.xml @@ -6,6 +6,9 @@  	<panel.string name="cant_view_group_land_text">  		Non sei autorizzato a vedere quali terreni appartengono al gruppo.  	</panel.string> +	<panel.string name="epmty_view_group_land_text"> +		Nessuna voce +	</panel.string>  	<panel.string name="cant_view_group_accounting_text">  		Non sei autorizzato a visionare le informazioni finanziarie del gruppo.  	</panel.string> diff --git a/indra/newview/skins/default/xui/it/panel_group_notices.xml b/indra/newview/skins/default/xui/it/panel_group_notices.xml index 9dac282de9..8dd945830e 100644 --- a/indra/newview/skins/default/xui/it/panel_group_notices.xml +++ b/indra/newview/skins/default/xui/it/panel_group_notices.xml @@ -40,6 +40,7 @@ Massimo 200 per gruppo al giorno  		<text name="string">  			Trascina e rilascia qui l'oggetto da allegare:  		</text> +		<button label="Inventario" name="open_inventory" tool_tip="Apri l'inventario"/>  		<button label="Rimuovi" label_selected="Rimuovi allegato" name="remove_attachment" tool_tip="Rimuovi allegato dal tuo avviso"/>  		<button label="Invia" label_selected="Invia" name="send_notice"/>  		<group_drop_target name="drop_target" tool_tip="Trascina un oggetto dall'inventario Ãn questa casella per spedirlo con questo avviso. Devi avere i diritti per la copia e il trasferimento per poter allegare l'oggetto."/> diff --git a/indra/newview/skins/default/xui/it/panel_login.xml b/indra/newview/skins/default/xui/it/panel_login.xml index 287e938d57..473bcfa88d 100644 --- a/indra/newview/skins/default/xui/it/panel_login.xml +++ b/indra/newview/skins/default/xui/it/panel_login.xml @@ -8,18 +8,15 @@  	</panel.string>  	<layout_stack name="login_widgets">  		<layout_panel name="login"> -			<text name="first_name_text"> -				Nome: +			<text name="username_text"> +				Nome utente:  			</text> -			<line_editor label="Nome" name="first_name_edit" tool_tip="[SECOND_LIFE] First Name"/> -			<text name="last_name_text"> -				Cognome: -			</text> -			<line_editor label="Cognome" name="last_name_edit" tool_tip="[SECOND_LIFE] Last Name"/> +			<line_editor label="Nome utente" name="username_edit" tool_tip="Nome utente [SECOND_LIFE]"/>  			<text name="password_text">  				Password:  			</text>  			<check_box label="Ricorda password" name="remember_check"/> +			<button label="Accedi" name="connect_btn"/>  			<text name="start_location_text">  				Inizia da:  			</text> @@ -28,7 +25,6 @@  				<combo_box.item label="Casa mia" name="MyHome"/>  				<combo_box.item label="<Scrivi nome regione>" name="Typeregionname"/>  			</combo_box> -			<button label="Accedi" name="connect_btn"/>  		</layout_panel>  		<layout_panel name="links">  			<text name="create_new_account_text"> diff --git a/indra/newview/skins/default/xui/it/panel_main_inventory.xml b/indra/newview/skins/default/xui/it/panel_main_inventory.xml index 878daf1e6b..446b51ffa3 100644 --- a/indra/newview/skins/default/xui/it/panel_main_inventory.xml +++ b/indra/newview/skins/default/xui/it/panel_main_inventory.xml @@ -9,62 +9,20 @@  	<text name="ItemcountText">  		Oggetti:  	</text> -	<menu_bar name="Inventory Menu"> -		<menu label="File" name="File"> -			<menu_item_call label="Apri" name="Open"/> -			<menu label="Carica nel server" name="upload"> -				<menu_item_call label="Immagine ([COST]L$)..." name="Upload Image"/> -				<menu_item_call label="Suono ([COST]L$)..." name="Upload Sound"/> -				<menu_item_call label="Animazione ([COST]L$)..." name="Upload Animation"/> -				<menu_item_call label="In blocco ([COST]L$ per file)..." name="Bulk Upload"/> -			</menu> -			<menu_item_call label="Nuova finestra" name="New Window"/> -			<menu_item_call label="Mostra filtri" name="Show Filters"/> -			<menu_item_call label="Ripristina filtri" name="Reset Current"/> -			<menu_item_call label="Chiudi tutte le cartelle" name="Close All Folders"/> -			<menu_item_call label="Svuota cestino" name="Empty Trash"/> -			<menu_item_call label="Svuota oggetti smarriti" name="Empty Lost And Found"/> -		</menu> -		<menu label="Crea" name="Create"> -			<menu_item_call label="Nuova cartella" name="New Folder"/> -			<menu_item_call label="Nuovo script" name="New Script"/> -			<menu_item_call label="Nuovo biglietto" name="New Note"/> -			<menu_item_call label="Nuova gesture" name="New Gesture"/> -			<menu label="Maglietta intima" name="New Clothes"> -				<menu_item_call label="Nuova camicia" name="New Shirt"/> -				<menu_item_call label="Nuovi pantaloni" name="New Pants"/> -				<menu_item_call label="Nuove scarpe" name="New Shoes"/> -				<menu_item_call label="Nuove calze" name="New Socks"/> -				<menu_item_call label="Nuova giacca" name="New Jacket"/> -				<menu_item_call label="Nuova gonna" name="New Skirt"/> -				<menu_item_call label="Nuovi guanti" name="New Gloves"/> -				<menu_item_call label="Nuova maglietta intima" name="New Undershirt"/> -				<menu_item_call label="Nuovi slip" name="New Underpants"/> -				<menu_item_call label="Nuovo Alfa (trasparenza)" name="New Alpha"/> -				<menu_item_call label="Nuovo tatuaggio" name="New Tattoo"/> -			</menu> -			<menu label="Nuove parti del corpo" name="New Body Parts"> -				<menu_item_call label="Nuova figura corporea" name="New Shape"/> -				<menu_item_call label="Nuova pelle" name="New Skin"/> -				<menu_item_call label="Nuovi capelli" name="New Hair"/> -				<menu_item_call label="Nuovi occhi" name="New Eyes"/> -			</menu> -		</menu> -		<menu label="Ordina" name="Sort"> -			<menu_item_check label="In base al nome" name="By Name"/> -			<menu_item_check label="In base alla data" name="By Date"/> -			<menu_item_check label="Cartelle sempre in base al nome" name="Folders Always By Name"/> -			<menu_item_check label="Cartelle di sistema all'inizio" name="System Folders To Top"/> -		</menu> -	</menu_bar>  	<filter_editor label="Filtro" name="inventory search editor"/>  	<tab_container name="inventory filter tabs">  		<inventory_panel label="Tutti gli elementi" name="All Items"/> -		<inventory_panel label="Elementi recenti" name="Recent Items"/> +		<recent_inventory_panel label="Elementi recenti" name="Recent Items"/>  	</tab_container> -	<panel name="bottom_panel"> -		<button name="options_gear_btn" tool_tip="Mostra opzioni addizionali"/> -		<button name="add_btn" tool_tip="Aggiungi nuovo elemento"/> -		<dnd_button name="trash_btn" tool_tip="Rimuovi l'articolo selezionato"/> -	</panel> +	<layout_stack name="bottom_panel"> +		<layout_panel name="options_gear_btn_panel"> +			<button name="options_gear_btn" tool_tip="Mostra opzioni addizionali"/> +		</layout_panel> +		<layout_panel name="add_btn_panel"> +			<button name="add_btn" tool_tip="Aggiungi nuovo elemento"/> +		</layout_panel> +		<layout_panel name="trash_btn_panel"> +			<dnd_button name="trash_btn" tool_tip="Rimuovi l'articolo selezionato"/> +		</layout_panel> +	</layout_stack>  </panel> diff --git a/indra/newview/skins/default/xui/it/panel_outfit_edit.xml b/indra/newview/skins/default/xui/it/panel_outfit_edit.xml index 516181e0e9..bd2202b60e 100644 --- a/indra/newview/skins/default/xui/it/panel_outfit_edit.xml +++ b/indra/newview/skins/default/xui/it/panel_outfit_edit.xml @@ -2,6 +2,8 @@  <!-- Side tray Outfit Edit panel -->  <panel label="Modifica del vestiario" name="outfit_edit">  	<string name="No Outfit" value="Nessun vestiario"/> +	<string name="unsaved_changes" value="Modifiche non salvate"/> +	<string name="now_editing" value="Modifica di"/>  	<panel.string name="not_available">  		(non pert.)  	</panel.string> @@ -15,24 +17,19 @@  	<text name="title" value="Modifica vestiario"/>  	<panel label="bottom_panel" name="header_panel">  		<panel label="bottom_panel" name="outfit_name_and_status"> -			<text name="status" value="Modifica..."/> +			<text name="status" value="Modifica di..."/>  			<text name="curr_outfit_name" value="[Current Outfit]"/>  		</panel>  	</panel>  	<layout_stack name="im_panels">  		<layout_panel label="Pannello di controllo IM" name="outfit_wearables_panel"> -			<scroll_list name="look_items_list"> -				<scroll_list.columns label="Articolo look" name="look_item"/> -				<scroll_list.columns label="Ordina in base agli articoli del vestiario" name="look_item_sort"/> -			</scroll_list>  			<panel label="bottom_panel" name="edit_panel"/>  		</layout_panel>  		<layout_panel name="add_wearables_panel"> -			<filter_editor label="Filtro" name="look_item_filter"/> +			<text name="add_to_outfit_label" value="Aggiungi al vestiario:"/>  			<layout_stack name="filter_panels"> -				<layout_panel label="Pannello di controllo IM" name="filter_button_panel"> -					<text name="add_to_outfit_label" value="Aggiungi al vestiario:"/> -					<button label="V" name="filter_button"/> +				<layout_panel label="Pannello di controllo IM" name="filter_panel"> +					<filter_editor label="Filtro" name="look_item_filter"/>  				</layout_panel>  			</layout_stack>  			<panel label="add_wearables_button_bar" name="add_wearables_button_bar"> diff --git a/indra/newview/skins/default/xui/it/panel_people.xml b/indra/newview/skins/default/xui/it/panel_people.xml index c469da014a..056e424436 100644 --- a/indra/newview/skins/default/xui/it/panel_people.xml +++ b/indra/newview/skins/default/xui/it/panel_people.xml @@ -2,9 +2,9 @@  <!-- Side tray panel -->  <panel label="Persone" name="people_panel">  	<string name="no_recent_people" value="Nessuna persona recente. Stai cercando persone da frequentare? Prova la [secondlife:///app/search/people Ricerca] o la [secondlife:///app/worldmap Mappa del mondo]."/> -	<string name="no_filtered_recent_people" value="Non riesci a trovare quello che cerchi? Prova [secondlife:///app/search/people Cerca]."/> +	<string name="no_filtered_recent_people" value="Non riesci a trovare quello che cerchi? Prova [secondlife:///app/search/people/[SEARCH_TERM] Cerca]."/>  	<string name="no_one_near" value="Nessuno vicino. Stai cercando persone da frequentare? Try la [secondlife:///app/search/people Ricerca] o la [secondlife:///app/worldmap Mappa del mondo]."/> -	<string name="no_one_filtered_near" value="Non riesci a trovare quello che cerchi? Prova [secondlife:///app/search/people Cerca]."/> +	<string name="no_one_filtered_near" value="Non riesci a trovare quello che cerchi? Prova [secondlife:///app/search/people/[SEARCH_TERM] Cerca]."/>  	<string name="no_friends_online" value="Nessun amico online"/>  	<string name="no_friends" value="Nessun amico"/>  	<string name="no_friends_msg"> @@ -12,11 +12,11 @@  Stai cercando persone da frequentare? Prova la [secondlife:///app/worldmap Mappa del mondo].  	</string>  	<string name="no_filtered_friends_msg"> -		Non riesci a trovare quello che cerchi? Prova [secondlife:///app/search/people Cerca]. +		Non riesci a trovare quello che cerchi? Prova [secondlife:///app/search/people/[SEARCH_TERM] Cerca].  	</string>  	<string name="people_filter_label" value="Filtro persone"/>  	<string name="groups_filter_label" value="Filtro gruppi"/> -	<string name="no_filtered_groups_msg" value="Non riesci a trovare quello che cerchi? Prova [secondlife:///app/search/groups Cerca]."/> +	<string name="no_filtered_groups_msg" value="Non riesci a trovare quello che cerchi? Prova [secondlife:///app/search/groups/[SEARCH_TERM] Cerca]."/>  	<string name="no_groups_msg" value="Stai cercando gruppi di cui far parte? Prova [secondlife:///app/search/groups Cerca]."/>  	<filter_editor label="Filtro" name="filter_input"/>  	<tab_container name="tabs"> @@ -55,7 +55,7 @@ Stai cercando persone da frequentare? Prova la [secondlife:///app/worldmap Mappa  		<button label="Profilo" name="view_profile_btn" tool_tip="Mostra immagine, gruppi e altre informazioni del residente"/>  		<button label="IM" name="im_btn" tool_tip="Apri una sessione messaggio istantaneo"/>  		<button label="Chiama" name="call_btn" tool_tip="Chiama questo residente"/> -		<button label="Condividi" name="share_btn"/> +		<button label="Condividi" name="share_btn" tool_tip="Condividi un oggetto dell'inventario"/>  		<button label="Teleport" name="teleport_btn" tool_tip="Offri teleport"/>  		<button label="Profilo del gruppo" name="group_info_btn" tool_tip="Mostra informazioni gruppo"/>  		<button label="Chat di gruppo" name="chat_btn" tool_tip="Apri sessione chat"/> diff --git a/indra/newview/skins/default/xui/it/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/it/panel_preferences_advanced.xml index 09e19f4bc0..7c3f32ad7b 100644 --- a/indra/newview/skins/default/xui/it/panel_preferences_advanced.xml +++ b/indra/newview/skins/default/xui/it/panel_preferences_advanced.xml @@ -13,6 +13,7 @@  	</text>  	<check_box label="Costruire/Modificare" name="edit_camera_movement" tool_tip="Utilizza il posizionamento automatico della fotocamera entrando o uscendo dalla modalità modifica"/>  	<check_box label="Aspetto fisico" name="appearance_camera_movement" tool_tip="Utilizza il posizionamento automatico della camera in modalità modifica"/> +	<check_box initial_value="1" label="Barra laterale" name="appearance_sidebar_positioning" tool_tip="Utilizza il posizionamento automatico della fotocamera per la barra laterale"/>  	<check_box label="Visualizzami in modalità soggettiva" name="first_person_avatar_visible"/>  	<check_box label="Le frecce di direzione mi fanno sempre spostare" name="arrow_keys_move_avatar_check"/>  	<check_box label="Doppio click e tieni premuto per correre" name="tap_tap_hold_to_run"/> diff --git a/indra/newview/skins/default/xui/it/panel_preferences_chat.xml b/indra/newview/skins/default/xui/it/panel_preferences_chat.xml index 28df9d2e43..fb8ddf607d 100644 --- a/indra/newview/skins/default/xui/it/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/it/panel_preferences_chat.xml @@ -45,6 +45,7 @@  	</text>  	<check_box initial_value="true" label="Simula la battitura tasti quando scrivi" name="play_typing_animation"/>  	<check_box label="Quando sono OFF-LINE, spediscimi gli IM in una e-mail" name="send_im_to_email"/> +	<check_box label="Attiva IM in testo semplice e cronologia chat" name="plain_text_chat_history"/>  	<text name="show_ims_in_label">  		Mostra gli IM in:  	</text> diff --git a/indra/newview/skins/default/xui/it/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/it/panel_preferences_graphics1.xml index 5bd0cfb106..37857473aa 100644 --- a/indra/newview/skins/default/xui/it/panel_preferences_graphics1.xml +++ b/indra/newview/skins/default/xui/it/panel_preferences_graphics1.xml @@ -1,8 +1,5 @@  <?xml version="1.0" encoding="utf-8" standalone="yes"?>  <panel label="Grafica" name="Display panel"> -	<text name="UI Size:"> -		Dimensioni UI: -	</text>  	<text name="QualitySpeed">  		Qualità e velocità:  	</text> @@ -52,6 +49,10 @@  			m  		</text>  		<slider label="Conteggio massimo particelle:" name="MaxParticleCount"/> +		<slider label="Distanza visual. max avatar:" name="MaxAvatarDrawDistance"/> +		<text name="DrawDistanceMeterText3"> +			m +		</text>  		<slider label="Qualità in post-produzione:" name="RenderPostProcess"/>  		<text name="MeshDetailText">  			Dettagli reticolo: diff --git a/indra/newview/skins/default/xui/it/sidepanel_appearance.xml b/indra/newview/skins/default/xui/it/sidepanel_appearance.xml index c2e99b5573..df25772ffb 100644 --- a/indra/newview/skins/default/xui/it/sidepanel_appearance.xml +++ b/indra/newview/skins/default/xui/it/sidepanel_appearance.xml @@ -1,9 +1,13 @@  <?xml version="1.0" encoding="utf-8" standalone="yes"?>  <panel label="Vestiario" name="appearance panel">  	<string name="No Outfit" value="Nessun vestiario"/> +	<string name="Unsaved Changes" value="Modifiche non salvate"/> +	<string name="Now Wearing" value="Abbigliamento attuale..."/>  	<panel name="panel_currentlook"> -		<text name="currentlook_title"> -			(non salvato) +		<button label="M" name="editappearance_btn"/> +		<button label="A" name="openoutfit_btn"/> +		<text name="currentlook_status"> +			(Stato)  		</text>  	</panel>  	<filter_editor label="Filtri per il vestiario" name="Filter"/> diff --git a/indra/newview/skins/default/xui/it/sidepanel_inventory.xml b/indra/newview/skins/default/xui/it/sidepanel_inventory.xml index 8a391c882c..0d862a0ff7 100644 --- a/indra/newview/skins/default/xui/it/sidepanel_inventory.xml +++ b/indra/newview/skins/default/xui/it/sidepanel_inventory.xml @@ -4,6 +4,7 @@  		<panel name="button_panel">  			<button label="Profilo" name="info_btn"/>  			<button label="Condividi" name="share_btn"/> +			<button label="Acquisti" name="shop_btn"/>  			<button label="Indossa" name="wear_btn"/>  			<button label="Riproduci" name="play_btn"/>  			<button label="Teleport" name="teleport_btn"/> diff --git a/indra/newview/skins/default/xui/it/strings.xml b/indra/newview/skins/default/xui/it/strings.xml index 9a6c648c8e..67cd4c35b2 100644 --- a/indra/newview/skins/default/xui/it/strings.xml +++ b/indra/newview/skins/default/xui/it/strings.xml @@ -94,6 +94,24 @@  	<string name="LoginDownloadingClothing">  		Sto caricando i vestiti...  	</string> +	<string name="InvalidCertificate"> +		Il server ha inviato un certificato non valido o errato. Rivolgiti all'amministratore della griglia. +	</string> +	<string name="CertInvalidHostname"> +		Per accedere al server è stato utilizzato un nome host non valido; controlla lo SLURL o il nome host della griglia. +	</string> +	<string name="CertExpired"> +		Il certificato inviato dalla griglia sembra essere scaduto.  Controlla l'orologio del sistema o rivolgiti all'amministratore della griglia. +	</string> +	<string name="CertKeyUsage"> +		Impossibile utilizzare per SSl il certificato inviato dal server.  Rivolgiti all'amministratore della griglia. +	</string> +	<string name="CertBasicConstraints"> +		Nella catena dei certificati del server erano presenti troppi certificati.  Rivolgiti all'amministratore della griglia. +	</string> +	<string name="CertInvalidSignature"> +		Impossibile verificare la firma del certificato inviato dal server della griglia.  Rivolgiti all'amministratore della griglia. +	</string>  	<string name="LoginFailedNoNetwork">  		Errore di rete: Non è stato possibile stabilire un collegamento, controlla la tua connessione.  	</string> @@ -825,6 +843,42 @@  	<string name="invalid">  		non valido  	</string> +	<string name="shirt_not_worn"> +		Camicia non indossata +	</string> +	<string name="pants_not_worn"> +		Pantaloni non indossati +	</string> +	<string name="shoes_not_worn"> +		Scarpe non indossate +	</string> +	<string name="socks_not_worn"> +		Calzini non indossati +	</string> +	<string name="jacket_not_worn"> +		Giacca non indossata +	</string> +	<string name="gloves_not_worn"> +		Guanti non indossati +	</string> +	<string name="undershirt_not_worn"> +		Maglietta intima non indossata +	</string> +	<string name="underpants_not_worn"> +		Slip non indossati +	</string> +	<string name="skirt_not_worn"> +		Gonna non indossata +	</string> +	<string name="alpha_not_worn"> +		Alpha non portato +	</string> +	<string name="tattoo_not_worn"> +		Tatuaggio non portato +	</string> +	<string name="invalid_not_worn"> +		non valido +	</string>  	<string name="NewWearable">  		Nuovo [WEARABLE_ITEM]  	</string> @@ -895,7 +949,10 @@  		Premi ESC per tornare in visualizzazione normale  	</string>  	<string name="InventoryNoMatchingItems"> -		Non riesci a trovare quello che cerchi? Prova [secondlife:///app/search/all Cerca]. +		Non riesci a trovare quello che cerchi? Prova [secondlife:///app/search/all/[SEARCH_TERM] Cerca]. +	</string> +	<string name="PlacesNoMatchingItems"> +		Non riesci a trovare quello che cerchi? Prova [secondlife:///app/search/places/[SEARCH_TERM] Cerca].  	</string>  	<string name="FavoritesNoMatchingItems">  		Trascina qui un punto di riferimento per aggiungerlo ai Preferiti. @@ -925,6 +982,7 @@  	<string name="Wave" value="Saluta con la mano"/>  	<string name="HelloAvatar" value="Ciao, avatar!"/>  	<string name="ViewAllGestures" value="Visualizza tutto >>"/> +	<string name="GetMoreGestures" value="Altre >>"/>  	<string name="Animations" value="Animazioni,"/>  	<string name="Calling Cards" value="Biglietti da visita,"/>  	<string name="Clothing" value="Vestiti,"/> @@ -1537,16 +1595,19 @@  		Il residente al quale hai inviato un messaggio è in modalità 'occupato', ovvero ha chiesto di non essere disturbato.  Il tuo messaggio comparirà nel suo pannello IM, dove potrà essere letto in un secondo momento.  	</string>  	<string name="MuteByName"> -		(in base al nome) +		(In base al nome)  	</string>  	<string name="MuteAgent">  		(Residente)  	</string>  	<string name="MuteObject"> -		(oggetto) +		(Oggetto)  	</string>  	<string name="MuteGroup"> -		(gruppo) +		(Gruppo) +	</string> +	<string name="MuteExternal"> +		(esterno)  	</string>  	<string name="RegionNoCovenant">  		Non esiste alcun regolamento per questa proprietà. @@ -3306,11 +3367,14 @@ Se il messaggio persiste, contatta [SUPPORT_SITE].  	<string name="answered_call">  		Risposto alla chiamata  	</string> -	<string name="started_call"> -		Chiamata vocale iniziata +	<string name="you_started_call"> +		Hai iniziato una chiamata vocale +	</string> +	<string name="you_joined_call"> +		Ti sei collegato alla chiamata in voce  	</string> -	<string name="joined_call"> -		Si è collegato alla chiamata in voce +	<string name="name_started_call"> +		[NAME] ha iniziato una chiamata vocale  	</string>  	<string name="ringing-im">  		Collegamento alla chiamata vocale... @@ -3509,6 +3573,90 @@ Segnala abuso  	<string name="Contents">  		Contenuto  	</string> +	<string name="Gesture"> +		Gesture +	</string> +	<string name="Male Gestures"> +		Gesture maschili +	</string> +	<string name="Female Gestures"> +		Gesture femminili +	</string> +	<string name="Other Gestures"> +		Altre gesture +	</string> +	<string name="Speech Gestures"> +		Gesture del parlato +	</string> +	<string name="Common Gestures"> +		Gesture comuni +	</string> +	<string name="Male - Excuse me"> +		Maschio - Chiedere scusa +	</string> +	<string name="Male - Get lost"> +		Maschio - Levati dai piedi! +	</string> +	<string name="Male - Blow kiss"> +		Maschio - Butta un bacio +	</string> +	<string name="Male - Boo"> +		Maschio - Bu +	</string> +	<string name="Male - Bored"> +		Maschio - Annoiato +	</string> +	<string name="Male - Hey"> +		Maschio - Ehi +	</string> +	<string name="Male - Laugh"> +		Maschio - Ridere +	</string> +	<string name="Male - Repulsed"> +		Maschio - Disgustato +	</string> +	<string name="Male - Shrug"> +		Maschio - Spallucce +	</string> +	<string name="Male - Stick tougue out"> +		Maschio - Tira fuori la lingua +	</string> +	<string name="Male - Wow"> +		Maschio - Accipicchia +	</string> +	<string name="FeMale - Excuse me"> +		Femmina - Chiedere scusa +	</string> +	<string name="FeMale - Get lost"> +		Femmina - Levati dai piedi! +	</string> +	<string name="FeMale - Blow kiss"> +		Femmina - Butta un bacio +	</string> +	<string name="FeMale - Boo"> +		Femmina - Bu +	</string> +	<string name="Female - Bored"> +		Femmina - Annoiata +	</string> +	<string name="Female - Hey"> +		Femmina - Ehi +	</string> +	<string name="Female - Laugh"> +		Femmina - Ridere +	</string> +	<string name="Female - Repulsed"> +		Femmina - Disgustata +	</string> +	<string name="Female - Shrug"> +		Femmina - Spallucce +	</string> +	<string name="Female - Stick tougue out"> +		Femmina - Tira fuori la lingua +	</string> +	<string name="Female - Wow"> +		Femmina - Accipicchia +	</string>  	<string name="AvatarBirthDateFormat">  		[day,datetime,slt]/[mthnum,datetime,slt]/[year,datetime,slt]  	</string> diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 8c089c0b79..8d2525dd26 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -41,9 +41,12 @@ from llmanifest import LLManifest, main, proper_windows_path, path_ancestors  class ViewerManifest(LLManifest):      def is_packaging_viewer(self): -        # This is overridden by the WindowsManifest sub-class, -        # which has different behavior if it is not packaging the viewer. -        return True +        # Some commands, files will only be included +        # if we are packaging the viewer on windows. +        # This manifest is also used to copy +        # files during the build (see copy_w_viewer_manifest +        # and copy_l_viewer_manifest targets) +        return 'package' in self.args['actions']      def construct(self):          super(ViewerManifest, self).construct() @@ -175,13 +178,6 @@ class WindowsManifest(ViewerManifest):          else:              return ''.join(self.channel().split()) + '.exe' -    def is_packaging_viewer(self): -        # Some commands, files will only be included -        # if we are packaging the viewer on windows. -        # This manifest is also used to copy -        # files during the build. -        return 'package' in self.args['actions'] -      def test_msvcrt_and_copy_action(self, src, dst):          # This is used to test a dll manifest.          # It is used as a temporary override during the construct method @@ -641,7 +637,9 @@ class DarwinManifest(ViewerManifest):                  if dylibs["llcommon"]:                      for libfile in ("libapr-1.0.3.7.dylib",                                      "libaprutil-1.0.3.8.dylib", -                                    "libexpat.0.5.0.dylib"): +                                    "libexpat.0.5.0.dylib", +                                    "libexception_handler.dylib", +                                    ):                          self.path(os.path.join(libdir, libfile), libfile)                  #libfmodwrapper.dylib @@ -662,7 +660,9 @@ class DarwinManifest(ViewerManifest):                      for libfile in ("libllcommon.dylib",                                      "libapr-1.0.3.7.dylib",                                      "libaprutil-1.0.3.8.dylib", -                                    "libexpat.0.5.0.dylib"): +                                    "libexpat.0.5.0.dylib", +                                    "libexception_handler.dylib", +                                    ):                          target_lib = os.path.join('../../..', libfile)                          self.run_command("ln -sf %(target)r %(link)r" %                                            {'target': target_lib, @@ -893,6 +893,7 @@ class Linux_i686Manifest(LinuxManifest):          if self.prefix("../../libraries/i686-linux/lib_release_client", dst="lib"):              self.path("libapr-1.so.0")              self.path("libaprutil-1.so.0") +            self.path("libbreakpad_client.so.0.0.0", "libbreakpad_client.so.0")              self.path("libdb-4.2.so")              self.path("libcrypto.so.0.9.7")              self.path("libexpat.so.1") @@ -930,7 +931,7 @@ class Linux_i686Manifest(LinuxManifest):                      self.path("libvivoxplatform.so")                      self.end_prefix("lib") -        if self.args['buildtype'].lower() == 'release': +        if self.args['buildtype'].lower() == 'release' and self.is_packaging_viewer():              print "* Going strip-crazy on the packaged binaries, since this is a RELEASE build"              self.run_command("find %(d)r/bin %(d)r/lib -type f | xargs --no-run-if-empty strip -S" % {'d': self.get_dst_prefix()} ) # makes some small assumptions about our packaged dir structure diff --git a/indra/win_crash_logger/llcrashloggerwindows.cpp b/indra/win_crash_logger/llcrashloggerwindows.cpp index c9e01c8418..2884231299 100644 --- a/indra/win_crash_logger/llcrashloggerwindows.cpp +++ b/indra/win_crash_logger/llcrashloggerwindows.cpp @@ -299,7 +299,6 @@ void LLCrashLoggerWindows::gatherPlatformSpecificFiles()  	// At this point we're responsive enough the user could click the close button  	SetCursor(gCursorArrow);  	mDebugLog["DisplayDeviceInfo"] = gDXHardware.getDisplayInfo(); -	mFileMap["CrashLog"] = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"SecondLifeException.log");  }  bool LLCrashLoggerWindows::mainLoop() diff --git a/install.xml b/install.xml index 80641d29e6..1f3e74a27a 100644 --- a/install.xml +++ b/install.xml @@ -132,9 +132,9 @@            <key>windows</key>            <map>              <key>md5sum</key> -            <string>f5cf8d121b26f2e7944f7e63cdbff04d</string> +            <string>4b84738eec2e21b0c096d53b79ee2681</string>              <key>url</key> -            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ares-1.6.0-windows-20091105.tar.bz2</uri> +            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ares-1.7.1-windows-20100611a.tar.bz2</uri>            </map>          </map>        </map> @@ -254,9 +254,9 @@            <key>windows</key>            <map>              <key>md5sum</key> -            <string>78ccac8aaf8ea5bec482dfbcdbeb1651</string> +            <string>b28856d3d02ee680353ae440561a6579</string>              <key>url</key> -            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/curl-7.19.6-windows-20100414.tar.bz2</uri> +            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/curl-7.20.1-windows-20100611.tar.bz2</uri>            </map>          </map>        </map> @@ -583,6 +583,39 @@            </map>          </map>        </map> +      <key>google_breakpad</key> +      <map> +        <key>copyright</key> +        <string>Copyright (c) 2006, Google Inc.</string> +        <key>description</key> +        <string>An open-source multi-platform crash reporting system </string> +        <key>license</key> +        <string>bsd</string> +        <key>packages</key> +        <map> +          <key>darwin</key> +          <map> +            <key>md5sum</key> +            <string>ced4010b59f1a579caa7fe3c18512499</string> +            <key>url</key> +            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/google_breakpad-0.0.0-rev599-darwin-20100528a.tar.bz2</uri> +          </map> +          <key>linux</key> +          <map> +            <key>md5sum</key> +            <string>29c3e7dad60bbf02c811786436d99523</string> +            <key>url</key> +            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/google_breakpad-0.0.0-rev599-linux-20100521b.tar.bz2</uri> +          </map> +          <key>windows</key> +          <map> +            <key>md5sum</key> +            <string>0859d47242990125f17eaab30bece2ff</string> +            <key>url</key> +            <uri>http://viewer-source-downloads.s3.amazonaws.com/install_pkgs/google_breakpad-0.0.0-rev599-windows-20100524.tar.bz2</uri> +          </map> +        </map> +      </map>        <key>googlemock</key>        <map>          <key>copyright</key>  | 
