diff options
Diffstat (limited to 'indra/newview')
| -rw-r--r-- | indra/newview/CMakeLists.txt | 3 | ||||
| -rw-r--r-- | indra/newview/llexternaleditor.cpp | 67 | ||||
| -rw-r--r-- | indra/newview/llexternaleditor.h | 6 | ||||
| -rw-r--r-- | indra/newview/llviewerprecompiledheaders.h | 4 | ||||
| -rw-r--r-- | indra/newview/llvoicevivox.cpp | 140 | 
5 files changed, 48 insertions, 172 deletions
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index f85b943c70..61ece1f857 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -30,7 +30,6 @@ include(LLUI)  include(LLVFS)  include(LLWindow)  include(LLXML) -include(LLXUIXML)  include(LScript)  include(Linking)  include(NDOF) @@ -65,7 +64,6 @@ include_directories(      ${LLVFS_INCLUDE_DIRS}      ${LLWINDOW_INCLUDE_DIRS}      ${LLXML_INCLUDE_DIRS} -    ${LLXUIXML_INCLUDE_DIRS}      ${LSCRIPT_INCLUDE_DIRS}      ${LSCRIPT_INCLUDE_DIRS}/lscript_compile      ${LLLOGIN_INCLUDE_DIRS} @@ -1744,7 +1742,6 @@ target_link_libraries(${VIEWER_BINARY_NAME}      ${LLVFS_LIBRARIES}      ${LLWINDOW_LIBRARIES}      ${LLXML_LIBRARIES} -    ${LLXUIXML_LIBRARIES}      ${LSCRIPT_LIBRARIES}      ${LLMATH_LIBRARIES}      ${LLCOMMON_LIBRARIES} diff --git a/indra/newview/llexternaleditor.cpp b/indra/newview/llexternaleditor.cpp index ed1d7e860a..db482f023e 100644 --- a/indra/newview/llexternaleditor.cpp +++ b/indra/newview/llexternaleditor.cpp @@ -29,6 +29,9 @@  #include "lltrans.h"  #include "llui.h" +#include "llprocess.h" +#include "llsdutil.h" +#include <boost/foreach.hpp>  // static  const std::string LLExternalEditor::sFilenameMarker = "%s"; @@ -45,19 +48,8 @@ LLExternalEditor::EErrorCode LLExternalEditor::setCommand(const std::string& env  		return EC_NOT_SPECIFIED;  	} -	// Add the filename marker if missing. -	if (cmd.find(sFilenameMarker) == std::string::npos) -	{ -		cmd += " \"" + sFilenameMarker + "\""; -		llinfos << "Adding the filename marker (" << sFilenameMarker << ")" << llendl; -	} -  	string_vec_t tokens; -	if (tokenize(tokens, cmd) < 2) // 2 = bin + at least one arg (%s) -	{ -		llwarns << "Error parsing editor command" << llendl; -		return EC_PARSE_ERROR; -	} +	tokenize(tokens, cmd);  	// Check executable for existence.  	std::string bin_path = tokens[0]; @@ -68,51 +60,48 @@ LLExternalEditor::EErrorCode LLExternalEditor::setCommand(const std::string& env  	}  	// Save command. -	mProcess.setExecutable(bin_path); -	mArgs.clear(); +	mProcessParams = LLProcess::Params(); +	mProcessParams.executable = bin_path;  	for (size_t i = 1; i < tokens.size(); ++i)  	{ -		if (i > 1) mArgs += " "; -		mArgs += "\"" + tokens[i] + "\""; +		mProcessParams.args.add(tokens[i]); +	} + +	// Add the filename marker if missing. +	if (cmd.find(sFilenameMarker) == std::string::npos) +	{ +		mProcessParams.args.add(sFilenameMarker); +		llinfos << "Adding the filename marker (" << sFilenameMarker << ")" << llendl;  	} -	llinfos << "Setting command [" << bin_path << " " << mArgs << "]" << llendl; + +	llinfos << "Setting command [" << mProcessParams << "]" << llendl;  	return EC_SUCCESS;  }  LLExternalEditor::EErrorCode LLExternalEditor::run(const std::string& file_path)  { -	std::string args = mArgs; -	if (mProcess.getExecutable().empty() || args.empty()) +	if (std::string(mProcessParams.executable).empty() || mProcessParams.args.empty())  	{  		llwarns << "Editor command not set" << llendl;  		return EC_NOT_SPECIFIED;  	} -	// Substitute the filename marker in the command with the actual passed file name. -	LLStringUtil::replaceString(args, sFilenameMarker, file_path); +	// Copy params block so we can replace sFilenameMarker +	LLProcess::Params params; +	params.executable = mProcessParams.executable; -	// Split command into separate tokens. -	string_vec_t tokens; -	tokenize(tokens, args); - -	// Set process arguments taken from the command. -	mProcess.clearArguments(); -	for (string_vec_t::const_iterator arg_it = tokens.begin(); arg_it != tokens.end(); ++arg_it) -	{ -		mProcess.addArgument(*arg_it); -	} - -	// Run the editor. -	llinfos << "Running editor command [" << mProcess.getExecutable() + " " + args << "]" << llendl; -	int result = mProcess.launch(); -	if (result == 0) +	// Substitute the filename marker in the command with the actual passed file name. +	BOOST_FOREACH(const std::string& arg, mProcessParams.args)  	{ -		// Prevent killing the process in destructor (will add it to the zombies list). -		mProcess.orphan(); +		std::string fixed(arg); +		LLStringUtil::replaceString(fixed, sFilenameMarker, file_path); +		params.args.add(fixed);  	} -	return result == 0 ? EC_SUCCESS : EC_FAILED_TO_RUN; +	// Run the editor. Prevent killing the process in destructor. +	params.autokill = false; +	return LLProcess::create(params) ? EC_SUCCESS : EC_FAILED_TO_RUN;  }  // static diff --git a/indra/newview/llexternaleditor.h b/indra/newview/llexternaleditor.h index ef5db56c6e..fd2c25020c 100644 --- a/indra/newview/llexternaleditor.h +++ b/indra/newview/llexternaleditor.h @@ -27,7 +27,7 @@  #ifndef LL_LLEXTERNALEDITOR_H  #define LL_LLEXTERNALEDITOR_H -#include <llprocesslauncher.h> +#include "llprocess.h"  /**   * Usage: @@ -97,9 +97,7 @@ private:  	 */  	static const std::string sSetting; - -	std::string			mArgs; -	LLProcessLauncher	mProcess; +	LLProcess::Params		mProcessParams;  };  #endif // LL_LLEXTERNALEDITOR_H diff --git a/indra/newview/llviewerprecompiledheaders.h b/indra/newview/llviewerprecompiledheaders.h index f738b84bb9..6c8a827ba3 100644 --- a/indra/newview/llviewerprecompiledheaders.h +++ b/indra/newview/llviewerprecompiledheaders.h @@ -57,6 +57,8 @@  #include "lldeleteutils.h"  #include "imageids.h"  #include "indra_constants.h" +#include "llinitparam.h" +  //#include "linden_common.h"  //#include "llpreprocessor.h"  #include "llallocator.h" @@ -124,7 +126,5 @@  // Library includes from llmessage project  #include "llcachename.h" -// Library includes from llxuixml -#include "llinitparam.h"  #endif diff --git a/indra/newview/llvoicevivox.cpp b/indra/newview/llvoicevivox.cpp index df1d3f2955..820d1d73e1 100644 --- a/indra/newview/llvoicevivox.cpp +++ b/indra/newview/llvoicevivox.cpp @@ -27,8 +27,6 @@  #include "llviewerprecompiledheaders.h"  #include "llvoicevivox.h" -#include <boost/tokenizer.hpp> -  #include "llsdutil.h"  // Linden library includes @@ -47,6 +45,7 @@  #include "llbase64.h"  #include "llviewercontrol.h"  #include "llappviewer.h"	// for gDisconnected, gDisableVoice +#include "llprocess.h"  // Viewer includes  #include "llmutelist.h"  // to check for muted avatars @@ -242,59 +241,21 @@ void LLVivoxVoiceClientCapResponder::result(const LLSD& content)  	}  } - - -#if LL_WINDOWS -static HANDLE sGatewayHandle = 0; +static LLProcessPtr sGatewayPtr;  static bool isGatewayRunning()  { -	bool result = false; -	if(sGatewayHandle != 0)		 -	{ -		DWORD waitresult = WaitForSingleObject(sGatewayHandle, 0); -		if(waitresult != WAIT_OBJECT_0) -		{ -			result = true; -		}			 -	} -	return result; -} -static void killGateway() -{ -	if(sGatewayHandle != 0) -	{ -		TerminateProcess(sGatewayHandle,0); -	} -} - -#else // Mac and linux - -static pid_t sGatewayPID = 0; -static bool isGatewayRunning() -{ -	bool result = false; -	if(sGatewayPID != 0) -	{ -		// A kill with signal number 0 has no effect, just does error checking.  It should return an error if the process no longer exists. -		if(kill(sGatewayPID, 0) == 0) -		{ -			result = true; -		} -	} -	return result; +	return sGatewayPtr && sGatewayPtr->isRunning();  }  static void killGateway()  { -	if(sGatewayPID != 0) +	if (sGatewayPtr)  	{ -		kill(sGatewayPID, SIGTERM); +		sGatewayPtr->kill();  	}  } -#endif -  ///////////////////////////////////////////////////////////////////////////////////////////////  LLVivoxVoiceClient::LLVivoxVoiceClient() : @@ -790,7 +751,7 @@ void LLVivoxVoiceClient::stateMachine()  			}  			else if(!isGatewayRunning())  			{ -				if(true) +				if (true)           // production build, not test  				{  					// Launch the voice daemon @@ -809,102 +770,33 @@ void LLVivoxVoiceClient::stateMachine()  #endif  					// See if the vivox executable exists  					llstat s; -					if(!LLFile::stat(exe_path, &s)) +					if (!LLFile::stat(exe_path, &s))  					{  						// vivox executable exists.  Build the command line and launch the daemon. +						LLProcess::Params params; +						params.executable = exe_path;  						// SLIM SDK: these arguments are no longer necessary.  //						std::string args = " -p tcp -h -c"; -						std::string args; -						std::string cmd;  						std::string loglevel = gSavedSettings.getString("VivoxDebugLevel"); -						  						if(loglevel.empty())  						{  							loglevel = "-1";	// turn logging off completely  						} -						 -						args += " -ll "; -						args += loglevel; -						 -						LL_DEBUGS("Voice") << "Args for SLVoice: " << args << LL_ENDL; - -#if LL_WINDOWS -						PROCESS_INFORMATION pinfo; -						STARTUPINFOA sinfo; -						 -						memset(&sinfo, 0, sizeof(sinfo)); -						 -						std::string exe_dir = gDirUtilp->getAppRODataDir(); -						cmd = "SLVoice.exe"; -						cmd += args; - -						// So retarded.  Windows requires that the second parameter to CreateProcessA be writable (non-const) string... -						char *args2 = new char[args.size() + 1]; -						strcpy(args2, args.c_str()); -						if(!CreateProcessA(exe_path.c_str(), args2, NULL, NULL, FALSE, 0, NULL, exe_dir.c_str(), &sinfo, &pinfo)) -						{ -//							DWORD dwErr = GetLastError(); -						} -						else -						{ -							// foo = pinfo.dwProcessId; // get your pid here if you want to use it later on -							// CloseHandle(pinfo.hProcess); // stops leaks - nothing else -							sGatewayHandle = pinfo.hProcess; -							CloseHandle(pinfo.hThread); // stops leaks - nothing else -						}		 -						 -						delete[] args2; -#else	// LL_WINDOWS -						// This should be the same for mac and linux -						{ -							std::vector<std::string> arglist; -							arglist.push_back(exe_path); -							 -							// Split the argument string into separate strings for each argument -							typedef boost::tokenizer<boost::char_separator<char> > tokenizer; -							boost::char_separator<char> sep(" "); -							tokenizer tokens(args, sep); -							tokenizer::iterator token_iter; -							for(token_iter = tokens.begin(); token_iter != tokens.end(); ++token_iter) -							{ -								arglist.push_back(*token_iter); -							} -							 -							// create an argv vector for the child process -							char **fakeargv = new char*[arglist.size() + 1]; -							int i; -							for(i=0; i < arglist.size(); i++) -								fakeargv[i] = const_cast<char*>(arglist[i].c_str()); +						params.args.add("-ll"); +						params.args.add(loglevel); +						params.cwd = gDirUtilp->getAppRODataDir(); +						sGatewayPtr = LLProcess::create(params); -							fakeargv[i] = NULL; -							 -							fflush(NULL); // flush all buffers before the child inherits them -							pid_t id = vfork(); -							if(id == 0) -							{ -								// child -								execv(exe_path.c_str(), fakeargv); -								 -								// If we reach this point, the exec failed. -								// Use _exit() instead of exit() per the vfork man page. -								_exit(0); -							} - -							// parent -							delete[] fakeargv; -							sGatewayPID = id; -						} -#endif	// LL_WINDOWS  						mDaemonHost = LLHost(gSavedSettings.getString("VivoxVoiceHost").c_str(), gSavedSettings.getU32("VivoxVoicePort")); -					}	 +					}  					else  					{  						LL_INFOS("Voice") << exe_path << " not found." << LL_ENDL; -					}	 +					}  				}  				else -				{		 +				{  					// SLIM SDK: port changed from 44124 to 44125.  					// We can connect to a client gateway running on another host.  This is useful for testing.  					// To do this, launch the gateway on a nearby host like this:  | 
