diff options
Diffstat (limited to 'indra/viewer_components')
10 files changed, 256 insertions, 23 deletions
| diff --git a/indra/viewer_components/updater/llupdatedownloader.cpp b/indra/viewer_components/updater/llupdatedownloader.cpp index c17a50e242..e88d1bf811 100644 --- a/indra/viewer_components/updater/llupdatedownloader.cpp +++ b/indra/viewer_components/updater/llupdatedownloader.cpp @@ -24,17 +24,20 @@   */  #include "linden_common.h" + +#include "llupdatedownloader.h" +  #include <stdexcept>  #include <boost/format.hpp>  #include <boost/lexical_cast.hpp>  #include <curl/curl.h>  #include "lldir.h" +#include "llevents.h"  #include "llfile.h"  #include "llmd5.h"  #include "llsd.h"  #include "llsdserialize.h"  #include "llthread.h" -#include "llupdatedownloader.h"  #include "llupdaterservice.h" @@ -45,18 +48,25 @@ public:  	Implementation(LLUpdateDownloader::Client & client);  	~Implementation();  	void cancel(void); -	void download(LLURI const & uri, std::string const & hash); +	void download(LLURI const & uri, +				  std::string const & hash, +				  std::string const & updateVersion, +				  bool required);  	bool isDownloading(void);  	size_t onHeader(void * header, size_t size);  	size_t onBody(void * header, size_t size); +	int onProgress(double downloadSize, double bytesDownloaded);  	void resume(void); +	void setBandwidthLimit(U64 bytesPerSecond);  private: +	curl_off_t mBandwidthLimit;  	bool mCancelled;  	LLUpdateDownloader::Client & mClient;  	CURL * mCurl;  	LLSD mDownloadData;  	llofstream mDownloadStream; +	unsigned char mDownloadPercent;  	std::string mDownloadRecordPath;  	curl_slist * mHeaderList; @@ -113,9 +123,12 @@ void LLUpdateDownloader::cancel(void)  } -void LLUpdateDownloader::download(LLURI const & uri, std::string const & hash) +void LLUpdateDownloader::download(LLURI const & uri, +								  std::string const & hash, +								  std::string const & updateVersion, +								  bool required)  { -	mImplementation->download(uri, hash); +	mImplementation->download(uri, hash, updateVersion, required);  } @@ -131,6 +144,12 @@ void LLUpdateDownloader::resume(void)  } +void LLUpdateDownloader::setBandwidthLimit(U64 bytesPerSecond) +{ +	mImplementation->setBandwidthLimit(bytesPerSecond); +} + +  // LLUpdateDownloader::Implementation  //----------------------------------------------------------------------------- @@ -149,14 +168,27 @@ namespace {  		size_t bytes = blockSize * blocks;  		return reinterpret_cast<LLUpdateDownloader::Implementation *>(downloader)->onHeader(data, bytes);  	} + + +	int progress_callback(void * downloader, +						  double dowloadTotal, +						  double downloadNow, +						  double uploadTotal, +						  double uploadNow) +	{ +		return reinterpret_cast<LLUpdateDownloader::Implementation *>(downloader)-> +			onProgress(dowloadTotal, downloadNow); +	}  }  LLUpdateDownloader::Implementation::Implementation(LLUpdateDownloader::Client & client):  	LLThread("LLUpdateDownloader"), +	mBandwidthLimit(0),  	mCancelled(false),  	mClient(client),  	mCurl(0), +	mDownloadPercent(0),  	mHeaderList(0)  {  	CURLcode code = curl_global_init(CURL_GLOBAL_ALL); // Just in case. @@ -182,12 +214,17 @@ void LLUpdateDownloader::Implementation::cancel(void)  } -void LLUpdateDownloader::Implementation::download(LLURI const & uri, std::string const & hash) +void LLUpdateDownloader::Implementation::download(LLURI const & uri, +												  std::string const & hash, +												  std::string const & updateVersion, +												  bool required)  {  	if(isDownloading()) mClient.downloadError("download in progress");  	mDownloadRecordPath = downloadMarkerPath();  	mDownloadData = LLSD(); +	mDownloadData["required"] = required; +	mDownloadData["update_version"] = updateVersion;  	try {  		startDownloading(uri, hash);  	} catch(DownloadError const & e) { @@ -233,12 +270,18 @@ void LLUpdateDownloader::Implementation::resume(void)  				resumeDownloading(fileStatus.st_size);  			} else if(!validateDownload()) {  				LLFile::remove(filePath); -				download(LLURI(mDownloadData["url"].asString()), mDownloadData["hash"].asString()); +				download(LLURI(mDownloadData["url"].asString()),  +						 mDownloadData["hash"].asString(), +						 mDownloadData["update_version"].asString(), +						 mDownloadData["required"].asBoolean());  			} else {  				mClient.downloadComplete(mDownloadData);  			}  		} else { -			download(LLURI(mDownloadData["url"].asString()), mDownloadData["hash"].asString()); +			download(LLURI(mDownloadData["url"].asString()),  +					 mDownloadData["hash"].asString(), +					 mDownloadData["update_version"].asString(), +					 mDownloadData["required"].asBoolean());  		}  	} catch(DownloadError & e) {  		mClient.downloadError(e.what()); @@ -246,6 +289,20 @@ void LLUpdateDownloader::Implementation::resume(void)  } +void LLUpdateDownloader::Implementation::setBandwidthLimit(U64 bytesPerSecond) +{ +	if((mBandwidthLimit != bytesPerSecond) && isDownloading() && !mDownloadData["required"].asBoolean()) { +		llassert(mCurl != 0); +		mBandwidthLimit = bytesPerSecond; +		CURLcode code = curl_easy_setopt(mCurl, CURLOPT_MAX_RECV_SPEED_LARGE, &mBandwidthLimit); +		if(code != CURLE_OK) LL_WARNS("UpdateDownload") <<  +			"unable to change dowload bandwidth" << LL_ENDL; +	} else { +		mBandwidthLimit = bytesPerSecond; +	} +} + +  size_t LLUpdateDownloader::Implementation::onHeader(void * buffer, size_t size)  {  	char const * headerPtr = reinterpret_cast<const char *> (buffer); @@ -290,6 +347,30 @@ size_t LLUpdateDownloader::Implementation::onBody(void * buffer, size_t size)  } +int LLUpdateDownloader::Implementation::onProgress(double downloadSize, double bytesDownloaded) +{ +	int downloadPercent = static_cast<int>(100. * (bytesDownloaded / downloadSize)); +	if(downloadPercent > mDownloadPercent) { +		mDownloadPercent = downloadPercent; +		 +		LLSD event; +		event["pump"] = LLUpdaterService::pumpName(); +		LLSD payload; +		payload["type"] = LLSD(LLUpdaterService::PROGRESS); +		payload["download_size"] = downloadSize; +		payload["bytes_downloaded"] = bytesDownloaded; +		event["payload"] = payload; +		LLEventPumps::instance().obtain("mainlooprepeater").post(event); +		 +		LL_INFOS("UpdateDownload") << "progress event " << payload << LL_ENDL; +	} else { +		; // Keep events to a reasonalbe number. +	} +	 +	return 0; +} + +  void LLUpdateDownloader::Implementation::run(void)  {  	CURLcode code = curl_easy_perform(mCurl); @@ -343,6 +424,14 @@ void LLUpdateDownloader::Implementation::initializeCurlGet(std::string const & u  	}  	throwOnCurlError(curl_easy_setopt(mCurl, CURLOPT_HTTPGET, true));  	throwOnCurlError(curl_easy_setopt(mCurl, CURLOPT_URL, url.c_str())); +	throwOnCurlError(curl_easy_setopt(mCurl, CURLOPT_PROGRESSFUNCTION, &progress_callback)); +	throwOnCurlError(curl_easy_setopt(mCurl, CURLOPT_PROGRESSDATA, this)); +	throwOnCurlError(curl_easy_setopt(mCurl, CURLOPT_NOPROGRESS, false)); +	// if it's a required update set the bandwidth limit to 0 (unlimited) +	curl_off_t limit = mDownloadData["required"].asBoolean() ? 0 : mBandwidthLimit; +	throwOnCurlError(curl_easy_setopt(mCurl, CURLOPT_MAX_RECV_SPEED_LARGE, limit)); +	 +	mDownloadPercent = 0;  } diff --git a/indra/viewer_components/updater/llupdatedownloader.h b/indra/viewer_components/updater/llupdatedownloader.h index 1b3d7480fd..0d635640cf 100644 --- a/indra/viewer_components/updater/llupdatedownloader.h +++ b/indra/viewer_components/updater/llupdatedownloader.h @@ -52,7 +52,10 @@ public:  	void cancel(void);  	// Start a new download. -	void download(LLURI const & uri, std::string const & hash); +	void download(LLURI const & uri, +				  std::string const & hash,  +				  std::string const & updateVersion, +				  bool required=false);  	// Returns true if a download is in progress.  	bool isDownloading(void); @@ -60,6 +63,9 @@ public:  	// Resume a partial download.  	void resume(void); +	// Set a limit on the dowload rate. +	void setBandwidthLimit(U64 bytesPerSecond); +	  private:  	boost::shared_ptr<Implementation> mImplementation;  }; @@ -76,6 +82,7 @@ public:  	// url - source (remote) location  	// hash - the md5 sum that should match the installer file.  	// path - destination (local) location +	// required - boolean indicating if this is a required update.  	// size - the size of the installer in bytes  	virtual void downloadComplete(LLSD const & data) = 0; diff --git a/indra/viewer_components/updater/llupdateinstaller.cpp b/indra/viewer_components/updater/llupdateinstaller.cpp index 650ef88af4..c7b70c2de8 100644 --- a/indra/viewer_components/updater/llupdateinstaller.cpp +++ b/indra/viewer_components/updater/llupdateinstaller.cpp @@ -31,6 +31,12 @@  #include "lldir.h"  +#if defined(LL_WINDOWS) +#pragma warning(disable: 4702)      // disable 'unreachable code' so we can use lexical_cast (really!). +#endif +#include <boost/lexical_cast.hpp> + +  namespace {  	class RelocateError {}; @@ -47,7 +53,10 @@ namespace {  } -int ll_install_update(std::string const & script, std::string const & updatePath, LLInstallScriptMode mode) +int ll_install_update(std::string const & script, +					  std::string const & updatePath, +					  bool required, +					  LLInstallScriptMode mode)  {  	std::string actualScriptPath;  	switch(mode) { @@ -73,6 +82,7 @@ int ll_install_update(std::string const & script, std::string const & updatePath  	launcher.setExecutable(actualScriptPath);  	launcher.addArgument(updatePath);  	launcher.addArgument(ll_install_failed_marker_path().c_str()); +	launcher.addArgument(boost::lexical_cast<std::string>(required));  	int result = launcher.launch();  	launcher.orphan(); diff --git a/indra/viewer_components/updater/llupdateinstaller.h b/indra/viewer_components/updater/llupdateinstaller.h index 6ce08ce6fa..fe5b1d19b5 100644 --- a/indra/viewer_components/updater/llupdateinstaller.h +++ b/indra/viewer_components/updater/llupdateinstaller.h @@ -42,9 +42,10 @@ enum LLInstallScriptMode {  // that the current application terminate once this function is called.  //  int ll_install_update( -					   std::string const & script, // Script to execute. -					   std::string const & updatePath, // Path to update file. -					   LLInstallScriptMode mode=LL_COPY_INSTALL_SCRIPT_TO_TEMP); // Run in place or copy to temp? +					  std::string const & script, // Script to execute. +					  std::string const & updatePath, // Path to update file. +					  bool required, // Is the update required. +					  LLInstallScriptMode mode=LL_COPY_INSTALL_SCRIPT_TO_TEMP); // Run in place or copy to temp?  // diff --git a/indra/viewer_components/updater/llupdaterservice.cpp b/indra/viewer_components/updater/llupdaterservice.cpp index cc60eaead2..aa4983a3b6 100644 --- a/indra/viewer_components/updater/llupdaterservice.cpp +++ b/indra/viewer_components/updater/llupdaterservice.cpp @@ -25,10 +25,11 @@  #include "linden_common.h" +#include "llupdaterservice.h" +  #include "llupdatedownloader.h"  #include "llevents.h"  #include "lltimer.h" -#include "llupdaterservice.h"  #include "llupdatechecker.h"  #include "llupdateinstaller.h"  #include "llversionviewer.h" @@ -98,6 +99,8 @@ class LLUpdaterServiceImpl :  	LLUpdaterService::app_exit_callback_t mAppExitCallback; +	LLUpdaterService::eUpdaterState mState; +	  	LOG_CLASS(LLUpdaterServiceImpl);  public: @@ -111,12 +114,15 @@ public:  				   const std::string& version);  	void setCheckPeriod(unsigned int seconds); +	void setBandwidthLimit(U64 bytesPerSecond);  	void startChecking(bool install_if_ready);  	void stopChecking();  	bool isChecking(); +	LLUpdaterService::eUpdaterState getState();  	void setAppExitCallback(LLUpdaterService::app_exit_callback_t aecb) { mAppExitCallback = aecb;} +	std::string updatedVersion(void);  	bool checkForInstall(bool launchInstaller); // Test if a local install is ready.  	bool checkForResume(); // Test for resumeable d/l. @@ -138,7 +144,10 @@ public:  	bool onMainLoop(LLSD const & event);  private: +	std::string mNewVersion; +	  	void restartTimer(unsigned int seconds); +	void setState(LLUpdaterService::eUpdaterState state);  	void stopTimer();  }; @@ -149,7 +158,8 @@ LLUpdaterServiceImpl::LLUpdaterServiceImpl() :  	mIsDownloading(false),  	mCheckPeriod(0),  	mUpdateChecker(*this), -	mUpdateDownloader(*this) +	mUpdateDownloader(*this), +	mState(LLUpdaterService::INITIAL)  {  } @@ -183,6 +193,11 @@ void LLUpdaterServiceImpl::setCheckPeriod(unsigned int seconds)  	mCheckPeriod = seconds;  } +void LLUpdaterServiceImpl::setBandwidthLimit(U64 bytesPerSecond) +{ +	mUpdateDownloader.setBandwidthLimit(bytesPerSecond); +} +  void LLUpdaterServiceImpl::startChecking(bool install_if_ready)  {  	if(mUrl.empty() || mChannel.empty() || mVersion.empty()) @@ -201,10 +216,16 @@ void LLUpdaterServiceImpl::startChecking(bool install_if_ready)  		if(!mIsDownloading)  		{ +			setState(LLUpdaterService::CHECKING_FOR_UPDATE); +			  			// Checking can only occur during the mainloop.  			// reset the timer to 0 so that the next mainloop event   			// triggers a check;  			restartTimer(0);  +		}  +		else +		{ +			setState(LLUpdaterService::DOWNLOADING);  		}  	}  } @@ -222,6 +243,8 @@ void LLUpdaterServiceImpl::stopChecking()          mUpdateDownloader.cancel();  		mIsDownloading = false;      } +	 +	setState(LLUpdaterService::TERMINAL);  }  bool LLUpdaterServiceImpl::isChecking() @@ -229,6 +252,16 @@ bool LLUpdaterServiceImpl::isChecking()  	return mIsChecking;  } +LLUpdaterService::eUpdaterState LLUpdaterServiceImpl::getState() +{ +	return mState; +} + +std::string LLUpdaterServiceImpl::updatedVersion(void) +{ +	return mNewVersion; +} +  bool LLUpdaterServiceImpl::checkForInstall(bool launchInstaller)  {  	bool foundInstall = false; // return true if install is found. @@ -266,10 +299,13 @@ bool LLUpdaterServiceImpl::checkForInstall(bool launchInstaller)  		{  			if(launchInstaller)  			{ +				setState(LLUpdaterService::INSTALLING); +				  				LLFile::remove(update_marker_path());  				int result = ll_install_update(install_script_path(),  											   update_info["path"].asString(), +											   update_info["required"].asBoolean(),  											   install_script_mode());	  				if((result == 0) && mAppExitCallback) @@ -304,6 +340,7 @@ bool LLUpdaterServiceImpl::checkForResume()  			if(download_info["current_version"].asString() == ll_get_version())  			{  				mIsDownloading = true; +				mNewVersion = download_info["update_version"].asString();  				mUpdateDownloader.resume();  				result = true;  			} @@ -333,8 +370,11 @@ void LLUpdaterServiceImpl::optionalUpdate(std::string const & newVersion,  										  std::string const & hash)  {  	stopTimer(); +	mNewVersion = newVersion;  	mIsDownloading = true; -	mUpdateDownloader.download(uri, hash); +	mUpdateDownloader.download(uri, hash, newVersion, false); +	 +	setState(LLUpdaterService::DOWNLOADING);  }  void LLUpdaterServiceImpl::requiredUpdate(std::string const & newVersion, @@ -342,8 +382,11 @@ void LLUpdaterServiceImpl::requiredUpdate(std::string const & newVersion,  										  std::string const & hash)  {  	stopTimer(); +	mNewVersion = newVersion;  	mIsDownloading = true; -	mUpdateDownloader.download(uri, hash); +	mUpdateDownloader.download(uri, hash, newVersion, true); +	 +	setState(LLUpdaterService::DOWNLOADING);  }  void LLUpdaterServiceImpl::upToDate(void) @@ -352,6 +395,8 @@ void LLUpdaterServiceImpl::upToDate(void)  	{  		restartTimer(mCheckPeriod);  	} +	 +	setState(LLUpdaterService::UP_TO_DATE);  }  void LLUpdaterServiceImpl::downloadComplete(LLSD const & data)  @@ -367,8 +412,12 @@ void LLUpdaterServiceImpl::downloadComplete(LLSD const & data)  	event["pump"] = LLUpdaterService::pumpName();  	LLSD payload;  	payload["type"] = LLSD(LLUpdaterService::DOWNLOAD_COMPLETE); +	payload["required"] = data["required"]; +	payload["version"] = mNewVersion;  	event["payload"] = payload;  	LLEventPumps::instance().obtain("mainlooprepeater").post(event); +	 +	setState(LLUpdaterService::TERMINAL);  }  void LLUpdaterServiceImpl::downloadError(std::string const & message)  @@ -390,6 +439,8 @@ void LLUpdaterServiceImpl::downloadError(std::string const & message)  	payload["message"] = message;  	event["payload"] = payload;  	LLEventPumps::instance().obtain("mainlooprepeater").post(event); + +	setState(LLUpdaterService::FAILURE);  }  void LLUpdaterServiceImpl::restartTimer(unsigned int seconds) @@ -402,6 +453,28 @@ void LLUpdaterServiceImpl::restartTimer(unsigned int seconds)  		sListenerName, boost::bind(&LLUpdaterServiceImpl::onMainLoop, this, _1));  } +void LLUpdaterServiceImpl::setState(LLUpdaterService::eUpdaterState state) +{ +	if(state != mState) +	{ +		mState = state; +		 +		LLSD event; +		event["pump"] = LLUpdaterService::pumpName(); +		LLSD payload; +		payload["type"] = LLSD(LLUpdaterService::STATE_CHANGE); +		payload["state"] = state; +		event["payload"] = payload; +		LLEventPumps::instance().obtain("mainlooprepeater").post(event); +		 +		LL_INFOS("UpdaterService") << "setting state to " << state << LL_ENDL; +	} +	else  +	{ +		; // State unchanged; noop. +	} +} +  void LLUpdaterServiceImpl::stopTimer()  {  	mTimer.stop(); @@ -417,6 +490,12 @@ bool LLUpdaterServiceImpl::onMainLoop(LLSD const & event)  		// Check for failed install.  		if(LLFile::isfile(ll_install_failed_marker_path()))  		{ +			int requiredValue = 0;  +			{ +				llifstream stream(ll_install_failed_marker_path()); +				stream >> requiredValue; +				if(stream.fail()) requiredValue = 0; +			}  			// TODO: notify the user.  			llinfos << "found marker " << ll_install_failed_marker_path() << llendl;  			llinfos << "last install attempt failed" << llendl; @@ -424,11 +503,15 @@ bool LLUpdaterServiceImpl::onMainLoop(LLSD const & event)  			LLSD event;  			event["type"] = LLSD(LLUpdaterService::INSTALL_ERROR); +			event["required"] = LLSD(requiredValue);  			LLEventPumps::instance().obtain(LLUpdaterService::pumpName()).post(event); +			 +			setState(LLUpdaterService::TERMINAL);  		}  		else  		{  			mUpdateChecker.check(mProtocolVersion, mUrl, mPath, mChannel, mVersion); +			setState(LLUpdaterService::CHECKING_FOR_UPDATE);  		}  	}   	else  @@ -449,6 +532,11 @@ std::string const & LLUpdaterService::pumpName(void)  	return name;  } +bool LLUpdaterService::updateReadyToInstall(void) +{ +	return LLFile::isfile(update_marker_path()); +} +  LLUpdaterService::LLUpdaterService()  {  	if(gUpdater.expired()) @@ -480,6 +568,11 @@ void LLUpdaterService::setCheckPeriod(unsigned int seconds)  {  	mImpl->setCheckPeriod(seconds);  } + +void LLUpdaterService::setBandwidthLimit(U64 bytesPerSecond) +{ +	mImpl->setBandwidthLimit(bytesPerSecond); +}  void LLUpdaterService::startChecking(bool install_if_ready)  { @@ -496,11 +589,21 @@ bool LLUpdaterService::isChecking()  	return mImpl->isChecking();  } +LLUpdaterService::eUpdaterState LLUpdaterService::getState() +{ +	return mImpl->getState(); +} +  void LLUpdaterService::setImplAppExitCallback(LLUpdaterService::app_exit_callback_t aecb)  {  	return mImpl->setAppExitCallback(aecb);  } +std::string LLUpdaterService::updatedVersion(void) +{ +	return mImpl->updatedVersion(); +} +  std::string const & ll_get_version(void) {  	static std::string version(""); diff --git a/indra/viewer_components/updater/llupdaterservice.h b/indra/viewer_components/updater/llupdaterservice.h index 752a6f834b..421481bc43 100644 --- a/indra/viewer_components/updater/llupdaterservice.h +++ b/indra/viewer_components/updater/llupdaterservice.h @@ -43,12 +43,27 @@ public:  	// Name of the event pump through which update events will be delivered.  	static std::string const & pumpName(void); +	// Returns true if an update has been completely downloaded and is now ready to install. +	static bool updateReadyToInstall(void); +	  	// Type codes for events posted by this service.  Stored the event's 'type' element. -	enum eUpdateEvent { +	enum eUpdaterEvent {  		INVALID,  		DOWNLOAD_COMPLETE,  		DOWNLOAD_ERROR, -		INSTALL_ERROR +		INSTALL_ERROR, +		PROGRESS, +		STATE_CHANGE +	}; +	 +	enum eUpdaterState { +		INITIAL, +		CHECKING_FOR_UPDATE, +		DOWNLOADING, +		INSTALLING, +		UP_TO_DATE, +		TERMINAL, +		FAILURE  	};  	LLUpdaterService(); @@ -61,10 +76,12 @@ public:  				    const std::string& version);  	void setCheckPeriod(unsigned int seconds); +	void setBandwidthLimit(U64 bytesPerSecond);  	void startChecking(bool install_if_ready = false);  	void stopChecking();  	bool isChecking(); +	eUpdaterState getState();  	typedef boost::function<void (void)> app_exit_callback_t;  	template <typename F> @@ -73,6 +90,11 @@ public:  		app_exit_callback_t aecb = callable;  		setImplAppExitCallback(aecb);  	} +	 +	// If an update is or has been downloaded, this method will return the +	// version string for that update.  An empty string will be returned +	// otherwise. +	std::string updatedVersion(void);  private:  	boost::shared_ptr<LLUpdaterServiceImpl> mImpl; diff --git a/indra/viewer_components/updater/scripts/darwin/update_install b/indra/viewer_components/updater/scripts/darwin/update_install index 9df382f119..6a95f96d86 100644 --- a/indra/viewer_components/updater/scripts/darwin/update_install +++ b/indra/viewer_components/updater/scripts/darwin/update_install @@ -6,5 +6,5 @@  #  cd "$(dirname "$0")" -../Resources/mac-updater.app/Contents/MacOS/mac-updater -dmg "$1" -name "Second Life Viewer 2" -marker "$2" & +(../Resources/mac-updater.app/Contents/MacOS/mac-updater -dmg "$1" -name "Second Life Viewer 2"; if [ $? -ne 0 ]; then echo $3 >> "$2"; fi;) &  exit 0 diff --git a/indra/viewer_components/updater/scripts/linux/update_install b/indra/viewer_components/updater/scripts/linux/update_install index a271926e25..88451340ec 100644 --- a/indra/viewer_components/updater/scripts/linux/update_install +++ b/indra/viewer_components/updater/scripts/linux/update_install @@ -4,7 +4,7 @@ export LD_LIBRARY_PATH="$INSTALL_DIR/lib"  bin/linux-updater.bin --file "$1" --dest "$INSTALL_DIR" --name "Second Life Viewer 2" --stringsdir "$INSTALL_DIR/skins/default/xui/en" --stringsfile "strings.xml"  if [ $? -ne 0 ] -   then touch "$2" +   then echo $3 >> "$2"  fi  rm -f "$1" diff --git a/indra/viewer_components/updater/scripts/windows/update_install.bat b/indra/viewer_components/updater/scripts/windows/update_install.bat index 42e148a707..96687226a8 100644 --- a/indra/viewer_components/updater/scripts/windows/update_install.bat +++ b/indra/viewer_components/updater/scripts/windows/update_install.bat @@ -1,3 +1,3 @@  start /WAIT %1 /SKIP_DIALOGS
 -IF ERRORLEVEL 1 ECHO %ERRORLEVEL% > %2
 +IF ERRORLEVEL 1 ECHO %3 > %2
  DEL %1
 diff --git a/indra/viewer_components/updater/tests/llupdaterservice_test.cpp b/indra/viewer_components/updater/tests/llupdaterservice_test.cpp index 04ed4e6364..5f8cd28f29 100644 --- a/indra/viewer_components/updater/tests/llupdaterservice_test.cpp +++ b/indra/viewer_components/updater/tests/llupdaterservice_test.cpp @@ -48,7 +48,7 @@ void LLUpdateChecker::check(std::string const & protocolVersion, std::string con  								  std::string const & servicePath, std::string channel, std::string version)
  {}
  LLUpdateDownloader::LLUpdateDownloader(Client & ) {}
 -void LLUpdateDownloader::download(LLURI const & , std::string const &){}
 +void LLUpdateDownloader::download(LLURI const & , std::string const &, std::string const &, bool){}
  class LLDir_Mock : public LLDir
  {
 @@ -101,8 +101,9 @@ std::string LLUpdateDownloader::downloadMarkerPath(void)  void LLUpdateDownloader::resume(void) {}
  void LLUpdateDownloader::cancel(void) {}
 +void LLUpdateDownloader::setBandwidthLimit(U64 bytesPerSecond) {}
 -int ll_install_update(std::string const &, std::string const &, LLInstallScriptMode)
 +int ll_install_update(std::string const &, std::string const &, bool, LLInstallScriptMode)
  {
  	return 0;
  }
 | 
