diff options
| -rw-r--r-- | indra/llcommon/llapp.cpp | 62 | ||||
| -rw-r--r-- | indra/llcommon/llapp.h | 16 | ||||
| -rw-r--r-- | indra/newview/llappviewerwin32.cpp | 2 | ||||
| -rw-r--r-- | indra/win_crash_logger/llcrashloggerwindows.cpp | 2 | ||||
| -rw-r--r-- | indra/win_crash_logger/win_crash_logger.cpp | 11 | 
5 files changed, 86 insertions, 7 deletions
| diff --git a/indra/llcommon/llapp.cpp b/indra/llcommon/llapp.cpp index 2c76f29020..55138e48ee 100644 --- a/indra/llcommon/llapp.cpp +++ b/indra/llcommon/llapp.cpp @@ -256,6 +256,60 @@ bool LLApp::parseCommandOptions(int argc, char** argv)  	return true;  } +bool LLApp::parseCommandOptions(int argc, wchar_t** wargv) +{ +	LLSD commands; +	std::string name; +	std::string value; +	for(int ii = 1; ii < argc; ++ii) +	{ +		if(wargv[ii][0] != '-') +		{ +			LL_INFOS() << "Did not find option identifier while parsing token: " +				<< wargv[ii] << LL_ENDL; +			return false; +		} +		int offset = 1; +		if(wargv[ii][1] == '-') ++offset; +		name.assign(utf16str_to_utf8str(&wargv[ii][offset])); +		if(((ii+1) >= argc) || (wargv[ii+1][0] == '-')) +		{ +			// we found another option after this one or we have +			// reached the end. simply record that this option was +			// found and continue. +			int flag = name.compare("logfile"); +			if (0 == flag) +			{ +				commands[name] = "log"; +			} +			else +			{ +				commands[name] = true; +			} +			 +			continue; +		} +		++ii; +		value.assign(utf16str_to_utf8str(wargv[ii])); + +#if LL_WINDOWS +		//Windows changed command line parsing.  Deal with it. +		S32 slen = value.length() - 1; +		S32 start = 0; +		S32 end = slen; +		if (wargv[ii][start]=='"')start++; +		if (wargv[ii][end]=='"')end--; +		if (start!=0 || end!=slen)  +		{ +			value = value.substr (start,end); +		} +#endif + +		commands[name] = value; +	} +	setOptionData(PRIORITY_COMMAND_LINE, commands); +	return true; +}  void LLApp::manageLiveFile(LLLiveFile* livefile)  { @@ -354,7 +408,7 @@ void LLApp::setupErrorHandling(bool second_instance)  			std::wstring wpipe_name;  			wpipe_name =  mCrashReportPipeStr + wstringize(getPid()); -			const std::wstring wdump_path(wstringize(mDumpPath)); +			const std::wstring wdump_path(utf8str_to_utf16str(mDumpPath));  			int retries = 30;  			for (; retries > 0; --retries) @@ -515,9 +569,9 @@ void LLApp::setMiniDumpDir(const std::string &path)  	if(mExceptionHandler == 0) return;  #ifdef LL_WINDOWS -	wchar_t buffer[MAX_MINDUMP_PATH_LENGTH]; -	mbstowcs(buffer, mDumpPath.c_str(), MAX_MINDUMP_PATH_LENGTH); -	mExceptionHandler->set_dump_path(std::wstring(buffer)); +	std::wstring buffer(utf8str_to_utf16str(mDumpPath)); +	if (buffer.size() > MAX_MINDUMP_PATH_LENGTH) buffer.resize(MAX_MINDUMP_PATH_LENGTH); +	mExceptionHandler->set_dump_path(buffer);  #elif LL_LINUX          //google_breakpad::MinidumpDescriptor desc("/tmp");	//path works in debug fails in production inside breakpad lib so linux gets a little less stack reporting until it is patched.          google_breakpad::MinidumpDescriptor desc(mDumpPath);	//path works in debug fails in production inside breakpad lib so linux gets a little less stack reporting until it is patched. diff --git a/indra/llcommon/llapp.h b/indra/llcommon/llapp.h index ff9a92b45f..acd829d864 100644 --- a/indra/llcommon/llapp.h +++ b/indra/llcommon/llapp.h @@ -106,7 +106,7 @@ public:  	LLSD getOption(const std::string& name) const;  	/**  -	 * @brief Parse command line options and insert them into +	 * @brief Parse ASCII command line options and insert them into  	 * application command line options.  	 *  	 * The name inserted into the option will have leading option @@ -119,6 +119,20 @@ public:  	 */  	bool parseCommandOptions(int argc, char** argv); +	/**  +	 * @brief Parse Unicode command line options and insert them into +	 * application command line options. +	 * +	 * The name inserted into the option will have leading option +	 * identifiers (a minus or double minus) stripped. All options +	 * with values will be stored as a string, while all options +	 * without values will be stored as true. +	 * @param argc The argc passed into main(). +	 * @param wargv The wargv passed into main(). +	 * @return Returns true if the parse succeeded. +	 */ +	bool parseCommandOptions(int argc, wchar_t** wargv); +  	/**  	 * @brief Keep track of live files automatically.  	 * diff --git a/indra/newview/llappviewerwin32.cpp b/indra/newview/llappviewerwin32.cpp index 4268ecd91e..284a39301b 100644 --- a/indra/newview/llappviewerwin32.cpp +++ b/indra/newview/llappviewerwin32.cpp @@ -697,7 +697,7 @@ void LLAppViewerWin32::initCrashReporting(bool reportFreeze)  	exe_wstr = utf8str_to_utf16str(exe_path);  	std::wstring arg_wstr; -	arg_wstr=wstringize(arg_str); +	arg_wstr = utf8str_to_utf16str(arg_str);  	LL_INFOS("CrashReport") << "Creating crash reporter process " << exe_path << " with params: " << arg_str << LL_ENDL;      if(CreateProcess(exe_wstr.c_str(),      diff --git a/indra/win_crash_logger/llcrashloggerwindows.cpp b/indra/win_crash_logger/llcrashloggerwindows.cpp index 167acf6ac7..267224a79b 100644 --- a/indra/win_crash_logger/llcrashloggerwindows.cpp +++ b/indra/win_crash_logger/llcrashloggerwindows.cpp @@ -377,7 +377,7 @@ bool LLCrashLoggerWindows::initCrashServer()  	std::wstring wpipe_name;  	wpipe_name = mCrashReportPipeStr + std::wstring(wstringize(mPID)); -	std::wstring wdump_path( wstringize(dump_path) ); +	std::wstring wdump_path(utf8str_to_utf16str(dump_path));  	//Pipe naming conventions:  http://msdn.microsoft.com/en-us/library/aa365783%28v=vs.85%29.aspx  	mCrashHandler = new CrashGenerationServer( wpipe_name, diff --git a/indra/win_crash_logger/win_crash_logger.cpp b/indra/win_crash_logger/win_crash_logger.cpp index 7466dbb766..58746eba02 100644 --- a/indra/win_crash_logger/win_crash_logger.cpp +++ b/indra/win_crash_logger/win_crash_logger.cpp @@ -29,15 +29,26 @@  #include <stdlib.h>  #include "llcrashloggerwindows.h" +#ifdef _UNICODE +int APIENTRY wWinMain(HINSTANCE hInstance, +                      HINSTANCE hPrevInstance, +                      LPWSTR    lpCmdLine, +                      int       nCmdShow) +#else  int APIENTRY WinMain(HINSTANCE hInstance,                       HINSTANCE hPrevInstance,                       LPSTR     lpCmdLine,                       int       nCmdShow) +#endif //_UNICODE  {  	LL_INFOS() << "Starting crash reporter with args" << &lpCmdLine << LL_ENDL;  	LLCrashLoggerWindows app;  	app.setHandle(hInstance); +#ifdef _UNICODE +	app.parseCommandOptions(__argc, __wargv); +#else  	app.parseCommandOptions(__argc, __argv); +#endif //_UNICODE  	LLSD options = LLApp::instance()->getOptionData(                     LLApp::PRIORITY_COMMAND_LINE); | 
