summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-x.hgtags1
-rw-r--r--autobuild.xml32
-rwxr-xr-xbuild.sh1
-rw-r--r--indra/edit-me-to-trigger-new-build.txt1
-rw-r--r--indra/llcommon/llerror.cpp109
-rw-r--r--indra/llcommon/llerror.h17
-rw-r--r--indra/llcommon/llprocessor.cpp2
-rw-r--r--indra/llcommon/llthread.cpp5
-rw-r--r--indra/llcommon/tests/llerror_test.cpp291
-rw-r--r--indra/llcorehttp/httpstats.cpp2
-rw-r--r--indra/llcorehttp/tests/test_refcounted.hpp3
-rw-r--r--indra/llmessage/lltransfermanager.cpp4
-rw-r--r--indra/llui/llscrolllistctrl.cpp25
-rw-r--r--indra/llui/llscrolllistctrl.h5
-rw-r--r--indra/llui/lltextbox.cpp5
-rw-r--r--indra/llui/lltextbox.h3
-rw-r--r--indra/llwindow/llwindowwin32.cpp14
-rw-r--r--indra/newview/VIEWER_VERSION.txt2
-rw-r--r--indra/newview/app_settings/logcontrol.xml1
-rw-r--r--indra/newview/llagent.cpp1
-rw-r--r--indra/newview/llagent.h1
-rw-r--r--indra/newview/llappviewer.cpp2
-rw-r--r--indra/newview/llappviewerwin32.cpp2
-rw-r--r--indra/newview/llchicletbar.cpp2
-rw-r--r--indra/newview/llestateinfomodel.cpp6
-rw-r--r--indra/newview/llfloaterpreference.cpp11
-rw-r--r--indra/newview/llfloaterpreference.h1
-rw-r--r--indra/newview/llfloaterregioninfo.cpp4
-rw-r--r--indra/newview/llfloatersaveprefpreset.cpp7
-rw-r--r--indra/newview/llfloatertools.cpp6
-rw-r--r--indra/newview/llpanelface.cpp2
-rw-r--r--indra/newview/llpanelgrouproles.cpp1
-rw-r--r--indra/newview/llpanelpeople.cpp51
-rw-r--r--indra/newview/llpanelpeople.h3
-rw-r--r--indra/newview/llpanelvoicedevicesettings.cpp18
-rw-r--r--indra/newview/llpresetsmanager.cpp5
-rw-r--r--indra/newview/llrecentpeople.cpp30
-rw-r--r--indra/newview/llrecentpeople.h5
-rw-r--r--indra/newview/llregioninfomodel.cpp2
-rw-r--r--indra/newview/llviewerkeyboard.cpp2
-rw-r--r--indra/newview/llviewermessage.cpp32
-rw-r--r--indra/newview/llviewernetwork.cpp2
-rw-r--r--indra/newview/llviewertexture.cpp26
-rw-r--r--indra/newview/llvoiceclient.cpp8
-rw-r--r--indra/newview/llvoiceclient.h15
-rw-r--r--indra/newview/llvoicevivox.cpp285
-rw-r--r--indra/newview/llvoicevivox.h4
-rw-r--r--indra/newview/llworldmap.cpp18
-rw-r--r--indra/newview/llworldmapmessage.cpp14
-rw-r--r--indra/newview/llworldmapview.cpp10
-rw-r--r--indra/newview/llworldmipmap.cpp4
-rw-r--r--indra/newview/pipeline.cpp3
-rw-r--r--indra/newview/skins/default/xui/en/menu_people_nearby_view.xml10
-rw-r--r--indra/newview/skins/default/xui/en/notifications.xml7
-rw-r--r--indra/newview/tests/llviewernetwork_test.cpp4
55 files changed, 820 insertions, 307 deletions
diff --git a/.hgtags b/.hgtags
index ce10f5e784..9dd6783e6b 100755
--- a/.hgtags
+++ b/.hgtags
@@ -539,3 +539,4 @@ ad0e15543836d64d6399d28b32852510435e344a 5.1.0-release
2ea47f358b171178eb9a95503a1670d519c2886f 5.1.5-release
04538b8157c1f5cdacd9403f0a395452d4a93689 5.1.6-release
ac3b1332ad4f55b7182a8cbcc1254535a0069f75 5.1.7-release
+23ea0fe36fadf009a60c080392ce80e4bf8af8d9 5.1.8-release
diff --git a/autobuild.xml b/autobuild.xml
index 1fef5ba725..3107d77548 100644
--- a/autobuild.xml
+++ b/autobuild.xml
@@ -3032,9 +3032,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>
<key>archive</key>
<map>
<key>hash</key>
- <string>b1b0134bc55f55a7c1a04ee78d70c64d</string>
+ <string>a605ec940768c878527d3b8f2ff61288</string>
<key>url</key>
- <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/12438/73598/slvoice-4.9.0002.27586.511884-darwin64-511884.tar.bz2</string>
+ <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/21421/157284/slvoice-4.9.0002.30313.517593-darwin64-517593.tar.bz2</string>
</map>
<key>name</key>
<string>darwin64</string>
@@ -3068,9 +3068,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>
<key>archive</key>
<map>
<key>hash</key>
- <string>ec50c31efce74bdedee470b5388aeeec</string>
+ <string>5a78539626b5f23522d0b466247f48b4</string>
<key>url</key>
- <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/12434/73576/slvoice-4.9.0002.27586.511884-windows-511884.tar.bz2</string>
+ <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/21422/157291/slvoice-4.9.0002.30313.517593-windows-517593.tar.bz2</string>
</map>
<key>name</key>
<string>windows</string>
@@ -3080,16 +3080,16 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>
<key>archive</key>
<map>
<key>hash</key>
- <string>4bf45d641bf5b2bd6b2cc39edcb01a6e</string>
+ <string>1f8e09c053c00d9dc44ea74568e63dc1</string>
<key>url</key>
- <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/12433/73570/slvoice-4.9.0002.27586.511884-windows64-511884.tar.bz2</string>
+ <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/21423/157298/slvoice-4.9.0002.30313.517593-windows64-517593.tar.bz2</string>
</map>
<key>name</key>
<string>windows64</string>
</map>
</map>
<key>version</key>
- <string>4.9.0002.27586.511884</string>
+ <string>4.9.0002.30313.517593</string>
</map>
<key>tut</key>
<map>
@@ -3260,9 +3260,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>
<key>archive</key>
<map>
<key>hash</key>
- <string>f45c0a5e7b4601b355e163bf62f5718e</string>
+ <string>ce95944fb842849108102263a25fc794</string>
<key>url</key>
- <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/20587/147509/viewer_manager-1.0.517052-darwin64-517052.tar.bz2</string>
+ <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/23237/178332/viewer_manager-1.0.518840-darwin64-518840.tar.bz2</string>
</map>
<key>name</key>
<string>darwin64</string>
@@ -3284,9 +3284,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>
<key>archive</key>
<map>
<key>hash</key>
- <string>d2443caf062697430071d458a965f611</string>
+ <string>642f847a9ac45551af65a55826974334</string>
<key>url</key>
- <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/20588/147516/viewer_manager-1.0.517052-windows-517052.tar.bz2</string>
+ <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/23236/178338/viewer_manager-1.0.518840-windows-518840.tar.bz2</string>
</map>
<key>name</key>
<string>windows</string>
@@ -3297,7 +3297,7 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>
<key>source_type</key>
<string>hg</string>
<key>version</key>
- <string>1.0.517052</string>
+ <string>1.0.518840</string>
</map>
<key>vlc-bin</key>
<map>
@@ -3664,10 +3664,6 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>
<map>
<key>command</key>
<string>xcodebuild</string>
- <key>filters</key>
- <array>
- <string>setenv</string>
- </array>
<key>options</key>
<array>
<string>-configuration</string>
@@ -3724,10 +3720,6 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>
<map>
<key>command</key>
<string>xcodebuild</string>
- <key>filters</key>
- <array>
- <string>setenv</string>
- </array>
<key>options</key>
<array>
<string>-configuration</string>
diff --git a/build.sh b/build.sh
index bb8d66599b..1fc578e956 100755
--- a/build.sh
+++ b/build.sh
@@ -114,7 +114,6 @@ pre_build()
-DRELEASE_CRASH_REPORTING:BOOL="$RELEASE_CRASH_REPORTING" \
-DVIEWER_CHANNEL:STRING="${viewer_channel}" \
-DGRID:STRING="\"$viewer_grid\"" \
- -DLL_TESTS:BOOL="$run_tests" \
-DTEMPLATE_VERIFIER_OPTIONS:STRING="$template_verifier_options" $template_verifier_master_url \
"${SIGNING[@]}" \
|| fatal "$variant configuration failed"
diff --git a/indra/edit-me-to-trigger-new-build.txt b/indra/edit-me-to-trigger-new-build.txt
index 139597f9cb..b28b04f643 100644
--- a/indra/edit-me-to-trigger-new-build.txt
+++ b/indra/edit-me-to-trigger-new-build.txt
@@ -1,2 +1,3 @@
+
diff --git a/indra/llcommon/llerror.cpp b/indra/llcommon/llerror.cpp
index 29de79dc64..06c7aef8ab 100644
--- a/indra/llcommon/llerror.cpp
+++ b/indra/llcommon/llerror.cpp
@@ -40,6 +40,7 @@
# include <unistd.h>
#endif // !LL_WINDOWS
#include <vector>
+#include "string.h"
#include "llapp.h"
#include "llapr.h"
@@ -530,21 +531,16 @@ namespace LLError
mTags(new const char* [tag_count]),
mTagCount(tag_count)
{
- for (int i = 0; i < tag_count; i++)
- {
- mTags[i] = tags[i];
- }
-
switch (mLevel)
{
- case LEVEL_DEBUG: mLevelString = "DEBUG:"; break;
- case LEVEL_INFO: mLevelString = "INFO:"; break;
- case LEVEL_WARN: mLevelString = "WARNING:"; break;
- case LEVEL_ERROR: mLevelString = "ERROR:"; break;
- default: mLevelString = "XXX:"; break;
+ case LEVEL_DEBUG: mLevelString = "DEBUG"; break;
+ case LEVEL_INFO: mLevelString = "INFO"; break;
+ case LEVEL_WARN: mLevelString = "WARNING"; break;
+ case LEVEL_ERROR: mLevelString = "ERROR"; break;
+ default: mLevelString = "XXX"; break;
};
- mLocationString = llformat("%s(%d) :", abbreviateFile(mFile).c_str(), mLine);
+ mLocationString = llformat("%s(%d)", abbreviateFile(mFile).c_str(), mLine);
#if LL_WINDOWS
// DevStudio: __FUNCTION__ already includes the full class name
#else
@@ -558,13 +554,23 @@ namespace LLError
mFunctionString = className(mClassInfo) + "::";
}
#endif
- mFunctionString += std::string(mFunction) + ":";
- const std::string tag_hash("#");
+ mFunctionString += std::string(mFunction);
+
+ for (int i = 0; i < tag_count; i++)
+ {
+ if (strchr(tags[i], ' '))
+ {
+ LL_ERRS() << "Space is not allowed in a log tag at " << mLocationString << LL_ENDL;
+ }
+ mTags[i] = tags[i];
+ }
+
+ mTagString.append("#");
+ // always construct a tag sequence; will be just a single # if no tag
for (size_t i = 0; i < mTagCount; i++)
{
- mTagString.append(tag_hash);
mTagString.append(mTags[i]);
- mTagString.append((i == mTagCount - 1) ? ";" : ",");
+ mTagString.append("#");
}
}
@@ -899,7 +905,46 @@ namespace LLError
namespace
{
- void writeToRecorders(const LLError::CallSite& site, const std::string& message, bool show_location = true, bool show_time = true, bool show_tags = true, bool show_level = true, bool show_function = true)
+ void addEscapedMessage(std::ostream& out, const std::string& message)
+ {
+ size_t written_out = 0;
+ size_t all_content = message.length();
+ size_t escape_char_index; // always relative to start of message
+ // Use find_first_of to find the next character in message that needs escaping
+ for ( escape_char_index = message.find_first_of("\\\n\r");
+ escape_char_index != std::string::npos && written_out < all_content;
+ // record what we've written this iteration, scan for next char that needs escaping
+ written_out = escape_char_index + 1, escape_char_index = message.find_first_of("\\\n\r", written_out)
+ )
+ {
+ // found a character that needs escaping, so write up to that with the escape prefix
+ // note that escape_char_index is relative to the start, not to the written_out offset
+ out << message.substr(written_out, escape_char_index - written_out) << '\\';
+
+ // write out the appropriate second character in the escape sequence
+ char found = message[escape_char_index];
+ switch ( found )
+ {
+ case '\\':
+ out << '\\';
+ break;
+ case '\n':
+ out << 'n';
+ break;
+ case '\r':
+ out << 'r';
+ break;
+ }
+ }
+
+ if ( written_out < all_content ) // if the loop above didn't write everything
+ {
+ // write whatever was left
+ out << message.substr(written_out, std::string::npos);
+ }
+ }
+
+ void writeToRecorders(const LLError::CallSite& site, const std::string& escaped_message, bool show_location = true, bool show_time = true, bool show_tags = true, bool show_level = true, bool show_function = true)
{
LLError::ELevel level = site.mLevel;
LLError::SettingsConfigPtr s = LLError::Settings::getInstance()->getSettingsConfig();
@@ -912,32 +957,37 @@ namespace
std::ostringstream message_stream;
- if (show_time && r->wantsTime() && s->mTimeFunction != NULL)
+ if (r->wantsTime() && s->mTimeFunction != NULL)
{
- message_stream << s->mTimeFunction() << " ";
+ message_stream << s->mTimeFunction();
}
-
+ message_stream << " ";
+
if (show_level && r->wantsLevel())
{
- message_stream << site.mLevelString << " ";
+ message_stream << site.mLevelString;
}
+ message_stream << " ";
- if (show_tags && r->wantsTags())
+ if (r->wantsTags())
{
message_stream << site.mTagString;
}
+ message_stream << " ";
- if (show_location && (r->wantsLocation() || level == LLError::LEVEL_ERROR || s->mPrintLocation))
+ if (r->wantsLocation() || level == LLError::LEVEL_ERROR || s->mPrintLocation)
{
- message_stream << site.mLocationString << " ";
+ message_stream << site.mLocationString;
}
+ message_stream << " ";
if (show_function && r->wantsFunctionName())
{
- message_stream << site.mFunctionString << " ";
+ message_stream << site.mFunctionString;
}
+ message_stream << " : ";
- message_stream << message;
+ message_stream << escaped_message;
r->recordMessage(level, message_stream.str());
}
@@ -1180,11 +1230,6 @@ namespace LLError
delete out;
}
- if (site.mLevel == LEVEL_ERROR)
- {
- writeToRecorders(site, "error", true, true, true, false, false);
- }
-
std::ostringstream message_stream;
if (site.mPrintOnce)
@@ -1210,8 +1255,8 @@ namespace LLError
}
}
- message_stream << message;
-
+ addEscapedMessage(message_stream, message);
+
writeToRecorders(site, message_stream.str());
if (site.mLevel == LEVEL_ERROR && s->mCrashFunction)
diff --git a/indra/llcommon/llerror.h b/indra/llcommon/llerror.h
index ceb1fd2c5f..0a78229555 100644
--- a/indra/llcommon/llerror.h
+++ b/indra/llcommon/llerror.h
@@ -146,11 +146,22 @@ const int LL_ERR_NOERR = 0;
will result in messages like:
- WARN: LLFoo::doSomething: called with a big value for i: 283
+ WARN #FooBarTag# llcommon/llfoo(100) LLFoo::doSomething : called with a big value for i: 283
+ the syntax is:
+ <timestamp> SPACE <level> SPACE <tags> SPACE <location> SPACE <function> SPACE COLON SPACE <message>
+
+ where each SPACE is a single space character; note that if a field is empty (such as when no
+ tags are specified), all the SPACEs are still present.
+
+ The tags must be a single word (may not contain a space); if more than one tag is specified,
+ they are all surrounded by '#' ( #FooTag#BarTag# ).
+
Which messages are logged and which are suppressed can be controlled at run
- time from the live file logcontrol.xml based on function, class and/or
- source file. See etc/logcontrol-dev.xml for details.
+ time from the configuration file. The default configuration is in newview/app_settings/logcontrol.xml
+ A copy of that file named logcontrol-dev.xml can be made in the users personal settings
+ directory; that will override the installed default file. See the logcontrol.xml
+ file or http://wiki.secondlife.com/wiki/Logging_System_Overview for configuration details.
Lastly, logging is now very efficient in both compiled code and execution
when skipped. There is no need to wrap messages, even debugging ones, in
diff --git a/indra/llcommon/llprocessor.cpp b/indra/llcommon/llprocessor.cpp
index 446c312ca9..a618a1cc70 100644
--- a/indra/llcommon/llprocessor.cpp
+++ b/indra/llcommon/llprocessor.cpp
@@ -610,7 +610,7 @@ private:
value = (uint64_t)(( uint8_t *)&value);
else
{
- LL_WARNS("Unknown type returned from sysctl!") << LL_ENDL;
+ LL_WARNS() << "Unknown type returned from sysctl" << LL_ENDL;
}
}
diff --git a/indra/llcommon/llthread.cpp b/indra/llcommon/llthread.cpp
index 1f4aa9b3a6..f066e9a4cd 100644
--- a/indra/llcommon/llthread.cpp
+++ b/indra/llcommon/llthread.cpp
@@ -249,9 +249,10 @@ void LLThread::shutdown()
// This thread just wouldn't stop, even though we gave it time
//LL_WARNS() << "LLThread::~LLThread() exiting thread before clean exit!" << LL_ENDL;
// Put a stake in its heart.
- delete mRecorder;
-
apr_thread_exit(mAPRThreadp, -1);
+ delete mRecorder;
+ mRecorder = NULL;
+ mStatus = STOPPED;
return;
}
mAPRThreadp = NULL;
diff --git a/indra/llcommon/tests/llerror_test.cpp b/indra/llcommon/tests/llerror_test.cpp
index 20de205454..ce0dbce075 100644
--- a/indra/llcommon/tests/llerror_test.cpp
+++ b/indra/llcommon/tests/llerror_test.cpp
@@ -36,6 +36,26 @@
#include "../test/lltut.h"
+enum LogFieldIndex
+{
+ TIME_FIELD,
+ LEVEL_FIELD,
+ TAGS_FIELD,
+ LOCATION_FIELD,
+ FUNCTION_FIELD,
+ MSG_FIELD
+};
+
+static const char* FieldName[] =
+{
+ "TIME",
+ "LEVEL",
+ "TAGS",
+ "LOCATION",
+ "FUNCTION",
+ "MSG"
+};
+
namespace
{
#ifdef __clang__
@@ -58,7 +78,7 @@ namespace tut
class TestRecorder : public LLError::Recorder
{
public:
- TestRecorder() { mWantsTime = false; }
+ TestRecorder() { mWantsTime = false; mWantsTags = true; }
virtual ~TestRecorder() { }
virtual void recordMessage(LLError::ELevel level,
@@ -133,13 +153,64 @@ namespace tut
ensure_equals("message count", countMessages(), expectedCount);
}
- void ensure_message_contains(int n, const std::string& expectedText)
- {
- std::ostringstream test_name;
- test_name << "testing message " << n;
-
- ensure_contains(test_name.str(), message(n), expectedText);
- }
+ std::string message_field(int msgnum, LogFieldIndex fieldnum)
+ {
+ std::ostringstream test_name;
+ test_name << "testing message " << msgnum << ", not enough messages";
+ tut::ensure(test_name.str(), msgnum < countMessages());
+
+ std::string msg(message(msgnum));
+
+ std::string field_value;
+
+ // find the start of the field; fields are separated by a single space
+ size_t scan = 0;
+ int on_field = 0;
+ while ( scan < msg.length() && on_field < fieldnum )
+ {
+ // fields are delimited by one space
+ if ( ' ' == msg[scan] )
+ {
+ if ( on_field < FUNCTION_FIELD )
+ {
+ on_field++;
+ }
+ // except function, which may have embedded spaces so ends with " : "
+ else if ( ( on_field == FUNCTION_FIELD )
+ && ( ':' == msg[scan+1] && ' ' == msg[scan+2] )
+ )
+ {
+ on_field++;
+ scan +=2;
+ }
+ }
+ scan++;
+ }
+ size_t start_field = scan;
+ size_t fieldlen = 0;
+ if ( fieldnum < FUNCTION_FIELD )
+ {
+ fieldlen = msg.find(' ', start_field) - start_field;
+ }
+ else if ( fieldnum == FUNCTION_FIELD )
+ {
+ fieldlen = msg.find(" : ", start_field) - start_field;
+ }
+ else if ( MSG_FIELD == fieldnum ) // no delimiter, just everything to the end
+ {
+ fieldlen = msg.length() - start_field;
+ }
+
+ return msg.substr(start_field, fieldlen);
+ }
+
+ void ensure_message_field_equals(int msgnum, LogFieldIndex fieldnum, const std::string& expectedText)
+ {
+ std::ostringstream test_name;
+ test_name << "testing message " << msgnum << " field " << FieldName[fieldnum] << "\n message: \"" << message(msgnum) << "\"\n ";
+
+ ensure_equals(test_name.str(), message_field(msgnum, fieldnum), expectedText);
+ }
void ensure_message_does_not_contain(int n, const std::string& expectedText)
{
@@ -162,8 +233,8 @@ namespace tut
LL_INFOS() << "test" << LL_ENDL;
LL_INFOS() << "bob" << LL_ENDL;
- ensure_message_contains(0, "test");
- ensure_message_contains(1, "bob");
+ ensure_message_field_equals(0, MSG_FIELD, "test");
+ ensure_message_field_equals(1, MSG_FIELD, "bob");
}
}
@@ -171,11 +242,10 @@ namespace
{
void writeSome()
{
- LL_DEBUGS() << "one" << LL_ENDL;
- LL_INFOS() << "two" << LL_ENDL;
- LL_WARNS() << "three" << LL_ENDL;
- // fatal messages write out an additional "error" message
- LL_ERRS() << "four" << LL_ENDL;
+ LL_DEBUGS("WriteTag","AnotherTag") << "one" << LL_ENDL;
+ LL_INFOS("WriteTag") << "two" << LL_ENDL;
+ LL_WARNS("WriteTag") << "three" << LL_ENDL;
+ LL_ERRS("WriteTag") << "four" << LL_ENDL;
}
};
@@ -187,37 +257,41 @@ namespace tut
{
LLError::setDefaultLevel(LLError::LEVEL_DEBUG);
writeSome();
- ensure_message_contains(0, "one");
- ensure_message_contains(1, "two");
- ensure_message_contains(2, "three");
- ensure_message_contains(3, "error");
- ensure_message_contains(4, "four");
- ensure_message_count(5);
+ ensure_message_field_equals(0, MSG_FIELD, "one");
+ ensure_message_field_equals(0, LEVEL_FIELD, "DEBUG");
+ ensure_message_field_equals(0, TAGS_FIELD, "#WriteTag#AnotherTag#");
+ ensure_message_field_equals(1, MSG_FIELD, "two");
+ ensure_message_field_equals(1, LEVEL_FIELD, "INFO");
+ ensure_message_field_equals(1, TAGS_FIELD, "#WriteTag#");
+ ensure_message_field_equals(2, MSG_FIELD, "three");
+ ensure_message_field_equals(2, LEVEL_FIELD, "WARNING");
+ ensure_message_field_equals(2, TAGS_FIELD, "#WriteTag#");
+ ensure_message_field_equals(3, MSG_FIELD, "four");
+ ensure_message_field_equals(3, LEVEL_FIELD, "ERROR");
+ ensure_message_field_equals(3, TAGS_FIELD, "#WriteTag#");
+ ensure_message_count(4);
LLError::setDefaultLevel(LLError::LEVEL_INFO);
writeSome();
- ensure_message_contains(5, "two");
- ensure_message_contains(6, "three");
- ensure_message_contains(7, "error");
- ensure_message_contains(8, "four");
- ensure_message_count(9);
+ ensure_message_field_equals(4, MSG_FIELD, "two");
+ ensure_message_field_equals(5, MSG_FIELD, "three");
+ ensure_message_field_equals(6, MSG_FIELD, "four");
+ ensure_message_count(7);
LLError::setDefaultLevel(LLError::LEVEL_WARN);
writeSome();
- ensure_message_contains(9, "three");
- ensure_message_contains(10, "error");
- ensure_message_contains(11, "four");
- ensure_message_count(12);
+ ensure_message_field_equals(7, MSG_FIELD, "three");
+ ensure_message_field_equals(8, MSG_FIELD, "four");
+ ensure_message_count(9);
LLError::setDefaultLevel(LLError::LEVEL_ERROR);
writeSome();
- ensure_message_contains(12, "error");
- ensure_message_contains(13, "four");
- ensure_message_count(14);
+ ensure_message_field_equals(9, MSG_FIELD, "four");
+ ensure_message_count(10);
LLError::setDefaultLevel(LLError::LEVEL_NONE);
writeSome();
- ensure_message_count(14);
+ ensure_message_count(10);
}
template<> template<>
@@ -225,12 +299,11 @@ namespace tut
// error type string in output
{
writeSome();
- ensure_message_contains(0, "DEBUG: ");
- ensure_message_contains(1, "INFO: ");
- ensure_message_contains(2, "WARNING: ");
- ensure_message_does_not_contain(3, "ERROR");
- ensure_message_contains(4, "ERROR: ");
- ensure_message_count(5);
+ ensure_message_field_equals(0, LEVEL_FIELD, "DEBUG");
+ ensure_message_field_equals(1, LEVEL_FIELD, "INFO");
+ ensure_message_field_equals(2, LEVEL_FIELD, "WARNING");
+ ensure_message_field_equals(3, LEVEL_FIELD, "ERROR");
+ ensure_message_count(4);
}
template<> template<>
@@ -280,7 +353,7 @@ namespace
{
std::ostringstream location;
location << LLError::abbreviateFile(__FILE__)
- << "(" << line << ") : ";
+ << "(" << line << ")";
return location.str();
}
@@ -321,7 +394,7 @@ namespace tut
writeReturningLocation();
ensure_message_does_not_contain(0, location);
- ensure_message_contains(1, location);
+ ensure_message_field_equals(1, LOCATION_FIELD, location);
ensure_message_does_not_contain(2, location);
}
}
@@ -496,13 +569,13 @@ namespace tut
void ErrorTestObject::test<7>()
{
outerLogger();
- ensure_message_contains(0, "inside");
- ensure_message_contains(1, "outside(moo)");
+ ensure_message_field_equals(0, MSG_FIELD, "inside");
+ ensure_message_field_equals(1, MSG_FIELD, "outside(moo)");
ensure_message_count(2);
metaLogger();
- ensure_message_contains(2, "logging");
- ensure_message_contains(3, "meta(baz)");
+ ensure_message_field_equals(2, MSG_FIELD, "logging");
+ ensure_message_field_equals(3, MSG_FIELD, "meta(baz)");
ensure_message_count(4);
}
@@ -513,9 +586,9 @@ namespace tut
LLError::setPrintLocation(false);
std::string location = errorReturningLocation();
- ensure_message_contains(0, location + "error");
- ensure_message_contains(1, "die");
- ensure_message_count(2);
+ ensure_message_field_equals(0, LOCATION_FIELD, location);
+ ensure_message_field_equals(0, MSG_FIELD, "die");
+ ensure_message_count(1);
ensure("fatal callback called", fatalWasCalled);
}
@@ -544,13 +617,13 @@ namespace tut
setWantsTime(false);
ufoSighting();
- ensure_message_contains(0, "ufo");
+ ensure_message_field_equals(0, MSG_FIELD, "ufo");
ensure_message_does_not_contain(0, roswell());
setWantsTime(true);
ufoSighting();
- ensure_message_contains(1, "ufo");
- ensure_message_contains(1, roswell());
+ ensure_message_field_equals(1, MSG_FIELD, "ufo");
+ ensure_message_field_equals(1, TIME_FIELD, roswell());
}
template<> template<>
@@ -564,9 +637,9 @@ namespace tut
function;
writeReturningLocationAndFunction(location, function);
- ensure_equals("order is time location type function message",
+ ensure_equals("order is time level tags location function message",
message(0),
- roswell() + " INFO: " + location + function + ": apple");
+ roswell() + " INFO " + "# " /* no tag */ + location + " " + function + " : " + "apple");
}
template<> template<>
@@ -578,7 +651,7 @@ namespace tut
LL_INFOS() << "boo" << LL_ENDL;
- ensure_message_contains(0, "boo");
+ ensure_message_field_equals(0, MSG_FIELD, "boo");
ensure_equals("alt recorder count", boost::dynamic_pointer_cast<TestRecorder>(altRecorder)->countMessages(), 1);
ensure_contains("alt recorder message 0", boost::dynamic_pointer_cast<TestRecorder>(altRecorder)->message(0), "boo");
@@ -637,14 +710,12 @@ namespace tut
TestAlpha::doAll();
TestBeta::doAll();
- ensure_message_contains(0, "aim west");
- ensure_message_contains(1, "error");
- ensure_message_contains(2, "ate eels");
- ensure_message_contains(3, "buy iron");
- ensure_message_contains(4, "bad word");
- ensure_message_contains(5, "error");
- ensure_message_contains(6, "big easy");
- ensure_message_count(7);
+ ensure_message_field_equals(0, MSG_FIELD, "aim west");
+ ensure_message_field_equals(1, MSG_FIELD, "ate eels");
+ ensure_message_field_equals(2, MSG_FIELD, "buy iron");
+ ensure_message_field_equals(3, MSG_FIELD, "bad word");
+ ensure_message_field_equals(4, MSG_FIELD, "big easy");
+ ensure_message_count(5);
}
template<> template<>
@@ -657,8 +728,8 @@ namespace tut
LLError::setFunctionLevel("TestBeta::doError", LLError::LEVEL_NONE);
TestBeta::doAll();
- ensure_message_contains(0, "buy iron");
- ensure_message_contains(1, "bad word");
+ ensure_message_field_equals(0, MSG_FIELD, "buy iron");
+ ensure_message_field_equals(1, MSG_FIELD, "bad word");
ensure_message_count(2);
}
@@ -678,9 +749,9 @@ namespace tut
TestAlpha::doAll();
TestBeta::doAll();
- ensure_message_contains(0, "any idea");
- ensure_message_contains(1, "aim west");
- ensure_message_contains(2, "bad word");
+ ensure_message_field_equals(0, MSG_FIELD, "any idea");
+ ensure_message_field_equals(1, MSG_FIELD, "aim west");
+ ensure_message_field_equals(2, MSG_FIELD, "bad word");
ensure_message_count(3);
}
@@ -718,14 +789,13 @@ namespace tut
// configuration from LLSD
void ErrorTestObject::test<16>()
{
- std::string this_file = LLError::abbreviateFile(__FILE__);
LLSD config;
config["print-location"] = true;
config["default-level"] = "DEBUG";
LLSD set1;
set1["level"] = "WARN";
- set1["files"][0] = this_file;
+ set1["files"][0] = LLError::abbreviateFile(__FILE__);
LLSD set2;
set2["level"] = "INFO";
@@ -744,10 +814,9 @@ namespace tut
TestAlpha::doAll();
TestBeta::doAll();
- ensure_message_contains(0, "any idea");
- ensure_message_contains(0, this_file);
- ensure_message_contains(1, "aim west");
- ensure_message_contains(2, "bad word");
+ ensure_message_field_equals(0, MSG_FIELD, "any idea");
+ ensure_message_field_equals(1, MSG_FIELD, "aim west");
+ ensure_message_field_equals(2, MSG_FIELD, "bad word");
ensure_message_count(3);
// make sure reconfiguring works
@@ -758,15 +827,73 @@ namespace tut
TestAlpha::doAll();
TestBeta::doAll();
- ensure_message_contains(3, "aim west");
- ensure_message_does_not_contain(3, this_file);
- ensure_message_contains(4, "error");
- ensure_message_contains(5, "ate eels");
- ensure_message_contains(6, "bad word");
- ensure_message_contains(7, "error");
- ensure_message_contains(8, "big easy");
- ensure_message_count(9);
+ ensure_message_field_equals(3, MSG_FIELD, "aim west");
+ ensure_message_field_equals(4, MSG_FIELD, "ate eels");
+ ensure_message_field_equals(5, MSG_FIELD, "bad word");
+ ensure_message_field_equals(6, MSG_FIELD, "big easy");
+ ensure_message_count(7);
+ }
+}
+
+namespace
+{
+ void writeMsgNeedsEscaping()
+ {
+ LL_DEBUGS("WriteTag") << "backslash\\" << LL_ENDL;
+ LL_INFOS("WriteTag") << "newline\nafternewline" << LL_ENDL;
+ LL_WARNS("WriteTag") << "return\rafterreturn" << LL_ENDL;
+
+ LL_DEBUGS("WriteTag") << "backslash\\backslash\\" << LL_ENDL;
+ LL_INFOS("WriteTag") << "backslash\\newline\nanothernewline\nafternewline" << LL_ENDL;
+ LL_WARNS("WriteTag") << "backslash\\returnnewline\r\n\\afterbackslash" << LL_ENDL;
+ }
+};
+
+namespace tut
+{
+ template<> template<>
+ void ErrorTestObject::test<17>()
+ // backslash, return, and newline are escaped with backslashes
+ {
+ LLError::setDefaultLevel(LLError::LEVEL_DEBUG);
+ writeMsgNeedsEscaping();
+ ensure_message_field_equals(0, MSG_FIELD, "backslash\\\\");
+ ensure_message_field_equals(1, MSG_FIELD, "newline\\nafternewline");
+ ensure_message_field_equals(2, MSG_FIELD, "return\\rafterreturn");
+ ensure_message_field_equals(3, MSG_FIELD, "backslash\\\\backslash\\\\");
+ ensure_message_field_equals(4, MSG_FIELD, "backslash\\\\newline\\nanothernewline\\nafternewline");
+ ensure_message_field_equals(5, MSG_FIELD, "backslash\\\\returnnewline\\r\\n\\\\afterbackslash");
+ ensure_message_count(6);
+ }
+}
+
+namespace
+{
+ std::string writeTagWithSpaceReturningLocation()
+ {
+ LL_DEBUGS("Write Tag") << "not allowed" << LL_ENDL; int this_line = __LINE__;
+
+ std::ostringstream location;
+ location << LLError::abbreviateFile(__FILE__).c_str() << "(" << this_line << ")";
+ return location.str();
}
+};
+
+namespace tut
+{
+ template<> template<>
+ void ErrorTestObject::test<18>()
+ // space character is not allowed in a tag
+ {
+ LLError::setDefaultLevel(LLError::LEVEL_DEBUG);
+ fatalWasCalled = false;
+
+ std::string location = writeTagWithSpaceReturningLocation();
+ std::string expected = "Space is not allowed in a log tag at " + location;
+ ensure_message_field_equals(0, LEVEL_FIELD, "ERROR");
+ ensure_message_field_equals(0, MSG_FIELD, expected);
+ ensure("fatal callback called", fatalWasCalled);
+ }
}
/* Tests left:
diff --git a/indra/llcorehttp/httpstats.cpp b/indra/llcorehttp/httpstats.cpp
index b2de7f51ff..19eceae5ef 100644
--- a/indra/llcorehttp/httpstats.cpp
+++ b/indra/llcorehttp/httpstats.cpp
@@ -101,7 +101,7 @@ void HTTPStats::dumpStats()
out << (*it).first << " " << (*it).second << std::endl;
}
- LL_WARNS("HTTP Core") << out.str() << LL_ENDL;
+ LL_WARNS("HTTPCore") << out.str() << LL_ENDL;
}
diff --git a/indra/llcorehttp/tests/test_refcounted.hpp b/indra/llcorehttp/tests/test_refcounted.hpp
index cb4b50287a..5dff143e5d 100644
--- a/indra/llcorehttp/tests/test_refcounted.hpp
+++ b/indra/llcorehttp/tests/test_refcounted.hpp
@@ -30,6 +30,7 @@
#include "test_allocator.h"
+#if 0 // disable all of this because it's hanging win64 builds?
using namespace LLCoreInt;
namespace tut
@@ -152,5 +153,5 @@ namespace tut
ensure(mMemTotal == (GetMemTotal() - sizeof(RefCounted)));
}
}
-
+#endif // if 0
#endif // TEST_LLCOREINT_REF_COUNTED_H_
diff --git a/indra/llmessage/lltransfermanager.cpp b/indra/llmessage/lltransfermanager.cpp
index ec7b21d8b6..452b77fb6d 100644
--- a/indra/llmessage/lltransfermanager.cpp
+++ b/indra/llmessage/lltransfermanager.cpp
@@ -62,9 +62,11 @@ LLTransferManager::LLTransferManager() :
LLTransferManager::~LLTransferManager()
{
+ // LLTransferManager should have been cleaned up by message system shutdown process
+ llassert(!mValid);
if (mValid)
{
- LL_WARNS() << "LLTransferManager::~LLTransferManager - Should have been cleaned up by message system shutdown process" << LL_ENDL;
+ // Usually happens if OS tries to kill viewer
cleanup();
}
}
diff --git a/indra/llui/llscrolllistctrl.cpp b/indra/llui/llscrolllistctrl.cpp
index ed65b1e45f..f4028057e8 100644
--- a/indra/llui/llscrolllistctrl.cpp
+++ b/indra/llui/llscrolllistctrl.cpp
@@ -199,7 +199,8 @@ LLScrollListCtrl::LLScrollListCtrl(const LLScrollListCtrl::Params& p)
mHoveredColor(p.hovered_color()),
mSearchColumn(p.search_column),
mColumnPadding(p.column_padding),
- mContextMenuType(MENU_NONE)
+ mContextMenuType(MENU_NONE),
+ mIsFriendSignal(NULL)
{
mItemListRect.setOriginAndSize(
mBorderThickness,
@@ -323,6 +324,7 @@ LLScrollListCtrl::~LLScrollListCtrl()
mItemList.clear();
std::for_each(mColumns.begin(), mColumns.end(), DeletePairedPointer());
mColumns.clear();
+ delete mIsFriendSignal;
}
@@ -1836,6 +1838,19 @@ BOOL LLScrollListCtrl::handleRightMouseDown(S32 x, S32 y, MASK mask)
menu_name, LLMenuGL::sMenuContainer, LLMenuHolderGL::child_registry_t::instance());
if (mPopupMenu)
{
+ if (mIsFriendSignal)
+ {
+ bool isFriend = *(*mIsFriendSignal)(uuid);
+ LLView* addFriendButton = mPopupMenu->getChild<LLView>("add_friend");
+ LLView* removeFriendButton = mPopupMenu->getChild<LLView>("remove_friend");
+
+ if (addFriendButton && removeFriendButton)
+ {
+ addFriendButton->setEnabled(!isFriend);
+ removeFriendButton->setEnabled(isFriend);
+ }
+ }
+
mPopupMenu->show(x, y);
LLMenuGL::showPopup(this, mPopupMenu, x, y);
return TRUE;
@@ -3110,3 +3125,11 @@ void LLScrollListCtrl::onFocusLost()
LLUICtrl::onFocusLost();
}
+boost::signals2::connection LLScrollListCtrl::setIsFriendCallback(const is_friend_signal_t::slot_type& cb)
+{
+ if (!mIsFriendSignal)
+ {
+ mIsFriendSignal = new is_friend_signal_t();
+ }
+ return mIsFriendSignal->connect(cb);
+}
diff --git a/indra/llui/llscrolllistctrl.h b/indra/llui/llscrolllistctrl.h
index 699a8744e1..b35a8608e7 100644
--- a/indra/llui/llscrolllistctrl.h
+++ b/indra/llui/llscrolllistctrl.h
@@ -90,6 +90,7 @@ public:
typedef boost::signals2::signal<S32 (S32,const LLScrollListItem*,const LLScrollListItem*),maximum<S32> > sort_signal_t;
+ typedef boost::signals2::signal<bool(const LLUUID& user_id)> is_friend_signal_t;
struct Params : public LLInitParam::Block<Params, LLUICtrl::Params>
{
@@ -393,6 +394,8 @@ public:
return mSortCallback->connect(cb);
}
+ boost::signals2::connection setIsFriendCallback(const is_friend_signal_t::slot_type& cb);
+
protected:
// "Full" interface: use this when you're creating a list that has one or more of the following:
@@ -515,6 +518,8 @@ private:
std::vector<sort_column_t> mSortColumns;
sort_signal_t* mSortCallback;
+
+ is_friend_signal_t* mIsFriendSignal;
}; // end class LLScrollListCtrl
#endif // LL_SCROLLLISTCTRL_H
diff --git a/indra/llui/lltextbox.cpp b/indra/llui/lltextbox.cpp
index d175204e6d..01fe82e45d 100644
--- a/indra/llui/lltextbox.cpp
+++ b/indra/llui/lltextbox.cpp
@@ -43,7 +43,8 @@ template class LLTextBox* LLView::getChild<class LLTextBox>(
LLTextBox::LLTextBox(const LLTextBox::Params& p)
: LLTextBase(p),
- mClickedCallback(NULL)
+ mClickedCallback(NULL),
+ mShowCursorHand(true)
{}
LLTextBox::~LLTextBox()
@@ -103,7 +104,7 @@ BOOL LLTextBox::handleMouseUp(S32 x, S32 y, MASK mask)
BOOL LLTextBox::handleHover(S32 x, S32 y, MASK mask)
{
BOOL handled = LLTextBase::handleHover(x, y, mask);
- if (!handled && mClickedCallback)
+ if (!handled && mClickedCallback && mShowCursorHand)
{
// Clickable text boxes change the cursor to a hand
LLUI::getWindow()->setCursor(UI_CURSOR_HAND);
diff --git a/indra/llui/lltextbox.h b/indra/llui/lltextbox.h
index 071e18c638..061d2dd23d 100644
--- a/indra/llui/lltextbox.h
+++ b/indra/llui/lltextbox.h
@@ -68,11 +68,14 @@ public:
/*virtual*/ LLSD getValue() const;
/*virtual*/ BOOL setTextArg( const std::string& key, const LLStringExplicit& text );
+ void setShowCursorHand(bool show_cursor) { mShowCursorHand = show_cursor; }
+
protected:
void onUrlLabelUpdated(const std::string &url, const std::string &label);
LLUIString mText;
callback_t mClickedCallback;
+ bool mShowCursorHand;
};
// Build time optimization, generate once in .cpp file
diff --git a/indra/llwindow/llwindowwin32.cpp b/indra/llwindow/llwindowwin32.cpp
index cbda906599..4ee4a5357c 100644
--- a/indra/llwindow/llwindowwin32.cpp
+++ b/indra/llwindow/llwindowwin32.cpp
@@ -752,8 +752,6 @@ void LLWindowWin32::close()
mDragDrop->reset();
- // Make sure cursor is visible and we haven't mangled the clipping state.
- setMouseClipping(FALSE);
// Go back to screen mode written in the registry.
if (mFullscreen)
@@ -763,13 +761,13 @@ void LLWindowWin32::close()
// Don't process events in our mainWindowProc any longer.
SetWindowLongPtr(mWindowHandle, GWLP_USERDATA, NULL);
- if (mCallbacks)
- {
- mCallbacks->handleFocusLost(this);
- }
- else
+
+ // Make sure cursor is visible and we haven't mangled the clipping state.
+ showCursor();
+ setMouseClipping(FALSE);
+ if (gKeyboard)
{
- showCursor();
+ gKeyboard->resetKeys();
}
// Clean up remaining GL state
diff --git a/indra/newview/VIEWER_VERSION.txt b/indra/newview/VIEWER_VERSION.txt
index d4bda08b51..fc3aa7739a 100644
--- a/indra/newview/VIEWER_VERSION.txt
+++ b/indra/newview/VIEWER_VERSION.txt
@@ -1 +1 @@
-5.1.8
+5.1.9
diff --git a/indra/newview/app_settings/logcontrol.xml b/indra/newview/app_settings/logcontrol.xml
index ecd7c4bc36..8ced81fdb3 100644
--- a/indra/newview/app_settings/logcontrol.xml
+++ b/indra/newview/app_settings/logcontrol.xml
@@ -2,7 +2,6 @@
<map>
<!-- default-level can be ALL, DEBUG, INFO, WARN, ERROR, or NONE -->
<key>default-level</key> <string>INFO</string>
- <key>print-location</key> <boolean>false</boolean>
<key>settings</key>
<array>
<!-- Suppress anything but ERROR for some very verbose components -->
diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp
index 901294d6b4..9b8cc62aa8 100644
--- a/indra/newview/llagent.cpp
+++ b/indra/newview/llagent.cpp
@@ -4150,6 +4150,7 @@ void LLAgent::setTeleportState(ETeleportState state)
" for previously failed teleport. Ignore!" << LL_ENDL;
return;
}
+ LL_DEBUGS("Teleport") << "Setting teleport state to " << state << " Previous state: " << mTeleportState << LL_ENDL;
mTeleportState = state;
if (mTeleportState > TELEPORT_NONE && gSavedSettings.getBOOL("FreezeTime"))
{
diff --git a/indra/newview/llagent.h b/indra/newview/llagent.h
index 4bb4d317e8..b1b39b637e 100644
--- a/indra/newview/llagent.h
+++ b/indra/newview/llagent.h
@@ -629,6 +629,7 @@ public:
void teleportViaLocationLookAt(const LLVector3d& pos_global);// To a global location, preserving camera rotation
void teleportCancel(); // May or may not be allowed by server
void restoreCanceledTeleportRequest();
+ bool canRestoreCanceledTeleport() { return mTeleportCanceled != NULL; }
bool getTeleportKeepsLookAt() { return mbTeleportKeepsLookAt; } // Whether look-at reset after teleport
protected:
bool teleportCore(bool is_local = false); // Stuff for all teleports; returns true if the teleport can proceed
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index 687b76c224..189f7c1426 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -3118,7 +3118,7 @@ LLSD LLAppViewer::getViewerInfo() const
}
else
{
- LL_WARNS("Driver version")<< "Cannot get driver version from getDriverVersionWMI" << LL_ENDL;
+ LL_WARNS("DriverVersion")<< "Cannot get driver version from getDriverVersionWMI" << LL_ENDL;
LLSD driver_info = gDXHardware.getDisplayInfo();
if (driver_info.has("DriverVersion"))
{
diff --git a/indra/newview/llappviewerwin32.cpp b/indra/newview/llappviewerwin32.cpp
index 48b3a1c485..f0a4a54fbf 100644
--- a/indra/newview/llappviewerwin32.cpp
+++ b/indra/newview/llappviewerwin32.cpp
@@ -698,7 +698,7 @@ void LLAppViewerWin32::initCrashReporting(bool reportFreeze)
&processInfo) == FALSE)
// Could not start application -> call 'GetLastError()'
{
- LL_WARNS("CrashReport Launch") << "CreateProcess failed " << GetLastError() << LL_ENDL;
+ LL_WARNS("CrashReport") << "CreateProcess failed " << GetLastError() << LL_ENDL;
return;
}
}
diff --git a/indra/newview/llchicletbar.cpp b/indra/newview/llchicletbar.cpp
index c4f959bfa9..91b9d68fd2 100644
--- a/indra/newview/llchicletbar.cpp
+++ b/indra/newview/llchicletbar.cpp
@@ -70,7 +70,7 @@ void LLChicletBar::log(LLView* panel, const std::string& descr)
{
if (NULL == panel) return;
LLView* layout = panel->getParent();
- LL_DEBUGS("Chiclet Bar Rects") << descr << ": "
+ LL_DEBUGS("ChicletBarRects") << descr << ": "
<< "panel: " << panel->getName()
<< ", rect: " << panel->getRect()
<< " layout: " << layout->getName()
diff --git a/indra/newview/llestateinfomodel.cpp b/indra/newview/llestateinfomodel.cpp
index e56a67f8d1..95d40be913 100644
--- a/indra/newview/llestateinfomodel.cpp
+++ b/indra/newview/llestateinfomodel.cpp
@@ -93,7 +93,7 @@ void LLEstateInfoModel::update(const strings_t& strings)
mFlags = strtoul(strings[3].c_str(), NULL, 10);
mSunHour = ((F32)(strtod(strings[4].c_str(), NULL)))/1024.0f;
- LL_DEBUGS("Windlight Sync") << "Received estate info: "
+ LL_DEBUGS("WindlightSync") << "Received estate info: "
<< "is_sun_fixed = " << getUseFixedSun()
<< ", sun_hour = " << getSunHour() << LL_ENDL;
LL_DEBUGS() << getInfoDump() << LL_ENDL;
@@ -151,7 +151,7 @@ void LLEstateInfoModel::commitEstateInfoCapsCoro(std::string url)
body["invoice"] = LLFloaterRegionInfo::getLastInvoice();
- LL_DEBUGS("Windlight Sync") << "Sending estate caps: "
+ LL_DEBUGS("WindlightSync") << "Sending estate caps: "
<< "is_sun_fixed = " << getUseFixedSun()
<< ", sun_hour = " << getSunHour() << LL_ENDL;
LL_DEBUGS() << body << LL_ENDL;
@@ -181,7 +181,7 @@ void LLEstateInfoModel::commitEstateInfoCapsCoro(std::string url)
// strings[3] = str((S32)(sun_hour * 1024.f))
void LLEstateInfoModel::commitEstateInfoDataserver()
{
- LL_DEBUGS("Windlight Sync") << "Sending estate info: "
+ LL_DEBUGS("WindlightSync") << "Sending estate info: "
<< "is_sun_fixed = " << getUseFixedSun()
<< ", sun_hour = " << getSunHour() << LL_ENDL;
LL_DEBUGS() << getInfoDump() << LL_ENDL;
diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp
index 7aff9fb586..f2e7058098 100644
--- a/indra/newview/llfloaterpreference.cpp
+++ b/indra/newview/llfloaterpreference.cpp
@@ -2329,6 +2329,11 @@ BOOL LLPanelPreference::postBuild()
bool show_favorites_at_login = LLPanelLogin::getShowFavorites();
getChild<LLCheckBoxCtrl>("favorites_on_login_check")->setValue(show_favorites_at_login);
}
+ if (hasChild("mute_chb_label", TRUE))
+ {
+ getChild<LLTextBox>("mute_chb_label")->setShowCursorHand(false);
+ getChild<LLTextBox>("mute_chb_label")->setClickedCallback(boost::bind(&toggleMuteWhenMinimized));
+ }
//////////////////////PanelAdvanced ///////////////////
if (hasChild("modifier_combo", TRUE))
@@ -2438,6 +2443,12 @@ void LLPanelPreference::handleFavoritesOnLoginChanged(LLUICtrl* checkbox, const
}
}
+void LLPanelPreference::toggleMuteWhenMinimized()
+{
+ std::string mute("MuteWhenMinimized");
+ gSavedSettings.setBOOL(mute, !gSavedSettings.getBOOL(mute));
+}
+
void LLPanelPreference::cancel()
{
for (control_values_map_t::iterator iter = mSavedValues.begin();
diff --git a/indra/newview/llfloaterpreference.h b/indra/newview/llfloaterpreference.h
index 8339a18296..a24b69ddbf 100644
--- a/indra/newview/llfloaterpreference.h
+++ b/indra/newview/llfloaterpreference.h
@@ -244,6 +244,7 @@ private:
//for "Show my Favorite Landmarks at Login"
static void handleFavoritesOnLoginChanged(LLUICtrl* checkbox, const LLSD& value);
+ static void toggleMuteWhenMinimized();
typedef std::map<std::string, LLColor4> string_color_map_t;
string_color_map_t mSavedColors;
diff --git a/indra/newview/llfloaterregioninfo.cpp b/indra/newview/llfloaterregioninfo.cpp
index af68a2aae1..a0522c99c2 100644
--- a/indra/newview/llfloaterregioninfo.cpp
+++ b/indra/newview/llfloaterregioninfo.cpp
@@ -3248,14 +3248,14 @@ void LLPanelEnvironmentInfo::sendRegionSunUpdate()
param_set.setAll(sky_map.beginMap()->second);
F32 sun_angle = param_set.getSunAngle();
- LL_DEBUGS("Windlight Sync") << "Old sun hour: " << region_info.mSunHour << LL_ENDL;
+ LL_DEBUGS("WindlightSync") << "Old sun hour: " << region_info.mSunHour << LL_ENDL;
// convert value range from 0..2pi to 6..30
region_info.mSunHour = fmodf((sun_angle / F_TWO_PI) * 24.f, 24.f) + 6.f;
}
region_info.setUseFixedSun(region_use_fixed_sky);
region_info.mUseEstateSun = !region_use_fixed_sky;
- LL_DEBUGS("Windlight Sync") << "Sun hour: " << region_info.mSunHour << LL_ENDL;
+ LL_DEBUGS("WindlightSync") << "Sun hour: " << region_info.mSunHour << LL_ENDL;
region_info.sendRegionTerrain(LLFloaterRegionInfo::getLastInvoice());
}
diff --git a/indra/newview/llfloatersaveprefpreset.cpp b/indra/newview/llfloatersaveprefpreset.cpp
index 6320c6b626..684778c93a 100644
--- a/indra/newview/llfloatersaveprefpreset.cpp
+++ b/indra/newview/llfloatersaveprefpreset.cpp
@@ -34,6 +34,7 @@
#include "llfloaterreg.h"
#include "llnotificationsutil.h"
#include "llpresetsmanager.h"
+#include "lltrans.h"
LLFloaterSavePrefPreset::LLFloaterSavePrefPreset(const LLSD &key)
: LLFloater(key)
@@ -86,7 +87,11 @@ void LLFloaterSavePrefPreset::onBtnSave()
{
std::string name = mPresetCombo->getSimple();
- if (!LLPresetsManager::getInstance()->savePreset(mSubdirectory, name))
+ if ((name == LLTrans::getString(PRESETS_DEFAULT)) || (name == PRESETS_DEFAULT))
+ {
+ LLNotificationsUtil::add("DefaultPresetNotSaved");
+ }
+ else if (!LLPresetsManager::getInstance()->savePreset(mSubdirectory, name))
{
LLSD args;
args["NAME"] = name;
diff --git a/indra/newview/llfloatertools.cpp b/indra/newview/llfloatertools.cpp
index 7fc60ddaac..ee4fdbe9a5 100644
--- a/indra/newview/llfloatertools.cpp
+++ b/indra/newview/llfloatertools.cpp
@@ -1225,7 +1225,7 @@ void LLFloaterTools::getMediaState()
if(!has_media_capability)
{
getChildView("add_media")->setEnabled(FALSE);
- LL_WARNS("LLFloaterTools: media") << "Media not enabled (no capability) in this region!" << LL_ENDL;
+ LL_WARNS("LLFloaterToolsMedia") << "Media not enabled (no capability) in this region!" << LL_ENDL;
clearMediaSettings();
return;
}
@@ -1249,7 +1249,7 @@ void LLFloaterTools::getMediaState()
{
if (!object->permModify())
{
- LL_INFOS("LLFloaterTools: media")
+ LL_INFOS("LLFloaterToolsMedia")
<< "Selection not editable due to lack of modify permissions on object id "
<< object->getID() << LL_ENDL;
@@ -1262,7 +1262,7 @@ void LLFloaterTools::getMediaState()
// contention as to whether this is a sufficient solution.
// if (object->isMediaDataBeingFetched())
// {
-// LL_INFOS("LLFloaterTools: media")
+// LL_INFOS("LLFloaterToolsMedia")
// << "Selection not editable due to media data being fetched for object id "
// << object->getID() << LL_ENDL;
//
diff --git a/indra/newview/llpanelface.cpp b/indra/newview/llpanelface.cpp
index 01ce4470f0..13ee7bb003 100644
--- a/indra/newview/llpanelface.cpp
+++ b/indra/newview/llpanelface.cpp
@@ -1255,7 +1255,7 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
if (material && editable)
{
- LL_DEBUGS("Materials: OnMatererialsLoaded:") << material->asLLSD() << LL_ENDL;
+ LL_DEBUGS("Materials") << material->asLLSD() << LL_ENDL;
// Alpha
LLCtrlSelectionInterface* combobox_alphamode =
diff --git a/indra/newview/llpanelgrouproles.cpp b/indra/newview/llpanelgrouproles.cpp
index 087e0a0759..52a13304df 100644
--- a/indra/newview/llpanelgrouproles.cpp
+++ b/indra/newview/llpanelgrouproles.cpp
@@ -834,6 +834,7 @@ BOOL LLPanelGroupMembersSubTab::postBuildSubTab(LLView* root)
// Show the member's profile on double click.
mMembersList->setDoubleClickCallback(onMemberDoubleClick, this);
mMembersList->setContextMenu(LLScrollListCtrl::MENU_AVATAR);
+ mMembersList->setIsFriendCallback(LLAvatarActions::isFriend);
LLSD row;
row["columns"][0]["column"] = "name";
diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp
index 30fef9f5f0..1cbff37287 100644
--- a/indra/newview/llpanelpeople.cpp
+++ b/indra/newview/llpanelpeople.cpp
@@ -213,10 +213,39 @@ protected:
}
};
+class LLAvatarItemRecentArrivalComparator : public LLAvatarItemNameComparator
+{
+public:
+ LLAvatarItemRecentArrivalComparator() {};
+ virtual ~LLAvatarItemRecentArrivalComparator() {};
+
+protected:
+ virtual bool doCompare(const LLAvatarListItem* item1, const LLAvatarListItem* item2) const
+ {
+
+ F32 arr_time1 = LLRecentPeople::instance().getArrivalTimeByID(item1->getAvatarId());
+ F32 arr_time2 = LLRecentPeople::instance().getArrivalTimeByID(item2->getAvatarId());
+
+ if (arr_time1 == arr_time2)
+ {
+ std::string name1 = item1->getAvatarName();
+ std::string name2 = item2->getAvatarName();
+
+ LLStringUtil::toUpper(name1);
+ LLStringUtil::toUpper(name2);
+
+ return name1 < name2;
+ }
+
+ return arr_time1 > arr_time2;
+ }
+};
+
static const LLAvatarItemRecentComparator RECENT_COMPARATOR;
static const LLAvatarItemStatusComparator STATUS_COMPARATOR;
static LLAvatarItemDistanceComparator DISTANCE_COMPARATOR;
static const LLAvatarItemRecentSpeakerComparator RECENT_SPEAKER_COMPARATOR;
+static LLAvatarItemRecentArrivalComparator RECENT_ARRIVAL_COMPARATOR;
static LLPanelInjector<LLPanelPeople> t_people("panel_people");
@@ -539,6 +568,8 @@ LLPanelPeople::LLPanelPeople()
mEnableCallbackRegistrar.add("People.Nearby.ViewSort.CheckItem", boost::bind(&LLPanelPeople::onNearbyViewSortMenuItemCheck, this, _2));
mEnableCallbackRegistrar.add("People.Group.Plus.Validate", boost::bind(&LLPanelPeople::onGroupPlusButtonValidate, this));
+
+ doPeriodically(boost::bind(&LLPanelPeople::updateNearbyArrivalTime, this), 2.0);
}
LLPanelPeople::~LLPanelPeople()
@@ -1049,6 +1080,10 @@ void LLPanelPeople::setSortOrder(LLAvatarList* list, ESortOrder order, bool save
list->setComparator(&DISTANCE_COMPARATOR);
list->sort();
break;
+ case E_SORT_BY_RECENT_ARRIVAL:
+ list->setComparator(&RECENT_ARRIVAL_COMPARATOR);
+ list->sort();
+ break;
default:
LL_WARNS() << "Unrecognized people sort order for " << list->getName() << LL_ENDL;
return;
@@ -1386,6 +1421,10 @@ void LLPanelPeople::onNearbyViewSortMenuItemClicked(const LLSD& userdata)
{
setSortOrder(mNearbyList, E_SORT_BY_DISTANCE);
}
+ else if (chosen_item == "sort_arrival")
+ {
+ setSortOrder(mNearbyList, E_SORT_BY_RECENT_ARRIVAL);
+ }
else if (chosen_item == "view_usernames")
{
bool hide_usernames = !gSavedSettings.getBOOL("NearbyListHideUsernames");
@@ -1407,6 +1446,8 @@ bool LLPanelPeople::onNearbyViewSortMenuItemCheck(const LLSD& userdata)
return sort_order == E_SORT_BY_NAME;
if (item == "sort_distance")
return sort_order == E_SORT_BY_DISTANCE;
+ if (item == "sort_arrival")
+ return sort_order == E_SORT_BY_RECENT_ARRIVAL;
return false;
}
@@ -1594,5 +1635,15 @@ bool LLPanelPeople::isAccordionCollapsedByUser(const std::string& name)
return isAccordionCollapsedByUser(getChild<LLUICtrl>(name));
}
+bool LLPanelPeople::updateNearbyArrivalTime()
+{
+ std::vector<LLVector3d> positions;
+ std::vector<LLUUID> uuids;
+ static LLCachedControl<F32> range(gSavedSettings, "NearMeRange");
+ LLWorld::getInstance()->getAvatars(&uuids, &positions, gAgent.getPositionGlobal(), range);
+ LLRecentPeople::instance().updateAvatarsArrivalTime(uuids);
+ return LLApp::isExiting();
+}
+
// EOF
diff --git a/indra/newview/llpanelpeople.h b/indra/newview/llpanelpeople.h
index eb7e76a772..c72c4fc08a 100644
--- a/indra/newview/llpanelpeople.h
+++ b/indra/newview/llpanelpeople.h
@@ -62,6 +62,8 @@ public:
// internals
class Updater;
+ bool updateNearbyArrivalTime();
+
private:
typedef enum e_sort_oder {
@@ -70,6 +72,7 @@ private:
E_SORT_BY_MOST_RECENT = 2,
E_SORT_BY_DISTANCE = 3,
E_SORT_BY_RECENT_SPEAKERS = 4,
+ E_SORT_BY_RECENT_ARRIVAL = 5
} ESortOrder;
void removePicker();
diff --git a/indra/newview/llpanelvoicedevicesettings.cpp b/indra/newview/llpanelvoicedevicesettings.cpp
index 07f8045546..28631e2b7b 100644
--- a/indra/newview/llpanelvoicedevicesettings.cpp
+++ b/indra/newview/llpanelvoicedevicesettings.cpp
@@ -39,7 +39,6 @@
// Library includes (after viewer)
#include "lluictrlfactory.h"
-
static LLPanelInjector<LLPanelVoiceDeviceSettings> t_panel_group_general("panel_voice_device_settings");
static const std::string DEFAULT_DEVICE("Default");
@@ -233,18 +232,18 @@ void LLPanelVoiceDeviceSettings::refresh()
}
else if (LLVoiceClient::getInstance()->deviceSettingsUpdated())
{
- LLVoiceDeviceList::const_iterator iter;
+ LLVoiceDeviceList::const_iterator device;
if(mCtrlInputDevices)
{
mCtrlInputDevices->removeall();
mCtrlInputDevices->add(getLocalizedDeviceName(DEFAULT_DEVICE), DEFAULT_DEVICE, ADD_BOTTOM);
- for(iter=LLVoiceClient::getInstance()->getCaptureDevices().begin();
- iter != LLVoiceClient::getInstance()->getCaptureDevices().end();
- iter++)
+ for(device=LLVoiceClient::getInstance()->getCaptureDevices().begin();
+ device != LLVoiceClient::getInstance()->getCaptureDevices().end();
+ device++)
{
- mCtrlInputDevices->add(getLocalizedDeviceName(*iter), *iter, ADD_BOTTOM);
+ mCtrlInputDevices->add(getLocalizedDeviceName(device->display_name), device->full_name, ADD_BOTTOM);
}
// Fix invalid input audio device preference.
@@ -261,10 +260,11 @@ void LLPanelVoiceDeviceSettings::refresh()
mCtrlOutputDevices->removeall();
mCtrlOutputDevices->add(getLocalizedDeviceName(DEFAULT_DEVICE), DEFAULT_DEVICE, ADD_BOTTOM);
- for(iter= LLVoiceClient::getInstance()->getRenderDevices().begin();
- iter != LLVoiceClient::getInstance()->getRenderDevices().end(); iter++)
+ for(device = LLVoiceClient::getInstance()->getRenderDevices().begin();
+ device != LLVoiceClient::getInstance()->getRenderDevices().end();
+ device++)
{
- mCtrlOutputDevices->add(getLocalizedDeviceName(*iter), *iter, ADD_BOTTOM);
+ mCtrlOutputDevices->add(getLocalizedDeviceName(device->display_name), device->full_name, ADD_BOTTOM);
}
// Fix invalid output audio device preference.
diff --git a/indra/newview/llpresetsmanager.cpp b/indra/newview/llpresetsmanager.cpp
index 96818d5a21..df93572508 100644
--- a/indra/newview/llpresetsmanager.cpp
+++ b/indra/newview/llpresetsmanager.cpp
@@ -138,6 +138,11 @@ bool LLPresetsManager::savePreset(const std::string& subdirectory, std::string n
{
name = PRESETS_DEFAULT;
}
+ if (!createDefault && name == PRESETS_DEFAULT)
+ {
+ LL_WARNS() << "Should not overwrite default" << LL_ENDL;
+ return false;
+ }
bool saved = false;
std::vector<std::string> name_list;
diff --git a/indra/newview/llrecentpeople.cpp b/indra/newview/llrecentpeople.cpp
index 7689cd1a52..83b0c4f1bf 100644
--- a/indra/newview/llrecentpeople.cpp
+++ b/indra/newview/llrecentpeople.cpp
@@ -126,3 +126,33 @@ bool LLRecentPeople::handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
add(event->getValue().asUUID());
return true;
}
+
+void LLRecentPeople::updateAvatarsArrivalTime(uuid_vec_t& uuids)
+{
+ id_to_time_map_t buf = mAvatarsArrivalTime;
+ mAvatarsArrivalTime.clear();
+
+ for (uuid_vec_t::const_iterator id_it = uuids.begin(); id_it != uuids.end(); ++id_it)
+ {
+ if (buf.find(*id_it) != buf.end())
+ {
+ mAvatarsArrivalTime[*id_it] = buf[*id_it];
+ }
+ else
+ {
+ mAvatarsArrivalTime[*id_it] = LLDate::now().secondsSinceEpoch();
+ }
+ }
+}
+
+F32 LLRecentPeople::getArrivalTimeByID(const LLUUID& id)
+{
+ id_to_time_map_t::const_iterator it = mAvatarsArrivalTime.find(id);
+
+ if (it != mAvatarsArrivalTime.end())
+ {
+ return it->second;
+ }
+ return LLDate::now().secondsSinceEpoch();
+}
+
diff --git a/indra/newview/llrecentpeople.h b/indra/newview/llrecentpeople.h
index c7aaf604f5..1b4295ddad 100644
--- a/indra/newview/llrecentpeople.h
+++ b/indra/newview/llrecentpeople.h
@@ -53,6 +53,7 @@ class LLRecentPeople: public LLSingleton<LLRecentPeople>, public LLOldEvents::LL
LLSINGLETON_EMPTY_CTOR(LLRecentPeople);
LOG_CLASS(LLRecentPeople);
public:
+ typedef std::map <LLUUID, F32> id_to_time_map_t;
typedef boost::signals2::signal<void ()> signal_t;
/**
@@ -116,6 +117,9 @@ public:
*/
/*virtual*/ bool handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata);
+ void updateAvatarsArrivalTime(uuid_vec_t& uuids);
+ F32 getArrivalTimeByID(const LLUUID& id);
+
private:
const LLUUID& getIDByPhoneNumber(const LLSD& userdata);
@@ -123,6 +127,7 @@ private:
typedef std::map<LLUUID, LLSD> recent_people_t;
recent_people_t mPeople;
signal_t mChangedSignal;
+ id_to_time_map_t mAvatarsArrivalTime;
};
#endif // LL_LLRECENTPEOPLE_H
diff --git a/indra/newview/llregioninfomodel.cpp b/indra/newview/llregioninfomodel.cpp
index 25d7be831f..7daaa7ef8e 100644
--- a/indra/newview/llregioninfomodel.cpp
+++ b/indra/newview/llregioninfomodel.cpp
@@ -158,7 +158,7 @@ void LLRegionInfoModel::update(LLMessageSystem* msg)
// actually the "last set" sun hour, not the current sun hour. JC
msg->getF32(_PREHASH_RegionInfo, _PREHASH_SunHour, mSunHour);
- LL_DEBUGS("Windlight Sync") << "Got region sun hour: " << mSunHour << LL_ENDL;
+ LL_DEBUGS("WindlightSync") << "Got region sun hour: " << mSunHour << LL_ENDL;
msg->getS32Fast(_PREHASH_RegionInfo2, _PREHASH_HardMaxAgents, mHardAgentLimit);
diff --git a/indra/newview/llviewerkeyboard.cpp b/indra/newview/llviewerkeyboard.cpp
index fd4315a319..b89e1497a1 100644
--- a/indra/newview/llviewerkeyboard.cpp
+++ b/indra/newview/llviewerkeyboard.cpp
@@ -716,7 +716,7 @@ BOOL LLViewerKeyboard::handleKey(KEY translated_key, MASK translated_mask, BOOL
if(mKeysSkippedByUI.find(translated_key) != mKeysSkippedByUI.end())
{
mKeyHandledByUI[translated_key] = FALSE;
- LL_INFOS("Keyboard Handling") << "Key wasn't handled by UI!" << LL_ENDL;
+ LL_INFOS("KeyboardHandling") << "Key wasn't handled by UI!" << LL_ENDL;
}
else
{
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index a2b4a6a91d..0c5bd9ad1d 100644
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -2709,6 +2709,12 @@ void process_teleport_start(LLMessageSystem *msg, void**)
U32 teleport_flags = 0x0;
msg->getU32("Info", "TeleportFlags", teleport_flags);
+ if (gAgent.getTeleportState() == LLAgent::TELEPORT_MOVING)
+ {
+ // Race condition?
+ LL_WARNS("Messaging") << "Got TeleportStart, but teleport already in progress. TeleportFlags=" << teleport_flags << LL_ENDL;
+ }
+
LL_DEBUGS("Messaging") << "Got TeleportStart with TeleportFlags=" << teleport_flags << ". gTeleportDisplay: " << gTeleportDisplay << ", gAgent.mTeleportState: " << gAgent.getTeleportState() << LL_ENDL;
// *NOTE: The server sends two StartTeleport packets when you are teleporting to a LM
@@ -2766,7 +2772,7 @@ void process_teleport_progress(LLMessageSystem* msg, void**)
}
std::string buffer;
msg->getString("Info", "Message", buffer);
- LL_DEBUGS("Messaging") << "teleport progress: " << buffer << LL_ENDL;
+ LL_DEBUGS("Messaging") << "teleport progress: " << buffer << " flags: " << teleport_flags << LL_ENDL;
//Sorta hacky...default to using simulator raw messages
//if we don't find the coresponding mapping in our progress mappings
@@ -2889,9 +2895,25 @@ void process_teleport_finish(LLMessageSystem* msg, void**)
if (gAgent.getTeleportState() == LLAgent::TELEPORT_NONE)
{
- // Server either ignored teleport cancel message or did not receive it in time.
- // This message can't be ignored since teleport is complete at server side
- gAgent.restoreCanceledTeleportRequest();
+ if (gAgent.canRestoreCanceledTeleport())
+ {
+ // Server either ignored teleport cancel message or did not receive it in time.
+ // This message can't be ignored since teleport is complete at server side
+ gAgent.restoreCanceledTeleportRequest();
+ }
+ else
+ {
+ // Race condition? Make sure all variables are set correctly for teleport to work
+ LL_WARNS("Messaging") << "Teleport 'finish' message without 'start'" << LL_ENDL;
+ gTeleportDisplay = TRUE;
+ LLViewerMessage::getInstance()->mTeleportStartedSignal();
+ gAgent.setTeleportState(LLAgent::TELEPORT_REQUESTED);
+ make_ui_sound("UISndTeleportOut");
+ }
+ }
+ else if (gAgent.getTeleportState() == LLAgent::TELEPORT_MOVING)
+ {
+ LL_WARNS("Messaging") << "Teleport message in the middle of other teleport" << LL_ENDL;
}
// Teleport is finished; it can't be cancelled now.
@@ -3755,7 +3777,7 @@ void process_time_synch(LLMessageSystem *mesgsys, void **user_data)
LLWorld::getInstance()->setSpaceTimeUSec(space_time_usec);
- LL_DEBUGS("Windlight Sync") << "Sun phase: " << phase << " rad = " << fmodf(phase / F_TWO_PI + 0.25, 1.f) * 24.f << " h" << LL_ENDL;
+ LL_DEBUGS("WindlightSync") << "Sun phase: " << phase << " rad = " << fmodf(phase / F_TWO_PI + 0.25, 1.f) * 24.f << " h" << LL_ENDL;
gSky.setSunPhase(phase);
gSky.setSunTargetDirection(sun_direction, sun_ang_velocity);
diff --git a/indra/newview/llviewernetwork.cpp b/indra/newview/llviewernetwork.cpp
index 9f6d606a22..46b3c8f315 100644
--- a/indra/newview/llviewernetwork.cpp
+++ b/indra/newview/llviewernetwork.cpp
@@ -127,7 +127,7 @@ void LLGridManager::initialize(const std::string& grid_file)
addSystemGrid(LLTrans::getString("AditiGridLabel"),
"util.aditi.lindenlab.com",
"https://login.aditi.lindenlab.com/cgi-bin/login.cgi",
- "http://aditi-secondlife.webdev.lindenlab.com/helpers/",
+ "https://secondlife.aditi.lindenlab.com/helpers/",
DEFAULT_LOGIN_PAGE,
SL_UPDATE_QUERY_URL,
"https://my.aditi.lindenlab.com/",
diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp
index 39ffbfc989..2e366835d9 100644
--- a/indra/newview/llviewertexture.cpp
+++ b/indra/newview/llviewertexture.cpp
@@ -110,6 +110,12 @@ const F32 desired_discard_bias_min = -2.0f; // -max number of levels to improve
const F32 desired_discard_bias_max = (F32)MAX_DISCARD_LEVEL; // max number of levels to reduce image quality by
const F64 log_2 = log(2.0);
+#if ADDRESS_SIZE == 32
+const U32 DESIRED_NORMAL_FETCHED_TEXTURE_SIZE = (U32)LLViewerFetchedTexture::MAX_IMAGE_SIZE_DEFAULT / 2;
+#else
+const U32 DESIRED_NORMAL_FETCHED_TEXTURE_SIZE = (U32)LLViewerFetchedTexture::MAX_IMAGE_SIZE_DEFAULT;
+#endif
+
//----------------------------------------------------------------------------------------------
//namespace: LLViewerTextureAccess
//----------------------------------------------------------------------------------------------
@@ -1578,12 +1584,17 @@ void LLViewerFetchedTexture::processTextureStats()
mDesiredDiscardLevel = llmin(getMaxDiscardLevel(), (S32)mLoadedCallbackDesiredDiscardLevel);
}
else
- {
+ {
+ U32 desired_size = MAX_IMAGE_SIZE_DEFAULT; // MAX_IMAGE_SIZE_DEFAULT = 1024 and max size ever is 2048
+ if (mBoostLevel <= LLGLTexture::BOOST_SCULPTED)
+ {
+ desired_size = DESIRED_NORMAL_FETCHED_TEXTURE_SIZE;
+ }
if(!mKnownDrawWidth || !mKnownDrawHeight || mFullWidth <= mKnownDrawWidth || mFullHeight <= mKnownDrawHeight)
{
- if (mFullWidth > MAX_IMAGE_SIZE_DEFAULT || mFullHeight > MAX_IMAGE_SIZE_DEFAULT)
+ if (mFullWidth > desired_size || mFullHeight > desired_size)
{
- mDesiredDiscardLevel = 1; // MAX_IMAGE_SIZE_DEFAULT = 1024 and max size ever is 2048
+ mDesiredDiscardLevel = 1;
}
else
{
@@ -3197,8 +3208,13 @@ void LLViewerLODTexture::processTextureStats()
discard_level = floorf(discard_level);
F32 min_discard = 0.f;
- if (mFullWidth > MAX_IMAGE_SIZE_DEFAULT || mFullHeight > MAX_IMAGE_SIZE_DEFAULT)
- min_discard = 1.f; // MAX_IMAGE_SIZE_DEFAULT = 1024 and max size ever is 2048
+ U32 desired_size = MAX_IMAGE_SIZE_DEFAULT; // MAX_IMAGE_SIZE_DEFAULT = 1024 and max size ever is 2048
+ if (mBoostLevel <= LLGLTexture::BOOST_SCULPTED)
+ {
+ desired_size = DESIRED_NORMAL_FETCHED_TEXTURE_SIZE;
+ }
+ if (mFullWidth > desired_size || mFullHeight > desired_size)
+ min_discard = 1.f;
discard_level = llclamp(discard_level, min_discard, (F32)MAX_DISCARD_LEVEL);
diff --git a/indra/newview/llvoiceclient.cpp b/indra/newview/llvoiceclient.cpp
index 503815e2ed..e1dca4ae43 100644
--- a/indra/newview/llvoiceclient.cpp
+++ b/indra/newview/llvoiceclient.cpp
@@ -79,7 +79,7 @@ LLVoiceHandler gVoiceHandler;
std::string LLVoiceClientStatusObserver::status2string(LLVoiceClientStatusObserver::EStatusType inStatus)
{
- std::string result = "UNKNOWN";
+ std::string result = "UNTRANSLATED";
// Prevent copy-paste errors when updating this list...
#define CASE(x) case x: result = #x; break
@@ -92,12 +92,18 @@ std::string LLVoiceClientStatusObserver::status2string(LLVoiceClientStatusObserv
CASE(STATUS_JOINED);
CASE(STATUS_LEFT_CHANNEL);
CASE(STATUS_VOICE_DISABLED);
+ CASE(STATUS_VOICE_ENABLED);
CASE(BEGIN_ERROR_STATUS);
CASE(ERROR_CHANNEL_FULL);
CASE(ERROR_CHANNEL_LOCKED);
CASE(ERROR_NOT_AVAILABLE);
CASE(ERROR_UNKNOWN);
default:
+ {
+ std::ostringstream stream;
+ stream << "UNKNOWN(" << (int)inStatus << ")";
+ result = stream.str();
+ }
break;
}
diff --git a/indra/newview/llvoiceclient.h b/indra/newview/llvoiceclient.h
index 32637dcf42..337f01f3e5 100644
--- a/indra/newview/llvoiceclient.h
+++ b/indra/newview/llvoiceclient.h
@@ -40,8 +40,19 @@ class LLVOAvatar;
// devices
-typedef std::vector<std::string> LLVoiceDeviceList;
-
+class LLVoiceDevice
+{
+ public:
+ std::string display_name; // friendly value for the user
+ std::string full_name; // internal value for selection
+
+ LLVoiceDevice(const std::string& display_name, const std::string& full_name)
+ :display_name(display_name)
+ ,full_name(full_name)
+ {
+ };
+};
+typedef std::vector<LLVoiceDevice> LLVoiceDeviceList;
class LLVoiceClientParticipantObserver
{
diff --git a/indra/newview/llvoicevivox.cpp b/indra/newview/llvoicevivox.cpp
index 1676f70b1e..b039afa734 100644
--- a/indra/newview/llvoicevivox.cpp
+++ b/indra/newview/llvoicevivox.cpp
@@ -99,6 +99,7 @@ namespace {
const int CONNECT_RETRY_MAX = 3;
const F32 LOGIN_ATTEMPT_TIMEOUT = 30.0f;
+ const F32 LOGOUT_ATTEMPT_TIMEOUT = 5.0f;
const int LOGIN_RETRY_MAX = 3;
const F32 PROVISION_RETRY_TIMEOUT = 2.0;
@@ -259,9 +260,16 @@ static void killGateway()
{
if (sGatewayPtr)
{
+ LL_DEBUGS("Voice") << "SLVoice " << sGatewayPtr->getStatusString() << LL_ENDL;
+
sGatewayPump.stopListening("VivoxDaemonPump");
- sGatewayPtr->kill();
+ sGatewayPtr->kill(__FUNCTION__);
+ sGatewayPtr=NULL;
}
+ else
+ {
+ LL_DEBUGS("Voice") << "no gateway" << LL_ENDL;
+ }
}
///////////////////////////////////////////////////////////////////////////////////////////////
@@ -283,7 +291,7 @@ LLVivoxVoiceClient::LLVivoxVoiceClient() :
mDevicesListUpdated(false),
mAreaVoiceDisabled(false),
- mAudioSession(),
+ mAudioSession(), // TBD - should be NULL
mAudioSessionChanged(false),
mNextAudioSession(),
@@ -416,6 +424,7 @@ void LLVivoxVoiceClient::cleanUp()
deleteAllSessions();
deleteAllVoiceFonts();
deleteVoiceFontTemplates();
+ LL_DEBUGS("Voice") << "exiting" << LL_ENDL;
}
//---------------------------------------------------
@@ -447,7 +456,7 @@ void LLVivoxVoiceClient::updateSettings()
bool LLVivoxVoiceClient::writeString(const std::string &str)
{
bool result = false;
- LL_DEBUGS("LOW Voice") << "sending:\n" << str << LL_ENDL;
+ LL_DEBUGS("LowVoice") << "sending:\n" << str << LL_ENDL;
if(mConnected)
{
@@ -645,18 +654,18 @@ void LLVivoxVoiceClient::idle(void* user_data)
//
void LLVivoxVoiceClient::voiceControlCoro()
{
+ LL_DEBUGS("Voice") << "starting" << LL_ENDL;
mIsCoroutineActive = true;
LLCoros::set_consuming(true);
while (gAgent.getTeleportState() != LLAgent::TELEPORT_NONE)
{
- LL_INFOS("Voice") << "Suspending voiceControlCoro() due to teleport. Tuning: " << mTuningMode << ". Relog: " << mRelogRequested << LL_ENDL;
+ LL_DEBUGS("Voice") << "Suspending voiceControlCoro() momentarily for teleport. Tuning: " << mTuningMode << ". Relog: " << mRelogRequested << LL_ENDL;
llcoro::suspendUntilTimeout(1.0);
}
do
{
-
if (startAndConnectSession())
{
if (mTuningMode)
@@ -666,6 +675,7 @@ void LLVivoxVoiceClient::voiceControlCoro()
waitForChannel(); // this doesn't normally return unless relog is needed or shutting down
+ LL_DEBUGS("Voice") << "lost channel RelogRequested=" << mRelogRequested << LL_ENDL;
endAndDisconnectSession();
}
@@ -673,16 +683,23 @@ void LLVivoxVoiceClient::voiceControlCoro()
// that we attempted to relog into Vivox and were rejected.
// Rather than just quit out of voice, we will tear it down (above)
// and then reconstruct the voice connecion from scratch.
+ LL_DEBUGS("Voice")
+ << "disconnected"
+ << " RelogRequested=" << mRelogRequested
+ << LL_ENDL;
if (mRelogRequested)
{
+ LL_INFOS("Voice") << "will attempt to reconnect to voice" << LL_ENDL;
while (isGatewayRunning() || gAgent.getTeleportState() != LLAgent::TELEPORT_NONE)
{
+ LL_INFOS("Voice") << "waiting for SLVoice to exit" << LL_ENDL;
llcoro::suspendUntilTimeout(1.0);
}
}
}
- while (mRelogRequested);
+ while (mVoiceEnabled && mRelogRequested);
mIsCoroutineActive = false;
+ LL_INFOS("Voice") << "exiting" << LL_ENDL;
}
@@ -714,6 +731,8 @@ bool LLVivoxVoiceClient::startAndConnectSession()
bool LLVivoxVoiceClient::endAndDisconnectSession()
{
+ LL_DEBUGS("Voice") << LL_ENDL;
+
breakVoiceConnection(true);
killGateway();
@@ -723,13 +742,15 @@ bool LLVivoxVoiceClient::endAndDisconnectSession()
bool LLVivoxVoiceClient::callbackEndDaemon(const LLSD& data)
{
- if (!LLAppViewer::isExiting())
+ if (!LLAppViewer::isExiting() && mVoiceEnabled)
{
+ LL_WARNS("Voice") << "SLVoice terminated " << ll_stream_notation_sd(data) << LL_ENDL;
terminateAudioSession(false);
closeSocket();
cleanUp();
LLVoiceClient::getInstance()->setUserPTTState(false);
gAgent.setVoiceConnected(false);
+ mRelogRequested = true;
}
sGatewayPump.stopListening("VivoxDaemonPump");
return false;
@@ -741,6 +762,7 @@ bool LLVivoxVoiceClient::startAndLaunchDaemon()
if (!voiceEnabled())
{
// Voice is locked out, we must not launch the vivox daemon.
+ LL_WARNS("Voice") << "voice disabled; not starting daemon" << LL_ENDL;
return false;
}
@@ -748,11 +770,6 @@ bool LLVivoxVoiceClient::startAndLaunchDaemon()
{
#ifndef VIVOXDAEMON_REMOTEHOST
// Launch the voice daemon
-
- // *FIX:Mani - Using the executable dir instead
- // of mAppRODataDir, the working directory from which the app
- // is launched.
- //std::string exe_path = gDirUtilp->getAppRODataDir();
std::string exe_path = gDirUtilp->getExecutableDir();
exe_path += gDirUtilp->getDirDelimiter();
#if LL_WINDOWS
@@ -807,13 +824,16 @@ bool LLVivoxVoiceClient::startAndLaunchDaemon()
params.postend = sGatewayPump.getName();
sGatewayPump.listen("VivoxDaemonPump", boost::bind(&LLVivoxVoiceClient::callbackEndDaemon, this, _1));
+ LL_INFOS("Voice") << "Launching SLVoice" << LL_ENDL;
+ LL_DEBUGS("Voice") << "SLVoice params " << params << LL_ENDL;
+
sGatewayPtr = LLProcess::create(params);
mDaemonHost = LLHost(gSavedSettings.getString("VivoxVoiceHost").c_str(), gSavedSettings.getU32("VivoxVoicePort"));
}
else
{
- LL_INFOS("Voice") << exe_path << " not found." << LL_ENDL;
+ LL_WARNS("Voice") << exe_path << " not found." << LL_ENDL;
return false;
}
#else
@@ -836,6 +856,10 @@ bool LLVivoxVoiceClient::startAndLaunchDaemon()
mMainSessionGroupHandle.clear();
}
+ else
+ {
+ LL_DEBUGS("Voice") << " gateway running; not attempting to start" << LL_ENDL;
+ }
//---------------------------------------------------------------------
llcoro::suspendUntilTimeout(UPDATE_THROTTLE_SECONDS);
@@ -900,12 +924,15 @@ bool LLVivoxVoiceClient::provisionVoiceAccount()
while (!gAgent.getRegion() || !gAgent.getRegion()->capabilitiesReceived())
{
+ LL_DEBUGS("Voice") << "no capabilities for voice provisioning; waiting " << LL_ENDL;
// *TODO* Pump a message for wake up.
llcoro::suspend();
}
std::string url = gAgent.getRegionCapability("ProvisionVoiceAccountRequest");
+ LL_DEBUGS("Voice") << "region ready for voice provisioning; url=" << url << LL_ENDL;
+
LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID);
LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t
httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("voiceAccountProvision", httpPolicy));
@@ -953,14 +980,23 @@ bool LLVivoxVoiceClient::provisionVoiceAccount()
std::string voiceUserName = result["username"].asString();
std::string voicePassword = result["password"].asString();
- //LL_DEBUGS("Voice") << "ProvisionVoiceAccountRequest response:" << dumpResponse() << LL_ENDL;
-
if (result.has("voice_sip_uri_hostname"))
+ {
voiceSipUriHostname = result["voice_sip_uri_hostname"].asString();
-
+ }
+
// this key is actually misnamed -- it will be an entire URI, not just a hostname.
if (result.has("voice_account_server_name"))
+ {
voiceAccountServerUri = result["voice_account_server_name"].asString();
+ }
+
+ LL_DEBUGS("Voice") << "ProvisionVoiceAccountRequest response"
+ << " user " << (voiceUserName.empty() ? "not set" : "set")
+ << " password " << (voicePassword.empty() ? "not set" : "set")
+ << " sip uri " << voiceSipUriHostname
+ << " account uri " << voiceAccountServerUri
+ << LL_ENDL;
setLoginInfo(voiceUserName, voicePassword, voiceSipUriHostname, voiceAccountServerUri);
@@ -972,8 +1008,11 @@ bool LLVivoxVoiceClient::establishVoiceConnection()
LLEventPump &voiceConnectPump = LLEventPumps::instance().obtain("vivoxClientPump");
if (!mVoiceEnabled && mIsInitialized)
+ {
+ LL_WARNS("Voice") << "cannot establish connection; enabled "<<mVoiceEnabled<<" initialized "<<mIsInitialized<<LL_ENDL;
return false;
-
+ }
+
LLSD result;
bool connected(false);
bool giving_up(false);
@@ -1035,7 +1074,7 @@ bool LLVivoxVoiceClient::establishVoiceConnection()
bool LLVivoxVoiceClient::breakVoiceConnection(bool corowait)
{
- LL_DEBUGS("Voice") << LL_ENDL;
+ LL_DEBUGS("Voice") << "( wait=" << corowait << ")" << LL_ENDL;
LLEventPump &voicePump = LLEventPumps::instance().obtain("vivoxClientPump");
bool retval(true);
@@ -1044,7 +1083,9 @@ bool LLVivoxVoiceClient::breakVoiceConnection(bool corowait)
if (corowait)
{
- LLSD result = llcoro::suspendUntilEventOn(voicePump);
+ LLSD timeoutResult(LLSDMap("connector", "timeout"));
+
+ LLSD result = llcoro::suspendUntilEventOnWithTimeout(voicePump, LOGOUT_ATTEMPT_TIMEOUT, timeoutResult);
LL_DEBUGS("Voice") << "event=" << ll_stream_notation_sd(result) << LL_ENDL;
retval = result.has("connector");
@@ -1073,6 +1114,7 @@ bool LLVivoxVoiceClient::breakVoiceConnection(bool corowait)
#endif
}
+ LL_DEBUGS("Voice") << "closing SLVoice socket" << LL_ENDL;
closeSocket(); // Need to do this now -- bad things happen if the destructor does it later.
cleanUp();
mConnected = false;
@@ -1174,31 +1216,35 @@ bool LLVivoxVoiceClient::loginToVivox()
void LLVivoxVoiceClient::logoutOfVivox(bool wait)
{
+ if (mIsLoggedIn)
+ {
+ // Ensure that we'll re-request provisioning before logging in again
+ mAccountPassword.clear();
+ mVoiceAccountServerURI.clear();
- if (!mIsLoggedIn)
- return;
-
- // Ensure that we'll re-request provisioning before logging in again
- mAccountPassword.clear();
- mVoiceAccountServerURI.clear();
-
- logoutSendMessage();
+ logoutSendMessage();
- if (wait)
- {
- LLEventPump &voicePump = LLEventPumps::instance().obtain("vivoxClientPump");
- LLSD timeoutResult(LLSDMap("lougout", "timeout"));
+ if (wait)
+ {
+ LLEventPump &voicePump = LLEventPumps::instance().obtain("vivoxClientPump");
+ LLSD timeoutResult(LLSDMap("logout", "timeout"));
- LLSD result = llcoro::suspendUntilEventOnWithTimeout(voicePump, LOGIN_ATTEMPT_TIMEOUT, timeoutResult);
+ LL_DEBUGS("Voice")
+ << "waiting for logout response on "
+ << voicePump.getName()
+ << LL_ENDL;
- LL_DEBUGS("Voice") << "event=" << ll_stream_notation_sd(result) << LL_ENDL;
+ LLSD result = llcoro::suspendUntilEventOnWithTimeout(voicePump, LOGOUT_ATTEMPT_TIMEOUT, timeoutResult);
- if (result.has("logout"))
+ LL_DEBUGS("Voice") << "event=" << ll_stream_notation_sd(result) << LL_ENDL;
+ }
+ else
{
+ LL_DEBUGS("Voice") << "not waiting for logout" << LL_ENDL;
}
- }
- mIsLoggedIn = false;
+ mIsLoggedIn = false;
+ }
}
@@ -1269,6 +1315,10 @@ bool LLVivoxVoiceClient::requestParcelVoiceInfo()
// state. If the cap request is still pending,
// the responder will check to see if we've moved
// to a new session and won't change any state.
+ LL_DEBUGS("Voice") << "terminate requested " << mSessionTerminateRequested
+ << " enabled " << mVoiceEnabled
+ << " initialized " << mIsInitialized
+ << LL_ENDL;
terminateAudioSession(true);
return false;
}
@@ -1293,17 +1343,30 @@ bool LLVivoxVoiceClient::requestParcelVoiceInfo()
LLSD voice_credentials = result["voice_credentials"];
if (voice_credentials.has("channel_uri"))
{
+ LL_DEBUGS("Voice") << "got voice channel uri" << LL_ENDL;
uri = voice_credentials["channel_uri"].asString();
}
+ else
+ {
+ LL_WARNS("Voice") << "No voice channel uri" << LL_ENDL;
+ }
+
if (voice_credentials.has("channel_credentials"))
{
+ LL_DEBUGS("Voice") << "got voice channel credentials" << LL_ENDL;
credentials =
voice_credentials["channel_credentials"].asString();
}
- }
+ else
+ {
+ LL_WARNS("Voice") << "No voice channel credentials" << LL_ENDL;
- if (!uri.empty())
- LL_INFOS("Voice") << "Voice URI is " << uri << LL_ENDL;
+ }
+ }
+ else
+ {
+ LL_WARNS("Voice") << "No voice credentials" << LL_ENDL;
+ }
// set the spatial channel. If no voice credentials or uri are
// available, then we simply drop out of voice spatially.
@@ -1366,7 +1429,10 @@ bool LLVivoxVoiceClient::addAndJoinSession(const sessionStatePtr_t &nextSession)
if (!mVoiceEnabled && mIsInitialized)
{
- LL_DEBUGS("Voice") << "Voice no longer enabled. Exiting." << LL_ENDL;
+ LL_DEBUGS("Voice") << "Voice no longer enabled. Exiting"
+ << " enabled " << mVoiceEnabled
+ << " initialized " << mIsInitialized
+ << LL_ENDL;
mIsJoiningSession = false;
// User bailed out during connect -- jump straight to teardown.
terminateAudioSession(true);
@@ -1489,7 +1555,7 @@ bool LLVivoxVoiceClient::terminateAudioSession(bool wait)
if (mAudioSession)
{
- LL_INFOS("Voice") << "Terminating current voice session " << mAudioSession->mHandle << LL_ENDL;
+ LL_INFOS("Voice") << "terminateAudioSession(" << wait << ") Terminating current voice session " << mAudioSession->mHandle << LL_ENDL;
if (mIsLoggedIn)
{
@@ -1519,7 +1585,9 @@ bool LLVivoxVoiceClient::terminateAudioSession(bool wait)
LLSD result;
do
{
- result = llcoro::suspendUntilEventOn(voicePump);
+ LLSD timeoutResult(LLSDMap("session", "timeout"));
+
+ result = llcoro::suspendUntilEventOnWithTimeout(voicePump, LOGOUT_ATTEMPT_TIMEOUT, timeoutResult);
LL_DEBUGS("Voice") << "event=" << ll_stream_notation_sd(result) << LL_ENDL;
if (result.has("session"))
@@ -1534,7 +1602,7 @@ bool LLVivoxVoiceClient::terminateAudioSession(bool wait)
}
std::string message = result["session"].asString();
- if (message == "removed")
+ if (message == "removed" || message == "timeout")
break;
}
} while (true);
@@ -1559,11 +1627,10 @@ bool LLVivoxVoiceClient::terminateAudioSession(bool wait)
// The old session may now need to be deleted.
reapSession(oldSession);
-
}
else
{
- LL_WARNS("Voice") << "stateSessionTerminated with NULL mAudioSession" << LL_ENDL;
+ LL_WARNS("Voice") << "terminateAudioSession(" << wait << ") with NULL mAudioSession" << LL_ENDL;
}
notifyStatusObservers(LLVoiceClientStatusObserver::STATUS_LEFT_CHANNEL);
@@ -1573,13 +1640,15 @@ bool LLVivoxVoiceClient::terminateAudioSession(bool wait)
// the region chat.
mSessionTerminateRequested = false;
- if ((mVoiceEnabled || !mIsInitialized) && !mRelogRequested && !LLApp::isExiting())
- {
- // Just leaving a channel, go back to stateNoChannel (the "logged in but have no channel" state).
- return true;
- }
-
- return false;
+ bool status=((mVoiceEnabled || !mIsInitialized) && !mRelogRequested && !LLApp::isExiting());
+ LL_DEBUGS("Voice") << "exiting"
+ << " VoiceEnabled " << mVoiceEnabled
+ << " IsInitialized " << mIsInitialized
+ << " RelogRequested " << mRelogRequested
+ << " AppExiting " << LLApp::isExiting()
+ << " returning " << status
+ << LL_ENDL;
+ return status;
}
bool LLVivoxVoiceClient::waitForChannel()
@@ -1640,7 +1709,18 @@ bool LLVivoxVoiceClient::waitForChannel()
sessionStatePtr_t joinSession = mNextAudioSession;
mNextAudioSession.reset();
if (!runSession(joinSession))
+ {
+ LL_DEBUGS("Voice") << "runSession returned false; leaving inner loop" << LL_ENDL;
break;
+ }
+ else
+ {
+ LL_DEBUGS("Voice")
+ << "runSession returned true to inner loop"
+ << " RelogRequested=" << mRelogRequested
+ << " VoiceEnabled=" << mVoiceEnabled
+ << LL_ENDL;
+ }
}
if (!mNextAudioSession)
@@ -1649,20 +1729,33 @@ bool LLVivoxVoiceClient::waitForChannel()
}
} while (mVoiceEnabled && !mRelogRequested);
+ LL_DEBUGS("Voice")
+ << "leaving inner waitForChannel loop"
+ << " RelogRequested=" << mRelogRequested
+ << " VoiceEnabled=" << mVoiceEnabled
+ << LL_ENDL;
+
mIsProcessingChannels = false;
logoutOfVivox(true);
if (mRelogRequested)
{
+ LL_DEBUGS("Voice") << "Relog Requested, restarting provisioning" << LL_ENDL;
if (!provisionVoiceAccount())
{
+ LL_WARNS("Voice") << "provisioning voice failed; giving up" << LL_ENDL;
giveUp();
return false;
}
}
- } while (mVoiceEnabled && mRelogRequested);
+ } while (mVoiceEnabled && mRelogRequested && isGatewayRunning());
+ LL_DEBUGS("Voice")
+ << "exiting"
+ << " RelogRequested=" << mRelogRequested
+ << " VoiceEnabled=" << mVoiceEnabled
+ << LL_ENDL;
return true;
}
@@ -1676,6 +1769,7 @@ bool LLVivoxVoiceClient::runSession(const sessionStatePtr_t &session)
if (mSessionTerminateRequested)
{
+ LL_DEBUGS("Voice") << "runSession terminate requested " << LL_ENDL;
terminateAudioSession(true);
}
// if a relog has been requested then addAndJoineSession
@@ -1694,7 +1788,7 @@ bool LLVivoxVoiceClient::runSession(const sessionStatePtr_t &session)
mIsInChannel = true;
mMuteMicDirty = true;
- while (mVoiceEnabled && !mSessionTerminateRequested && !mTuningMode)
+ while (mVoiceEnabled && isGatewayRunning() && !mSessionTerminateRequested && !mTuningMode)
{
sendCaptureAndRenderDevices();
if (mAudioSession && mAudioSession->mParticipantsChanged)
@@ -1744,7 +1838,9 @@ bool LLVivoxVoiceClient::runSession(const sessionStatePtr_t &session)
mIsInitialized = true;
LLSD result = llcoro::suspendUntilEventOnWithTimeout(voicePump, UPDATE_THROTTLE_SECONDS, timeoutEvent);
if (!result.has("timeout")) // logging the timeout event spams the log
+ {
LL_DEBUGS("Voice") << "event=" << ll_stream_notation_sd(result) << LL_ENDL;
+ }
if (result.has("session"))
{
if (result.has("handle"))
@@ -1765,6 +1861,7 @@ bool LLVivoxVoiceClient::runSession(const sessionStatePtr_t &session)
if (message == "removed")
{
+ LL_DEBUGS("Voice") << "session removed" << LL_ENDL;
notifyStatusObservers(LLVoiceClientStatusObserver::STATUS_LEFT_CHANNEL);
break;
}
@@ -1774,15 +1871,16 @@ bool LLVivoxVoiceClient::runSession(const sessionStatePtr_t &session)
std::string message = result["login"];
if (message == "account_logout")
{
+ LL_DEBUGS("Voice") << "logged out" << LL_ENDL;
mIsLoggedIn = false;
mRelogRequested = true;
break;
}
}
-
}
mIsInChannel = false;
+ LL_DEBUGS("Voice") << "terminating at end of runSession" << LL_ENDL;
terminateAudioSession(true);
return true;
@@ -1978,6 +2076,7 @@ bool LLVivoxVoiceClient::performMicTuning()
if (mTuningSpeakerVolumeDirty)
{
+ LL_INFOS("Voice") << "setting tuning speaker level to " << mTuningSpeakerVolume << LL_ENDL;
stream
<< "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Aux.SetSpeakerLevel.1\">"
<< "<Level>" << mTuningSpeakerVolume << "</Level>"
@@ -2335,11 +2434,10 @@ void LLVivoxVoiceClient::clearCaptureDevices()
mCaptureDevices.clear();
}
-void LLVivoxVoiceClient::addCaptureDevice(const std::string& name)
+void LLVivoxVoiceClient::addCaptureDevice(const LLVoiceDevice& device)
{
- LL_DEBUGS("Voice") << name << LL_ENDL;
-
- mCaptureDevices.push_back(name);
+ LL_DEBUGS("Voice") << "display: '" << device.display_name << "' device: '" << device.full_name << "'" << LL_ENDL;
+ mCaptureDevices.push_back(device);
}
LLVoiceDeviceList& LLVivoxVoiceClient::getCaptureDevices()
@@ -2377,10 +2475,10 @@ void LLVivoxVoiceClient::clearRenderDevices()
mRenderDevices.clear();
}
-void LLVivoxVoiceClient::addRenderDevice(const std::string& name)
+void LLVivoxVoiceClient::addRenderDevice(const LLVoiceDevice& device)
{
- LL_DEBUGS("Voice") << name << LL_ENDL;
- mRenderDevices.push_back(name);
+ LL_DEBUGS("Voice") << "display: '" << device.display_name << "' device: '" << device.full_name << "'" << LL_ENDL;
+ mRenderDevices.push_back(device);
}
LLVoiceDeviceList& LLVivoxVoiceClient::getRenderDevices()
@@ -2528,13 +2626,13 @@ bool LLVivoxVoiceClient::deviceSettingsAvailable()
}
bool LLVivoxVoiceClient::deviceSettingsUpdated()
{
+ bool updated = mDevicesListUpdated;
if (mDevicesListUpdated)
{
// a hot swap event or a polling of the audio devices has been parsed since the last redraw of the input and output device panel.
- mDevicesListUpdated = !mDevicesListUpdated; // toggle the setting
- return true;
+ mDevicesListUpdated = false; // toggle the setting
}
- return false;
+ return updated;
}
void LLVivoxVoiceClient::refreshDeviceLists(bool clearCurrentList)
@@ -2553,8 +2651,7 @@ void LLVivoxVoiceClient::daemonDied()
// The daemon died, so the connection is gone. Reset everything and start over.
LL_WARNS("Voice") << "Connection to vivox daemon lost. Resetting state."<< LL_ENDL;
- // Try to relaunch the daemon
- /*TODO:*/
+ //TODO: Try to relaunch the daemon
}
void LLVivoxVoiceClient::giveUp()
@@ -2915,7 +3012,6 @@ void LLVivoxVoiceClient::sendPositionAndVolumeUpdate(void)
}
}
- //sendLocalAudioUpdates(); obsolete, used to send volume setting on position updates
std::string update(stream.str());
if(!update.empty())
{
@@ -2960,7 +3056,6 @@ void LLVivoxVoiceClient::sendLocalAudioUpdates()
{
// Check all of the dirty states and then send messages to those needing to be changed.
// Tuningmode hands its own mute settings.
-
std::ostringstream stream;
if (mMuteMicDirty && !mTuningMode)
@@ -2969,7 +3064,7 @@ void LLVivoxVoiceClient::sendLocalAudioUpdates()
// Send a local mute command.
- LL_DEBUGS("Voice") << "Sending MuteLocalMic command with parameter " << (mMuteMic ? "true" : "false") << LL_ENDL;
+ LL_INFOS("Voice") << "Sending MuteLocalMic command with parameter " << (mMuteMic ? "true" : "false") << LL_ENDL;
stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Connector.MuteLocalMic.1\">"
<< "<ConnectorHandle>" << LLVivoxSecurity::getInstance()->connectorHandle() << "</ConnectorHandle>"
@@ -3231,8 +3326,6 @@ void LLVivoxVoiceClient::sessionConnectResponse(std::string &requestId, int stat
{
LL_DEBUGS("Voice") << "Session.Connect response received (success)" << LL_ENDL;
}
-
- /*TODO: Post response?*/
}
void LLVivoxVoiceClient::logoutResponse(int statusCode, std::string &statusString)
@@ -4037,7 +4130,7 @@ void LLVivoxVoiceClient::sessionNotificationEvent(std::string &sessionHandle, st
void LLVivoxVoiceClient::auxAudioPropertiesEvent(F32 energy)
{
- LL_DEBUGS("Voice") << "got energy " << energy << LL_ENDL;
+ LL_DEBUGS("VoiceEnergy") << "got energy " << energy << LL_ENDL;
mTuningEnergy = energy;
}
@@ -4989,6 +5082,12 @@ void LLVivoxVoiceClient::setMuteMic(bool muted)
void LLVivoxVoiceClient::setVoiceEnabled(bool enabled)
{
+ LL_DEBUGS("Voice")
+ << "( " << (enabled ? "enabled" : "disabled") << " )"
+ << " was "<< (mVoiceEnabled ? "enabled" : "disabled")
+ << " coro "<< (mIsCoroutineActive ? "active" : "inactive")
+ << LL_ENDL;
+
if (enabled != mVoiceEnabled)
{
// TODO: Refactor this so we don't call into LLVoiceChannel, but simply
@@ -4998,6 +5097,7 @@ void LLVivoxVoiceClient::setVoiceEnabled(bool enabled)
if (enabled)
{
+ LL_DEBUGS("Voice") << "enabling" << LL_ENDL;
LLVoiceChannel::getCurrentVoiceChannel()->activate();
status = LLVoiceClientStatusObserver::STATUS_VOICE_ENABLED;
@@ -5006,6 +5106,10 @@ void LLVivoxVoiceClient::setVoiceEnabled(bool enabled)
LLCoros::instance().launch("LLVivoxVoiceClient::voiceControlCoro();",
boost::bind(&LLVivoxVoiceClient::voiceControlCoro, LLVivoxVoiceClient::getInstance()));
}
+ else
+ {
+ LL_DEBUGS("Voice") << "coro should be active.. not launching" << LL_ENDL;
+ }
}
else
{
@@ -5013,8 +5117,13 @@ void LLVivoxVoiceClient::setVoiceEnabled(bool enabled)
LLVoiceChannel::getCurrentVoiceChannel()->deactivate();
status = LLVoiceClientStatusObserver::STATUS_VOICE_DISABLED;
}
- notifyStatusObservers(status);
+
+ notifyStatusObservers(status);
}
+ else
+ {
+ LL_DEBUGS("Voice") << " no-op" << LL_ENDL;
+ }
}
bool LLVivoxVoiceClient::voiceEnabled()
@@ -5718,7 +5827,7 @@ void LLVivoxVoiceClient::deleteSession(const sessionStatePtr_t &session)
void LLVivoxVoiceClient::deleteAllSessions()
{
- LL_DEBUGS("Voice") << "called" << LL_ENDL;
+ LL_DEBUGS("Voice") << LL_ENDL;
while (!mSessionsByHandle.empty())
{
@@ -5769,6 +5878,10 @@ void LLVivoxVoiceClient::removeObserver(LLVoiceClientStatusObserver* observer)
void LLVivoxVoiceClient::notifyStatusObservers(LLVoiceClientStatusObserver::EStatusType status)
{
+ LL_DEBUGS("Voice") << "( " << LLVoiceClientStatusObserver::status2string(status) << " )"
+ << " mAudioSession=" << mAudioSession
+ << LL_ENDL;
+
if(mAudioSession)
{
if(status == LLVoiceClientStatusObserver::ERROR_UNKNOWN)
@@ -5813,8 +5926,8 @@ void LLVivoxVoiceClient::notifyStatusObservers(LLVoiceClientStatusObserver::ESta
LL_DEBUGS("Voice")
<< " " << LLVoiceClientStatusObserver::status2string(status)
<< ", session URI " << getAudioSessionURI()
- << (inSpatialChannel()?", proximal is true":", proximal is false")
- << LL_ENDL;
+ << ", proximal is " << inSpatialChannel()
+ << LL_ENDL;
for (status_observer_set_t::iterator it = mStatusObservers.begin();
it != mStatusObservers.end();
@@ -7022,16 +7135,20 @@ void LLVivoxProtocolParser::EndTag(const char *tag)
else if (!stricmp("Presence", tag))
statusString = string;
else if (!stricmp("CaptureDevices", tag))
+ {
LLVivoxVoiceClient::getInstance()->setDevicesListUpdated(true);
+ }
else if (!stricmp("RenderDevices", tag))
+ {
LLVivoxVoiceClient::getInstance()->setDevicesListUpdated(true);
+ }
else if (!stricmp("CaptureDevice", tag))
{
- LLVivoxVoiceClient::getInstance()->addCaptureDevice(deviceString);
+ LLVivoxVoiceClient::getInstance()->addCaptureDevice(LLVoiceDevice(displayNameString, deviceString));
}
else if (!stricmp("RenderDevice", tag))
{
- LLVivoxVoiceClient::getInstance()->addRenderDevice(deviceString);
+ LLVivoxVoiceClient::getInstance()->addRenderDevice(LLVoiceDevice(displayNameString, deviceString));
}
else if (!stricmp("BlockMask", tag))
blockMask = string;
@@ -7153,12 +7270,12 @@ void LLVivoxProtocolParser::processResponse(std::string tag)
if (isEvent)
{
const char *eventTypeCstr = eventTypeString.c_str();
- LL_DEBUGS("LOW Voice") << eventTypeCstr << LL_ENDL;
+ LL_DEBUGS("LowVoice") << eventTypeCstr << LL_ENDL;
if (!stricmp(eventTypeCstr, "ParticipantUpdatedEvent"))
{
// These happen so often that logging them is pretty useless.
- LL_DEBUGS("LOW Voice") << "Updated Params: " << sessionHandle << ", " << sessionGroupHandle << ", " << uriString << ", " << alias << ", " << isModeratorMuted << ", " << isSpeaking << ", " << volume << ", " << energy << LL_ENDL;
+ LL_DEBUGS("LowVoice") << "Updated Params: " << sessionHandle << ", " << sessionGroupHandle << ", " << uriString << ", " << alias << ", " << isModeratorMuted << ", " << isSpeaking << ", " << volume << ", " << energy << LL_ENDL;
LLVivoxVoiceClient::getInstance()->participantUpdatedEvent(sessionHandle, sessionGroupHandle, uriString, alias, isModeratorMuted, isSpeaking, volume, energy);
}
else if (!stricmp(eventTypeCstr, "AccountLoginStateChangeEvent"))
@@ -7227,7 +7344,7 @@ void LLVivoxProtocolParser::processResponse(std::string tag)
<ParticipantType>0</ParticipantType>
</Event>
*/
- LL_DEBUGS("LOW Voice") << "Added Params: " << sessionHandle << ", " << sessionGroupHandle << ", " << uriString << ", " << alias << ", " << nameString << ", " << displayNameString << ", " << participantType << LL_ENDL;
+ LL_DEBUGS("LowVoice") << "Added Params: " << sessionHandle << ", " << sessionGroupHandle << ", " << uriString << ", " << alias << ", " << nameString << ", " << displayNameString << ", " << participantType << LL_ENDL;
LLVivoxVoiceClient::getInstance()->participantAddedEvent(sessionHandle, sessionGroupHandle, uriString, alias, nameString, displayNameString, participantType);
}
else if (!stricmp(eventTypeCstr, "ParticipantRemovedEvent"))
@@ -7240,7 +7357,7 @@ void LLVivoxProtocolParser::processResponse(std::string tag)
<AccountName>xtx7YNV-3SGiG7rA1fo5Ndw==</AccountName>
</Event>
*/
- LL_DEBUGS("LOW Voice") << "Removed params:" << sessionHandle << ", " << sessionGroupHandle << ", " << uriString << ", " << alias << ", " << nameString << LL_ENDL;
+ LL_DEBUGS("LowVoice") << "Removed params:" << sessionHandle << ", " << sessionGroupHandle << ", " << uriString << ", " << alias << ", " << nameString << LL_ENDL;
LLVivoxVoiceClient::getInstance()->participantRemovedEvent(sessionHandle, sessionGroupHandle, uriString, alias, nameString);
}
@@ -7307,7 +7424,7 @@ void LLVivoxProtocolParser::processResponse(std::string tag)
else
{
const char *actionCstr = actionString.c_str();
- LL_DEBUGS("LOW Voice") << actionCstr << LL_ENDL;
+ LL_DEBUGS("LowVoice") << actionCstr << LL_ENDL;
if (!stricmp(actionCstr, "Session.Set3DPosition.1"))
{
diff --git a/indra/newview/llvoicevivox.h b/indra/newview/llvoicevivox.h
index 9d4af85c8c..50862cea1e 100644
--- a/indra/newview/llvoicevivox.h
+++ b/indra/newview/llvoicevivox.h
@@ -432,10 +432,10 @@ protected:
//----------------------------------
// devices
void clearCaptureDevices();
- void addCaptureDevice(const std::string& name);
+ void addCaptureDevice(const LLVoiceDevice& device);
void clearRenderDevices();
void setDevicesListUpdated(bool state);
- void addRenderDevice(const std::string& name);
+ void addRenderDevice(const LLVoiceDevice& device);
void buildSetAudioDevices(std::ostringstream &stream);
void getCaptureDevicesSendMessage();
diff --git a/indra/newview/llworldmap.cpp b/indra/newview/llworldmap.cpp
index 837b30586b..cbb6e85b96 100644
--- a/indra/newview/llworldmap.cpp
+++ b/indra/newview/llworldmap.cpp
@@ -172,7 +172,7 @@ void LLSimInfo::dump() const
U32 x_pos, y_pos;
from_region_handle(mHandle, &x_pos, &y_pos);
- LL_INFOS("World Map") << x_pos << "," << y_pos
+ LL_INFOS("WorldMap") << x_pos << "," << y_pos
<< " " << mName
<< " " << (S32)mAccess
<< " " << std::hex << mRegionFlags << std::dec
@@ -229,7 +229,7 @@ LLWorldMap::LLWorldMap() :
mTrackingLocation( 0, 0, 0 ),
mFirstRequest(true)
{
- //LL_INFOS("World Map") << "Creating the World Map -> LLWorldMap::LLWorldMap()" << LL_ENDL;
+ //LL_INFOS("WorldMap") << "Creating the World Map -> LLWorldMap::LLWorldMap()" << LL_ENDL;
mMapBlockLoaded = new bool[MAP_BLOCK_RES*MAP_BLOCK_RES];
clearSimFlags();
}
@@ -237,7 +237,7 @@ LLWorldMap::LLWorldMap() :
LLWorldMap::~LLWorldMap()
{
- //LL_INFOS("World Map") << "Destroying the World Map -> LLWorldMap::~LLWorldMap()" << LL_ENDL;
+ //LL_INFOS("WorldMap") << "Destroying the World Map -> LLWorldMap::~LLWorldMap()" << LL_ENDL;
reset();
delete[] mMapBlockLoaded;
}
@@ -375,7 +375,7 @@ bool LLWorldMap::simNameFromPosGlobal(const LLVector3d& pos_global, std::string
void LLWorldMap::reloadItems(bool force)
{
- //LL_INFOS("World Map") << "LLWorldMap::reloadItems()" << LL_ENDL;
+ //LL_INFOS("WorldMap") << "LLWorldMap::reloadItems()" << LL_ENDL;
if (clearItems(force))
{
LLWorldMapMessage::getInstance()->sendItemRequest(MAP_ITEM_TELEHUB);
@@ -407,7 +407,7 @@ bool LLWorldMap::insertRegion(U32 x_world, U32 y_world, std::string& name, LLUUI
else
{
U64 handle = to_region_handle(x_world, y_world);
- //LL_INFOS("World Map") << "Map sim : " << name << ", ID : " << image_id.getString() << LL_ENDL;
+ //LL_INFOS("WorldMap") << "Map sim : " << name << ", ID : " << image_id.getString() << LL_ENDL;
// Insert the region in the region map of the world map
// Loading the LLSimInfo object with what we got and insert it in the map
LLSimInfo* siminfo = LLWorldMap::getInstance()->simInfoFromHandle(handle);
@@ -459,7 +459,7 @@ bool LLWorldMap::insertItem(U32 x_world, U32 y_world, std::string& name, LLUUID&
siminfo = LLWorldMap::getInstance()->createSimInfoFromHandle(handle);
}
- //LL_INFOS("World Map") << "Process item : type = " << type << LL_ENDL;
+ //LL_INFOS("WorldMap") << "Process item : type = " << type << LL_ENDL;
switch (type)
{
case MAP_ITEM_TELEHUB: // telehubs
@@ -553,7 +553,7 @@ bool LLWorldMap::insertItem(U32 x_world, U32 y_world, std::string& name, LLUUID&
}
case MAP_ITEM_AGENT_LOCATIONS: // agent locations
{
-// LL_INFOS("World Map") << "New Location " << new_item.mName << LL_ENDL;
+// LL_INFOS("WorldMap") << "New Location " << new_item.mName << LL_ENDL;
if (extra > 0)
{
new_item.setCount(extra);
@@ -604,7 +604,7 @@ void LLWorldMap::updateRegions(S32 x0, S32 y0, S32 x1, S32 y1)
S32 offset = block_x | (block_y * MAP_BLOCK_RES);
if (!mMapBlockLoaded[offset])
{
- //LL_INFOS("World Map") << "Loading Block (" << block_x << "," << block_y << ")" << LL_ENDL;
+ //LL_INFOS("WorldMap") << "Loading Block (" << block_x << "," << block_y << ")" << LL_ENDL;
LLWorldMapMessage::getInstance()->sendMapBlockRequest(block_x * MAP_BLOCK_SIZE, block_y * MAP_BLOCK_SIZE, (block_x * MAP_BLOCK_SIZE) + MAP_BLOCK_SIZE - 1, (block_y * MAP_BLOCK_SIZE) + MAP_BLOCK_SIZE - 1);
mMapBlockLoaded[offset] = true;
}
@@ -614,7 +614,7 @@ void LLWorldMap::updateRegions(S32 x0, S32 y0, S32 x1, S32 y1)
void LLWorldMap::dump()
{
- LL_INFOS("World Map") << "LLWorldMap::dump()" << LL_ENDL;
+ LL_INFOS("WorldMap") << "LLWorldMap::dump()" << LL_ENDL;
for (sim_info_map_t::iterator it = mSimInfoMap.begin(); it != mSimInfoMap.end(); ++it)
{
LLSimInfo* info = it->second;
diff --git a/indra/newview/llworldmapmessage.cpp b/indra/newview/llworldmapmessage.cpp
index 865292fa90..8be340de4c 100644
--- a/indra/newview/llworldmapmessage.cpp
+++ b/indra/newview/llworldmapmessage.cpp
@@ -54,7 +54,7 @@ LLWorldMapMessage::~LLWorldMapMessage()
void LLWorldMapMessage::sendItemRequest(U32 type, U64 handle)
{
- //LL_INFOS("World Map") << "Send item request : type = " << type << LL_ENDL;
+ //LL_INFOS("WorldMap") << "Send item request : type = " << type << LL_ENDL;
LLMessageSystem* msg = gMessageSystem;
msg->newMessageFast(_PREHASH_MapItemRequest);
@@ -74,7 +74,7 @@ void LLWorldMapMessage::sendItemRequest(U32 type, U64 handle)
void LLWorldMapMessage::sendNamedRegionRequest(std::string region_name)
{
- //LL_INFOS("World Map") << "LLWorldMap::sendNamedRegionRequest()" << LL_ENDL;
+ //LL_INFOS("WorldMap") << LL_ENDL;
LLMessageSystem* msg = gMessageSystem;
// Request for region data
@@ -95,7 +95,7 @@ void LLWorldMapMessage::sendNamedRegionRequest(std::string region_name,
const std::string& callback_url,
bool teleport) // immediately teleport when result returned
{
- //LL_INFOS("World Map") << "LLWorldMap::sendNamedRegionRequest()" << LL_ENDL;
+ //LL_INFOS("WorldMap") << LL_ENDL;
mSLURLRegionName = region_name;
mSLURLRegionHandle = 0;
mSLURL = callback_url;
@@ -110,7 +110,7 @@ void LLWorldMapMessage::sendHandleRegionRequest(U64 region_handle,
const std::string& callback_url,
bool teleport) // immediately teleport when result returned
{
- //LL_INFOS("World Map") << "LLWorldMap::sendHandleRegionRequest()" << LL_ENDL;
+ //LL_INFOS("WorldMap") << LL_ENDL;
mSLURLRegionName.clear();
mSLURLRegionHandle = region_handle;
mSLURL = callback_url;
@@ -128,7 +128,7 @@ void LLWorldMapMessage::sendHandleRegionRequest(U64 region_handle,
void LLWorldMapMessage::sendMapBlockRequest(U16 min_x, U16 min_y, U16 max_x, U16 max_y, bool return_nonexistent)
{
- //LL_INFOS("World Map") << "LLWorldMap::sendMapBlockRequest()" << ", min = (" << min_x << ", " << min_y << "), max = (" << max_x << ", " << max_y << "), nonexistent = " << return_nonexistent << LL_ENDL;
+ //LL_INFOS("WorldMap" << " min = (" << min_x << ", " << min_y << "), max = (" << max_x << ", " << max_y << ", nonexistent = " << return_nonexistent << LL_ENDL;
LLMessageSystem* msg = gMessageSystem;
msg->newMessageFast(_PREHASH_MapBlockRequest);
msg->nextBlockFast(_PREHASH_AgentData);
@@ -161,7 +161,7 @@ void LLWorldMapMessage::processMapBlockReply(LLMessageSystem* msg, void**)
}
S32 num_blocks = msg->getNumberOfBlocksFast(_PREHASH_Data);
- //LL_INFOS("World Map") << "LLWorldMap::processMapBlockReply(), num_blocks = " << num_blocks << LL_ENDL;
+ //LL_INFOS("WorldMap") << "num_blocks = " << num_blocks << LL_ENDL;
bool found_null_sim = false;
@@ -233,7 +233,7 @@ void LLWorldMapMessage::processMapBlockReply(LLMessageSystem* msg, void**)
// public static
void LLWorldMapMessage::processMapItemReply(LLMessageSystem* msg, void**)
{
- //LL_INFOS("World Map") << "LLWorldMap::processMapItemReply()" << LL_ENDL;
+ //LL_INFOS("WorldMap") << LL_ENDL;
U32 type;
msg->getU32Fast(_PREHASH_RequestData, _PREHASH_ItemType, type);
diff --git a/indra/newview/llworldmapview.cpp b/indra/newview/llworldmapview.cpp
index 9ae788a409..707fe76cef 100644
--- a/indra/newview/llworldmapview.cpp
+++ b/indra/newview/llworldmapview.cpp
@@ -177,7 +177,7 @@ LLWorldMapView::LLWorldMapView()
mMouseDownY( 0 ),
mSelectIDStart(0)
{
- //LL_INFOS("World Map") << "Creating the Map -> LLWorldMapView::LLWorldMapView()" << LL_ENDL;
+ //LL_INFOS("WorldMap") << "Creating the Map -> LLWorldMapView::LLWorldMapView()" << LL_ENDL;
clearLastClick();
}
@@ -217,7 +217,7 @@ BOOL LLWorldMapView::postBuild()
LLWorldMapView::~LLWorldMapView()
{
- //LL_INFOS("World Map") << "Destroying the map -> LLWorldMapView::~LLWorldMapView()" << LL_ENDL;
+ //LL_INFOS("WorldMap") << "Destroying the map -> LLWorldMapView::~LLWorldMapView()" << LL_ENDL;
cleanupTextures();
}
@@ -616,7 +616,7 @@ void LLWorldMapView::drawMipmap(S32 width, S32 height)
}
else
{
- //LL_INFOS("World Map") << "Render complete, don't draw background..." << LL_ENDL;
+ //LL_INFOS("WorldMap") << "Render complete, don't draw background..." << LL_ENDL;
}
// Render the current level
@@ -705,7 +705,7 @@ bool LLWorldMapView::drawMipmapLevel(S32 width, S32 height, S32 level, bool load
//else
//{
// Waiting for a tile -> the level is not complete
- // LL_INFOS("World Map") << "Unfetched tile. level = " << level << LL_ENDL;
+ // LL_INFOS("WorldMap") << "Unfetched tile. level = " << level << LL_ENDL;
//}
}
else
@@ -1668,7 +1668,7 @@ void LLWorldMapView::updateVisibleBlocks()
S32 world_bottom = world_center_y - S32(half_height / sMapScale) - 1;
S32 world_top = world_center_y + S32(half_height / sMapScale) + 1;
- //LL_INFOS("World Map") << "LLWorldMapView::updateVisibleBlocks() : sMapScale = " << sMapScale << ", left = " << world_left << ", right = " << world_right << ", bottom = " << world_bottom << ", top = " << world_top << LL_ENDL;
+ //LL_INFOS("WorldMap") << "LLWorldMapView::updateVisibleBlocks() : sMapScale = " << sMapScale << ", left = " << world_left << ", right = " << world_right << ", bottom = " << world_bottom << ", top = " << world_top << LL_ENDL;
LLWorldMap::getInstance()->updateRegions(world_left, world_bottom, world_right, world_top);
}
diff --git a/indra/newview/llworldmipmap.cpp b/indra/newview/llworldmipmap.cpp
index 895ccaef5a..a2e519a61a 100644
--- a/indra/newview/llworldmipmap.cpp
+++ b/indra/newview/llworldmipmap.cpp
@@ -100,7 +100,7 @@ void LLWorldMipmap::equalizeBoostLevels()
}
}
#if DEBUG_TILES_STAT
- LL_INFOS("World Map") << "LLWorldMipmap tile stats : total requested = " << nb_tiles << ", visible = " << nb_visible << ", missing = " << nb_missing << LL_ENDL;
+ LL_INFOS("WorldMap") << "LLWorldMipmap tile stats : total requested = " << nb_tiles << ", visible = " << nb_visible << ", missing = " << nb_missing << LL_ENDL;
#endif // DEBUG_TILES_STAT
}
@@ -187,7 +187,7 @@ LLPointer<LLViewerFetchedTexture> LLWorldMipmap::loadObjectsTile(U32 grid_x, U32
// Use a local jpeg for every tile to test map speed without S3 access
//imageurl = "file://C:\\Develop\\mapserver-distribute-3\\indra\\build-vc80\\mapserver\\relwithdebinfo\\regions\\00995\\01001\\region-995-1001-prims.jpg";
// END DEBUG
- //LL_INFOS("World Map") << "LLWorldMipmap::loadObjectsTile(), URL = " << imageurl << LL_ENDL;
+ //LL_INFOS("WorldMap") << "LLWorldMipmap::loadObjectsTile(), URL = " << imageurl << LL_ENDL;
LLPointer<LLViewerFetchedTexture> img = LLViewerTextureManager::getFetchedTextureFromUrl(imageurl, FTT_MAP_TILE, TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE);
img->setBoostLevel(LLGLTexture::BOOST_MAP);
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index e541c1054e..e81515d52f 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -8666,7 +8666,8 @@ void LLPipeline::renderDeferredLighting()
}
const LLViewerObject *vobj = drawablep->getVObj();
- if(vobj && vobj->getAvatar() && vobj->getAvatar()->isInMuteList())
+ if(vobj && vobj->getAvatar()
+ && (vobj->getAvatar()->isTooComplex() || vobj->getAvatar()->isInMuteList()))
{
continue;
}
diff --git a/indra/newview/skins/default/xui/en/menu_people_nearby_view.xml b/indra/newview/skins/default/xui/en/menu_people_nearby_view.xml
index a9f6b8045d..0f7c6a2aa5 100644
--- a/indra/newview/skins/default/xui/en/menu_people_nearby_view.xml
+++ b/indra/newview/skins/default/xui/en/menu_people_nearby_view.xml
@@ -33,6 +33,16 @@
function="People.Nearby.ViewSort.CheckItem"
parameter="sort_distance"/>
</menu_item_check>
+ <menu_item_check
+ label="Sort by Recent arrival"
+ name="sort_arrival">
+ <menu_item_check.on_click
+ function="People.Nearby.ViewSort.Action"
+ parameter="sort_arrival"/>
+ <menu_item_check.on_check
+ function="People.Nearby.ViewSort.CheckItem"
+ parameter="sort_arrival"/>
+ </menu_item_check>
<menu_item_separator layout="topleft" />
<menu_item_check name="view_icons" label="View People Icons">
<menu_item_check.on_click
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index 6b164c660a..9eaa5330c3 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -8277,6 +8277,13 @@ Failed to save snapshot to [PATH]: Directory does not exist.
type="notifytip">
Error saving preset [NAME].
</notification>
+
+ <notification
+ icon="notifytip.tga"
+ name="DefaultPresetNotSaved"
+ type="notifytip">
+Can not overwrite default preset.
+ </notification>
<notification
icon="notifytip.tga"
diff --git a/indra/newview/tests/llviewernetwork_test.cpp b/indra/newview/tests/llviewernetwork_test.cpp
index d1dddf8e7e..bb28abead3 100644
--- a/indra/newview/tests/llviewernetwork_test.cpp
+++ b/indra/newview/tests/llviewernetwork_test.cpp
@@ -258,7 +258,7 @@ namespace tut
std::string("https://login.aditi.lindenlab.com/cgi-bin/login.cgi"));
ensure_equals("Aditi helper uri",
LLGridManager::getInstance()->getHelperURI("util.aditi.lindenlab.com"),
- std::string("http://aditi-secondlife.webdev.lindenlab.com/helpers/"));
+ std::string("https://secondlife.aditi.lindenlab.com/helpers/"));
ensure_equals("Aditi login page",
LLGridManager::getInstance()->getLoginPage("util.aditi.lindenlab.com"),
std::string("https://viewer-splash.secondlife.com/"));
@@ -330,7 +330,7 @@ namespace tut
std::string("https://login.aditi.lindenlab.com/cgi-bin/login.cgi"));
ensure_equals("Aditi helper uri",
LLGridManager::getInstance()->getHelperURI("util.aditi.lindenlab.com"),
- std::string("http://aditi-secondlife.webdev.lindenlab.com/helpers/"));
+ std::string("https://secondlife.aditi.lindenlab.com/helpers/"));
ensure_equals("Aditi login page",
LLGridManager::getInstance()->getLoginPage("util.aditi.lindenlab.com"),
std::string("https://viewer-splash.secondlife.com/"));