summaryrefslogtreecommitdiff
path: root/indra/newview
diff options
context:
space:
mode:
Diffstat (limited to 'indra/newview')
-rw-r--r--indra/newview/llappcorehttp.cpp3
-rw-r--r--indra/newview/llappviewer.cpp13
-rw-r--r--indra/newview/llfasttimerview.cpp4
-rw-r--r--indra/newview/lllogininstance.cpp145
-rw-r--r--indra/newview/lllogininstance.h1
-rw-r--r--indra/newview/llviewerstats.h86
-rw-r--r--indra/newview/skins/default/xui/en/notifications.xml333
-rw-r--r--indra/newview/tests/lllogininstance_test.cpp14
-rwxr-xr-xindra/newview/viewer_manifest.py13
9 files changed, 150 insertions, 462 deletions
diff --git a/indra/newview/llappcorehttp.cpp b/indra/newview/llappcorehttp.cpp
index c1f898284a..261a7b5ad9 100644
--- a/indra/newview/llappcorehttp.cpp
+++ b/indra/newview/llappcorehttp.cpp
@@ -39,6 +39,7 @@
#include <curl/curl.h>
#include "llcorehttputil.h"
+#include "httpstats.h"
// Here is where we begin to get our connection usage under control.
// This establishes llcorehttp policy classes that, among other
@@ -313,6 +314,8 @@ void LLAppCoreHttp::requestStop()
void LLAppCoreHttp::cleanup()
{
+ LLCore::HTTPStats::instance().dumpStats();
+
if (LLCORE_HTTP_HANDLE_INVALID == mStopHandle)
{
// Should have been started already...
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index 251c5eb4b1..b6f705f21a 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -1101,6 +1101,19 @@ bool LLAppViewer::init()
}
}
+ char* PARENT = getenv("PARENT");
+ if (! (PARENT && std::string(PARENT) == "SL_Launcher"))
+ {
+ // Don't directly run this executable. Please run the launcher, which
+ // will run the viewer itself.
+ // Naturally we do not consider this bulletproof. The point is to
+ // gently remind a user who *inadvertently* finds him/herself in this
+ // situation to do things the Right Way. Anyone who intentionally
+ // bypasses this mechanism needs no reminder that s/he's shooting
+ // him/herself in the foot.
+ LLNotificationsUtil::add("RunLauncher");
+ }
+
#if LL_WINDOWS
if (gGLManager.mGLVersion < LLFeatureManager::getInstance()->getExpectedGLVersion())
{
diff --git a/indra/newview/llfasttimerview.cpp b/indra/newview/llfasttimerview.cpp
index a69b3b7dc7..91501ccb1f 100644
--- a/indra/newview/llfasttimerview.cpp
+++ b/indra/newview/llfasttimerview.cpp
@@ -796,13 +796,13 @@ LLSD LLFastTimerView::analyzePerformanceLogDefault(std::istream& is)
for(stats_map_t::iterator it = time_stats.begin(); it != time_stats.end(); ++it)
{
std::string label = it->first;
- ret[label]["TotalTime"] = time_stats[label].mSum;
+ ret[label]["TotalTime"] = time_stats[label].getSum();
ret[label]["MeanTime"] = time_stats[label].getMean();
ret[label]["MaxTime"] = time_stats[label].getMaxValue();
ret[label]["MinTime"] = time_stats[label].getMinValue();
ret[label]["StdDevTime"] = time_stats[label].getStdDev();
- ret[label]["Samples"] = sample_stats[label].mSum;
+ ret[label]["Samples"] = sample_stats[label].getSum();
ret[label]["MaxSamples"] = sample_stats[label].getMaxValue();
ret[label]["MinSamples"] = sample_stats[label].getMinValue();
ret[label]["StdDevSamples"] = sample_stats[label].getStdDev();
diff --git a/indra/newview/lllogininstance.cpp b/indra/newview/lllogininstance.cpp
index 229703bb39..54459342a7 100644
--- a/indra/newview/lllogininstance.cpp
+++ b/indra/newview/lllogininstance.cpp
@@ -31,6 +31,7 @@
// llcommon
#include "llevents.h"
#include "stringize.h"
+#include "llsdserialize.h"
// llmessage (!)
#include "llfiltersd2xmlrpc.h" // for xml_escape_string()
@@ -47,12 +48,10 @@
#include "llstartup.h"
#include "llfloaterreg.h"
#include "llnotifications.h"
+#include "llnotificationsutil.h"
#include "llwindow.h"
#include "llviewerwindow.h"
#include "llprogressview.h"
-#if LL_LINUX
-#include "lltrans.h"
-#endif
#include "llsecapi.h"
#include "llstartup.h"
#include "llmachineid.h"
@@ -250,63 +249,90 @@ bool LLLoginInstance::handleLoginEvent(const LLSD& event)
void LLLoginInstance::handleLoginFailure(const LLSD& event)
{
-
-
- // Login has failed.
- // Figure out why and respond...
- LLSD response = event["data"];
- std::string reason_response = response["reason"].asString();
- std::string message_response = response["message"].asString();
- // For the cases of critical message or TOS agreement,
- // start the TOS dialog. The dialog response will be handled
- // by the LLLoginInstance::handleTOSResponse() callback.
- // The callback intiates the login attempt next step, either
- // to reconnect or to end the attempt in failure.
- if(reason_response == "tos")
- {
- LL_INFOS() << "LLLoginInstance::handleLoginFailure ToS" << LL_ENDL;
-
- LLSD data(LLSD::emptyMap());
- data["message"] = message_response;
- data["reply_pump"] = TOS_REPLY_PUMP;
- if (gViewerWindow)
- gViewerWindow->setShowProgress(FALSE);
- LLFloaterReg::showInstance("message_tos", data);
- LLEventPumps::instance().obtain(TOS_REPLY_PUMP)
- .listen(TOS_LISTENER_NAME,
- boost::bind(&LLLoginInstance::handleTOSResponse,
- this, _1, "agree_to_tos"));
- }
- else if(reason_response == "critical")
- {
- LL_INFOS() << "LLLoginInstance::handleLoginFailure Crit" << LL_ENDL;
+ // Login has failed.
+ // Figure out why and respond...
+ LLSD response = event["data"];
+ std::string reason_response = response["reason"].asString();
+ std::string message_response = response["message"].asString();
+ // For the cases of critical message or TOS agreement,
+ // start the TOS dialog. The dialog response will be handled
+ // by the LLLoginInstance::handleTOSResponse() callback.
+ // The callback intiates the login attempt next step, either
+ // to reconnect or to end the attempt in failure.
+ if(reason_response == "tos")
+ {
+ LL_INFOS() << "LLLoginInstance::handleLoginFailure ToS" << LL_ENDL;
+
+ LLSD data(LLSD::emptyMap());
+ data["message"] = message_response;
+ data["reply_pump"] = TOS_REPLY_PUMP;
+ if (gViewerWindow)
+ gViewerWindow->setShowProgress(FALSE);
+ LLFloaterReg::showInstance("message_tos", data);
+ LLEventPumps::instance().obtain(TOS_REPLY_PUMP)
+ .listen(TOS_LISTENER_NAME,
+ boost::bind(&LLLoginInstance::handleTOSResponse,
+ this, _1, "agree_to_tos"));
+ }
+ else if(reason_response == "critical")
+ {
+ LL_INFOS() << "LLLoginInstance::handleLoginFailure Crit" << LL_ENDL;
+
+ LLSD data(LLSD::emptyMap());
+ data["message"] = message_response;
+ data["reply_pump"] = TOS_REPLY_PUMP;
+ if(response.has("error_code"))
+ {
+ data["error_code"] = response["error_code"];
+ }
+ if(response.has("certificate"))
+ {
+ data["certificate"] = response["certificate"];
+ }
+
+ if (gViewerWindow)
+ gViewerWindow->setShowProgress(FALSE);
+
+ LLFloaterReg::showInstance("message_critical", data);
+ LLEventPumps::instance().obtain(TOS_REPLY_PUMP)
+ .listen(TOS_LISTENER_NAME,
+ boost::bind(&LLLoginInstance::handleTOSResponse,
+ this, _1, "read_critical"));
+ }
+ else if(reason_response == "update")
+ {
+ // This shouldn't happen - the viewer manager should have forced an update;
+ // possibly the user ran the viewer directly and bypassed the update check
+ std::string required_version = response["message_args"]["VERSION"];
+ LL_WARNS() << "Login failed because an update to version " << required_version << " is required." << LL_ENDL;
+
+ if (gViewerWindow)
+ gViewerWindow->setShowProgress(FALSE);
+
+ LLSD data(LLSD::emptyMap());
+ data["VERSION"] = required_version;
+ LLNotificationsUtil::add("RequiredUpdate", data, LLSD::emptyMap(), boost::bind(&LLLoginInstance::handleLoginDisallowed, this, _1, _2));
+ }
+ else if(reason_response == "key")
+ {
+ // this is a password problem or other restriction
+ // an appropriate message has already been displayed
+ attemptComplete();
+ }
+ else
+ {
+ LL_WARNS() << "Login failed for an unknown reason: " << LLSDOStreamer<LLSDNotationFormatter>(response) << LL_ENDL;
+
+ if (gViewerWindow)
+ gViewerWindow->setShowProgress(FALSE);
+
+ LLNotificationsUtil::add("LoginFailedUnknown", LLSD::emptyMap(), LLSD::emptyMap(), boost::bind(&LLLoginInstance::handleLoginDisallowed, this, _1, _2));
+ }
+}
- LLSD data(LLSD::emptyMap());
- data["message"] = message_response;
- data["reply_pump"] = TOS_REPLY_PUMP;
- if(response.has("error_code"))
- {
- data["error_code"] = response["error_code"];
- }
- if(response.has("certificate"))
- {
- data["certificate"] = response["certificate"];
- }
-
- if (gViewerWindow)
- gViewerWindow->setShowProgress(FALSE);
-
- LLFloaterReg::showInstance("message_critical", data);
- LLEventPumps::instance().obtain(TOS_REPLY_PUMP)
- .listen(TOS_LISTENER_NAME,
- boost::bind(&LLLoginInstance::handleTOSResponse,
- this, _1, "read_critical"));
- }
- else
- {
- LL_INFOS() << "LLLoginInstance::handleLoginFailure attemptComplete" << LL_ENDL;
- attemptComplete();
- }
+void LLLoginInstance::handleLoginDisallowed(const LLSD& notification, const LLSD& response)
+{
+ attemptComplete();
}
void LLLoginInstance::handleLoginSuccess(const LLSD& event)
@@ -363,6 +389,7 @@ bool LLLoginInstance::handleTOSResponse(bool accepted, const std::string& key)
return true;
}
+
std::string construct_start_string()
{
std::string start;
diff --git a/indra/newview/lllogininstance.h b/indra/newview/lllogininstance.h
index 67d0f01ba6..f53c02c6e1 100644
--- a/indra/newview/lllogininstance.h
+++ b/indra/newview/lllogininstance.h
@@ -77,6 +77,7 @@ private:
void handleLoginSuccess(const LLSD& event);
void handleDisconnect(const LLSD& event);
void handleIndeterminate(const LLSD& event);
+ void handleLoginDisallowed(const LLSD& notification, const LLSD& response);
bool handleTOSResponse(bool v, const std::string& key);
diff --git a/indra/newview/llviewerstats.h b/indra/newview/llviewerstats.h
index 97a060d95e..d8d92d61d3 100644
--- a/indra/newview/llviewerstats.h
+++ b/indra/newview/llviewerstats.h
@@ -30,7 +30,7 @@
#include "lltextureinfo.h"
#include "lltracerecording.h"
#include "lltrace.h"
-
+#include "llstatsaccumulator.h"
enum ESimStatID
{
@@ -256,89 +256,9 @@ public:
void addToMessage(LLSD &body);
- struct StatsAccumulator
- {
- S32 mCount;
- F32 mSum;
- F32 mSumOfSquares;
- F32 mMinValue;
- F32 mMaxValue;
- U32 mCountOfNextUpdatesToIgnore;
-
- inline StatsAccumulator()
- {
- reset();
- }
-
- inline void push( F32 val )
- {
- if ( mCountOfNextUpdatesToIgnore > 0 )
- {
- mCountOfNextUpdatesToIgnore--;
- return;
- }
-
- mCount++;
- mSum += val;
- mSumOfSquares += val * val;
- if (mCount == 1 || val > mMaxValue)
- {
- mMaxValue = val;
- }
- if (mCount == 1 || val < mMinValue)
- {
- mMinValue = val;
- }
- }
-
- inline F32 getMean() const
- {
- return (mCount == 0) ? 0.f : ((F32)mSum)/mCount;
- }
-
- inline F32 getMinValue() const
- {
- return mMinValue;
- }
-
- inline F32 getMaxValue() const
- {
- return mMaxValue;
- }
-
- inline F32 getStdDev() const
- {
- const F32 mean = getMean();
- return (mCount < 2) ? 0.f : sqrt(llmax(0.f,mSumOfSquares/mCount - (mean * mean)));
- }
-
- inline U32 getCount() const
- {
- return mCount;
- }
-
- inline void reset()
- {
- mCount = 0;
- mSum = mSumOfSquares = 0.f;
- mMinValue = 0.0f;
- mMaxValue = 0.0f;
- mCountOfNextUpdatesToIgnore = 0;
- }
-
- inline LLSD asLLSD() const
- {
- LLSD data;
- data["mean"] = getMean();
- data["std_dev"] = getStdDev();
- data["count"] = (S32)mCount;
- data["min"] = getMinValue();
- data["max"] = getMaxValue();
- return data;
- }
- };
+ typedef LLStatsAccumulator StatsAccumulator;
- // Phase tracking (originally put in for avatar rezzing), tracking
+ // Phase tracking (originally put in for avatar rezzing), tracking
// progress of active/completed phases for activities like outfit changing.
typedef std::map<std::string,LLTimer> phase_map_t;
typedef std::map<std::string,StatsAccumulator> phase_stats_t;
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index 4db272ba3f..3f39ea36f3 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -1760,6 +1760,13 @@ Visit [_URL] for more information?
<notification
icon="alertmodal.tga"
+ name="RunLauncher"
+ type="alertmodal">
+ Please do not directly run the viewer executable. Update any existing shortcuts to run SL_Launcher instead.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
name="OldGPUDriver"
type="alertmodal">
There is likely a newer driver for your graphics chip. Updating graphics drivers can substantially improve performance.
@@ -3826,337 +3833,27 @@ Finished download of raw terrain file to:
<notification
icon="alertmodal.tga"
- name="DownloadWindowsMandatory"
- type="alertmodal">
-A new version of [APP_NAME] is available.
-[MESSAGE]
-You must download this update to use [APP_NAME].
- <tag>confirm</tag>
- <usetemplate
- name="okcancelbuttons"
- notext="Quit"
- yestext="Download"/>
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="DownloadWindows"
- type="alertmodal">
-An updated version of [APP_NAME] is available.
-[MESSAGE]
-This update is not required, but we suggest you install it to improve performance and stability.
- <tag>confirm</tag>
- <usetemplate
- name="okcancelbuttons"
- notext="Continue"
- yestext="Download"/>
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="DownloadWindowsReleaseForDownload"
- type="alertmodal">
-An updated version of [APP_NAME] is available.
-[MESSAGE]
-This update is not required, but we suggest you install it to improve performance and stability.
- <tag>confirm</tag>
- <usetemplate
- name="okcancelbuttons"
- notext="Continue"
- yestext="Download"/>
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="DownloadLinuxMandatory"
- type="alertmodal">
-A new version of [APP_NAME] is available.
-[MESSAGE]
-You must download this update to use [APP_NAME].
- <tag>confirm</tag>
- <usetemplate
- name="okcancelbuttons"
- notext="Quit"
- yestext="Download"/>
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="DownloadLinux"
- type="alertmodal">
-An updated version of [APP_NAME] is available.
-[MESSAGE]
-This update is not required, but we suggest you install it to improve performance and stability.
- <tag>confirm</tag>
- <usetemplate
- name="okcancelbuttons"
- notext="Continue"
- yestext="Download"/>
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="DownloadLinuxReleaseForDownload"
- type="alertmodal">
-An updated version of [APP_NAME] is available.
-[MESSAGE]
-This update is not required, but we suggest you install it to improve performance and stability.
- <tag>confirm</tag>
- <usetemplate
- name="okcancelbuttons"
- notext="Continue"
- yestext="Download"/>
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="DownloadMacMandatory"
+ name="RequiredUpdate"
type="alertmodal">
-A new version of [APP_NAME] is available.
-[MESSAGE]
-You must download this update to use [APP_NAME].
-
-Download to your Applications folder?
+Version [VERSION] is required for login.
+This should have been updated for you but apparently was not.
+Please download from https://secondlife.com/support/downloads/
<tag>confirm</tag>
<usetemplate
- name="okcancelbuttons"
- notext="Quit"
- yestext="Download"/>
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="DownloadMac"
- type="alertmodal">
-An updated version of [APP_NAME] is available.
-[MESSAGE]
-This update is not required, but we suggest you install it to improve performance and stability.
-
-Download to your Applications folder?
- <tag>confirm</tag>
- <usetemplate
- name="okcancelbuttons"
- notext="Continue"
- yestext="Download"/>
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="DownloadMacReleaseForDownload"
- type="alertmodal">
-An updated version of [APP_NAME] is available.
-[MESSAGE]
-This update is not required, but we suggest you install it to improve performance and stability.
-
-Download to your Applications folder?
- <tag>confirm</tag>
- <usetemplate
- name="okcancelbuttons"
- notext="Continue"
- yestext="Download"/>
- </notification>
-
- <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="alertmodal.tga"
- name="FailedRequiredUpdateInstall"
- type="alertmodal">
-We were unable to install a required update.
-You will be unable to log in until [APP_NAME] has been updated.
-
-Please download and install the latest viewer from
-http://secondlife.com/download.
- <tag>fail</tag>
- <usetemplate
- name="okbutton"
- yestext="Quit"/>
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="UpdaterServiceNotRunning"
+ name="LoginFailedUnknown"
type="alertmodal">
-There is a required update for your Second Life Installation.
-
-You may download this update from http://www.secondlife.com/downloads
-or you can install it now.
- <tag>confirm</tag>
- <usetemplate
- name="okcancelbuttons"
- notext="Quit Second Life"
- yestext="Download and install now"/>
- </notification>
-
- <notification
- icon="notify.tga"
- name="DownloadBackgroundTip"
- type="notify">
-We have downloaded an update to your [APP_NAME] installation.
-Version [VERSION] [[INFO_URL] Information about this update]
- <tag>confirm</tag>
- <usetemplate
- name="okcancelbuttons"
- notext="Later..."
- yestext="Install now and restart [APP_NAME]"/>
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="DownloadBackgroundDialog"
- type="alertmodal">
-We have downloaded an update to your [APP_NAME] installation.
- Version [VERSION] [[INFO_URL] Information about this update]
- <tag>confirm</tag>
- <usetemplate
- name="okcancelbuttons"
- notext="Later..."
- yestext="Install now and restart [APP_NAME]"/>
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="RequiredUpdateDownloadedVerboseDialog"
- type="alertmodal"
- force_urls_external="true">
-We have downloaded a required software update.
-Version [VERSION] [[INFO_URL] Information about this update]
-
-We must restart [APP_NAME] to install the update.
- <tag>confirm</tag>
- <usetemplate
- name="okbutton"
- yestext="OK"/>
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="RequiredUpdateDownloadedDialog"
- type="alertmodal"
- force_urls_external="true">
-We must restart [APP_NAME] to install the update.
-[[INFO_URL] Information about this update]
- <tag>confirm</tag>
- <usetemplate
- name="okbutton"
- yestext="OK"/>
- </notification>
-
- <notification
- icon="notify.tga"
- name="OtherChannelDownloadBackgroundTip"
- type="notify">
-We have downloaded an update to your [APP_NAME] installation.
-Version [VERSION]
-This experimental viewer has been replaced by a [NEW_CHANNEL] viewer;
-see [[INFO_URL] for details about this update]
- <tag>confirm</tag>
- <usetemplate
- name="okcancelbuttons"
- notext="Later..."
- yestext="Install now and restart [APP_NAME]"/>
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="OtherChannelDownloadBackgroundDialog"
- type="alertmodal">
-We have downloaded an update to your [APP_NAME] installation.
-Version [VERSION]
-This experimental viewer has been replaced by a [NEW_CHANNEL] viewer;
-see [[INFO_URL] Information about this update]
- <tag>confirm</tag>
- <usetemplate
- name="okcancelbuttons"
- notext="Later..."
- yestext="Install now and restart [APP_NAME]"/>
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="OtherChannelRequiredUpdateDownloadedVerboseDialog"
- type="alertmodal"
- force_urls_external="true">
-We have downloaded a required software update.
-Version [VERSION]
-This experimental viewer has been replaced by a [NEW_CHANNEL] viewer;
-see [[INFO_URL] Information about this update]
-
-We must restart [APP_NAME] to install the update.
- <tag>confirm</tag>
- <usetemplate
- name="okbutton"
- yestext="OK"/>
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="OtherChannelRequiredUpdateDownloadedDialog"
- type="alertmodal"
- force_urls_external="true">
-We must restart [APP_NAME] to install the update.
-This experimental viewer has been replaced by a [NEW_CHANNEL] viewer;
-see [[INFO_URL] Information about this update]
- <tag>confirm</tag>
- <usetemplate
- name="okbutton"
- yestext="OK"/>
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="UpdateDownloadInProgress"
- type="alertmodal">
-An update is available!
-It's downloading in the background and we will prompt you to restart your viewer to finish installing it as soon as it's ready.
- <tag>confirm</tag>
- <usetemplate
- name="okbutton"
- yestext="OK"/>
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="UpdateDownloadComplete"
- type="alertmodal">
-An update was downloaded. It will be installed during restart.
- <tag>confirm</tag>
- <usetemplate
- name="okbutton"
- yestext="OK"/>
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="UpdateDeferred"
- type="alertmodal">
-An update was downloaded that you previously chose to skip or defer to the next start up.
- <tag>confirm</tag>
- <usetemplate
- name="okbutton"
- yestext="OK"/>
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="UpdateViewerUpToDate"
- type="alertmodal">
-Your viewer is up to date!
-If you can't wait to try out the latest features and fixes, check out the Alternate Viewers page. http://wiki.secondlife.com/wiki/Linden_Lab_Official:Alternate_Viewers.
+Sorry, login failed for an unrecognized reason.
+If you continue to get this message, please check the [SUPPORT_SITE].
<tag>confirm</tag>
<usetemplate
name="okbutton"
- yestext="OK"/>
+ yestext="Quit"/>
</notification>
<notification
diff --git a/indra/newview/tests/lllogininstance_test.cpp b/indra/newview/tests/lllogininstance_test.cpp
index 3b7ec48d61..85a117a96b 100644
--- a/indra/newview/tests/lllogininstance_test.cpp
+++ b/indra/newview/tests/lllogininstance_test.cpp
@@ -40,6 +40,7 @@
// other Linden headers
#include "../test/lltut.h"
#include "llevents.h"
+#include "llnotificationsutil.h"
#if defined(LL_WINDOWS)
#pragma warning(disable: 4355) // using 'this' in base-class ctor initializer expr
@@ -112,6 +113,19 @@ void LLCredential::authenticatorType(std::string &idType)
{
}
+LLNotificationPtr LLNotificationsUtil::add(const std::string& name,
+ const LLSD& substitutions,
+ const LLSD& payload,
+ boost::function<void (const LLSD&, const LLSD&)> functor)
+{
+ return LLNotificationPtr((LLNotification*)NULL);
+}
+
+LLNotificationPtr LLNotificationsUtil::add(const std::string& name, const LLSD& args)
+{
+ return LLNotificationPtr((LLNotification*)NULL);
+}
+
//-----------------------------------------------------------------------------
#include "../llviewernetwork.h"
LLGridManager::~LLGridManager()
diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py
index 2d88fe7dce..d734106a9d 100755
--- a/indra/newview/viewer_manifest.py
+++ b/indra/newview/viewer_manifest.py
@@ -1192,6 +1192,18 @@ class DarwinManifest(ViewerManifest):
keychain_pwd_path = os.path.join(build_secrets_checkout,'code-signing-osx','password.txt')
keychain_pwd = open(keychain_pwd_path).read().rstrip()
+ # Note: As of macOS Sierra, keychains are created with names postfixed with '-db' so for example, the
+ # SL Viewer keychain would by default be found in ~/Library/Keychains/viewer.keychain-db instead of
+ # just ~/Library/Keychains/viewer.keychain in earlier versions.
+ #
+ # Because we have old OS files from previous versions of macOS on the build hosts, the configurations
+ # are different on each host. Some have viewer.keychain, some have viewer.keychain-db and some have both.
+ # As you can see in the line below, this script expects the Linden Developer cert/keys to be in viewer.keychain.
+ #
+ # To correctly sign builds you need to make sure ~/Library/Keychains/viewer.keychain exists on the host
+ # and that it contains the correct cert/key. If a build host is set up with a clean version of macOS Sierra (or later)
+ # then you will need to change this line (and the one for 'codesign' command below) to point to right place or else
+ # pull in the cert/key into the default viewer keychain 'viewer.keychain-db' and export it to 'viewer.keychain'
self.run_command('security unlock-keychain -p "%s" "%s/Library/Keychains/viewer.keychain"' % ( keychain_pwd, home_path ) )
signed=False
sign_attempts=3
@@ -1200,6 +1212,7 @@ class DarwinManifest(ViewerManifest):
try:
sign_attempts-=1;
self.run_command(
+ # Note: See blurb above about names of keychains
'codesign --verbose --deep --force --keychain "%(home_path)s/Library/Keychains/viewer.keychain" --sign %(identity)r %(bundle)r' % {
'home_path' : home_path,
'identity': identity,