diff options
Diffstat (limited to 'indra/newview')
31 files changed, 670 insertions, 107 deletions
| diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 5647418619..fa49c1ac4c 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -64,6 +64,7 @@ include_directories(      ${LSCRIPT_INCLUDE_DIRS}      ${LSCRIPT_INCLUDE_DIRS}/lscript_compile      ${LLLOGIN_INCLUDE_DIRS} +    ${UPDATER_INCLUDE_DIRS}      )  set(viewer_SOURCE_FILES @@ -284,6 +285,7 @@ set(viewer_SOURCE_FILES      llloginhandler.cpp      lllogininstance.cpp      llmachineid.cpp +    llmainlooprepeater.cpp      llmanip.cpp      llmaniprotate.cpp      llmanipscale.cpp @@ -818,6 +820,7 @@ set(viewer_HEADER_FILES      llloginhandler.h      lllogininstance.h      llmachineid.h +    llmainlooprepeater.h      llmanip.h      llmaniprotate.h      llmanipscale.h @@ -1646,7 +1649,14 @@ if (WINDOWS)      endif (PACKAGE)  endif (WINDOWS) +# *NOTE - this list is very sensitive to ordering, test carefully on all +# platforms if you change the releative order of the entries here. +# In particular, cmake 2.6.4 (when buidling with linux/makefile generators) +# appears to sometimes de-duplicate redundantly listed dependencies improperly. +# To work around this, higher level modules should be listed before the modules +# that they depend upon. -brad  target_link_libraries(${VIEWER_BINARY_NAME} +    ${UPDATER_LIBRARIES}      ${LLAUDIO_LIBRARIES}      ${LLCHARACTER_LIBRARIES}      ${LLIMAGE_LIBRARIES} @@ -1833,10 +1843,18 @@ if (PACKAGE)      set(VIEWER_COPY_MANIFEST copy_l_viewer_manifest)    endif (LINUX) +  if(CMAKE_CFG_INTDIR STREQUAL ".") +      set(LLBUILD_CONFIG ${CMAKE_BUILD_TYPE}) +  else(CMAKE_CFG_INTDIR STREQUAL ".") +      # set LLBUILD_CONFIG to be a shell variable evaluated at build time +      # reflecting the configuration we are currently building. +      set(LLBUILD_CONFIG ${CMAKE_CFG_INTDIR}) +  endif(CMAKE_CFG_INTDIR STREQUAL ".")    add_custom_command(OUTPUT "${VIEWER_SYMBOL_FILE}"      COMMAND "${PYTHON_EXECUTABLE}"      ARGS        "${CMAKE_CURRENT_SOURCE_DIR}/generate_breakpad_symbols.py" +      "${LLBUILD_CONFIG}"        "${VIEWER_DIST_DIR}"        "${VIEWER_EXE_GLOBS}"        "${VIEWER_LIB_GLOB}" @@ -1845,7 +1863,7 @@ if (PACKAGE)      DEPENDS generate_breakpad_symbols.py      VERBATIM    ) -  add_custom_target(generate_breakpad_symbols ALL DEPENDS "${VIEWER_SYMBOL_FILE}") +  add_custom_target(generate_breakpad_symbols DEPENDS "${VIEWER_SYMBOL_FILE}")    add_dependencies(generate_breakpad_symbols "${VIEWER_BINARY_NAME}" "${VIEWER_COPY_MANIFEST}")    add_dependencies(package generate_breakpad_symbols)  endif (PACKAGE) @@ -1860,6 +1878,7 @@ if (LL_TESTS)      llmediadataclient.cpp      lllogininstance.cpp      llviewerhelputil.cpp +    llversioninfo.cpp    )    ################################################## diff --git a/indra/newview/app_settings/cmd_line.xml b/indra/newview/app_settings/cmd_line.xml index 0562cf5480..1b8393330d 100644 --- a/indra/newview/app_settings/cmd_line.xml +++ b/indra/newview/app_settings/cmd_line.xml @@ -363,8 +363,7 @@      <map>        <key>count</key>        <integer>1</integer> -      <key>map-to</key> -      <string>VersionChannelName</string> +      <!-- Special case. Not mapped to a setting. -->      </map>      <key>loginpage</key> diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index e5845bc947..0f946b0f0b 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -11090,7 +11090,62 @@        <key>Value</key>        <integer>15</integer>      </map> -	<key>UploadBakedTexOld</key> +    <key>UpdaterServiceActive</key> +    <map> +      <key>Comment</key> +      <string>Enable or disable the updater service.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map> +    <key>UpdaterServiceCheckPeriod</key> +    <map> +      <key>Comment</key> +      <string>Default period between update checking.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>U32</string> +      <key>Value</key> +      <integer>3600</integer> +    </map> +    <key>UpdaterServiceURL</key> +    <map> +      <key>Comment</key> +      <string>Default location for the updater service.</string> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>http://update.secondlife.com</string> +    </map> +    <key>UpdaterServicePath</key> +    <map> +      <key>Comment</key> +      <string>Path on the update server host.</string> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>update</string> +    </map> +    <key>UpdaterServiceProtocolVersion</key> +    <map> +      <key>Comment</key> +      <string>The update protocol version to use.</string> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>v1.0</string> +    </map> +    <key>UploadBakedTexOld</key>      <map>        <key>Comment</key>        <string>Forces the baked texture pipeline to upload using the old method.</string> @@ -11443,17 +11498,6 @@        <key>Value</key>        <integer>0</integer>      </map> -    <key>VersionChannelName</key> -    <map> -      <key>Comment</key> -      <string>Versioning Channel Name.</string> -      <key>Persist</key> -      <integer>0</integer> -      <key>Type</key> -      <string>String</string> -      <key>Value</key> -      <string>Second Life Release</string> -    </map>      <key>VertexShaderEnable</key>      <map>        <key>Comment</key> diff --git a/indra/newview/generate_breakpad_symbols.py b/indra/newview/generate_breakpad_symbols.py index 8f2dfd2348..4fd04d780e 100644 --- a/indra/newview/generate_breakpad_symbols.py +++ b/indra/newview/generate_breakpad_symbols.py @@ -31,6 +31,7 @@ import fnmatch  import itertools  import operator  import os +import re  import sys  import shlex  import subprocess @@ -45,8 +46,12 @@ class MissingModuleError(Exception):          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)) +def main(configuration, viewer_dir, viewer_exes, libs_suffix, dump_syms_tool, viewer_symbol_file): +    print "generate_breakpad_symbols run with args: %s" % str((configuration, viewer_dir, viewer_exes, libs_suffix, dump_syms_tool, viewer_symbol_file)) + +    if not re.match("release", configuration, re.IGNORECASE): +        print "skipping breakpad symbol generation for non-release build." +        return 0      # split up list of viewer_exes      # "'Second Life' SLPlugin" becomes ['Second Life', 'SLPlugin'] @@ -122,7 +127,7 @@ def main(viewer_dir, viewer_exes, libs_suffix, dump_syms_tool, viewer_symbol_fil      return 0  if __name__ == "__main__": -    if len(sys.argv) != 6: +    if len(sys.argv) != 7:          usage()          sys.exit(1)      sys.exit(main(*sys.argv[1:])) diff --git a/indra/newview/installers/windows/installer_template.nsi b/indra/newview/installers/windows/installer_template.nsi index d5712f80cf..4e8ed807ee 100644 --- a/indra/newview/installers/windows/installer_template.nsi +++ b/indra/newview/installers/windows/installer_template.nsi @@ -85,6 +85,8 @@ AutoCloseWindow true					; after all files install, close window  InstallDir "$PROGRAMFILES\${INSTNAME}"  InstallDirRegKey HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\${INSTNAME}" ""  DirText $(DirectoryChooseTitle) $(DirectoryChooseSetup) +Page directory dirPre +Page instfiles  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;  ;;; Variables @@ -95,6 +97,8 @@ Var INSTFLAGS  Var INSTSHORTCUT  Var COMMANDLINE         ; command line passed to this installer, set in .onInit  Var SHORTCUT_LANG_PARAM ; "--set InstallLanguage de", passes language to viewer +Var SKIP_DIALOGS        ; set from command line in  .onInit. autoinstall  +                        ; GUI and the defaults.  ;;; Function definitions should go before file includes, because calls to  ;;; DLLs like LangDLL trigger an implicit file include, so if that call is at @@ -110,6 +114,9 @@ Var SHORTCUT_LANG_PARAM ; "--set InstallLanguage de", passes language to viewer  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;  Function .onInstSuccess      Push $R0	# Option value, unused + +    StrCmp $SKIP_DIALOGS "true" label_launch  +      ${GetOptions} $COMMANDLINE "/AUTOSTART" $R0      # If parameter was there (no error) just launch      # Otherwise ask @@ -128,6 +135,13 @@ label_no_launch:  	Pop $R0  FunctionEnd +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; Pre-directory page callback +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +Function dirPre +    StrCmp $SKIP_DIALOGS "true" 0 +2 +	Abort +FunctionEnd      ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;  ; Make sure we're not on Windows 98 / ME @@ -145,7 +159,8 @@ Function CheckWindowsVersion  	StrCmp $R0 "NT" win_ver_bad  	Return  win_ver_bad: -	MessageBox MB_YESNO $(CheckWindowsVersionMB) IDNO win_ver_abort +	StrCmp $SKIP_DIALOGS "true" +2 ; If skip_dialogs is set just install +            MessageBox MB_YESNO $(CheckWindowsVersionMB) IDNO win_ver_abort  	Return  win_ver_abort:  	Quit @@ -184,13 +199,13 @@ FunctionEnd  ; If it has, allow user to bail out of install process.  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;  Function CheckIfAlreadyCurrent -  Push $0 -	ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG" "Version" -    StrCmp $0 ${VERSION_LONG} 0 DONE -	MessageBox MB_OKCANCEL $(CheckIfCurrentMB) /SD IDOK IDOK DONE +    Push $0 +    ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG" "Version" +    StrCmp $0 ${VERSION_LONG} 0 continue_install +    StrCmp $SKIP_DIALOGS "true" continue_install +    MessageBox MB_OKCANCEL $(CheckIfCurrentMB) /SD IDOK IDOK continue_install      Quit - -  DONE: +continue_install:      Pop $0      Return  FunctionEnd @@ -203,7 +218,9 @@ Function CloseSecondLife    Push $0    FindWindow $0 "Second Life" ""    IntCmp $0 0 DONE -  MessageBox MB_OKCANCEL $(CloseSecondLifeInstMB) IDOK CLOSE IDCANCEL CANCEL_INSTALL +   +  StrCmp $SKIP_DIALOGS "true" CLOSE +    MessageBox MB_OKCANCEL $(CloseSecondLifeInstMB) IDOK CLOSE IDCANCEL CANCEL_INSTALL    CANCEL_INSTALL:      Quit @@ -659,23 +676,29 @@ FunctionEnd  Function .onInit      Push $0      ${GetParameters} $COMMANDLINE              ; get our command line + +    ${GetOptions} $COMMANDLINE "/SKIP_DIALOGS" $0    +    IfErrors +2 0 ; If error jump past setting SKIP_DIALOGS +        StrCpy $SKIP_DIALOGS "true" +      ${GetOptions} $COMMANDLINE "/LANGID=" $0   ; /LANGID=1033 implies US English      ; If no language (error), then proceed -    IfErrors lbl_check_silent +    IfErrors lbl_configure_default_lang      ; No error means we got a language, so use it      StrCpy $LANGUAGE $0      Goto lbl_return -lbl_check_silent: -    ; For silent installs, no language prompt, use default -    IfSilent lbl_return -     -	; If we currently have a version of SL installed, default to the language of that install +lbl_configure_default_lang: +    ; If we currently have a version of SL installed, default to the language of that install      ; Otherwise don't change $LANGUAGE and it will default to the OS UI language. -	ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\${INSTNAME}" "InstallerLanguage" -    IfErrors lbl_build_menu +    ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\${INSTNAME}" "InstallerLanguage" +    IfErrors +2 0 ; If error skip the copy instruction   	StrCpy $LANGUAGE $0 +    ; For silent installs, no language prompt, use default +    IfSilent lbl_return +    StrCmp $SKIP_DIALOGS "true" lbl_return +    lbl_build_menu:  	Push ""      # Use separate file so labels can be UTF-16 but we can still merge changes diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index f66663891d..b6f52e3e15 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -83,6 +83,7 @@  #include "llweb.h"  #include "llsecondlifeurls.h" +#include "llupdaterservice.h"  // Linden library includes  #include "llavatarnamecache.h" @@ -196,6 +197,8 @@  #include "llsecapi.h"  #include "llmachineid.h" +#include "llmainlooprepeater.h" +  // *FIX: These extern globals should be cleaned up.  // The globals either represent state/config/resource-storage of either   // this app, or another 'component' of the viewer. App globals should be  @@ -576,7 +579,8 @@ LLAppViewer::LLAppViewer() :  	mAgentRegionLastAlive(false),  	mRandomizeFramerate(LLCachedControl<bool>(gSavedSettings,"Randomize Framerate", FALSE)),  	mPeriodicSlowFrame(LLCachedControl<bool>(gSavedSettings,"Periodic Slow Frame", FALSE)), -	mFastTimerLogThread(NULL) +	mFastTimerLogThread(NULL), +	mUpdater(new LLUpdaterService())  {  	if(NULL != sInstance)  	{ @@ -652,10 +656,13 @@ bool LLAppViewer::init()      initThreads();      writeSystemInfo(); -	// Build a string representing the current version number. -    gCurrentVersion = llformat("%s %s",  -							   gSavedSettings.getString("VersionChannelName").c_str(), -							   LLVersionInfo::getVersion().c_str()); +	// Initialize updater service (now that we have an io pump) +	initUpdater(); +	if(isQuitting()) +	{ +		// Early out here because updater set the quitting flag. +		return true; +	}  	//////////////////////////////////////////////////////////////////////////////  	////////////////////////////////////////////////////////////////////////////// @@ -799,6 +806,9 @@ bool LLAppViewer::init()  		return 1;  	} +	// Initialize the repeater service. +	LLMainLoopRepeater::instance().start(); +	  	//  	// Initialize the window  	// @@ -895,7 +905,8 @@ bool LLAppViewer::init()  	gDebugInfo["GraphicsCard"] = LLFeatureManager::getInstance()->getGPUString();  	// Save the current version to the prefs file -	gSavedSettings.setString("LastRunVersion", gCurrentVersion); +	gSavedSettings.setString("LastRunVersion",  +							 LLVersionInfo::getVersionAndChannel());  	gSimLastTime = gRenderStartTime.getElapsedTimeF32();  	gSimFrames = (F32)gFrameCount; @@ -970,7 +981,7 @@ bool LLAppViewer::mainLoop()  	gServicePump = new LLPumpIO(gAPRPoolp);  	LLHTTPClient::setPump(*gServicePump);  	LLCurl::setCAFile(gDirUtilp->getCAFile()); - +	  	// Note: this is where gLocalSpeakerMgr and gActiveSpeakerMgr used to be instantiated.  	LLVoiceChannel::initClass(); @@ -1353,11 +1364,14 @@ bool LLAppViewer::cleanup()  	llinfos << "Cleaning Up" << llendflush;  	// Must clean up texture references before viewer window is destroyed. -	LLHUDManager::getInstance()->updateEffects(); -	LLHUDObject::updateAll(); -	LLHUDManager::getInstance()->cleanupEffects(); -	LLHUDObject::cleanupHUDObjects(); -	llinfos << "HUD Objects cleaned up" << llendflush; +	if(LLHUDManager::instanceExists()) +	{ +		LLHUDManager::getInstance()->updateEffects(); +		LLHUDObject::updateAll(); +		LLHUDManager::getInstance()->cleanupEffects(); +		LLHUDObject::cleanupHUDObjects(); +		llinfos << "HUD Objects cleaned up" << llendflush; +	}  	LLKeyframeDataCache::clear(); @@ -1369,8 +1383,10 @@ bool LLAppViewer::cleanup()  	// Note: this is where gWorldMap used to be deleted.  	// Note: this is where gHUDManager used to be deleted. -	LLHUDManager::getInstance()->shutdownClass(); -	 +	if(LLHUDManager::instanceExists()) +	{ +		LLHUDManager::getInstance()->shutdownClass(); +	}  	delete gAssetStorage;  	gAssetStorage = NULL; @@ -1666,7 +1682,10 @@ bool LLAppViewer::cleanup()  #ifndef LL_RELEASE_FOR_DOWNLOAD  	llinfos << "Auditing VFS" << llendl; -	gVFS->audit(); +	if(gVFS) +	{ +		gVFS->audit(); +	}  #endif  	llinfos << "Misc Cleanup" << llendflush; @@ -1707,6 +1726,8 @@ bool LLAppViewer::cleanup()  		llinfos << "File launched." << llendflush;  	} +	LLMainLoopRepeater::instance().stop(); +  	ll_close_fail_log();      llinfos << "Goodbye!" << llendflush; @@ -1953,8 +1974,6 @@ bool LLAppViewer::initConfiguration()  	gSavedSettings.setString("ClientSettingsFile",           gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, getSettingsFilename("Default", "Global"))); -	gSavedSettings.setString("VersionChannelName", LLVersionInfo::getChannel()); -  #ifndef	LL_RELEASE_FOR_DOWNLOAD  	// provide developer build only overrides for these control variables that are not  	// persisted to settings.xml @@ -2095,6 +2114,11 @@ bool LLAppViewer::initConfiguration()          }      } +    if(clp.hasOption("channel")) +    { +		LLVersionInfo::resetChannel(clp.getOption("channel")[0]); +	} +	  	// If we have specified crash on startup, set the global so we'll trigger the crash at the right time  	if(clp.hasOption("crashonstartup")) @@ -2364,6 +2388,58 @@ bool LLAppViewer::initConfiguration()  	return true; // Config was successful.  } +namespace { +    // *TODO - decide if there's a better place for this function. +    // do we need a file llupdaterui.cpp or something? -brad +    bool notify_update(LLSD const & evt) +    { +		switch (evt["type"].asInteger()) +		{ +			case LLUpdaterService::DOWNLOAD_COMPLETE: +				LLNotificationsUtil::add("DownloadBackground"); +				break; +			case LLUpdaterService::INSTALL_ERROR: +				LLNotificationsUtil::add("FailedUpdateInstall"); +				break; +			default: +				llinfos << "unhandled update event " << evt << llendl; +				break; +		} + +		// let others also handle this event by default +        return false; +    } +}; + +void LLAppViewer::initUpdater() +{ +	// Initialize the updater service. +	// Generate URL to the udpater service +	// Get Channel +	// Get Version +	std::string url = gSavedSettings.getString("UpdaterServiceURL"); +	std::string channel = LLVersionInfo::getChannel(); +	std::string version = LLVersionInfo::getVersion(); +	std::string protocol_version = gSavedSettings.getString("UpdaterServiceProtocolVersion"); +	std::string service_path = gSavedSettings.getString("UpdaterServicePath"); +	U32 check_period = gSavedSettings.getU32("UpdaterServiceCheckPeriod"); + +	mUpdater->setAppExitCallback(boost::bind(&LLAppViewer::forceQuit, this)); +	mUpdater->initialize(protocol_version,  +						 url,  +						 service_path,  +						 channel,  +						 version); + 	mUpdater->setCheckPeriod(check_period); +	if(gSavedSettings.getBOOL("UpdaterServiceActive")) +	{ +		bool install_if_ready = true; +		mUpdater->startChecking(install_if_ready); +	} + +    LLEventPump & updater_pump = LLEventPumps::instance().obtain(LLUpdaterService::pumpName()); +    updater_pump.listen("notify_update", ¬ify_update); +}  void LLAppViewer::checkForCrash(void)  { @@ -2524,15 +2600,18 @@ void LLAppViewer::cleanupSavedSettings()  	// save window position if not maximized  	// as we don't track it in callbacks -	BOOL maximized = gViewerWindow->mWindow->getMaximized(); -	if (!maximized) +	if(NULL != gViewerWindow)  	{ -		LLCoordScreen window_pos; - -		if (gViewerWindow->mWindow->getPosition(&window_pos)) +		BOOL maximized = gViewerWindow->mWindow->getMaximized(); +		if (!maximized)  		{ -			gSavedSettings.setS32("WindowX", window_pos.mX); -			gSavedSettings.setS32("WindowY", window_pos.mY); +			LLCoordScreen window_pos; + +			if (gViewerWindow->mWindow->getPosition(&window_pos)) +			{ +				gSavedSettings.setS32("WindowX", window_pos.mX); +				gSavedSettings.setS32("WindowY", window_pos.mY); +			}  		}  	} @@ -2555,7 +2634,7 @@ void LLAppViewer::writeSystemInfo()  {  	gDebugInfo["SLLog"] = LLError::logFileName(); -	gDebugInfo["ClientInfo"]["Name"] = gSavedSettings.getString("VersionChannelName"); +	gDebugInfo["ClientInfo"]["Name"] = LLVersionInfo::getChannel();  	gDebugInfo["ClientInfo"]["MajorVersion"] = LLVersionInfo::getMajor();  	gDebugInfo["ClientInfo"]["MinorVersion"] = LLVersionInfo::getMinor();  	gDebugInfo["ClientInfo"]["PatchVersion"] = LLVersionInfo::getPatch(); @@ -2658,7 +2737,7 @@ void LLAppViewer::handleViewerCrash()  	//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 -	gDebugInfo["ClientInfo"]["Name"] = gSavedSettings.getString("VersionChannelName"); +	gDebugInfo["ClientInfo"]["Name"] = LLVersionInfo::getChannel();  	gDebugInfo["ClientInfo"]["MajorVersion"] = LLVersionInfo::getMajor();  	gDebugInfo["ClientInfo"]["MinorVersion"] = LLVersionInfo::getMinor(); @@ -4271,7 +4350,10 @@ void LLAppViewer::disconnectViewer()  	// This is where we used to call gObjectList.destroy() and then delete gWorldp.  	// Now we just ask the LLWorld singleton to cleanly shut down. -	LLWorld::getInstance()->destroyClass(); +	if(LLWorld::instanceExists()) +	{ +		LLWorld::getInstance()->destroyClass(); +	}  	// call all self-registered classes  	LLDestroyClassList::instance().fireCallbacks(); @@ -4385,7 +4467,7 @@ void LLAppViewer::handleLoginComplete()  	initMainloopTimeout("Mainloop Init");  	// Store some data to DebugInfo in case of a freeze. -	gDebugInfo["ClientInfo"]["Name"] = gSavedSettings.getString("VersionChannelName"); +	gDebugInfo["ClientInfo"]["Name"] = LLVersionInfo::getChannel();  	gDebugInfo["ClientInfo"]["MajorVersion"] = LLVersionInfo::getMajor();  	gDebugInfo["ClientInfo"]["MinorVersion"] = LLVersionInfo::getMinor(); @@ -4491,7 +4573,7 @@ void LLAppViewer::launchUpdater()  	// *TODO change userserver to be grid on both viewer and sim, since  	// userserver no longer exists.  	query_map["userserver"] = LLGridManager::getInstance()->getGridLabel(); -	query_map["channel"] = gSavedSettings.getString("VersionChannelName"); +	query_map["channel"] = LLVersionInfo::getChannel();  	// *TODO constantize this guy  	// *NOTE: This URL is also used in win_setup/lldownloader.cpp  	LLURI update_url = LLURI::buildHTTP("secondlife.com", 80, "update.php", query_map); diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h index a14ab4362f..aa4256a2bd 100644 --- a/indra/newview/llappviewer.h +++ b/indra/newview/llappviewer.h @@ -39,7 +39,7 @@ class LLTextureCache;  class LLImageDecodeThread;  class LLTextureFetch;  class LLWatchdogTimeout; -class LLCommandLineParser; +class LLUpdaterService;  struct apr_dso_handle_t; @@ -186,7 +186,7 @@ private:  	bool initThreads(); // Initialize viewer threads, return false on failure.  	bool initConfiguration(); // Initialize settings from the command line/config file. - +	void initUpdater(); // Initialize the updater service.  	bool initCache(); // Initialize local client cache. @@ -264,7 +264,14 @@ private:  	U32 mAvailPhysicalMemInKB ;  	U32 mAvailVirtualMemInKB ; +	 +	boost::scoped_ptr<LLUpdaterService> mUpdater; + +	//--------------------------------------------- +	//*NOTE: Mani - legacy updater stuff +	// Still useable?  public: +  	//some information for updater  	typedef struct  	{ @@ -274,6 +281,7 @@ public:  	static LLUpdaterInfo *sUpdaterInfo ;  	void launchUpdater(); +	//---------------------------------------------  };  // consts from viewer.h diff --git a/indra/newview/llchiclet.cpp b/indra/newview/llchiclet.cpp index 8f385160e9..885d553524 100644 --- a/indra/newview/llchiclet.cpp +++ b/indra/newview/llchiclet.cpp @@ -1092,9 +1092,11 @@ LLChicletPanel::LLChicletPanel(const Params&p)  LLChicletPanel::~LLChicletPanel()  { -	LLTransientFloaterMgr::getInstance()->removeControlView(mLeftScrollButton); -	LLTransientFloaterMgr::getInstance()->removeControlView(mRightScrollButton); - +	if(LLTransientFloaterMgr::instanceExists()) +	{ +		LLTransientFloaterMgr::getInstance()->removeControlView(mLeftScrollButton); +		LLTransientFloaterMgr::getInstance()->removeControlView(mRightScrollButton); +	}  }  void im_chiclet_callback(LLChicletPanel* panel, const LLSD& data){ diff --git a/indra/newview/llcurrencyuimanager.cpp b/indra/newview/llcurrencyuimanager.cpp index 2b92b228b3..b4a1457f47 100644 --- a/indra/newview/llcurrencyuimanager.cpp +++ b/indra/newview/llcurrencyuimanager.cpp @@ -166,7 +166,7 @@ void LLCurrencyUIManager::Impl::updateCurrencyInfo()  		gAgent.getSecureSessionID().asString());  	keywordArgs.appendString("language", LLUI::getLanguage());  	keywordArgs.appendInt("currencyBuy", mUserCurrencyBuy); -	keywordArgs.appendString("viewerChannel", gSavedSettings.getString("VersionChannelName")); +	keywordArgs.appendString("viewerChannel", LLVersionInfo::getChannel());  	keywordArgs.appendInt("viewerMajorVersion", LLVersionInfo::getMajor());  	keywordArgs.appendInt("viewerMinorVersion", LLVersionInfo::getMinor());  	keywordArgs.appendInt("viewerPatchVersion", LLVersionInfo::getPatch()); @@ -241,7 +241,7 @@ void LLCurrencyUIManager::Impl::startCurrencyBuy(const std::string& password)  	{  		keywordArgs.appendString("password", password);  	} -	keywordArgs.appendString("viewerChannel", gSavedSettings.getString("VersionChannelName")); +	keywordArgs.appendString("viewerChannel", LLVersionInfo::getChannel());  	keywordArgs.appendInt("viewerMajorVersion", LLVersionInfo::getMajor());  	keywordArgs.appendInt("viewerMinorVersion", LLVersionInfo::getMinor());  	keywordArgs.appendInt("viewerPatchVersion", LLVersionInfo::getPatch()); diff --git a/indra/newview/llfloaterabout.cpp b/indra/newview/llfloaterabout.cpp index 135137069c..8ae3ccbae3 100644 --- a/indra/newview/llfloaterabout.cpp +++ b/indra/newview/llfloaterabout.cpp @@ -213,7 +213,7 @@ LLSD LLFloaterAbout::getInfo()  	info["VIEWER_VERSION_STR"] = LLVersionInfo::getVersion();  	info["BUILD_DATE"] = __DATE__;  	info["BUILD_TIME"] = __TIME__; -	info["CHANNEL"] = gSavedSettings.getString("VersionChannelName"); +	info["CHANNEL"] = LLVersionInfo::getChannel();  	info["VIEWER_RELEASE_NOTES_URL"] = get_viewer_release_notes_url(); @@ -291,7 +291,7 @@ static std::string get_viewer_release_notes_url()  	std::string url = LLTrans::getString("RELEASE_NOTES_BASE_URL");  	if (! LLStringUtil::endsWith(url, "/"))  		url += "/"; -	url += gSavedSettings.getString("VersionChannelName") + "/"; +	url += LLVersionInfo::getChannel() + "/";  	url += LLVersionInfo::getShortVersion();  	return LLWeb::escapeURL(url);  } diff --git a/indra/newview/lllogininstance.cpp b/indra/newview/lllogininstance.cpp index 029e700c4c..fe84aca147 100644 --- a/indra/newview/lllogininstance.cpp +++ b/indra/newview/lllogininstance.cpp @@ -42,6 +42,7 @@  // newview  #include "llviewernetwork.h"  #include "llviewercontrol.h" +#include "llversioninfo.h"  #include "llslurl.h"  #include "llstartup.h"  #include "llfloaterreg.h" @@ -181,8 +182,8 @@ void LLLoginInstance::constructAuthParams(LLPointer<LLCredential> user_credentia  	request_params["read_critical"] = false; // handleTOSResponse  	request_params["last_exec_event"] = mLastExecEvent;  	request_params["mac"] = hashed_unique_id_string; -	request_params["version"] = gCurrentVersion; // Includes channel name -	request_params["channel"] = gSavedSettings.getString("VersionChannelName"); +	request_params["version"] = LLVersionInfo::getVersionAndChannel(); // Includes channel name +	request_params["channel"] = LLVersionInfo::getChannel();  	request_params["id0"] = mSerialNumber;  	mRequestData.clear(); diff --git a/indra/newview/llmainlooprepeater.cpp b/indra/newview/llmainlooprepeater.cpp new file mode 100644 index 0000000000..5c020e6d98 --- /dev/null +++ b/indra/newview/llmainlooprepeater.cpp @@ -0,0 +1,88 @@ +/**  + * @file llmachineid.cpp + * @brief retrieves unique machine ids + * + * $LicenseInfo:firstyear=2009&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2010, Linden Research, Inc. + *  + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + *  + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * Lesser General Public License for more details. + *  + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA + *  + * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" +#include "llapr.h" +#include "llevents.h" +#include "llmainlooprepeater.h" + + + +// LLMainLoopRepeater +//----------------------------------------------------------------------------- + + +LLMainLoopRepeater::LLMainLoopRepeater(void): +	mQueue(0) +{ +	; // No op. +} + + +void LLMainLoopRepeater::start(void) +{ +	if(mQueue != 0) return; + +	mQueue = new LLThreadSafeQueue<LLSD>(gAPRPoolp, 1024); +	mMainLoopConnection = LLEventPumps::instance(). +		obtain("mainloop").listen(LLEventPump::inventName(), boost::bind(&LLMainLoopRepeater::onMainLoop, this, _1)); +	mRepeaterConnection = LLEventPumps::instance(). +		obtain("mainlooprepeater").listen(LLEventPump::inventName(), boost::bind(&LLMainLoopRepeater::onMessage, this, _1)); +} + + +void LLMainLoopRepeater::stop(void) +{ +	mMainLoopConnection.release(); +	mRepeaterConnection.release(); + +	delete mQueue; +	mQueue = 0; +} + + +bool LLMainLoopRepeater::onMainLoop(LLSD const &) +{ +	LLSD message; +	while(mQueue->tryPopBack(message)) { +		std::string pump = message["pump"].asString(); +		if(pump.length() == 0 ) continue; // No pump. +		LLEventPumps::instance().obtain(pump).post(message["payload"]); +	} +	return false; +} + + +bool LLMainLoopRepeater::onMessage(LLSD const & event) +{ +	try { +		mQueue->pushFront(event); +	} catch(LLThreadSafeQueueError & e) { +		llwarns << "could not repeat message (" << e.what() << ")" <<  +			event.asString() << LL_ENDL; +	} +	return false; +} diff --git a/indra/newview/llmainlooprepeater.h b/indra/newview/llmainlooprepeater.h new file mode 100644 index 0000000000..f84c0ca94c --- /dev/null +++ b/indra/newview/llmainlooprepeater.h @@ -0,0 +1,65 @@ +/**  + * @file llmainlooprepeater.h + * @brief a service for repeating messages on the main loop. + * + * $LicenseInfo:firstyear=2010&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2010, Linden Research, Inc. + *  + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + *  + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * Lesser General Public License for more details. + *  + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA + *  + * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA + * $/LicenseInfo$ + */ + +#ifndef LL_LLMAINLOOPREPEATER_H +#define LL_LLMAINLOOPREPEATER_H + + +#include "llsd.h" +#include "llthreadsafequeue.h" + + +// +// A service which creates the pump 'mainlooprepeater' to which any thread can +// post a message that will be re-posted on the main loop. +// +// The posted message should contain two map elements: pump and payload.  The +// pump value is a string naming the pump to which the message should be +// re-posted.  The payload value is what will be posted to the designated pump. +// +class LLMainLoopRepeater: +	public LLSingleton<LLMainLoopRepeater> +{ +public: +	LLMainLoopRepeater(void); +	 +	// Start the repeater service. +	void start(void); +	 +	// Stop the repeater service. +	void stop(void); +	 +private: +	LLTempBoundListener mMainLoopConnection; +	LLTempBoundListener mRepeaterConnection; +	LLThreadSafeQueue<LLSD> * mQueue; +	 +	bool onMainLoop(LLSD const &); +	bool onMessage(LLSD const & event); +}; + + +#endif diff --git a/indra/newview/llmoveview.cpp b/indra/newview/llmoveview.cpp index 6658e1d7e8..d38bb5aa4a 100644 --- a/indra/newview/llmoveview.cpp +++ b/indra/newview/llmoveview.cpp @@ -552,7 +552,7 @@ LLPanelStandStopFlying::LLPanelStandStopFlying() :  }  // static -inline LLPanelStandStopFlying* LLPanelStandStopFlying::getInstance() +LLPanelStandStopFlying* LLPanelStandStopFlying::getInstance()  {  	static LLPanelStandStopFlying* panel = getStandStopFlyingPanel();  	return panel; diff --git a/indra/newview/llpanellogin.cpp b/indra/newview/llpanellogin.cpp index 467aefc60f..cf567fb208 100644 --- a/indra/newview/llpanellogin.cpp +++ b/indra/newview/llpanellogin.cpp @@ -230,7 +230,7 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,  	getChild<LLPanel>("login")->setDefaultBtn("connect_btn"); -	std::string channel = gSavedSettings.getString("VersionChannelName"); +	std::string channel = LLVersionInfo::getChannel();  	std::string version = llformat("%s (%d)",  								   LLVersionInfo::getShortVersion().c_str(),  								   LLVersionInfo::getBuild()); @@ -817,7 +817,7 @@ void LLPanelLogin::loadLoginPage()  								   LLVersionInfo::getShortVersion().c_str(),  								   LLVersionInfo::getBuild()); -	char* curl_channel = curl_escape(gSavedSettings.getString("VersionChannelName").c_str(), 0); +	char* curl_channel = curl_escape(LLVersionInfo::getChannel().c_str(), 0);  	char* curl_version = curl_escape(version.c_str(), 0);  	oStr << "&channel=" << curl_channel; diff --git a/indra/newview/llspeakbutton.cpp b/indra/newview/llspeakbutton.cpp index 3dce66f394..c76ecae4a2 100644 --- a/indra/newview/llspeakbutton.cpp +++ b/indra/newview/llspeakbutton.cpp @@ -134,8 +134,11 @@ LLSpeakButton::LLSpeakButton(const Params& p)  LLSpeakButton::~LLSpeakButton()  { -	LLTransientFloaterMgr::getInstance()->removeControlView(mSpeakBtn); -	LLTransientFloaterMgr::getInstance()->removeControlView(mShowBtn); +	if(LLTransientFloaterMgr::instanceExists()) +	{ +		LLTransientFloaterMgr::getInstance()->removeControlView(mSpeakBtn); +		LLTransientFloaterMgr::getInstance()->removeControlView(mShowBtn); +	}  }  void LLSpeakButton::setSpeakToolTip(const std::string& msg) diff --git a/indra/newview/llspeakingindicatormanager.cpp b/indra/newview/llspeakingindicatormanager.cpp index ede1d6bebe..9b38bf22ff 100644 --- a/indra/newview/llspeakingindicatormanager.cpp +++ b/indra/newview/llspeakingindicatormanager.cpp @@ -308,7 +308,10 @@ void LLSpeakingIndicatorManager::registerSpeakingIndicator(const LLUUID& speaker  void LLSpeakingIndicatorManager::unregisterSpeakingIndicator(const LLUUID& speaker_id, const LLSpeakingIndicator* const speaking_indicator)  { -	SpeakingIndicatorManager::instance().unregisterSpeakingIndicator(speaker_id, speaking_indicator); +	if(SpeakingIndicatorManager::instanceExists()) +	{ +		SpeakingIndicatorManager::instance().unregisterSpeakingIndicator(speaker_id, speaking_indicator); +	}  }  // EOF diff --git a/indra/newview/lltransientfloatermgr.cpp b/indra/newview/lltransientfloatermgr.cpp index 78dd602f39..6deab96b45 100644 --- a/indra/newview/lltransientfloatermgr.cpp +++ b/indra/newview/lltransientfloatermgr.cpp @@ -36,8 +36,11 @@  LLTransientFloaterMgr::LLTransientFloaterMgr()  { -	gViewerWindow->getRootView()->addMouseDownCallback(boost::bind( +	if(gViewerWindow) +	{ +		gViewerWindow->getRootView()->addMouseDownCallback(boost::bind(  			&LLTransientFloaterMgr::leftMouseClickCallback, this, _1, _2, _3)); +	}  	mGroupControls.insert(std::pair<ETransientGroup, std::set<LLView*> >(GLOBAL, std::set<LLView*>()));  	mGroupControls.insert(std::pair<ETransientGroup, std::set<LLView*> >(DOCKED, std::set<LLView*>())); diff --git a/indra/newview/lltranslate.cpp b/indra/newview/lltranslate.cpp index 050e34ade9..8ccfdb071b 100644 --- a/indra/newview/lltranslate.cpp +++ b/indra/newview/lltranslate.cpp @@ -36,7 +36,7 @@  #include "llbufferstream.h"  #include "llui.h" -#include "llversionviewer.h" +#include "llversioninfo.h"  #include "llviewercontrol.h"  #include "jsoncpp/reader.h" @@ -64,11 +64,11 @@ void LLTranslate::translateMessage(LLHTTPClient::ResponderPtr &result, const std  	getTranslateUrl(url, from_lang, to_lang, mesg);      std::string user_agent = llformat("%s %d.%d.%d (%d)", -		LL_CHANNEL, -		LL_VERSION_MAJOR, -		LL_VERSION_MINOR, -		LL_VERSION_PATCH, -		LL_VERSION_BUILD ); +		LLVersionInfo::getChannel().c_str(), +		LLVersionInfo::getMajor(), +		LLVersionInfo::getMinor(), +		LLVersionInfo::getPatch(), +		LLVersionInfo::getBuild());  	if (!m_Header.size())  	{ diff --git a/indra/newview/llversioninfo.cpp b/indra/newview/llversioninfo.cpp index 733d05834a..53994c68f2 100644 --- a/indra/newview/llversioninfo.cpp +++ b/indra/newview/llversioninfo.cpp @@ -95,9 +95,42 @@ const std::string &LLVersionInfo::getShortVersion()  	return version;  } +namespace +{ +	/// Storage of the channel name the viewer is using. +	//  The channel name is set by hardcoded constant,  +	//  or by calling LLVersionInfo::resetChannel() +	std::string sWorkingChannelName(LL_CHANNEL); + +	// Storage for the "version and channel" string. +	// This will get reset too. +	std::string sVersionChannel(""); +} + +//static +const std::string &LLVersionInfo::getVersionAndChannel() +{ +	if (sVersionChannel.empty()) +	{ +		// cache the version string +		std::ostringstream stream; +		stream << LLVersionInfo::getVersion()  +			   << " " +			   << LLVersionInfo::getChannel(); +		sVersionChannel = stream.str(); +	} + +	return sVersionChannel; +} +  //static  const std::string &LLVersionInfo::getChannel()  { -	static std::string name(LL_CHANNEL); -	return name; +	return sWorkingChannelName; +} + +void LLVersionInfo::resetChannel(const std::string& channel) +{ +	sWorkingChannelName = channel; +	sVersionChannel.clear(); // Reset version and channel string til next use.  } diff --git a/indra/newview/llversioninfo.h b/indra/newview/llversioninfo.h index e468b6ae4e..36defbcd68 100644 --- a/indra/newview/llversioninfo.h +++ b/indra/newview/llversioninfo.h @@ -58,8 +58,15 @@ public:  	/// return the viewer version as a string like "2.0.0"  	static const std::string &getShortVersion(); +	/// return the viewer version and channel as a string +	/// like "2.0.0.200030 Second Life Release" +	static const std::string &getVersionAndChannel(); +  	/// return the channel name, e.g. "Second Life"  	static const std::string &getChannel(); +	 +	/// reset the channel name used by the viewer. +	static void resetChannel(const std::string& channel);  };  #endif diff --git a/indra/newview/llviewercontrol.cpp b/indra/newview/llviewercontrol.cpp index 117e49d67f..622d09c600 100644 --- a/indra/newview/llviewercontrol.cpp +++ b/indra/newview/llviewercontrol.cpp @@ -70,6 +70,7 @@  #include "llpaneloutfitsinventory.h"  #include "llpanellogin.h"  #include "llpaneltopinfobar.h" +#include "llupdaterservice.h"  #ifdef TOGGLE_HACKED_GODLIKE_VIEWER  BOOL 				gHackGodmode = FALSE; @@ -82,7 +83,6 @@ LLControlGroup gCrashSettings("CrashSettings");	// saved at end of session  LLControlGroup gWarningSettings("Warnings"); // persists ignored dialogs/warnings  std::string gLastRunVersion; -std::string gCurrentVersion;  extern BOOL gResizeScreenTexture;  extern BOOL gDebugGL; @@ -502,6 +502,18 @@ bool toggle_show_object_render_cost(const LLSD& newvalue)  	return true;  } +void toggle_updater_service_active(LLControlVariable* control, const LLSD& new_value) +{ +    if(new_value.asBoolean()) +    { +        LLUpdaterService().startChecking(); +    } +    else +    { +        LLUpdaterService().stopChecking(); +    } +} +  ////////////////////////////////////////////////////////////////////////////  void settings_setup_listeners() @@ -649,6 +661,7 @@ void settings_setup_listeners()  	gSavedSettings.getControl("ShowNavbarFavoritesPanel")->getSignal()->connect(boost::bind(&toggle_show_favorites_panel, _2));  	gSavedSettings.getControl("ShowMiniLocationPanel")->getSignal()->connect(boost::bind(&toggle_show_mini_location_panel, _2));  	gSavedSettings.getControl("ShowObjectRenderingCost")->getSignal()->connect(boost::bind(&toggle_show_object_render_cost, _2)); +	gSavedSettings.getControl("UpdaterServiceActive")->getSignal()->connect(&toggle_updater_service_active);  	gSavedSettings.getControl("ForceShowGrid")->getSignal()->connect(boost::bind(&handleForceShowGrid, _2));  	gSavedSettings.getControl("RenderTransparentWater")->getSignal()->connect(boost::bind(&handleRenderTransparentWaterChanged, _2));  } diff --git a/indra/newview/llviewercontrol.h b/indra/newview/llviewercontrol.h index 22b48f8906..d7191f5c8d 100644 --- a/indra/newview/llviewercontrol.h +++ b/indra/newview/llviewercontrol.h @@ -57,7 +57,5 @@ extern LLControlGroup gCrashSettings;  // Set after settings loaded  extern std::string gLastRunVersion; -extern std::string gCurrentVersion; -  #endif // LL_LLVIEWERCONTROL_H diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp index 31cf0acdd7..fae4eb3c05 100644 --- a/indra/newview/llviewermedia.cpp +++ b/indra/newview/llviewermedia.cpp @@ -492,7 +492,7 @@ std::string LLViewerMedia::getCurrentUserAgent()  	// Just in case we need to check browser differences in A/B test  	// builds. -	std::string channel = gSavedSettings.getString("VersionChannelName"); +	std::string channel = LLVersionInfo::getChannel();  	// append our magic version number string to the browser user agent id  	// See the HTTP 1.0 and 1.1 specifications for allowed formats: diff --git a/indra/newview/llviewerstats.cpp b/indra/newview/llviewerstats.cpp index 46c78e2bb4..402f00c5e7 100644 --- a/indra/newview/llviewerstats.cpp +++ b/indra/newview/llviewerstats.cpp @@ -48,6 +48,7 @@  #include "llagent.h"  #include "llagentcamera.h"  #include "llviewercontrol.h" +#include "llversioninfo.h"  #include "llfloatertools.h"  #include "lldebugview.h"  #include "llfasttimerview.h" @@ -749,7 +750,7 @@ void send_stats()  	// send fps only for time app spends in foreground  	agent["fps"] = (F32)gForegroundFrameCount / gForegroundTime.getElapsedTimeF32(); -	agent["version"] = gCurrentVersion; +	agent["version"] = LLVersionInfo::getVersionAndChannel();  	std::string language = LLUI::getLanguage();  	agent["language"] = language; diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index 1247e4724e..9536bf2cf7 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -2871,6 +2871,25 @@ Download to your Applications folder?    <notification     icon="alertmodal.tga" +   name="FailedUpdateInstall" +   type="alertmodal"> +An error occurred installing the viewer update. +Please download and install the latest viewer from +http://secondlife.com/download. +    <usetemplate +     name="okbutton" +     yestext="OK"/> +  </notification> +  <notification +   icon="notifytip.tga" +   name="DownloadBackground" +   type="notifytip"> +An updated version of [APP_NAME] has been downloaded. +It will be applied the next time you restart [APP_NAME] +  </notification> + +  <notification +   icon="alertmodal.tga"     name="DeedObjectToGroup"     type="alertmodal">  Deeding this object will cause the group to: diff --git a/indra/newview/skins/default/xui/en/panel_preferences_setup.xml b/indra/newview/skins/default/xui/en/panel_preferences_setup.xml index 14aa38c5d3..584bd1ea9d 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_setup.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_setup.xml @@ -341,4 +341,20 @@     name="web_proxy_port"     top_delta="0"     width="145" /> + +  <check_box +    top_delta="2" +    enabled="true" +    follows="left|top" +    height="18" +    initial_value="true" +    control_name="UpdaterServiceActive" +    label="Automatically download and install [APP_NAME] updates" +    left="30" +    mouse_opaque="true" +    name="updater_service_active" +    radio_style="false" +    width="400" +    top_pad="10"/> +  </panel> diff --git a/indra/newview/tests/lllogininstance_test.cpp b/indra/newview/tests/lllogininstance_test.cpp index db50b89620..b902c7ab09 100644 --- a/indra/newview/tests/lllogininstance_test.cpp +++ b/indra/newview/tests/lllogininstance_test.cpp @@ -48,6 +48,9 @@ const std::string VIEWERLOGIN_GRIDLABEL("viewerlogin_grid");  const std::string APPVIEWER_SERIALNUMBER("appviewer_serialno"); +const std::string VIEWERLOGIN_CHANNEL("invalid_channel"); +const std::string VIEWERLOGIN_VERSION_CHANNEL("invalid_version"); +  // Link seams.  //----------------------------------------------------------------------------- @@ -160,7 +163,6 @@ std::string LLGridManager::getAppSLURLBase(const std::string& grid_name)  //-----------------------------------------------------------------------------  #include "../llviewercontrol.h"  LLControlGroup gSavedSettings("Global"); -std::string gCurrentVersion = "invalid_version";  LLControlGroup::LLControlGroup(const std::string& name) :  	LLInstanceTracker<LLControlGroup, std::string>(name){} @@ -177,6 +179,10 @@ BOOL LLControlGroup::declareString(const std::string& name, const std::string &i  #include "lluicolortable.h"  void LLUIColorTable::saveUserSettings(void)const {} +//----------------------------------------------------------------------------- +#include "../llversioninfo.h" +const std::string &LLVersionInfo::getVersionAndChannel() { return VIEWERLOGIN_VERSION_CHANNEL; } +const std::string &LLVersionInfo::getChannel() { return VIEWERLOGIN_CHANNEL; }  //-----------------------------------------------------------------------------  #include "llnotifications.h" @@ -290,7 +296,6 @@ namespace tut  			gSavedSettings.declareBOOL("UseDebugMenus", FALSE, "", FALSE);  			gSavedSettings.declareBOOL("ForceMandatoryUpdate", FALSE, "", FALSE);  			gSavedSettings.declareString("ClientSettingsFile", "test_settings.xml", "", FALSE); -			gSavedSettings.declareString("VersionChannelName", "test_version_string", "", FALSE);  			gSavedSettings.declareString("NextLoginLocation", "", "", FALSE);  			gSavedSettings.declareBOOL("LoginLastLocation", FALSE, "", FALSE); diff --git a/indra/newview/tests/llversioninfo_test.cpp b/indra/newview/tests/llversioninfo_test.cpp new file mode 100644 index 0000000000..8855a24ead --- /dev/null +++ b/indra/newview/tests/llversioninfo_test.cpp @@ -0,0 +1,114 @@ +/**  + * @file llversioninfo_test.cpp + * + * $LicenseInfo:firstyear=2010&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2010, Linden Research, Inc. + *  + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + *  + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * Lesser General Public License for more details. + *  + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA + *  + * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA + * $/LicenseInfo$ + */ + +#include "linden_common.h" + +#include "../test/lltut.h" + +#include "../llversioninfo.h" +#include "llversionviewer.h" + +namespace tut +{ +    struct versioninfo +    { +		versioninfo() +			: mResetChannel("Reset Channel") +		{ +			std::ostringstream stream; +			stream << LL_VERSION_MAJOR << "." +				   << LL_VERSION_MINOR << "." +				   << LL_VERSION_PATCH << "." +				   << LL_VERSION_BUILD; +			mVersion = stream.str(); +			stream.str(""); + +			stream << LL_VERSION_MAJOR << "." +				   << LL_VERSION_MINOR << "." +				   << LL_VERSION_PATCH; +			mShortVersion = stream.str(); +			stream.str(""); + +			stream << mVersion +				   << " " +				   << LL_CHANNEL; +			mVersionAndChannel = stream.str(); +			stream.str(""); + +			stream << mVersion +				   << " " +				   << mResetChannel; +			mResetVersionAndChannel = stream.str(); +		} +		std::string mResetChannel; +		std::string mVersion; +		std::string mShortVersion; +		std::string mVersionAndChannel; +		std::string mResetVersionAndChannel; +    }; +     +	typedef test_group<versioninfo> versioninfo_t; +	typedef versioninfo_t::object versioninfo_object_t; +	tut::versioninfo_t tut_versioninfo("LLVersionInfo"); + +	template<> template<> +	void versioninfo_object_t::test<1>() +	{ +		ensure_equals("Major version",  +					  LLVersionInfo::getMajor(),  +					  LL_VERSION_MAJOR); +		ensure_equals("Minor version",  +					  LLVersionInfo::getMinor(),  +					  LL_VERSION_MINOR); +		ensure_equals("Patch version",  +					  LLVersionInfo::getPatch(),  +					  LL_VERSION_PATCH); +		ensure_equals("Build version",  +					  LLVersionInfo::getBuild(),  +					  LL_VERSION_BUILD); +		ensure_equals("Channel version",  +					  LLVersionInfo::getChannel(),  +					  LL_CHANNEL); + +		ensure_equals("Version String",  +					  LLVersionInfo::getVersion(),  +					  mVersion); +		ensure_equals("Short Version String",  +					  LLVersionInfo::getShortVersion(),  +					  mShortVersion); +		ensure_equals("Version and channel String",  +					  LLVersionInfo::getVersionAndChannel(),  +					  mVersionAndChannel); + +		LLVersionInfo::resetChannel(mResetChannel); +		ensure_equals("Reset channel version",  +					  LLVersionInfo::getChannel(),  +					  mResetChannel); + +		ensure_equals("Reset Version and channel String",  +					  LLVersionInfo::getVersionAndChannel(),  +					  mResetVersionAndChannel); +	} +} diff --git a/indra/newview/tests/llviewerhelputil_test.cpp b/indra/newview/tests/llviewerhelputil_test.cpp index a0f1d1c3c3..b425b50c8b 100644 --- a/indra/newview/tests/llviewerhelputil_test.cpp +++ b/indra/newview/tests/llviewerhelputil_test.cpp @@ -72,16 +72,13 @@ static void substitute_string(std::string &input, const std::string &search, con  	}  } -class LLAgent -{ -public: -	LLAgent() {} -	~LLAgent() {} -#ifdef __GNUC__ -	__attribute__ ((noinline)) -#endif -	bool isGodlike() const { return FALSE; } -}; +#include "../llagent.h" +LLAgent::LLAgent() : mAgentAccess(gSavedSettings) { } +LLAgent::~LLAgent() { } +bool LLAgent::isGodlike() const { return FALSE; } +LLAgentAccess::LLAgentAccess(LLControlGroup& settings) : mSavedSettings(settings) { } +LLUIColor::LLUIColor() {} +  LLAgent gAgent;  std::string LLWeb::expandURLSubstitutions(const std::string &url, diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 6861f02bfb..4e5d6271df 100644 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -247,10 +247,13 @@ class WindowsManifest(ViewerManifest):          self.disable_manifest_check() +        self.path("../viewer_components/updater/scripts/windows/update_install.bat") +          # Get shared libs from the shared libs staging directory          if self.prefix(src=os.path.join(os.pardir, 'sharedlibs', self.args['configuration']),                         dst=""): +              self.enable_crt_manifest_check()              # Get kdu dll, continue if missing. @@ -572,6 +575,8 @@ class DarwinManifest(ViewerManifest):              # copy additional libs in <bundle>/Contents/MacOS/              self.path("../../libraries/universal-darwin/lib_release/libndofdev.dylib", dst="MacOS/libndofdev.dylib") +            self.path("../viewer_components/updater/scripts/darwin/update_install", "MacOS/update_install") +              # most everything goes in the Resources directory              if self.prefix(src="", dst="Resources"):                  super(DarwinManifest, self).construct() @@ -743,6 +748,11 @@ class DarwinManifest(ViewerManifest):              devfile = re.search("/dev/disk([0-9]+)[^s]", hdi_output).group(0).strip()              volpath = re.search('HFS\s+(.+)', hdi_output).group(1).strip() +            if devfile != '/dev/disk1': +                # adding more debugging info based upon nat's hunches to the +                # logs to help track down 'SetFile -a V' failures -brad +                print "WARNING: 'SetFile -a V' command below is probably gonna fail" +              # Copy everything in to the mounted .dmg              if self.default_channel() and not self.default_grid(): @@ -842,6 +852,8 @@ class LinuxManifest(ViewerManifest):              # recurse              self.end_prefix("res-sdl") +        self.path("../viewer_components/updater/scripts/linux/update_install", "bin/update_install") +          # plugins          if self.prefix(src="", dst="bin/llplugin"):              self.path("../media_plugins/webkit/libmedia_plugin_webkit.so", "libmedia_plugin_webkit.so") @@ -870,7 +882,7 @@ class LinuxManifest(ViewerManifest):          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 +            self.run_command("find %(d)r/bin %(d)r/lib -type f \\! -name update_install | xargs --no-run-if-empty strip -S" % {'d': self.get_dst_prefix()} ) # makes some small assumptions about our packaged dir structure          # Fix access permissions          self.run_command(""" @@ -897,6 +909,9 @@ class LinuxManifest(ViewerManifest):                          'dir': self.get_build_prefix(),                          'inst_name': installer_name,                          'inst_path':self.build_path_of(installer_name)}) +            else: +                print "Skipping %s.tar.bz2 for non-Release build (%s)" % \ +                      (installer_name, self.args['buildtype'])          finally:              self.run_command("mv %(inst)s %(dst)s" % {                  'dst': self.get_dst_prefix(), | 
