summaryrefslogtreecommitdiff
path: root/indra
diff options
context:
space:
mode:
Diffstat (limited to 'indra')
-rwxr-xr-xindra/lib/python/indra/util/llmanifest.py82
-rw-r--r--indra/llcharacter/llmotioncontroller.cpp9
-rw-r--r--indra/llcharacter/llmotioncontroller.h2
-rw-r--r--indra/llcommon/llapp.cpp72
-rw-r--r--indra/llcommon/llapp.h16
-rw-r--r--indra/llcommon/llevents.cpp7
-rw-r--r--indra/llcommon/llinitparam.cpp7
-rw-r--r--indra/llcommon/llmetricperformancetester.cpp14
-rw-r--r--indra/llcommon/llmetricperformancetester.h10
-rw-r--r--indra/llcommon/llsys.h5
-rw-r--r--indra/llcorehttp/_httpinternal.h5
-rw-r--r--indra/llcorehttp/_httpoprequest.cpp5
-rw-r--r--indra/llcorehttp/_httpoprequest.h2
-rw-r--r--indra/llcorehttp/_httppolicy.cpp16
-rw-r--r--indra/llcorehttp/httpoptions.cpp12
-rw-r--r--indra/llcorehttp/httpoptions.h22
-rw-r--r--indra/llcrashlogger/llcrashlock.cpp14
-rw-r--r--indra/llcrashlogger/llcrashlogger.cpp14
-rw-r--r--indra/llimage/llimage.cpp60
-rw-r--r--indra/llimage/llimage.h3
-rw-r--r--indra/llmath/llvolume.cpp14
-rw-r--r--indra/llrender/llgl.cpp2
-rw-r--r--indra/llrender/llgl.h2
-rw-r--r--indra/llui/llfolderviewmodel.h4
-rw-r--r--indra/llui/llscrollcontainer.cpp50
-rw-r--r--indra/llui/llscrollcontainer.h6
-rw-r--r--indra/llui/llxuiparser.cpp36
-rw-r--r--indra/llvfs/lldir.cpp16
-rw-r--r--indra/media_plugins/cef/media_plugin_cef.cpp1
-rw-r--r--indra/newview/app_settings/settings.xml19
-rw-r--r--indra/newview/installers/windows/installer_template.nsi7
-rw-r--r--indra/newview/llappearancemgr.cpp33
-rw-r--r--indra/newview/llappearancemgr.h3
-rw-r--r--indra/newview/llappviewer.cpp167
-rw-r--r--indra/newview/llappviewer.h10
-rw-r--r--indra/newview/llappviewerwin32.cpp4
-rw-r--r--indra/newview/llconversationmodel.h3
-rw-r--r--indra/newview/llestateinfomodel.cpp2
-rw-r--r--indra/newview/llfasttimerview.cpp10
-rw-r--r--indra/newview/llfeaturemanager.cpp4
-rw-r--r--indra/newview/llflexibleobject.cpp77
-rw-r--r--indra/newview/llflexibleobject.h4
-rw-r--r--indra/newview/llfloateravatarpicker.cpp19
-rw-r--r--indra/newview/llfloateravatarrendersettings.cpp7
-rw-r--r--indra/newview/llfloaterland.cpp13
-rw-r--r--indra/newview/llfloatermodeluploadbase.cpp2
-rw-r--r--indra/newview/llfloaterregiondebugconsole.cpp8
-rw-r--r--indra/newview/llfloaterregioninfo.cpp6
-rw-r--r--indra/newview/llfloaterreporter.cpp4
-rw-r--r--indra/newview/llfloaterscriptlimits.cpp35
-rw-r--r--indra/newview/llfloatersidepanelcontainer.cpp5
-rw-r--r--indra/newview/llfloatersnapshot.cpp4
-rw-r--r--indra/newview/llfolderviewmodelinventory.cpp9
-rw-r--r--indra/newview/llimview.cpp3
-rw-r--r--indra/newview/llinventorybridge.cpp80
-rw-r--r--indra/newview/llinventorybridge.h4
-rw-r--r--indra/newview/llinventoryfilter.cpp86
-rw-r--r--indra/newview/llinventoryfilter.h28
-rw-r--r--indra/newview/llinventoryfunctions.cpp11
-rw-r--r--indra/newview/llinventorypanel.cpp24
-rw-r--r--indra/newview/llinventorypanel.h5
-rw-r--r--indra/newview/lllogininstance.cpp22
-rw-r--r--indra/newview/llmachineid.cpp35
-rw-r--r--indra/newview/llmediactrl.h2
-rw-r--r--indra/newview/llmeshrepository.cpp6
-rw-r--r--indra/newview/lloutfitgallery.cpp76
-rw-r--r--indra/newview/lloutfitgallery.h3
-rw-r--r--indra/newview/llpanellogin.cpp2
-rw-r--r--indra/newview/llpanelmaininventory.cpp142
-rw-r--r--indra/newview/llpanelmaininventory.h7
-rw-r--r--indra/newview/llpanelobject.cpp2
-rw-r--r--indra/newview/llpanelobjectinventory.cpp5
-rw-r--r--indra/newview/llpanelsnapshotpostcard.cpp2
-rw-r--r--indra/newview/llpanelwearing.cpp2
-rw-r--r--indra/newview/llpreview.cpp3
-rw-r--r--indra/newview/llpreview.h3
-rw-r--r--indra/newview/llpreviewanim.cpp6
-rw-r--r--indra/newview/llpreviewgesture.cpp11
-rw-r--r--indra/newview/llpreviewnotecard.cpp10
-rw-r--r--indra/newview/llpreviewscript.cpp26
-rw-r--r--indra/newview/llpreviewscript.h2
-rw-r--r--indra/newview/llproductinforequest.cpp2
-rw-r--r--indra/newview/llscenemonitor.cpp2
-rw-r--r--indra/newview/llsidepanelinventory.cpp13
-rw-r--r--indra/newview/llsidepanelinventory.h1
-rw-r--r--indra/newview/llspeakers.cpp6
-rw-r--r--indra/newview/llstartup.cpp5
-rw-r--r--indra/newview/lltexturecache.cpp43
-rw-r--r--indra/newview/lltexturecache.h8
-rw-r--r--indra/newview/lltexturefetch.cpp2
-rw-r--r--indra/newview/lltextureinfo.cpp121
-rw-r--r--indra/newview/lltextureinfo.h7
-rw-r--r--indra/newview/lltexturestats.cpp3
-rw-r--r--indra/newview/lltoolpie.cpp3
-rw-r--r--indra/newview/llviewerinventory.cpp95
-rw-r--r--indra/newview/llviewermenu.cpp3
-rw-r--r--indra/newview/llviewermenufile.cpp2
-rw-r--r--indra/newview/llviewermessage.cpp24
-rw-r--r--indra/newview/llviewerobject.cpp19
-rw-r--r--indra/newview/llviewerobject.h2
-rw-r--r--indra/newview/llviewerobjectlist.cpp7
-rw-r--r--indra/newview/llviewerparcelmedia.cpp2
-rw-r--r--indra/newview/llviewerregion.cpp6
-rw-r--r--indra/newview/llviewerregion.h6
-rw-r--r--indra/newview/llviewerstats.cpp5
-rw-r--r--indra/newview/llviewertexture.cpp8
-rw-r--r--indra/newview/llviewertexture.h2
-rw-r--r--indra/newview/llviewerwindow.cpp5
-rw-r--r--indra/newview/llvoavatar.cpp64
-rw-r--r--indra/newview/llvoavatarself.cpp2
-rw-r--r--indra/newview/llvocache.cpp12
-rw-r--r--indra/newview/llvocache.h6
-rw-r--r--indra/newview/llvoicevivox.cpp24
-rw-r--r--indra/newview/llvoicevivox.h1
-rw-r--r--indra/newview/llweb.cpp18
-rw-r--r--indra/newview/llwlhandlers.cpp4
-rw-r--r--indra/newview/llxmlrpclistener.cpp2
-rw-r--r--indra/newview/llxmlrpctransaction.cpp26
-rw-r--r--indra/newview/llxmlrpctransaction.h2
-rw-r--r--indra/newview/skins/default/xui/de/menu_viewer.xml1
-rw-r--r--indra/newview/skins/default/xui/de/panel_preferences_advanced.xml2
-rw-r--r--indra/newview/skins/default/xui/en/floater_avatar_picker.xml4
-rw-r--r--indra/newview/skins/default/xui/en/floater_grid_status.xml1
-rw-r--r--indra/newview/skins/default/xui/en/floater_inventory_view_finder.xml37
-rw-r--r--indra/newview/skins/default/xui/en/floater_web_content.xml1
-rw-r--r--indra/newview/skins/default/xui/en/menu_inventory.xml8
-rw-r--r--indra/newview/skins/default/xui/en/notifications.xml22
-rw-r--r--indra/newview/skins/default/xui/en/panel_active_object_row.xml20
-rw-r--r--indra/newview/skins/default/xui/en/panel_main_inventory.xml42
-rw-r--r--indra/newview/skins/default/xui/en/panel_media_settings_general.xml4
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_advanced.xml6
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_chat.xml3
-rw-r--r--indra/newview/skins/default/xui/es/menu_viewer.xml1
-rw-r--r--indra/newview/skins/default/xui/es/panel_preferences_advanced.xml2
-rw-r--r--indra/newview/skins/default/xui/es/strings.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/menu_viewer.xml1
-rw-r--r--indra/newview/skins/default/xui/fr/panel_preferences_advanced.xml2
-rw-r--r--indra/newview/skins/default/xui/it/menu_viewer.xml1
-rw-r--r--indra/newview/skins/default/xui/it/panel_preferences_advanced.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/menu_viewer.xml1
-rw-r--r--indra/newview/skins/default/xui/ja/panel_preferences_advanced.xml2
-rw-r--r--indra/newview/skins/default/xui/pl/panel_preferences_advanced.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/menu_viewer.xml1
-rw-r--r--indra/newview/skins/default/xui/pt/panel_preferences_advanced.xml2
-rw-r--r--indra/newview/skins/default/xui/ru/menu_viewer.xml1
-rw-r--r--indra/newview/skins/default/xui/ru/panel_preferences_advanced.xml2
-rw-r--r--indra/newview/skins/default/xui/tr/menu_viewer.xml1
-rw-r--r--indra/newview/skins/default/xui/tr/panel_preferences_advanced.xml2
-rw-r--r--indra/newview/skins/default/xui/zh/menu_viewer.xml1
-rw-r--r--indra/newview/skins/default/xui/zh/panel_preferences_advanced.xml2
-rwxr-xr-xindra/newview/viewer_manifest.py293
-rw-r--r--indra/test/test.cpp8
-rw-r--r--indra/win_crash_logger/llcrashloggerwindows.cpp2
-rw-r--r--indra/win_crash_logger/win_crash_logger.cpp11
154 files changed, 1896 insertions, 731 deletions
diff --git a/indra/lib/python/indra/util/llmanifest.py b/indra/lib/python/indra/util/llmanifest.py
index d4e61aedd1..7050ce43b7 100755
--- a/indra/lib/python/indra/util/llmanifest.py
+++ b/indra/lib/python/indra/util/llmanifest.py
@@ -376,12 +376,30 @@ class LLManifest(object):
self.excludes.append(glob)
def prefix(self, src='', build=None, dst=None):
- """ Pushes a prefix onto the stack. Until end_prefix is
- called, all relevant method calls (esp. to path()) will prefix
- paths with the entire prefix stack. Source and destination
- prefixes can be different, though if only one is provided they
- are both equal. To specify a no-op, use an empty string, not
- None."""
+ """
+ Usage:
+
+ with self.prefix(...args as described...):
+ self.path(...)
+
+ For the duration of the 'with' block, pushes a prefix onto the stack.
+ Within that block, all relevant method calls (esp. to path()) will
+ prefix paths with the entire prefix stack. Source and destination
+ prefixes can be different, though if only one is provided they are
+ both equal. To specify a no-op, use an empty string, not None.
+
+ Also supports the older (pre-Python-2.5) syntax:
+
+ if self.prefix(...args as described...):
+ self.path(...)
+ self.end_prefix(...)
+
+ Before the arrival of the 'with' statement, one was required to code
+ self.prefix() and self.end_prefix() in matching pairs to push and to
+ pop the prefix stacks, respectively. The older prefix() method
+ returned True specifically so that the caller could indent the
+ relevant block of code with 'if', just for aesthetic purposes.
+ """
if dst is None:
dst = src
if build is None:
@@ -390,7 +408,57 @@ class LLManifest(object):
self.artwork_prefix.append(src)
self.build_prefix.append(build)
self.dst_prefix.append(dst)
- return True # so that you can wrap it in an if to get indentation
+
+ # The above code is unchanged from the original implementation. What's
+ # new is the return value. We're going to return an instance of
+ # PrefixManager that binds this LLManifest instance and Does The Right
+ # Thing on exit.
+ return self.PrefixManager(self)
+
+ class PrefixManager(object):
+ def __init__(self, manifest):
+ self.manifest = manifest
+ # stack attributes we manage in this LLManifest (sub)class
+ # instance
+ stacks = ("src_prefix", "artwork_prefix", "build_prefix", "dst_prefix")
+ # If the caller wrote:
+ # with self.prefix(...):
+ # as intended, then bind the state of each prefix stack as it was
+ # just BEFORE the call to prefix(). Since prefix() appended an
+ # entry to each prefix stack, capture len()-1.
+ self.prevlen = { stack: len(getattr(self.manifest, stack)) - 1
+ for stack in stacks }
+
+ def __nonzero__(self):
+ # If the caller wrote:
+ # if self.prefix(...):
+ # then a value of this class had better evaluate as 'True'.
+ return True
+
+ def __enter__(self):
+ # nobody uses 'with self.prefix(...) as variable:'
+ return None
+
+ def __exit__(self, type, value, traceback):
+ # First, if the 'with' block raised an exception, just propagate.
+ # Do NOT swallow it.
+ if type is not None:
+ return False
+
+ # Okay, 'with' block completed successfully. Restore previous
+ # state of each of the prefix stacks in self.stacks.
+ # Note that we do NOT simply call pop() on them as end_prefix()
+ # does. This is to cope with the possibility that the coder
+ # changed 'if self.prefix(...):' to 'with self.prefix(...):' yet
+ # forgot to remove the self.end_prefix(...) call at the bottom of
+ # the block. In that case, calling pop() again would be Bad! But
+ # if we restore the length of each stack to what it was before the
+ # current prefix() block, it doesn't matter whether end_prefix()
+ # was called or not.
+ for stack, prevlen in self.prevlen.items():
+ # find the attribute in 'self.manifest' named by 'stack', and
+ # truncate that list back to 'prevlen'
+ del getattr(self.manifest, stack)[prevlen:]
def end_prefix(self, descr=None):
"""Pops a prefix off the stack. If given an argument, checks
diff --git a/indra/llcharacter/llmotioncontroller.cpp b/indra/llcharacter/llmotioncontroller.cpp
index d8185aa693..35e76f1d9d 100644
--- a/indra/llcharacter/llmotioncontroller.cpp
+++ b/indra/llcharacter/llmotioncontroller.cpp
@@ -139,7 +139,8 @@ LLMotionController::LLMotionController()
mTimeStep(0.f),
mTimeStepCount(0),
mLastInterp(0.f),
- mIsSelf(FALSE)
+ mIsSelf(FALSE),
+ mLastCountAfterPurge(0)
{
}
@@ -238,10 +239,12 @@ void LLMotionController::purgeExcessMotions()
}
}
- if (mLoadedMotions.size() > 2*MAX_MOTION_INSTANCES)
+ U32 loaded_count = mLoadedMotions.size();
+ if (loaded_count > (2 * MAX_MOTION_INSTANCES) && loaded_count > mLastCountAfterPurge)
{
- LL_WARNS_ONCE("Animation") << "> " << 2*MAX_MOTION_INSTANCES << " Loaded Motions" << LL_ENDL;
+ LL_WARNS_ONCE("Animation") << loaded_count << " Loaded Motions. Amount of motions is over limit." << LL_ENDL;
}
+ mLastCountAfterPurge = loaded_count;
}
//-----------------------------------------------------------------------------
diff --git a/indra/llcharacter/llmotioncontroller.h b/indra/llcharacter/llmotioncontroller.h
index 72de331694..9d9c64f4f0 100644
--- a/indra/llcharacter/llmotioncontroller.h
+++ b/indra/llcharacter/llmotioncontroller.h
@@ -224,6 +224,8 @@ protected:
F32 mLastInterp;
U8 mJointSignature[2][LL_CHARACTER_MAX_ANIMATED_JOINTS];
+private:
+ U32 mLastCountAfterPurge; //for logging and debugging purposes
};
//-----------------------------------------------------------------------------
diff --git a/indra/llcommon/llapp.cpp b/indra/llcommon/llapp.cpp
index 2c76f29020..6cc9e804d4 100644
--- a/indra/llcommon/llapp.cpp
+++ b/indra/llcommon/llapp.cpp
@@ -256,6 +256,70 @@ bool LLApp::parseCommandOptions(int argc, char** argv)
return true;
}
+bool LLApp::parseCommandOptions(int argc, wchar_t** wargv)
+{
+ LLSD commands;
+ std::string name;
+ std::string value;
+ for(int ii = 1; ii < argc; ++ii)
+ {
+ if(wargv[ii][0] != '-')
+ {
+ LL_INFOS() << "Did not find option identifier while parsing token: "
+ << wargv[ii] << LL_ENDL;
+ return false;
+ }
+ int offset = 1;
+ if(wargv[ii][1] == '-') ++offset;
+
+#if LL_WINDOWS
+ name.assign(utf16str_to_utf8str(&wargv[ii][offset]));
+#else
+ name.assign(wstring_to_utf8str(&wargv[ii][offset]));
+#endif
+ if(((ii+1) >= argc) || (wargv[ii+1][0] == '-'))
+ {
+ // we found another option after this one or we have
+ // reached the end. simply record that this option was
+ // found and continue.
+ int flag = name.compare("logfile");
+ if (0 == flag)
+ {
+ commands[name] = "log";
+ }
+ else
+ {
+ commands[name] = true;
+ }
+
+ continue;
+ }
+ ++ii;
+
+#if LL_WINDOWS
+ value.assign(utf16str_to_utf8str((wargv[ii])));
+#else
+ value.assign(wstring_to_utf8str((wargv[ii])));
+#endif
+
+#if LL_WINDOWS
+ //Windows changed command line parsing. Deal with it.
+ S32 slen = value.length() - 1;
+ S32 start = 0;
+ S32 end = slen;
+ if (wargv[ii][start]=='"')start++;
+ if (wargv[ii][end]=='"')end--;
+ if (start!=0 || end!=slen)
+ {
+ value = value.substr (start,end);
+ }
+#endif
+
+ commands[name] = value;
+ }
+ setOptionData(PRIORITY_COMMAND_LINE, commands);
+ return true;
+}
void LLApp::manageLiveFile(LLLiveFile* livefile)
{
@@ -354,7 +418,7 @@ void LLApp::setupErrorHandling(bool second_instance)
std::wstring wpipe_name;
wpipe_name = mCrashReportPipeStr + wstringize(getPid());
- const std::wstring wdump_path(wstringize(mDumpPath));
+ const std::wstring wdump_path(utf8str_to_utf16str(mDumpPath));
int retries = 30;
for (; retries > 0; --retries)
@@ -515,9 +579,9 @@ void LLApp::setMiniDumpDir(const std::string &path)
if(mExceptionHandler == 0) return;
#ifdef LL_WINDOWS
- wchar_t buffer[MAX_MINDUMP_PATH_LENGTH];
- mbstowcs(buffer, mDumpPath.c_str(), MAX_MINDUMP_PATH_LENGTH);
- mExceptionHandler->set_dump_path(std::wstring(buffer));
+ std::wstring buffer(utf8str_to_utf16str(mDumpPath));
+ if (buffer.size() > MAX_MINDUMP_PATH_LENGTH) buffer.resize(MAX_MINDUMP_PATH_LENGTH);
+ mExceptionHandler->set_dump_path(buffer);
#elif LL_LINUX
//google_breakpad::MinidumpDescriptor desc("/tmp"); //path works in debug fails in production inside breakpad lib so linux gets a little less stack reporting until it is patched.
google_breakpad::MinidumpDescriptor desc(mDumpPath); //path works in debug fails in production inside breakpad lib so linux gets a little less stack reporting until it is patched.
diff --git a/indra/llcommon/llapp.h b/indra/llcommon/llapp.h
index ff9a92b45f..acd829d864 100644
--- a/indra/llcommon/llapp.h
+++ b/indra/llcommon/llapp.h
@@ -106,7 +106,7 @@ public:
LLSD getOption(const std::string& name) const;
/**
- * @brief Parse command line options and insert them into
+ * @brief Parse ASCII command line options and insert them into
* application command line options.
*
* The name inserted into the option will have leading option
@@ -119,6 +119,20 @@ public:
*/
bool parseCommandOptions(int argc, char** argv);
+ /**
+ * @brief Parse Unicode command line options and insert them into
+ * application command line options.
+ *
+ * The name inserted into the option will have leading option
+ * identifiers (a minus or double minus) stripped. All options
+ * with values will be stored as a string, while all options
+ * without values will be stored as true.
+ * @param argc The argc passed into main().
+ * @param wargv The wargv passed into main().
+ * @return Returns true if the parse succeeded.
+ */
+ bool parseCommandOptions(int argc, wchar_t** wargv);
+
/**
* @brief Keep track of live files automatically.
*
diff --git a/indra/llcommon/llevents.cpp b/indra/llcommon/llevents.cpp
index a3856e4fc4..dce97b5411 100644
--- a/indra/llcommon/llevents.cpp
+++ b/indra/llcommon/llevents.cpp
@@ -322,6 +322,13 @@ LLBoundListener LLEventPump::listen_impl(const std::string& name, const LLEventL
const NameList& after,
const NameList& before)
{
+ if (!mSignal)
+ {
+ LL_WARNS() << "Can't connect listener" << LL_ENDL;
+ // connect will fail, return dummy
+ return LLBoundListener();
+ }
+
float nodePosition = 1.0;
// if the supplied name is empty we are not interested in the ordering mechanism
diff --git a/indra/llcommon/llinitparam.cpp b/indra/llcommon/llinitparam.cpp
index 1d104cf55d..aa2f4eb289 100644
--- a/indra/llcommon/llinitparam.cpp
+++ b/indra/llcommon/llinitparam.cpp
@@ -193,12 +193,7 @@ namespace LLInitParam
{
if (!silent)
{
- std::string file_name = p.getCurrentFileName();
- if(!file_name.empty())
- {
- file_name = "in file: " + file_name;
- }
- p.parserWarning(llformat("Failed to parse parameter \"%s\" %s", p.getCurrentElementName().c_str(), file_name.c_str()));
+ p.parserWarning(llformat("Failed to parse parameter \"%s\"", p.getCurrentElementName().c_str()));
}
return false;
}
diff --git a/indra/llcommon/llmetricperformancetester.cpp b/indra/llcommon/llmetricperformancetester.cpp
index 16fc365da1..f8a93baf45 100644
--- a/indra/llcommon/llmetricperformancetester.cpp
+++ b/indra/llcommon/llmetricperformancetester.cpp
@@ -132,8 +132,8 @@ void LLMetricPerformanceTesterBasic::doAnalysisMetrics(std::string baseline, std
}
// Open baseline and current target, exit if one is inexistent
- std::ifstream base_is(baseline.c_str());
- std::ifstream target_is(target.c_str());
+ llifstream base_is(baseline.c_str());
+ llifstream target_is(target.c_str());
if (!base_is.is_open() || !target_is.is_open())
{
LL_WARNS() << "'-analyzeperformance' error : baseline or current target file inexistent" << LL_ENDL;
@@ -151,7 +151,7 @@ void LLMetricPerformanceTesterBasic::doAnalysisMetrics(std::string baseline, std
target_is.close();
//output comparision
- std::ofstream os(output.c_str());
+ llofstream os(output.c_str());
os << "Label, Metric, Base(B), Target(T), Diff(T-B), Percentage(100*T/B)\n";
for(LLMetricPerformanceTesterBasic::name_tester_map_t::iterator iter = LLMetricPerformanceTesterBasic::sTesterMap.begin() ;
@@ -212,7 +212,7 @@ void LLMetricPerformanceTesterBasic::addMetric(std::string str)
}
/*virtual*/
-void LLMetricPerformanceTesterBasic::analyzePerformance(std::ofstream* os, LLSD* base, LLSD* current)
+void LLMetricPerformanceTesterBasic::analyzePerformance(llofstream* os, LLSD* base, LLSD* current)
{
resetCurrentCount() ;
@@ -254,14 +254,14 @@ void LLMetricPerformanceTesterBasic::analyzePerformance(std::ofstream* os, LLSD*
}
/*virtual*/
-void LLMetricPerformanceTesterBasic::compareTestResults(std::ofstream* os, std::string metric_string, S32 v_base, S32 v_current)
+void LLMetricPerformanceTesterBasic::compareTestResults(llofstream* os, std::string metric_string, S32 v_base, S32 v_current)
{
*os << llformat(" ,%s, %d, %d, %d, %.4f\n", metric_string.c_str(), v_base, v_current,
v_current - v_base, (v_base != 0) ? 100.f * v_current / v_base : 0) ;
}
/*virtual*/
-void LLMetricPerformanceTesterBasic::compareTestResults(std::ofstream* os, std::string metric_string, F32 v_base, F32 v_current)
+void LLMetricPerformanceTesterBasic::compareTestResults(llofstream* os, std::string metric_string, F32 v_base, F32 v_current)
{
*os << llformat(" ,%s, %.4f, %.4f, %.4f, %.4f\n", metric_string.c_str(), v_base, v_current,
v_current - v_base, (fabs(v_base) > 0.0001f) ? 100.f * v_current / v_base : 0.f ) ;
@@ -293,7 +293,7 @@ LLMetricPerformanceTesterWithSession::~LLMetricPerformanceTesterWithSession()
}
/*virtual*/
-void LLMetricPerformanceTesterWithSession::analyzePerformance(std::ofstream* os, LLSD* base, LLSD* current)
+void LLMetricPerformanceTesterWithSession::analyzePerformance(llofstream* os, LLSD* base, LLSD* current)
{
// Load the base session
resetCurrentCount() ;
diff --git a/indra/llcommon/llmetricperformancetester.h b/indra/llcommon/llmetricperformancetester.h
index e6b46be1cf..2e99ed979d 100644
--- a/indra/llcommon/llmetricperformancetester.h
+++ b/indra/llcommon/llmetricperformancetester.h
@@ -60,7 +60,7 @@ public:
* By default, compares the test results against the baseline one by one, item by item,
* in the increasing order of the LLSD record counter, starting from the first one.
*/
- virtual void analyzePerformance(std::ofstream* os, LLSD* base, LLSD* current) ;
+ virtual void analyzePerformance(llofstream* os, LLSD* base, LLSD* current) ;
static void doAnalysisMetrics(std::string baseline, std::string target, std::string output) ;
@@ -93,8 +93,8 @@ protected:
* @param[in] v_base - Base value of the metric.
* @param[in] v_current - Current value of the metric.
*/
- virtual void compareTestResults(std::ofstream* os, std::string metric_string, S32 v_base, S32 v_current) ;
- virtual void compareTestResults(std::ofstream* os, std::string metric_string, F32 v_base, F32 v_current) ;
+ virtual void compareTestResults(llofstream* os, std::string metric_string, S32 v_base, S32 v_current) ;
+ virtual void compareTestResults(llofstream* os, std::string metric_string, F32 v_base, F32 v_current) ;
/**
* @brief Reset internal record count. Count starts with 1.
@@ -181,7 +181,7 @@ public:
* This will be loading the base and current sessions and compare them using the virtual
* abstract methods loadTestSession() and compareTestSessions()
*/
- virtual void analyzePerformance(std::ofstream* os, LLSD* base, LLSD* current) ;
+ virtual void analyzePerformance(llofstream* os, LLSD* base, LLSD* current) ;
protected:
/**
@@ -205,7 +205,7 @@ protected:
* @brief Compare the base session and the target session. Assumes base and current sessions have been loaded.
* @param[out] os - The comparison result as a standard stream
*/
- virtual void compareTestSessions(std::ofstream* os) = 0;
+ virtual void compareTestSessions(llofstream* os) = 0;
LLTestSession* mBaseSessionp;
LLTestSession* mCurrentSessionp;
diff --git a/indra/llcommon/llsys.h b/indra/llcommon/llsys.h
index 95ef4cf065..5ab97939b9 100644
--- a/indra/llcommon/llsys.h
+++ b/indra/llcommon/llsys.h
@@ -37,13 +37,14 @@
//
#include "llsd.h"
+#include "llsingleton.h"
#include <iosfwd>
#include <string>
-class LL_COMMON_API LLOSInfo
+class LL_COMMON_API LLOSInfo : public LLSingleton<LLOSInfo>
{
+ LLSINGLETON(LLOSInfo);
public:
- LLOSInfo();
void stream(std::ostream& s) const;
const std::string& getOSString() const;
diff --git a/indra/llcorehttp/_httpinternal.h b/indra/llcorehttp/_httpinternal.h
index 79c89d6c92..690ebbecd8 100644
--- a/indra/llcorehttp/_httpinternal.h
+++ b/indra/llcorehttp/_httpinternal.h
@@ -127,9 +127,12 @@ const int HTTP_TRACE_MAX = HTTP_TRACE_CURL_BODIES;
// We want to span a few windows to allow transport to slow
// after onset of the throttles and then recover without a final
// failure. Other systems may need other constants.
-const int HTTP_RETRY_COUNT_DEFAULT = 8;
+const int HTTP_RETRY_COUNT_DEFAULT = 5;
const int HTTP_RETRY_COUNT_MIN = 0;
const int HTTP_RETRY_COUNT_MAX = 100;
+const HttpTime HTTP_RETRY_BACKOFF_MIN_DEFAULT = 1E6L; // 1 sec
+const HttpTime HTTP_RETRY_BACKOFF_MAX_DEFAULT = 5E6L; // 5 sec
+const HttpTime HTTP_RETRY_BACKOFF_MAX = 20E6L; // 20 sec
const int HTTP_REDIRECTS_DEFAULT = 10;
diff --git a/indra/llcorehttp/_httpoprequest.cpp b/indra/llcorehttp/_httpoprequest.cpp
index f526af37b5..721147ffb0 100644
--- a/indra/llcorehttp/_httpoprequest.cpp
+++ b/indra/llcorehttp/_httpoprequest.cpp
@@ -142,6 +142,8 @@ HttpOpRequest::HttpOpRequest()
mPolicy503Retries(0),
mPolicyRetryAt(HttpTime(0)),
mPolicyRetryLimit(HTTP_RETRY_COUNT_DEFAULT),
+ mPolicyMinRetryBackoff(HttpTime(HTTP_RETRY_BACKOFF_MIN_DEFAULT)),
+ mPolicyMaxRetryBackoff(HttpTime(HTTP_RETRY_BACKOFF_MAX_DEFAULT)),
mCallbackSSLVerify(NULL)
{
// *NOTE: As members are added, retry initialization/cleanup
@@ -438,6 +440,9 @@ void HttpOpRequest::setupCommon(HttpRequest::policy_t policy_id,
mPolicyRetryLimit = options->getRetries();
mPolicyRetryLimit = llclamp(mPolicyRetryLimit, HTTP_RETRY_COUNT_MIN, HTTP_RETRY_COUNT_MAX);
mTracing = (std::max)(mTracing, llclamp(options->getTrace(), HTTP_TRACE_MIN, HTTP_TRACE_MAX));
+
+ mPolicyMinRetryBackoff = llclamp(options->getMinBackoff(), HttpTime(0), HTTP_RETRY_BACKOFF_MAX);
+ mPolicyMaxRetryBackoff = llclamp(options->getMaxBackoff(), mPolicyMinRetryBackoff, HTTP_RETRY_BACKOFF_MAX);
}
}
diff --git a/indra/llcorehttp/_httpoprequest.h b/indra/llcorehttp/_httpoprequest.h
index 201c37d5c3..cdbe350785 100644
--- a/indra/llcorehttp/_httpoprequest.h
+++ b/indra/llcorehttp/_httpoprequest.h
@@ -233,6 +233,8 @@ public:
int mPolicy503Retries;
HttpTime mPolicyRetryAt;
int mPolicyRetryLimit;
+ HttpTime mPolicyMinRetryBackoff; // initial delay between retries (mcs)
+ HttpTime mPolicyMaxRetryBackoff;
}; // end class HttpOpRequest
diff --git a/indra/llcorehttp/_httppolicy.cpp b/indra/llcorehttp/_httppolicy.cpp
index a302db8b46..885f0ed61d 100644
--- a/indra/llcorehttp/_httppolicy.cpp
+++ b/indra/llcorehttp/_httppolicy.cpp
@@ -152,20 +152,16 @@ void HttpPolicy::addOp(const HttpOpRequest::ptr_t &op)
void HttpPolicy::retryOp(const HttpOpRequest::ptr_t &op)
{
- static const HttpTime retry_deltas[] =
- {
- 250000, // 1st retry in 0.25 S, etc...
- 500000,
- 1000000,
- 2000000,
- 5000000 // ... to every 5.0 S.
- };
- static const int delta_max(int(LL_ARRAY_SIZE(retry_deltas)) - 1);
static const HttpStatus error_503(503);
const HttpTime now(totalTime());
const int policy_class(op->mReqPolicy);
- HttpTime delta(retry_deltas[llclamp(op->mPolicyRetries, 0, delta_max)]);
+
+ HttpTime delta_min = op->mPolicyMinRetryBackoff;
+ HttpTime delta_max = op->mPolicyMaxRetryBackoff;
+ // mPolicyRetries limited to 100
+ U32 delta_factor = op->mPolicyRetries <= 10 ? 1 << op->mPolicyRetries : 1024;
+ HttpTime delta = llmin(delta_min * delta_factor, delta_max);
bool external_delta(false);
if (op->mReplyRetryAfter > 0 && op->mReplyRetryAfter < 30)
diff --git a/indra/llcorehttp/httpoptions.cpp b/indra/llcorehttp/httpoptions.cpp
index aab447f2dd..df5aa52fa9 100644
--- a/indra/llcorehttp/httpoptions.cpp
+++ b/indra/llcorehttp/httpoptions.cpp
@@ -39,6 +39,8 @@ HttpOptions::HttpOptions() :
mTimeout(HTTP_REQUEST_TIMEOUT_DEFAULT),
mTransferTimeout(HTTP_REQUEST_XFER_TIMEOUT_DEFAULT),
mRetries(HTTP_RETRY_COUNT_DEFAULT),
+ mMinRetryBackoff(HTTP_RETRY_BACKOFF_MIN_DEFAULT),
+ mMaxRetryBackoff(HTTP_RETRY_BACKOFF_MAX_DEFAULT),
mUseRetryAfter(HTTP_USE_RETRY_AFTER_DEFAULT),
mFollowRedirects(true),
mVerifyPeer(false),
@@ -81,6 +83,16 @@ void HttpOptions::setRetries(unsigned int retries)
mRetries = retries;
}
+void HttpOptions::setMinBackoff(HttpTime delay)
+{
+ mMinRetryBackoff = delay;
+}
+
+void HttpOptions::setMaxBackoff(HttpTime delay)
+{
+ mMaxRetryBackoff = delay;
+}
+
void HttpOptions::setUseRetryAfter(bool use_retry)
{
mUseRetryAfter = use_retry;
diff --git a/indra/llcorehttp/httpoptions.h b/indra/llcorehttp/httpoptions.h
index 510eaa45bb..8a6de61b04 100644
--- a/indra/llcorehttp/httpoptions.h
+++ b/indra/llcorehttp/httpoptions.h
@@ -101,13 +101,31 @@ public:
/// Sets the number of retries on an LLCore::HTTPRequest before the
/// request fails.
- // Default: 8
+ // Default: 5
void setRetries(unsigned int retries);
unsigned int getRetries() const
{
return mRetries;
}
+ /// Sets minimal delay before request retries. In microseconds.
+ /// HttpPolicy will increase delay from min to max with each retry
+ // Default: 1 000 000 mcs
+ void setMinBackoff(HttpTime delay);
+ HttpTime getMinBackoff() const
+ {
+ return mMinRetryBackoff;
+ }
+
+ /// Sets maximum delay before request retries. In microseconds.
+ /// HttpPolicy will increase delay from min to max with each retry
+ // Default: 5 000 000 mcs
+ void setMaxBackoff(HttpTime delay);
+ HttpTime getMaxBackoff() const
+ {
+ return mMaxRetryBackoff;
+ }
+
// Default: true
void setUseRetryAfter(bool use_retry);
bool getUseRetryAfter() const
@@ -166,6 +184,8 @@ protected:
unsigned int mTimeout;
unsigned int mTransferTimeout;
unsigned int mRetries;
+ HttpTime mMinRetryBackoff;
+ HttpTime mMaxRetryBackoff;
bool mUseRetryAfter;
bool mFollowRedirects;
bool mVerifyPeer;
diff --git a/indra/llcrashlogger/llcrashlock.cpp b/indra/llcrashlogger/llcrashlock.cpp
index 7dde1fcd69..77abfbcf0f 100644
--- a/indra/llcrashlogger/llcrashlock.cpp
+++ b/indra/llcrashlogger/llcrashlock.cpp
@@ -188,12 +188,22 @@ LLSD LLCrashLock::getProcessList()
//static
bool LLCrashLock::fileExists(std::string filename)
{
- return boost::filesystem::exists(filename.c_str());
+#ifdef LL_WINDOWS // or BOOST_WINDOWS_API
+ boost::filesystem::path file_path(utf8str_to_utf16str(filename));
+#else
+ boost::filesystem::path file_path(filename);
+#endif
+ return boost::filesystem::exists(file_path);
}
void LLCrashLock::cleanupProcess(std::string proc_dir)
{
- boost::filesystem::remove_all(proc_dir);
+#ifdef LL_WINDOWS // or BOOST_WINDOWS_API
+ boost::filesystem::path dir_path(utf8str_to_utf16str(proc_dir));
+#else
+ boost::filesystem::path dir_path(proc_dir);
+#endif
+ boost::filesystem::remove_all(dir_path);
}
bool LLCrashLock::putProcessList(const LLSD& proc_sd)
diff --git a/indra/llcrashlogger/llcrashlogger.cpp b/indra/llcrashlogger/llcrashlogger.cpp
index dca49be051..1d58dba9ab 100644
--- a/indra/llcrashlogger/llcrashlogger.cpp
+++ b/indra/llcrashlogger/llcrashlogger.cpp
@@ -155,9 +155,9 @@ std::string getStartupStateFromLog(std::string& sllog)
bool LLCrashLogger::readFromXML(LLSD& dest, const std::string& filename )
{
- std::string db_file_name = gDirUtilp->getExpandedFilename(LL_PATH_DUMP,filename);
- std::ifstream log_file(db_file_name.c_str());
-
+ std::string db_file_name = gDirUtilp->getExpandedFilename(LL_PATH_DUMP,filename);
+ llifstream log_file(db_file_name.c_str());
+
// Look for it in the given file
if (log_file.is_open())
{
@@ -186,7 +186,7 @@ bool LLCrashLogger::readMinidump(std::string minidump_path)
{
size_t length=0;
- std::ifstream minidump_stream(minidump_path.c_str(), std::ios_base::in | std::ios_base::binary);
+ llifstream minidump_stream(minidump_path.c_str(), std::ios_base::in | std::ios_base::binary);
if(minidump_stream.is_open())
{
minidump_stream.seekg(0, std::ios::end);
@@ -287,7 +287,7 @@ void LLCrashLogger::gatherFiles()
if (!file.empty())
{
LL_DEBUGS("CRASHREPORT") << "trying to read " << itr->first << ": " << file << LL_ENDL;
- std::ifstream f(file.c_str());
+ llifstream f(file.c_str());
if(f.is_open())
{
std::stringstream s;
@@ -342,7 +342,7 @@ void LLCrashLogger::gatherFiles()
if ( ( iter->length() > 30 ) && (iter->rfind(".dmp") == (iter->length()-4) ) )
{
std::string fullname = pathname + *iter;
- std::ifstream fdat( fullname.c_str(), std::ifstream::binary);
+ llifstream fdat(fullname.c_str(), std::ifstream::binary);
if (fdat)
{
char buf[5];
@@ -462,7 +462,7 @@ bool LLCrashLogger::sendCrashLog(std::string dump_dir)
updateApplication("Sending reports...");
- std::ofstream out_file(report_file.c_str());
+ llofstream out_file(report_file.c_str());
LLSDSerialize::toPrettyXML(post_data, out_file);
out_file.flush();
out_file.close();
diff --git a/indra/llimage/llimage.cpp b/indra/llimage/llimage.cpp
index fe49e8e011..bb345e282a 100644
--- a/indra/llimage/llimage.cpp
+++ b/indra/llimage/llimage.cpp
@@ -1437,7 +1437,7 @@ void LLImageRaw::copyScaled( LLImageRaw* src )
bool LLImageRaw::scale( S32 new_width, S32 new_height, bool scale_image_data )
{
S32 components = getComponents();
- if (! ((1 == components) || (3 == components) || (4 == components) ))
+ if (components != 1 && components != 3 && components != 4)
{
LL_WARNS() << "Invalid getComponents value (" << components << ")" << LL_ENDL;
return false;
@@ -1513,6 +1513,55 @@ bool LLImageRaw::scale( S32 new_width, S32 new_height, bool scale_image_data )
return true ;
}
+LLPointer<LLImageRaw> LLImageRaw::scaled(S32 new_width, S32 new_height)
+{
+ LLPointer<LLImageRaw> result;
+
+ S32 components = getComponents();
+ if (components != 1 && components != 3 && components != 4)
+ {
+ LL_WARNS() << "Invalid getComponents value (" << components << ")" << LL_ENDL;
+ return result;
+ }
+
+ if (isBufferInvalid())
+ {
+ LL_WARNS() << "Invalid image buffer" << LL_ENDL;
+ return result;
+ }
+
+ S32 old_width = getWidth();
+ S32 old_height = getHeight();
+
+ if ((old_width == new_width) && (old_height == new_height))
+ {
+ result = new LLImageRaw(old_width, old_height, components);
+ if (!result)
+ {
+ LL_WARNS() << "Failed to allocate new image" << LL_ENDL;
+ return result;
+ }
+ memcpy(result->getData(), getData(), getDataSize());
+ }
+ else
+ {
+ S32 new_data_size = new_width * new_height * components;
+
+ if (new_data_size > 0)
+ {
+ result = new LLImageRaw(new_width, new_height, components);
+ if (!result)
+ {
+ LL_WARNS() << "Failed to allocate new image" << LL_ENDL;
+ return result;
+ }
+ bilinear_scale(getData(), old_width, old_height, components, old_width*components, result->getData(), new_width, new_height, components, new_width*components);
+ }
+ }
+
+ return result;
+}
+
void LLImageRaw::copyLineScaled( U8* in, U8* out, S32 in_pixel_len, S32 out_pixel_len, S32 in_pixel_step, S32 out_pixel_step )
{
const S32 components = getComponents();
@@ -1786,10 +1835,13 @@ static std::string find_file(std::string &name, S8 *codec)
#endif
EImageCodec LLImageBase::getCodecFromExtension(const std::string& exten)
{
- for (int i=0; i<(int)(NUM_FILE_EXTENSIONS); i++)
+ if (!exten.empty())
{
- if (exten == file_extensions[i].exten)
- return file_extensions[i].codec;
+ for (int i = 0; i < (int)(NUM_FILE_EXTENSIONS); i++)
+ {
+ if (exten == file_extensions[i].exten)
+ return file_extensions[i].codec;
+ }
}
return IMG_CODEC_INVALID;
}
diff --git a/indra/llimage/llimage.h b/indra/llimage/llimage.h
index d0bd4a2aef..958c9fad3d 100644
--- a/indra/llimage/llimage.h
+++ b/indra/llimage/llimage.h
@@ -215,7 +215,8 @@ public:
void expandToPowerOfTwo(S32 max_dim = MAX_IMAGE_SIZE, bool scale_image = true);
void contractToPowerOfTwo(S32 max_dim = MAX_IMAGE_SIZE, bool scale_image = true);
void biasedScaleToPowerOfTwo(S32 max_dim = MAX_IMAGE_SIZE);
- bool scale( S32 new_width, S32 new_height, bool scale_image = true );
+ bool scale(S32 new_width, S32 new_height, bool scale_image = true);
+ LLPointer<LLImageRaw> scaled(S32 new_width, S32 new_height);
// Fill the buffer with a constant color
void fill( const LLColor4U& color );
diff --git a/indra/llmath/llvolume.cpp b/indra/llmath/llvolume.cpp
index 274ec50f20..44a33d9bc3 100644
--- a/indra/llmath/llvolume.cpp
+++ b/indra/llmath/llvolume.cpp
@@ -5311,19 +5311,31 @@ void LLVolumeFace::cacheOptimize()
S32 num_verts = mNumVertices;
S32 size = ((num_verts*sizeof(LLVector2)) + 0xF) & ~0xF;
LLVector4a* pos = (LLVector4a*) ll_aligned_malloc<64>(sizeof(LLVector4a)*2*num_verts+size);
+ if (pos == NULL)
+ {
+ LL_ERRS("LLVOLUME") << "Allocation of positions vector[" << sizeof(LLVector4a) * 2 * num_verts + size << "] failed. " << LL_ENDL;
+ }
LLVector4a* norm = pos + num_verts;
LLVector2* tc = (LLVector2*) (norm + num_verts);
LLVector4a* wght = NULL;
if (mWeights)
{
- wght = (LLVector4a*) ll_aligned_malloc_16(sizeof(LLVector4a)*num_verts);
+ wght = (LLVector4a*)ll_aligned_malloc_16(sizeof(LLVector4a)*num_verts);
+ if (wght == NULL)
+ {
+ LL_ERRS("LLVOLUME") << "Allocation of weights[" << sizeof(LLVector4a) * num_verts << "] failed" << LL_ENDL;
+ }
}
LLVector4a* binorm = NULL;
if (mTangents)
{
binorm = (LLVector4a*) ll_aligned_malloc_16(sizeof(LLVector4a)*num_verts);
+ if (binorm == NULL)
+ {
+ LL_ERRS("LLVOLUME") << "Allocation of binormals[" << sizeof(LLVector4a)*num_verts << "] failed" << LL_ENDL;
+ }
}
//allocate mapping of old indices to new indices
diff --git a/indra/llrender/llgl.cpp b/indra/llrender/llgl.cpp
index 18063e9700..155c2402bd 100644
--- a/indra/llrender/llgl.cpp
+++ b/indra/llrender/llgl.cpp
@@ -64,7 +64,7 @@ static const std::string HEADLESS_VENDOR_STRING("Linden Lab");
static const std::string HEADLESS_RENDERER_STRING("Headless");
static const std::string HEADLESS_VERSION_STRING("1.0");
-std::ofstream gFailLog;
+llofstream gFailLog;
#if GL_ARB_debug_output
diff --git a/indra/llrender/llgl.h b/indra/llrender/llgl.h
index 75e5fe86ec..aa98b3f6bc 100644
--- a/indra/llrender/llgl.h
+++ b/indra/llrender/llgl.h
@@ -47,7 +47,7 @@
extern BOOL gDebugGL;
extern BOOL gDebugSession;
-extern std::ofstream gFailLog;
+extern llofstream gFailLog;
#define LL_GL_ERRS LL_ERRS("RenderState")
diff --git a/indra/llui/llfolderviewmodel.h b/indra/llui/llfolderviewmodel.h
index 641241a88c..f71a88c56e 100644
--- a/indra/llui/llfolderviewmodel.h
+++ b/indra/llui/llfolderviewmodel.h
@@ -147,6 +147,10 @@ public:
virtual const std::string& getDisplayName() const = 0;
virtual const std::string& getSearchableName() const = 0;
+ virtual std::string getSearchableDescription() const = 0;
+ virtual std::string getSearchableCreatorName()const = 0;
+ virtual std::string getSearchableUUIDString() const = 0;
+
virtual LLPointer<LLUIImage> getIcon() const = 0;
virtual LLPointer<LLUIImage> getIconOpen() const { return getIcon(); }
virtual LLPointer<LLUIImage> getIconOverlay() const { return NULL; }
diff --git a/indra/llui/llscrollcontainer.cpp b/indra/llui/llscrollcontainer.cpp
index f70eebc594..6135cc56ad 100644
--- a/indra/llui/llscrollcontainer.cpp
+++ b/indra/llui/llscrollcontainer.cpp
@@ -72,6 +72,7 @@ LLScrollContainer::Params::Params()
hide_scrollbar("hide_scrollbar"),
min_auto_scroll_rate("min_auto_scroll_rate", 100),
max_auto_scroll_rate("max_auto_scroll_rate", 1000),
+ max_auto_scroll_zone("max_auto_scroll_zone", 16),
reserve_scroll_corner("reserve_scroll_corner", false),
size("size", -1)
{}
@@ -88,6 +89,7 @@ LLScrollContainer::LLScrollContainer(const LLScrollContainer::Params& p)
mReserveScrollCorner(p.reserve_scroll_corner),
mMinAutoScrollRate(p.min_auto_scroll_rate),
mMaxAutoScrollRate(p.max_auto_scroll_rate),
+ mMaxAutoScrollZone(p.max_auto_scroll_zone),
mScrolledView(NULL),
mSize(p.size)
{
@@ -290,8 +292,22 @@ BOOL LLScrollContainer::handleDragAndDrop(S32 x, S32 y, MASK mask,
return TRUE;
}
+bool LLScrollContainer::canAutoScroll(S32 x, S32 y)
+{
+ if (mAutoScrolling)
+ {
+ return true; // already scrolling
+ }
+ return autoScroll(x, y, false);
+}
+
bool LLScrollContainer::autoScroll(S32 x, S32 y)
{
+ return autoScroll(x, y, true);
+}
+
+bool LLScrollContainer::autoScroll(S32 x, S32 y, bool do_scroll)
+{
static LLUICachedControl<S32> scrollbar_size_control ("UIScrollbarSize", 0);
S32 scrollbar_size = (mSize == -1 ? scrollbar_size_control : mSize);
@@ -302,6 +318,8 @@ bool LLScrollContainer::autoScroll(S32 x, S32 y)
screenRectToLocal(getRootView()->getLocalRect(), &screen_local_extents);
LLRect inner_rect_local( 0, mInnerRect.getHeight(), mInnerRect.getWidth(), 0 );
+ // Note: Will also include scrollers as scroll zones, so opposite
+ // scroll zones might have different size due to visible scrollers
if( mScrollbar[HORIZONTAL]->getVisible() )
{
inner_rect_local.mBottom += scrollbar_size;
@@ -316,8 +334,8 @@ bool LLScrollContainer::autoScroll(S32 x, S32 y)
S32 auto_scroll_speed = ll_round(mAutoScrollRate * LLFrameTimer::getFrameDeltaTimeF32());
// autoscroll region should take up no more than one third of visible scroller area
- S32 auto_scroll_region_width = llmin(inner_rect_local.getWidth() / 3, 10);
- S32 auto_scroll_region_height = llmin(inner_rect_local.getHeight() / 3, 10);
+ S32 auto_scroll_region_width = llmin(inner_rect_local.getWidth() / 3, (S32)mMaxAutoScrollZone);
+ S32 auto_scroll_region_height = llmin(inner_rect_local.getHeight() / 3, (S32)mMaxAutoScrollZone);
if( mScrollbar[HORIZONTAL]->getVisible() )
{
@@ -325,8 +343,11 @@ bool LLScrollContainer::autoScroll(S32 x, S32 y)
left_scroll_rect.mRight = inner_rect_local.mLeft + auto_scroll_region_width;
if( left_scroll_rect.pointInRect( x, y ) && (mScrollbar[HORIZONTAL]->getDocPos() > 0) )
{
- mScrollbar[HORIZONTAL]->setDocPos( mScrollbar[HORIZONTAL]->getDocPos() - auto_scroll_speed );
- mAutoScrolling = TRUE;
+ if (do_scroll)
+ {
+ mScrollbar[HORIZONTAL]->setDocPos(mScrollbar[HORIZONTAL]->getDocPos() - auto_scroll_speed);
+ mAutoScrolling = TRUE;
+ }
scrolling = true;
}
@@ -334,8 +355,11 @@ bool LLScrollContainer::autoScroll(S32 x, S32 y)
right_scroll_rect.mLeft = inner_rect_local.mRight - auto_scroll_region_width;
if( right_scroll_rect.pointInRect( x, y ) && (mScrollbar[HORIZONTAL]->getDocPos() < mScrollbar[HORIZONTAL]->getDocPosMax()) )
{
- mScrollbar[HORIZONTAL]->setDocPos( mScrollbar[HORIZONTAL]->getDocPos() + auto_scroll_speed );
- mAutoScrolling = TRUE;
+ if (do_scroll)
+ {
+ mScrollbar[HORIZONTAL]->setDocPos(mScrollbar[HORIZONTAL]->getDocPos() + auto_scroll_speed);
+ mAutoScrolling = TRUE;
+ }
scrolling = true;
}
}
@@ -345,8 +369,11 @@ bool LLScrollContainer::autoScroll(S32 x, S32 y)
bottom_scroll_rect.mTop = inner_rect_local.mBottom + auto_scroll_region_height;
if( bottom_scroll_rect.pointInRect( x, y ) && (mScrollbar[VERTICAL]->getDocPos() < mScrollbar[VERTICAL]->getDocPosMax()) )
{
- mScrollbar[VERTICAL]->setDocPos( mScrollbar[VERTICAL]->getDocPos() + auto_scroll_speed );
- mAutoScrolling = TRUE;
+ if (do_scroll)
+ {
+ mScrollbar[VERTICAL]->setDocPos(mScrollbar[VERTICAL]->getDocPos() + auto_scroll_speed);
+ mAutoScrolling = TRUE;
+ }
scrolling = true;
}
@@ -354,8 +381,11 @@ bool LLScrollContainer::autoScroll(S32 x, S32 y)
top_scroll_rect.mBottom = inner_rect_local.mTop - auto_scroll_region_height;
if( top_scroll_rect.pointInRect( x, y ) && (mScrollbar[VERTICAL]->getDocPos() > 0) )
{
- mScrollbar[VERTICAL]->setDocPos( mScrollbar[VERTICAL]->getDocPos() - auto_scroll_speed );
- mAutoScrolling = TRUE;
+ if (do_scroll)
+ {
+ mScrollbar[VERTICAL]->setDocPos(mScrollbar[VERTICAL]->getDocPos() - auto_scroll_speed);
+ mAutoScrolling = TRUE;
+ }
scrolling = true;
}
}
diff --git a/indra/llui/llscrollcontainer.h b/indra/llui/llscrollcontainer.h
index c4c4d0a136..e6c7891397 100644
--- a/indra/llui/llscrollcontainer.h
+++ b/indra/llui/llscrollcontainer.h
@@ -66,6 +66,7 @@ public:
hide_scrollbar;
Optional<F32> min_auto_scroll_rate,
max_auto_scroll_rate;
+ Optional<U32> max_auto_scroll_zone;
Optional<LLUIColor> bg_color;
Optional<LLScrollbar::callback_t> scroll_callback;
Optional<S32> size;
@@ -114,7 +115,8 @@ public:
virtual void draw();
virtual bool addChild(LLView* view, S32 tab_group = 0);
-
+
+ bool canAutoScroll(S32 x, S32 y);
bool autoScroll(S32 x, S32 y);
S32 getSize() const { return mSize; }
@@ -128,6 +130,7 @@ private:
virtual void scrollHorizontal( S32 new_pos );
virtual void scrollVertical( S32 new_pos );
void updateScroll();
+ bool autoScroll(S32 x, S32 y, bool do_scroll);
void calcVisibleSize( S32 *visible_width, S32 *visible_height, BOOL* show_h_scrollbar, BOOL* show_v_scrollbar ) const;
LLScrollbar* mScrollbar[ORIENTATION_COUNT];
@@ -141,6 +144,7 @@ private:
F32 mAutoScrollRate;
F32 mMinAutoScrollRate;
F32 mMaxAutoScrollRate;
+ U32 mMaxAutoScrollZone;
bool mHideScrollbar;
};
diff --git a/indra/llui/llxuiparser.cpp b/indra/llui/llxuiparser.cpp
index 99a0869ce3..138ba8bf02 100644
--- a/indra/llui/llxuiparser.cpp
+++ b/indra/llui/llxuiparser.cpp
@@ -58,10 +58,6 @@ static LLInitParam::Parser::parser_inspect_func_map_t sSimpleXUIInspectFuncs;
const char* NO_VALUE_MARKER = "no_value";
-#ifdef LL_WINDOWS
-const S32 LINE_NUMBER_HERE = 0;
-#endif
-
struct MaxOccursValues : public LLInitParam::TypeValuesHelper<U32, MaxOccursValues>
{
static void declareValues()
@@ -1313,22 +1309,14 @@ bool LLXUIParser::writeSDValue(Parser& parser, const void* val_ptr, name_stack_t
void LLXUIParser::parserWarning(const std::string& message)
{
-#ifdef LL_WINDOWS
- // use Visual Studio friendly formatting of output message for easy access to originating xml
- LL_INFOS() << llformat("%s(%d):\t%s", mCurFileName.c_str(), mCurReadNode->getLineNumber(), message.c_str()) << LL_ENDL;
-#else
- Parser::parserWarning(message);
-#endif
+ std::string warning_msg = llformat("%s:\t%s(%d)", message.c_str(), mCurFileName.c_str(), mCurReadNode->getLineNumber());
+ Parser::parserWarning(warning_msg);
}
void LLXUIParser::parserError(const std::string& message)
{
-#ifdef LL_WINDOWS
- // use Visual Studio friendly formatting of output message for easy access to originating xml
- LL_INFOS() << llformat("%s(%d):\t%s", mCurFileName.c_str(), mCurReadNode->getLineNumber(), message.c_str()) << LL_ENDL;
-#else
- Parser::parserError(message);
-#endif
+ std::string error_msg = llformat("%s:\t%s(%d)", message.c_str(), mCurFileName.c_str(), mCurReadNode->getLineNumber());
+ Parser::parserError(error_msg);
}
@@ -1641,22 +1629,14 @@ bool LLSimpleXUIParser::processText()
void LLSimpleXUIParser::parserWarning(const std::string& message)
{
-#ifdef LL_WINDOWS
- // use Visual Studio friendly formatting of output message for easy access to originating xml
- LL_INFOS() << llformat("%s(%d):\t%s", mCurFileName.c_str(), LINE_NUMBER_HERE, message.c_str()) << LL_ENDL;
-#else
- Parser::parserWarning(message);
-#endif
+ std::string warning_msg = llformat("%s:\t%s", message.c_str(), mCurFileName.c_str());
+ Parser::parserWarning(warning_msg);
}
void LLSimpleXUIParser::parserError(const std::string& message)
{
-#ifdef LL_WINDOWS
- // use Visual Studio friendly formatting of output message for easy access to originating xml
- LL_INFOS() << llformat("%s(%d):\t%s", mCurFileName.c_str(), LINE_NUMBER_HERE, message.c_str()) << LL_ENDL;
-#else
- Parser::parserError(message);
-#endif
+ std::string error_msg = llformat("%s:\t%s", message.c_str(), mCurFileName.c_str());
+ Parser::parserError(error_msg);
}
bool LLSimpleXUIParser::readFlag(Parser& parser, void* val_ptr)
diff --git a/indra/llvfs/lldir.cpp b/indra/llvfs/lldir.cpp
index 924e1166ee..b845de71fa 100644
--- a/indra/llvfs/lldir.cpp
+++ b/indra/llvfs/lldir.cpp
@@ -104,8 +104,13 @@ LLDir::~LLDir()
std::vector<std::string> LLDir::getFilesInDir(const std::string &dirname)
{
//Returns a vector of fullpath filenames.
-
- boost::filesystem::path p (dirname);
+
+#ifdef LL_WINDOWS // or BOOST_WINDOWS_API
+ boost::filesystem::path p(utf8str_to_utf16str(dirname));
+#else
+ boost::filesystem::path p(dirname);
+#endif
+
std::vector<std::string> v;
if (exists(p))
@@ -193,7 +198,12 @@ U32 LLDir::deleteDirAndContents(const std::string& dir_name)
try
{
- boost::filesystem::path dir_path(dir_name);
+#ifdef LL_WINDOWS // or BOOST_WINDOWS_API
+ boost::filesystem::path dir_path(utf8str_to_utf16str(dir_name));
+#else
+ boost::filesystem::path dir_path(dir_name);
+#endif
+
if (boost::filesystem::exists (dir_path))
{
if (!boost::filesystem::is_empty (dir_path))
diff --git a/indra/media_plugins/cef/media_plugin_cef.cpp b/indra/media_plugins/cef/media_plugin_cef.cpp
index 74a0febe3c..f3d7762a08 100644
--- a/indra/media_plugins/cef/media_plugin_cef.cpp
+++ b/indra/media_plugins/cef/media_plugin_cef.cpp
@@ -388,6 +388,7 @@ void MediaPluginCEF::receiveMessage(const char* message_string)
}
else if (message_name == "cleanup")
{
+ mVolumeCatcher.setVolume(0);
mCEFLib->requestExit();
}
else if (message_name == "shm_added")
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index cb4be8d9fc..c0e963c228 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -812,6 +812,17 @@
<key>Value</key>
<integer>0</integer>
</map>
+ <key>FramePerSecondLimit</key>
+ <map>
+ <key>Comment</key>
+ <string>Controls upper limit of frames per second</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>U32</string>
+ <key>Value</key>
+ <integer>120</integer>
+ </map>
<key>BackgroundYieldTime</key>
<map>
<key>Comment</key>
@@ -1382,7 +1393,7 @@
<key>Type</key>
<string>U32</string>
<key>Value</key>
- <integer>512</integer>
+ <integer>1024</integer>
</map>
<key>CacheValidateCounter</key>
<map>
@@ -4534,7 +4545,7 @@
<key>Type</key>
<string>String</string>
<key>Value</key>
- <string>http://search.secondlife.com/viewer/[CATEGORY]/?q=[QUERY]&amp;p=[AUTH_TOKEN]&amp;r=[MATURITY]&amp;lang=[LANGUAGE]&amp;g=[GODLIKE]&amp;sid=[SESSION_ID]&amp;rid=[REGION_ID]&amp;pid=[PARCEL_ID]&amp;channel=[CHANNEL]&amp;version=[VERSION]&amp;major=[VERSION_MAJOR]&amp;minor=[VERSION_MINOR]&amp;patch=[VERSION_PATCH]&amp;build=[VERSION_BUILD]</string>
+ <string>https://search.[GRID]/viewer/[CATEGORY]/?q=[QUERY]&amp;p=[AUTH_TOKEN]&amp;r=[MATURITY]&amp;lang=[LANGUAGE]&amp;g=[GODLIKE]&amp;sid=[SESSION_ID]&amp;rid=[REGION_ID]&amp;pid=[PARCEL_ID]&amp;channel=[CHANNEL]&amp;version=[VERSION]&amp;major=[VERSION_MAJOR]&amp;minor=[VERSION_MINOR]&amp;patch=[VERSION_PATCH]&amp;build=[VERSION_BUILD]</string>
</map>
<key>HighResSnapshot</key>
<map>
@@ -5581,12 +5592,12 @@
<key>Type</key>
<string>F32</string>
<key>Value</key>
- <real>10.0</real>
+ <real>40.0</real>
</map>
<key>LoginSRVPump</key>
<map>
<key>Comment</key>
- <string>Name of the message pump that handles SRV request</string>
+ <string>Name of the message pump that handles SRV request (deprecated)</string>
<key>Persist</key>
<integer>0</integer>
<key>Type</key>
diff --git a/indra/newview/installers/windows/installer_template.nsi b/indra/newview/installers/windows/installer_template.nsi
index ade808e3e2..cd867d79b3 100644
--- a/indra/newview/installers/windows/installer_template.nsi
+++ b/indra/newview/installers/windows/installer_template.nsi
@@ -324,11 +324,6 @@ CreateShortCut "$INSTDIR\$INSTSHORTCUT.lnk" \
CreateShortCut "$INSTDIR\Uninstall $INSTSHORTCUT.lnk" \
'"$INSTDIR\uninst.exe"' ''
-# Create *.bat file to specify lang params on first run from installer - see MAINT-5259S
-FileOpen $9 "$INSTDIR\autorun.bat" w
-FileWrite $9 'start "$INSTDIR\$INSTEXE" /d "$INSTDIR" "$INSTDIR\$INSTEXE" $SHORTCUT_LANG_PARAM$\r$\n'
-FileClose $9
-
# Write registry
WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG" "" "$INSTDIR"
WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG" "Version" "${VERSION_LONG}"
@@ -724,7 +719,7 @@ Call CheckWindowsServPack # Warn if not on the latest SP before asking to launc
Push $R0 # Option value, unused#
StrCmp $SKIP_AUTORUN "true" +2;
# Assumes SetOutPath $INSTDIR
- Exec '"$WINDIR\explorer.exe" "$INSTDIR\autorun.bat"'
+ Exec '"$WINDIR\explorer.exe" "$INSTDIR\$INSTSHORTCUT.lnk"'
Pop $R0
#
FunctionEnd
diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp
index c928cf0601..0fb811a386 100644
--- a/indra/newview/llappearancemgr.cpp
+++ b/indra/newview/llappearancemgr.cpp
@@ -1321,6 +1321,8 @@ static void removeDuplicateItems(LLInventoryModel::item_array_t& items)
//=========================================================================
+const std::string LLAppearanceMgr::sExpectedTextureName = "OutfitPreview";
+
const LLUUID LLAppearanceMgr::getCOF() const
{
return gInventory.findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT);
@@ -1571,7 +1573,14 @@ void LLAppearanceMgr::removeOutfitPhoto(const LLUUID& outfit_id)
BOOST_FOREACH(LLViewerInventoryItem* outfit_item, outfit_item_array)
{
LLViewerInventoryItem* linked_item = outfit_item->getLinkedItem();
- if (linked_item != NULL && linked_item->getActualType() == LLAssetType::AT_TEXTURE)
+ if (linked_item != NULL)
+ {
+ if (linked_item->getActualType() == LLAssetType::AT_TEXTURE)
+ {
+ gInventory.removeItem(outfit_item->getUUID());
+ }
+ }
+ else if (outfit_item->getActualType() == LLAssetType::AT_TEXTURE)
{
gInventory.removeItem(outfit_item->getUUID());
}
@@ -3209,6 +3218,7 @@ void appearance_mgr_update_dirty_state()
void update_base_outfit_after_ordering()
{
LLAppearanceMgr& app_mgr = LLAppearanceMgr::instance();
+ app_mgr.setOutfitImage(LLUUID());
LLInventoryModel::cat_array_t sub_cat_array;
LLInventoryModel::item_array_t outfit_item_array;
gInventory.collectDescendents(app_mgr.getBaseOutfitUUID(),
@@ -3218,9 +3228,26 @@ void update_base_outfit_after_ordering()
BOOST_FOREACH(LLViewerInventoryItem* outfit_item, outfit_item_array)
{
LLViewerInventoryItem* linked_item = outfit_item->getLinkedItem();
- if (linked_item != NULL && linked_item->getActualType() == LLAssetType::AT_TEXTURE)
+ if (linked_item != NULL)
+ {
+ if (linked_item->getActualType() == LLAssetType::AT_TEXTURE)
+ {
+ app_mgr.setOutfitImage(linked_item->getLinkedUUID());
+ if (linked_item->getName() == LLAppearanceMgr::sExpectedTextureName)
+ {
+ // Images with "appropriate" name take priority
+ break;
+ }
+ }
+ }
+ else if (outfit_item->getActualType() == LLAssetType::AT_TEXTURE)
{
- app_mgr.setOutfitImage(linked_item->getLinkedUUID());
+ app_mgr.setOutfitImage(outfit_item->getUUID());
+ if (outfit_item->getName() == LLAppearanceMgr::sExpectedTextureName)
+ {
+ // Images with "appropriate" name take priority
+ break;
+ }
}
}
diff --git a/indra/newview/llappearancemgr.h b/indra/newview/llappearancemgr.h
index 166c663feb..c274a8b049 100644
--- a/indra/newview/llappearancemgr.h
+++ b/indra/newview/llappearancemgr.h
@@ -291,6 +291,9 @@ public:
BOOL getIsInCOF(const LLUUID& obj_id) const;
// Is this in the COF and can the user delete it from the COF?
BOOL getIsProtectedCOFItem(const LLUUID& obj_id) const;
+
+ // Outfits will prioritize textures with such name to use for preview in gallery
+ static const std::string sExpectedTextureName;
};
class LLUpdateAppearanceOnDestroy: public LLInventoryCallback
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index 3794c19bb1..9af7d9e815 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -307,8 +307,6 @@ F32SecondsImplicit gFrameIntervalSeconds = 0.f;
F32 gFPSClamped = 10.f; // Pretend we start at target rate.
F32 gFrameDTClamped = 0.f; // Time between adjacent checks to network for packets
U64MicrosecondsImplicit gStartTime = 0; // gStartTime is "private", used only to calculate gFrameTimeSeconds
-U32 gFrameStalls = 0;
-const F64 FRAME_STALL_THRESHOLD = 1.0;
LLTimer gRenderStartTime;
LLFrameTimer gForegroundTime;
@@ -631,7 +629,7 @@ public:
void run()
{
- std::ofstream os(mFile.c_str());
+ llofstream os(mFile.c_str());
while (!LLAppViewer::instance()->isQuitting())
{
@@ -694,7 +692,8 @@ LLAppViewer::LLAppViewer()
mPeriodicSlowFrame(LLCachedControl<bool>(gSavedSettings,"Periodic Slow Frame", FALSE)),
mFastTimerLogThread(NULL),
mSettingsLocationList(NULL),
- mIsFirstRun(false)
+ mIsFirstRun(false),
+ mMinMicroSecPerFrame(0.f)
{
if(NULL != sInstance)
{
@@ -722,7 +721,7 @@ LLAppViewer::LLAppViewer()
// OK to write stuff to logs now, we've now crash reported if necessary
//
- LLLoginInstance::instance().setPlatformInfo(gPlatform, getOSInfo().getOSVersionString(), getOSInfo().getOSStringSimple());
+ LLLoginInstance::instance().setPlatformInfo(gPlatform, LLOSInfo::instance().getOSVersionString(), LLOSInfo::instance().getOSStringSimple());
}
LLAppViewer::~LLAppViewer()
@@ -1239,6 +1238,9 @@ bool LLAppViewer::init()
joystick->setNeedsReset(true);
/*----------------------------------------------------------------------*/
+ gSavedSettings.getControl("FramePerSecondLimit")->getSignal()->connect(boost::bind(&LLAppViewer::onChangeFrameLimit, this, _2));
+ onChangeFrameLimit(gSavedSettings.getLLSD("FramePerSecondLimit"));
+
return true;
}
@@ -1318,9 +1320,6 @@ bool LLAppViewer::frame()
LLEventPump& mainloop(LLEventPumps::instance().obtain("mainloop"));
LLSD newFrame;
- LLTimer frameTimer,idleTimer;
- LLTimer debugTime;
-
//LLPrivateMemoryPoolTester::getInstance()->run(false) ;
//LLPrivateMemoryPoolTester::getInstance()->run(true) ;
//LLPrivateMemoryPoolTester::destroy() ;
@@ -1361,14 +1360,6 @@ bool LLAppViewer::frame()
gViewerWindow->getWindow()->gatherInput();
}
-#if 1 && !LL_RELEASE_FOR_DOWNLOAD
- // once per second debug info
- if (debugTime.getElapsedTimeF32() > 1.f)
- {
- debugTime.reset();
- }
-
-#endif
//memory leaking simulation
LLFloaterMemLeak* mem_leak_instance =
LLFloaterReg::findTypedInstance<LLFloaterMemLeak>("mem_leaking");
@@ -1422,7 +1413,24 @@ bool LLAppViewer::frame()
{
pingMainloopTimeout("Main:Display");
gGLActive = TRUE;
+
+ static U64 last_call = 0;
+ if (!gTeleportDisplay)
+ {
+ // Frame/draw throttling
+ U64 elapsed_time = LLTimer::getTotalTime() - last_call;
+ if (elapsed_time < mMinMicroSecPerFrame)
+ {
+ LL_RECORD_BLOCK_TIME(FTM_SLEEP);
+ // llclamp for when time function gets funky
+ U64 sleep_time = llclamp(mMinMicroSecPerFrame - elapsed_time, (U64)1, (U64)1e6);
+ micro_sleep(sleep_time, 0);
+ }
+ }
+ last_call = LLTimer::getTotalTime();
+
display();
+
pingMainloopTimeout("Main:Snapshot");
LLFloaterSnapshot::update(); // take snapshots
LLFloaterOutfitSnapshot::update();
@@ -1450,7 +1458,8 @@ bool LLAppViewer::frame()
|| !gFocusMgr.getAppHasFocus())
{
// Sleep if we're not rendering, or the window is minimized.
- S32 milliseconds_to_sleep = llclamp(gSavedSettings.getS32("BackgroundYieldTime"), 0, 1000);
+ static LLCachedControl<S32> s_bacground_yeild_time(gSavedSettings, "BackgroundYieldTime", 40);
+ S32 milliseconds_to_sleep = llclamp((S32)s_bacground_yeild_time, 0, 1000);
// don't sleep when BackgroundYieldTime set to 0, since this will still yield to other threads
// of equal priority on Windows
if (milliseconds_to_sleep > 0)
@@ -1474,7 +1483,6 @@ bool LLAppViewer::frame()
ms_sleep(500);
}
- idleTimer.reset();
S32 total_work_pending = 0;
S32 total_io_pending = 0;
{
@@ -1527,13 +1535,6 @@ bool LLAppViewer::frame()
}
}
- if ((LLStartUp::getStartupState() >= STATE_CLEANUP) &&
- (frameTimer.getElapsedTimeF64() > FRAME_STALL_THRESHOLD))
- {
- gFrameStalls++;
- }
- frameTimer.reset();
-
resumeMainloopTimeout();
pingMainloopTimeout("Main:End");
@@ -2958,10 +2959,13 @@ bool LLAppViewer::initWindow()
#ifdef LL_DARWIN
- //Satisfy both MAINT-3135 (OSX 10.6 and earlier) MAINT-3288 (OSX 10.7 and later)
- if (getOSInfo().mMajorVer == 10 && getOSInfo().mMinorVer < 7)
- if ( getOSInfo().mMinorVer == 6 && getOSInfo().mBuild < 8 )
- gViewerWindow->getWindow()->setOldResize(true);
+ //Satisfy both MAINT-3135 (OSX 10.6 and earlier) MAINT-3288 (OSX 10.7 and later)
+ LLOSInfo& os_info = LLOSInfo::instance();
+ if (os_info.mMajorVer == 10 && os_info.mMinorVer < 7)
+ {
+ if ( os_info.mMinorVer == 6 && os_info.mBuild < 8 )
+ gViewerWindow->getWindow()->setOldResize(true);
+ }
#endif
if (gSavedSettings.getBOOL("WindowMaximized"))
@@ -3104,7 +3108,7 @@ LLSD LLAppViewer::getViewerInfo() const
info["CPU"] = gSysCPU.getCPUString();
info["MEMORY_MB"] = LLSD::Integer(gSysMemory.getPhysicalMemoryKB().valueInUnits<LLUnits::Megabytes>());
// Moved hack adjustment to Windows memory size into llsys.cpp
- info["OS_VERSION"] = LLAppViewer::instance()->getOSInfo().getOSString();
+ info["OS_VERSION"] = LLOSInfo::instance().getOSString();
info["GRAPHICS_CARD_VENDOR"] = (const char*)(glGetString(GL_VENDOR));
info["GRAPHICS_CARD"] = (const char*)(glGetString(GL_RENDERER));
@@ -3149,7 +3153,7 @@ LLSD LLAppViewer::getViewerInfo() const
info["J2C_VERSION"] = LLImageJ2C::getEngineInfo();
bool want_fullname = true;
- info["AUDIO_DRIVER_VERSION"] = gAudiop ? LLSD(gAudiop->getDriverName(want_fullname)) : LLSD();
+ info["AUDIO_DRIVER_VERSION"] = gAudiop ? LLSD(gAudiop->getDriverName(want_fullname)) : "Undefined";
if(LLVoiceClient::getInstance()->voiceEnabled())
{
LLVoiceVersionInfo version = LLVoiceClient::getInstance()->getVersion();
@@ -3299,6 +3303,70 @@ std::string LLAppViewer::getViewerInfoString() const
return support.str();
}
+std::string LLAppViewer::getShortViewerInfoString() const
+{
+ std::ostringstream support;
+ LLSD info(getViewerInfo());
+
+ support << LLTrans::getString("APP_NAME") << " " << info["VIEWER_VERSION_STR"].asString();
+ support << " (" << info["CHANNEL"].asString() << ")";
+ if (info.has("BUILD_CONFIG"))
+ {
+ support << "\n" << "Build Configuration " << info["BUILD_CONFIG"].asString();
+ }
+ if (info.has("REGION"))
+ {
+ support << "\n\n" << "You are at " << ll_vector3_from_sd(info["POSITION_LOCAL"]) << " in " << info["REGION"].asString();
+ support << " located at " << info["HOSTNAME"].asString() << " (" << info["HOSTIP"].asString() << ")";
+ support << "\n" << "SLURL: " << info["SLURL"].asString();
+ support << "\n" << "(Global coordinates " << ll_vector3_from_sd(info["POSITION"]) << ")";
+ support << "\n" << info["SERVER_VERSION"].asString();
+ }
+
+ support << "\n\n" << "CPU: " << info["CPU"].asString();
+ support << "\n" << "Memory: " << info["MEMORY_MB"].asString() << " MB";
+ support << "\n" << "OS: " << info["OS_VERSION"].asString();
+ support << "\n" << "Graphics Card: " << info["GRAPHICS_CARD"].asString() << " (" << info["GRAPHICS_CARD_VENDOR"].asString() << ")";
+
+ if (info.has("GRAPHICS_DRIVER_VERSION"))
+ {
+ support << "\n" << "Windows Graphics Driver Version: " << info["GRAPHICS_DRIVER_VERSION"].asString();
+ }
+
+ support << "\n" << "OpenGL Version: " << info["OPENGL_VERSION"].asString();
+
+ support << "\n\n" << "Window size:" << info["WINDOW_WIDTH"].asString() << "x" << info["WINDOW_HEIGHT"].asString();
+ support << "\n" << "Language: " << LLUI::getLanguage();
+ support << "\n" << "Font Size Adjustment: " << info["FONT_SIZE_ADJUSTMENT"].asString() << "pt";
+ support << "\n" << "UI Scaling: " << info["UI_SCALE"].asString();
+ support << "\n" << "Draw distance: " << info["DRAW_DISTANCE"].asString();
+ support << "\n" << "Bandwidth: " << info["NET_BANDWITH"].asString() << "kbit/s";
+ support << "\n" << "LOD factor: " << info["LOD_FACTOR"].asString();
+ support << "\n" << "Render quality: " << info["RENDER_QUALITY"].asString() << " / 7";
+ support << "\n" << "ALM: " << info["GPU_SHADERS"].asString();
+ support << "\n" << "Texture memory: " << info["TEXTURE_MEMORY"].asString() << "MB";
+ support << "\n" << "VFS (cache) creation time: " << info["VFS_TIME"].asString();
+
+ support << "\n\n" << "J2C Decoder: " << info["J2C_VERSION"].asString();
+ support << "\n" << "Audio Driver: " << info["AUDIO_DRIVER_VERSION"].asString();
+ support << "\n" << "LLCEFLib/CEF: " << info["LLCEFLIB_VERSION"].asString();
+ support << "\n" << "LibVLC: " << info["LIBVLC_VERSION"].asString();
+ support << "\n" << "Voice Server: " << info["VOICE_VERSION"].asString();
+
+ if (info.has("PACKETS_IN"))
+ {
+ support << "\n" << "Packets Lost: " << info["PACKETS_LOST"].asInteger() << "/" << info["PACKETS_IN"].asInteger();
+ F32 packets_pct = info["PACKETS_PCT"].asReal();
+ support << " (" << ll_round(packets_pct, 0.001f) << "%)";
+ }
+
+ LLSD substitution;
+ substitution["datetime"] = (S32)time(NULL);
+ support << "\n" << LLTrans::getString("AboutTime", substitution);
+
+ return support.str();
+}
+
void LLAppViewer::cleanupSavedSettings()
{
gSavedSettings.setBOOL("MouseSun", FALSE);
@@ -3376,7 +3444,7 @@ void LLAppViewer::writeSystemInfo()
gDebugInfo["RAMInfo"]["Physical"] = (LLSD::Integer)(gSysMemory.getPhysicalMemoryKB().value());
gDebugInfo["RAMInfo"]["Allocated"] = (LLSD::Integer)(gMemoryAllocated.valueInUnits<LLUnits::Kilobytes>());
- gDebugInfo["OSInfo"] = getOSInfo().getOSStringSimple();
+ gDebugInfo["OSInfo"] = LLOSInfo::instance().getOSStringSimple();
// The user is not logged on yet, but record the current grid choice login url
// which may have been the intended grid.
@@ -3418,8 +3486,8 @@ void LLAppViewer::writeSystemInfo()
// query some system information
LL_INFOS("SystemInfo") << "CPU info:\n" << gSysCPU << LL_ENDL;
LL_INFOS("SystemInfo") << "Memory info:\n" << gSysMemory << LL_ENDL;
- LL_INFOS("SystemInfo") << "OS: " << getOSInfo().getOSStringSimple() << LL_ENDL;
- LL_INFOS("SystemInfo") << "OS info: " << getOSInfo() << LL_ENDL;
+ LL_INFOS("SystemInfo") << "OS: " << LLOSInfo::instance().getOSStringSimple() << LL_ENDL;
+ LL_INFOS("SystemInfo") << "OS info: " << LLOSInfo::instance() << LL_ENDL;
gDebugInfo["SettingsFilename"] = gSavedSettings.getString("ClientSettingsFile");
gDebugInfo["ViewerExePath"] = gDirUtilp->getExecutablePathAndName();
@@ -3451,7 +3519,7 @@ void getFileList()
if ( ( iter->length() > 30 ) && (iter->rfind(".dmp") == (iter->length()-4) ) )
{
std::string fullname = pathname + *iter;
- std::ifstream fdat( fullname.c_str(), std::ifstream::binary);
+ llifstream fdat( fullname.c_str(), std::ifstream::binary);
if (fdat)
{
char buf[5];
@@ -4138,6 +4206,7 @@ bool LLAppViewer::initCache()
if (gSavedSettings.getBOOL("PurgeCacheOnStartup") ||
gSavedSettings.getBOOL("PurgeCacheOnNextStartup"))
{
+ LL_INFOS("AppCache") << "Startup cache purge requested: " << (gSavedSettings.getBOOL("PurgeCacheOnStartup") ? "ALWAYS" : "ONCE") << LL_ENDL;
gSavedSettings.setBOOL("PurgeCacheOnNextStartup", false);
mPurgeCache = true;
// STORM-1141 force purgeAllTextures to get called to prevent a crash here. -brad
@@ -4152,6 +4221,7 @@ bool LLAppViewer::initCache()
std::string new_cache_location = gSavedSettings.getString("NewCacheLocation");
if (new_cache_location != cache_location)
{
+ LL_INFOS("AppCache") << "Cache location changed, cache needs purging" << LL_ENDL;
gDirUtilp->setCacheDir(gSavedSettings.getString("CacheLocation"));
purgeCache(); // purge old cache
gSavedSettings.setString("CacheLocation", new_cache_location);
@@ -4177,23 +4247,15 @@ bool LLAppViewer::initCache()
// Init the texture cache
// Allocate 80% of the cache size for textures
const S32 MB = 1024 * 1024;
- const S64 MIN_CACHE_SIZE = 64 * MB;
+ const S64 MIN_CACHE_SIZE = 256 * MB;
const S64 MAX_CACHE_SIZE = 9984ll * MB;
const S64 MAX_VFS_SIZE = 1024 * MB; // 1 GB
S64 cache_size = (S64)(gSavedSettings.getU32("CacheSize")) * MB;
cache_size = llclamp(cache_size, MIN_CACHE_SIZE, MAX_CACHE_SIZE);
- S64 texture_cache_size = ((cache_size * 8) / 10);
- S64 vfs_size = cache_size - texture_cache_size;
-
- if (vfs_size > MAX_VFS_SIZE)
- {
- // Give the texture cache more space, since the VFS can't be bigger than 1GB.
- // This happens when the user's CacheSize setting is greater than 5GB.
- vfs_size = MAX_VFS_SIZE;
- texture_cache_size = cache_size - MAX_VFS_SIZE;
- }
+ S64 vfs_size = llmin((S64)((cache_size * 2) / 10), MAX_VFS_SIZE);
+ S64 texture_cache_size = cache_size - vfs_size;
S64 extra = LLAppViewer::getTextureCache()->initCache(LL_PATH_CACHE, texture_cache_size, texture_cache_mismatch);
texture_cache_size -= extra;
@@ -5366,6 +5428,19 @@ void LLAppViewer::disconnectViewer()
LLUrlEntryParcel::setDisconnected(gDisconnected);
}
+bool LLAppViewer::onChangeFrameLimit(LLSD const & evt)
+{
+ if (evt.asInteger() > 0)
+ {
+ mMinMicroSecPerFrame = 1000000 / evt.asInteger();
+ }
+ else
+ {
+ mMinMicroSecPerFrame = 0;
+ }
+ return false;
+}
+
void LLAppViewer::forceErrorLLError()
{
LL_ERRS() << "This is a deliberate llerror" << LL_ENDL;
diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h
index c4782ed216..75ce1b5524 100644
--- a/indra/newview/llappviewer.h
+++ b/indra/newview/llappviewer.h
@@ -97,11 +97,10 @@ public:
void writeDebugInfo(bool isStatic=true);
- const LLOSInfo& getOSInfo() const { return mSysOSInfo; }
-
void setServerReleaseNotesURL(const std::string& url) { mServerReleaseNotesURL = url; }
LLSD getViewerInfo() const;
std::string getViewerInfoString() const;
+ std::string getShortViewerInfoString() const;
// Report true if under the control of a debugger. A null-op default.
virtual bool beingDebugged() { return false; }
@@ -253,6 +252,8 @@ private:
void sendLogoutRequest();
void disconnectViewer();
+ bool onChangeFrameLimit(LLSD const & evt);
+
// *FIX: the app viewer class should be some sort of singleton, no?
// Perhaps its child class is the singleton and this should be an abstract base.
static LLAppViewer* sInstance;
@@ -265,8 +266,6 @@ private:
std::string mLogoutMarkerFileName;
LLAPRFile mLogoutMarkerFile; // A file created to indicate the app is running.
-
- LLOSInfo mSysOSInfo;
bool mReportedCrash;
std::string mServerReleaseNotesURL;
@@ -312,6 +311,8 @@ private:
LLAppCoreHttp mAppCoreHttp;
bool mIsFirstRun;
+ U64 mMinMicroSecPerFrame; // frame throttling
+
};
@@ -353,7 +354,6 @@ extern F32SecondsImplicit gFrameTimeSeconds; // Loses msec precision after ~4
extern F32SecondsImplicit gFrameIntervalSeconds; // Elapsed time between current and previous gFrameTimeSeconds
extern F32 gFPSClamped; // Frames per second, smoothed, weighted toward last frame
extern F32 gFrameDTClamped;
-extern U32 gFrameStalls;
extern LLTimer gRenderStartTime;
extern LLFrameTimer gForegroundTime;
diff --git a/indra/newview/llappviewerwin32.cpp b/indra/newview/llappviewerwin32.cpp
index d0093e6951..48b3a1c485 100644
--- a/indra/newview/llappviewerwin32.cpp
+++ b/indra/newview/llappviewerwin32.cpp
@@ -680,10 +680,10 @@ void LLAppViewerWin32::initCrashReporting(bool reportFreeze)
PROCESS_INFORMATION processInfo;
std::wstring exe_wstr;
- exe_wstr=wstringize(exe_path);
+ exe_wstr = utf8str_to_utf16str(exe_path);
std::wstring arg_wstr;
- arg_wstr=wstringize(arg_str);
+ arg_wstr = utf8str_to_utf16str(arg_str);
LL_INFOS("CrashReport") << "Creating crash reporter process " << exe_path << " with params: " << arg_str << LL_ENDL;
if(CreateProcess(exe_wstr.c_str(),
diff --git a/indra/newview/llconversationmodel.h b/indra/newview/llconversationmodel.h
index af7b50802c..3868bafae4 100644
--- a/indra/newview/llconversationmodel.h
+++ b/indra/newview/llconversationmodel.h
@@ -70,6 +70,9 @@ public:
virtual const std::string& getName() const { return mName; }
virtual const std::string& getDisplayName() const { return mName; }
virtual const std::string& getSearchableName() const { return mName; }
+ virtual std::string getSearchableDescription() const { return LLStringUtil::null; }
+ virtual std::string getSearchableCreatorName() const { return LLStringUtil::null; }
+ virtual std::string getSearchableUUIDString() const {return LLStringUtil::null;}
virtual const LLUUID& getUUID() const { return mUUID; }
virtual time_t getCreationDate() const { return 0; }
virtual LLPointer<LLUIImage> getIcon() const { return NULL; }
diff --git a/indra/newview/llestateinfomodel.cpp b/indra/newview/llestateinfomodel.cpp
index e422581129..e56a67f8d1 100644
--- a/indra/newview/llestateinfomodel.cpp
+++ b/indra/newview/llestateinfomodel.cpp
@@ -116,7 +116,7 @@ void LLEstateInfoModel::notifyCommit()
// tries to send estate info using a cap; returns true if it succeeded
bool LLEstateInfoModel::commitEstateInfoCaps()
{
- std::string url = gAgent.getRegion()->getCapability("EstateChangeInfo");
+ std::string url = gAgent.getRegionCapability("EstateChangeInfo");
if (url.empty())
{
diff --git a/indra/newview/llfasttimerview.cpp b/indra/newview/llfasttimerview.cpp
index 91501ccb1f..9219dd0279 100644
--- a/indra/newview/llfasttimerview.cpp
+++ b/indra/newview/llfasttimerview.cpp
@@ -463,7 +463,7 @@ void LLFastTimerView::exportCharts(const std::string& base, const std::string& t
{ //read base log into memory
S32 i = 0;
- std::ifstream is(base.c_str());
+ llifstream is(base.c_str());
while (!is.eof() && LLSDParser::PARSE_FAILURE != LLSDSerialize::fromXML(cur, is))
{
base_data[i++] = cur;
@@ -476,7 +476,7 @@ void LLFastTimerView::exportCharts(const std::string& base, const std::string& t
{ //read current log into memory
S32 i = 0;
- std::ifstream is(target.c_str());
+ llifstream is(target.c_str());
while (!is.eof() && LLSDParser::PARSE_FAILURE != LLSDSerialize::fromXML(cur, is))
{
cur_data[i++] = cur;
@@ -821,8 +821,8 @@ LLSD LLFastTimerView::analyzePerformanceLogDefault(std::istream& is)
void LLFastTimerView::doAnalysisDefault(std::string baseline, std::string target, std::string output)
{
// Open baseline and current target, exit if one is inexistent
- std::ifstream base_is(baseline.c_str());
- std::ifstream target_is(target.c_str());
+ llifstream base_is(baseline.c_str());
+ llifstream target_is(target.c_str());
if (!base_is.is_open() || !target_is.is_open())
{
LL_WARNS() << "'-analyzeperformance' error : baseline or current target file inexistent" << LL_ENDL;
@@ -840,7 +840,7 @@ void LLFastTimerView::doAnalysisDefault(std::string baseline, std::string target
target_is.close();
//output comparison
- std::ofstream os(output.c_str());
+ llofstream os(output.c_str());
LLSD::Real session_time = current["SessionTime"].asReal();
os <<
diff --git a/indra/newview/llfeaturemanager.cpp b/indra/newview/llfeaturemanager.cpp
index 3c50810129..ce949fa1bf 100644
--- a/indra/newview/llfeaturemanager.cpp
+++ b/indra/newview/llfeaturemanager.cpp
@@ -496,7 +496,7 @@ void LLFeatureManager::fetchFeatureTableCoro(std::string tableName)
#if LL_WINDOWS
- std::string os_string = LLAppViewer::instance()->getOSInfo().getOSStringSimple();
+ std::string os_string = LLOSInfo::instance().getOSStringSimple();
std::string filename;
if (os_string.find("Microsoft Windows XP") == 0)
@@ -777,7 +777,7 @@ void LLFeatureManager::applyBaseMasks()
}
#if LL_DARWIN
- const LLOSInfo& osInfo = LLAppViewer::instance()->getOSInfo();
+ const LLOSInfo& osInfo = LLOSInfo::instance();
if (osInfo.mMajorVer == 10 && osInfo.mMinorVer < 7)
{
maskFeatures("OSX_10_6_8");
diff --git a/indra/newview/llflexibleobject.cpp b/indra/newview/llflexibleobject.cpp
index b6e61f83b1..e075a311c2 100644
--- a/indra/newview/llflexibleobject.cpp
+++ b/indra/newview/llflexibleobject.cpp
@@ -43,9 +43,9 @@
#include "llworld.h"
#include "llvoavatar.h"
+static const F32 SEC_PER_FLEXI_FRAME = 1.f / 60.f; // 60 flexi updates per second
/*static*/ F32 LLVolumeImplFlexible::sUpdateFactor = 1.0f;
std::vector<LLVolumeImplFlexible*> LLVolumeImplFlexible::sInstanceList;
-std::vector<S32> LLVolumeImplFlexible::sUpdateDelay;
static LLTrace::BlockTimerStatHandle FTM_FLEXIBLE_REBUILD("Rebuild");
static LLTrace::BlockTimerStatHandle FTM_DO_FLEXIBLE_UPDATE("Flexible Update");
@@ -56,7 +56,10 @@ static LLTrace::BlockTimerStatHandle FTM_DO_FLEXIBLE_UPDATE("Flexible Update");
// constructor
//-----------------------------------------------
LLVolumeImplFlexible::LLVolumeImplFlexible(LLViewerObject* vo, LLFlexibleObjectData* attributes) :
- mVO(vo), mAttributes(attributes)
+ mVO(vo),
+ mAttributes(attributes),
+ mLastFrameNum(0),
+ mLastUpdatePeriod(0)
{
static U32 seed = 0;
mID = seed++;
@@ -64,7 +67,6 @@ LLVolumeImplFlexible::LLVolumeImplFlexible(LLViewerObject* vo, LLFlexibleObjectD
mUpdated = FALSE;
mInitializedRes = -1;
mSimulateRes = 0;
- mFrameNum = 0;
mCollisionSphereRadius = 0.f;
mRenderRes = -1;
@@ -75,7 +77,6 @@ LLVolumeImplFlexible::LLVolumeImplFlexible(LLViewerObject* vo, LLFlexibleObjectD
mInstanceIndex = sInstanceList.size();
sInstanceList.push_back(this);
- sUpdateDelay.push_back(0);
}//-----------------------------------------------
LLVolumeImplFlexible::~LLVolumeImplFlexible()
@@ -86,28 +87,28 @@ LLVolumeImplFlexible::~LLVolumeImplFlexible()
{
sInstanceList[mInstanceIndex] = sInstanceList[end_idx];
sInstanceList[mInstanceIndex]->mInstanceIndex = mInstanceIndex;
- sUpdateDelay[mInstanceIndex] = sUpdateDelay[end_idx];
}
sInstanceList.pop_back();
- sUpdateDelay.pop_back();
}
//static
void LLVolumeImplFlexible::updateClass()
{
- std::vector<S32>::iterator delay_iter = sUpdateDelay.begin();
+ LL_RECORD_BLOCK_TIME(FTM_DO_FLEXIBLE_UPDATE);
+ U64 virtual_frame_num = LLTimer::getElapsedSeconds() / SEC_PER_FLEXI_FRAME;
for (std::vector<LLVolumeImplFlexible*>::iterator iter = sInstanceList.begin();
iter != sInstanceList.end();
++iter)
{
- --(*delay_iter);
- if (*delay_iter <= 0)
+ // Note: by now update period might have changed
+ if ((*iter)->mRenderRes == -1
+ || (*iter)->mLastFrameNum + (*iter)->mLastUpdatePeriod <= virtual_frame_num
+ || (*iter)->mLastFrameNum > virtual_frame_num) //time issues, overflow
{
(*iter)->doIdleUpdate();
}
- ++delay_iter;
}
}
@@ -334,15 +335,12 @@ void LLVolumeImplFlexible::updateRenderRes()
// updated every time step. In the future, perhaps there could be an
// optimization similar to what Havok does for objects that are stationary.
//---------------------------------------------------------------------------------
-static LLTrace::BlockTimerStatHandle FTM_FLEXIBLE_UPDATE("Update Flexies");
void LLVolumeImplFlexible::doIdleUpdate()
{
LLDrawable* drawablep = mVO->mDrawable;
if (drawablep)
{
- //LL_RECORD_BLOCK_TIME(FTM_FLEXIBLE_UPDATE);
-
//ensure drawable is active
drawablep->makeActive();
@@ -354,15 +352,20 @@ void LLVolumeImplFlexible::doIdleUpdate()
{
updateRenderRes();
gPipeline.markRebuild(drawablep, LLDrawable::REBUILD_POSITION, FALSE);
- sUpdateDelay[mInstanceIndex] = 0;
}
else
{
F32 pixel_area = mVO->getPixelArea();
+ // Note: Flexies afar will be rarely updated, closer ones will be updated more frequently.
+ // But frequency differences are extremely noticeable, so consider modifying update factor,
+ // or at least clamping value a bit more from both sides.
U32 update_period = (U32) (llmax((S32) (LLViewerCamera::getInstance()->getScreenPixelArea()*0.01f/(pixel_area*(sUpdateFactor+1.f))),0)+1);
// MAINT-1890 Clamp the update period to ensure that the update_period is no greater than 32 frames
- update_period = llclamp(update_period, 0U, 32U);
+ update_period = llclamp(update_period, 1U, 32U);
+
+ // We control how fast flexies update, buy splitting updates among frames
+ U64 virtual_frame_num = LLTimer::getElapsedSeconds() / SEC_PER_FLEXI_FRAME;
if (visible)
{
@@ -370,42 +373,44 @@ void LLVolumeImplFlexible::doIdleUpdate()
pixel_area > 256.f)
{
U32 id;
-
if (mVO->isRootEdit())
{
id = mID;
}
else
{
- LLVOVolume* parent = (LLVOVolume*) mVO->getParent();
+ LLVOVolume* parent = (LLVOVolume*)mVO->getParent();
id = parent->getVolumeInterfaceID();
}
- if (mVO->isRootEdit())
- {
- id = mID;
- }
- else
- {
- LLVOVolume* parent = (LLVOVolume*) mVO->getParent();
- id = parent->getVolumeInterfaceID();
- }
- if ((LLDrawable::getCurrentFrame()+id)%update_period == 0)
- {
- sUpdateDelay[mInstanceIndex] = (S32) update_period-1;
+ // Throttle flexies and spread load by preventing flexies from updating in same frame
+ // Shows how many frames we need to wait before next update
+ U64 throttling_delay = (virtual_frame_num + id) % update_period;
- updateRenderRes();
+ if ((throttling_delay == 0 && mLastFrameNum < virtual_frame_num) //one or more virtual frames per frame
+ || (mLastFrameNum + update_period < virtual_frame_num)) // missed virtual frame
+ {
+ // We need mLastFrameNum to compensate for 'unreliable time' and to filter 'duplicate' frames
+ // If happened too late, subtract throttling_delay (it is zero otherwise)
+ mLastFrameNum = virtual_frame_num - throttling_delay;
+
+ // Store update period for updateClass()
+ // Note: Consider substituting update_period with mLastUpdatePeriod everywhere.
+ mLastUpdatePeriod = update_period;
+
+ updateRenderRes();
- gPipeline.markRebuild(drawablep, LLDrawable::REBUILD_POSITION, FALSE);
+ gPipeline.markRebuild(drawablep, LLDrawable::REBUILD_POSITION, FALSE);
+ }
+ }
}
- }
- }
else
{
- sUpdateDelay[mInstanceIndex] = (S32) update_period;
- }
-}
+ mLastFrameNum = virtual_frame_num;
+ mLastUpdatePeriod = update_period;
+ }
+ }
}
}
diff --git a/indra/newview/llflexibleobject.h b/indra/newview/llflexibleobject.h
index a00551df8e..9383ab03ae 100644
--- a/indra/newview/llflexibleobject.h
+++ b/indra/newview/llflexibleobject.h
@@ -72,7 +72,6 @@ class LLVolumeImplFlexible : public LLVolumeInterface
{
private:
static std::vector<LLVolumeImplFlexible*> sInstanceList;
- static std::vector<S32> sUpdateDelay;
S32 mInstanceIndex;
public:
@@ -133,7 +132,8 @@ private:
S32 mInitializedRes;
S32 mSimulateRes;
S32 mRenderRes;
- U32 mFrameNum;
+ U64 mLastFrameNum;
+ U32 mLastUpdatePeriod;
LLVector3 mCollisionSpherePosition;
F32 mCollisionSphereRadius;
U32 mID;
diff --git a/indra/newview/llfloateravatarpicker.cpp b/indra/newview/llfloateravatarpicker.cpp
index c394eb815b..c5561fe011 100644
--- a/indra/newview/llfloateravatarpicker.cpp
+++ b/indra/newview/llfloateravatarpicker.cpp
@@ -496,6 +496,18 @@ void LLFloaterAvatarPicker::find()
std::string text = getChild<LLUICtrl>("Edit")->getValue().asString();
+ size_t separator_index = text.find_first_of(" ._");
+ if (separator_index != text.npos)
+ {
+ std::string first = text.substr(0, separator_index);
+ std::string last = text.substr(separator_index+1, text.npos);
+ LLStringUtil::trim(last);
+ if("Resident" == last)
+ {
+ text = first;
+ }
+ }
+
mQueryID.generate();
std::string url;
@@ -739,12 +751,13 @@ void LLFloaterAvatarPicker::processResponse(const LLUUID& query_id, const LLSD&
if (search_results->isEmpty())
{
- LLStringUtil::format_map_t map;
- map["[TEXT]"] = getChild<LLUICtrl>("Edit")->getValue().asString();
+ std::string name = "'" + getChild<LLUICtrl>("Edit")->getValue().asString() + "'";
LLSD item;
item["id"] = LLUUID::null;
item["columns"][0]["column"] = "name";
- item["columns"][0]["value"] = getString("not_found", map);
+ item["columns"][0]["value"] = name;
+ item["columns"][1]["column"] = "username";
+ item["columns"][1]["value"] = getString("not_found_text");
search_results->addElement(item);
search_results->setEnabled(false);
getChildView("ok_btn")->setEnabled(false);
diff --git a/indra/newview/llfloateravatarrendersettings.cpp b/indra/newview/llfloateravatarrendersettings.cpp
index 2bae7d63aa..8bdb70a20d 100644
--- a/indra/newview/llfloateravatarrendersettings.cpp
+++ b/indra/newview/llfloateravatarrendersettings.cpp
@@ -27,11 +27,13 @@
#include "llfloateravatarrendersettings.h"
+#include "llagent.h"
#include "llavatarnamecache.h"
#include "llfloateravatarpicker.h"
#include "llfiltereditor.h"
#include "llfloaterreg.h"
#include "llnamelistctrl.h"
+#include "llnotificationsutil.h"
#include "llmenugl.h"
#include "lltrans.h"
#include "llviewerobjectlist.h"
@@ -268,6 +270,11 @@ void LLFloaterAvatarRenderSettings::onClickAdd(const LLSD& userdata)
void LLFloaterAvatarRenderSettings::callbackAvatarPicked(const uuid_vec_t& ids, S32 visual_setting)
{
if (ids.empty()) return;
+ if(ids[0] == gAgentID)
+ {
+ LLNotificationsUtil::add("AddSelfRenderExceptions");
+ return;
+ }
setAvatarRenderSetting(ids[0], visual_setting);
}
diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp
index 4352909706..88b3fb7b96 100644
--- a/indra/newview/llfloaterland.cpp
+++ b/indra/newview/llfloaterland.cpp
@@ -503,7 +503,7 @@ BOOL LLPanelLandGeneral::postBuild()
// note: on region change this will not be re checked, should not matter on Agni as
// 99% of the time all regions will return the same caps. In case of an erroneous setting
// to enabled the floater will just throw an error when trying to get it's cap
- std::string url = gAgent.getRegion()->getCapability("LandResources");
+ std::string url = gAgent.getRegionCapability("LandResources");
if (!url.empty())
{
if(mBtnScriptLimits)
@@ -2181,17 +2181,8 @@ void LLPanelLandOptions::refreshSearch()
&& region
&& !(region->getRegionFlag(REGION_FLAGS_BLOCK_PARCEL_SEARCH));
- // There is a bug with this panel whereby the Show Directory bit can be
- // slammed off by the Region based on an override. Since this data is cached
- // locally the change will not reflect in the panel, which could cause confusion
- // A workaround for this is to flip the bit off in the locally cached version
- // when we detect a mismatch case.
- if(!can_change && parcel->getParcelFlag(PF_SHOW_DIRECTORY))
- {
- parcel->setParcelFlag(PF_SHOW_DIRECTORY, FALSE);
- }
BOOL show_directory = parcel->getParcelFlag(PF_SHOW_DIRECTORY);
- mCheckShowDirectory ->set(show_directory);
+ mCheckShowDirectory->set(show_directory);
// Set by string in case the order in UI doesn't match the order by index.
LLParcel::ECategory cat = parcel->getCategory();
diff --git a/indra/newview/llfloatermodeluploadbase.cpp b/indra/newview/llfloatermodeluploadbase.cpp
index 7cdfd56d9a..4427e913e3 100644
--- a/indra/newview/llfloatermodeluploadbase.cpp
+++ b/indra/newview/llfloatermodeluploadbase.cpp
@@ -41,7 +41,7 @@ LLFloaterModelUploadBase::LLFloaterModelUploadBase(const LLSD& key)
void LLFloaterModelUploadBase::requestAgentUploadPermissions()
{
std::string capability = "MeshUploadFlag";
- std::string url = gAgent.getRegion()->getCapability(capability);
+ std::string url = gAgent.getRegionCapability(capability);
if (!url.empty())
{
diff --git a/indra/newview/llfloaterregiondebugconsole.cpp b/indra/newview/llfloaterregiondebugconsole.cpp
index 271fb2f9a3..e817589622 100644
--- a/indra/newview/llfloaterregiondebugconsole.cpp
+++ b/indra/newview/llfloaterregiondebugconsole.cpp
@@ -116,11 +116,11 @@ BOOL LLFloaterRegionDebugConsole::postBuild()
mOutput = getChild<LLTextEditor>("region_debug_console_output");
- std::string url = gAgent.getRegion()->getCapability("SimConsoleAsync");
+ std::string url = gAgent.getRegionCapability("SimConsoleAsync");
if (url.empty())
{
// Fall back to see if the old API is supported.
- url = gAgent.getRegion()->getCapability("SimConsole");
+ url = gAgent.getRegionCapability("SimConsole");
if (url.empty())
{
mOutput->appendText(
@@ -139,11 +139,11 @@ void LLFloaterRegionDebugConsole::onInput(LLUICtrl* ctrl, const LLSD& param)
LLLineEditor* input = static_cast<LLLineEditor*>(ctrl);
std::string text = input->getText() + "\n";
- std::string url = gAgent.getRegion()->getCapability("SimConsoleAsync");
+ std::string url = gAgent.getRegionCapability("SimConsoleAsync");
if (url.empty())
{
// Fall back to the old API
- url = gAgent.getRegion()->getCapability("SimConsole");
+ url = gAgent.getRegionCapability("SimConsole");
if (url.empty())
{
text += CONSOLE_UNAVAILABLE + PROMPT;
diff --git a/indra/newview/llfloaterregioninfo.cpp b/indra/newview/llfloaterregioninfo.cpp
index c330c2ae47..af68a2aae1 100644
--- a/indra/newview/llfloaterregioninfo.cpp
+++ b/indra/newview/llfloaterregioninfo.cpp
@@ -238,7 +238,7 @@ BOOL LLFloaterRegionInfo::postBuild()
return TRUE;
}
- if(!gAgent.getRegion()->getCapability("RegionExperiences").empty())
+ if(!gAgent.getRegionCapability("RegionExperiences").empty())
{
panel = new LLPanelRegionExperiences;
mInfoPanels.push_back(panel);
@@ -879,7 +879,7 @@ bool LLPanelRegionGeneralInfo::onMessageCommit(const LLSD& notification, const L
void LLFloaterRegionInfo::requestMeshRezInfo()
{
- std::string sim_console_url = gAgent.getRegion()->getCapability("SimConsoleAsync");
+ std::string sim_console_url = gAgent.getRegionCapability("SimConsoleAsync");
if (!sim_console_url.empty())
{
@@ -907,7 +907,7 @@ BOOL LLPanelRegionGeneralInfo::sendUpdate()
// First try using a Cap. If that fails use the old method.
LLSD body;
- std::string url = gAgent.getRegion()->getCapability("DispatchRegionInfo");
+ std::string url = gAgent.getRegionCapability("DispatchRegionInfo");
if (!url.empty())
{
body["block_terraform"] = getChild<LLUICtrl>("block_terraform_check")->getValue();
diff --git a/indra/newview/llfloaterreporter.cpp b/indra/newview/llfloaterreporter.cpp
index 515c2b0c4b..c0f5e63623 100644
--- a/indra/newview/llfloaterreporter.cpp
+++ b/indra/newview/llfloaterreporter.cpp
@@ -438,8 +438,8 @@ void LLFloaterReporter::onClickSend(void *userdata)
LLUploadDialog::modalUploadDialog(LLTrans::getString("uploading_abuse_report"));
// *TODO don't upload image if checkbox isn't checked
- std::string url = gAgent.getRegion()->getCapability("SendUserReport");
- std::string sshot_url = gAgent.getRegion()->getCapability("SendUserReportWithScreenshot");
+ std::string url = gAgent.getRegionCapability("SendUserReport");
+ std::string sshot_url = gAgent.getRegionCapability("SendUserReportWithScreenshot");
if(!url.empty() || !sshot_url.empty())
{
self->sendReportViaCaps(url, sshot_url, self->gatherReport());
diff --git a/indra/newview/llfloaterscriptlimits.cpp b/indra/newview/llfloaterscriptlimits.cpp
index 5f0587a286..21df769d0c 100644
--- a/indra/newview/llfloaterscriptlimits.cpp
+++ b/indra/newview/llfloaterscriptlimits.cpp
@@ -112,24 +112,16 @@ BOOL LLFloaterScriptLimits::postBuild()
}
// contruct the panels
- std::string land_url = gAgent.getRegion()->getCapability("LandResources");
- if (!land_url.empty())
- {
- LLPanelScriptLimitsRegionMemory* panel_memory;
- panel_memory = new LLPanelScriptLimitsRegionMemory;
- mInfoPanels.push_back(panel_memory);
- panel_memory->buildFromFile( "panel_script_limits_region_memory.xml");
- mTab->addTabPanel(panel_memory);
- }
-
- std::string attachment_url = gAgent.getRegion()->getCapability("AttachmentResources");
- if (!attachment_url.empty())
- {
- LLPanelScriptLimitsAttachment* panel_attachments = new LLPanelScriptLimitsAttachment;
- mInfoPanels.push_back(panel_attachments);
- panel_attachments->buildFromFile("panel_script_limits_my_avatar.xml");
- mTab->addTabPanel(panel_attachments);
- }
+ LLPanelScriptLimitsRegionMemory* panel_memory = new LLPanelScriptLimitsRegionMemory;
+ mInfoPanels.push_back(panel_memory);
+ panel_memory->buildFromFile( "panel_script_limits_region_memory.xml");
+ mTab->addTabPanel(panel_memory);
+
+ LLPanelScriptLimitsAttachment* panel_attachments = new LLPanelScriptLimitsAttachment;
+ mInfoPanels.push_back(panel_attachments);
+ panel_attachments->buildFromFile("panel_script_limits_my_avatar.xml");
+ mTab->addTabPanel(panel_attachments);
+
if(mInfoPanels.size() > 0)
{
@@ -195,6 +187,8 @@ LLPanelScriptLimitsRegionMemory::~LLPanelScriptLimitsRegionMemory()
BOOL LLPanelScriptLimitsRegionMemory::getLandScriptResources()
{
+ if (!gAgent.getRegion()) return FALSE;
+
LLSD body;
std::string url = gAgent.getRegion()->getCapability("LandResources");
if (!url.empty())
@@ -718,10 +712,9 @@ BOOL LLPanelScriptLimitsRegionMemory::StartRequestChain()
LLParcel* parcel = instance->getCurrentSelectedParcel();
LLViewerRegion* region = LLViewerParcelMgr::getInstance()->getSelectionRegion();
- LLUUID current_region_id = gAgent.getRegion()->getRegionID();
-
if ((region) && (parcel))
{
+ LLUUID current_region_id = gAgent.getRegion()->getRegionID();
LLVector3 parcel_center = parcel->getCenterpoint();
region_id = region->getRegionID();
@@ -982,6 +975,8 @@ void LLPanelScriptLimitsRegionMemory::onClickReturn(void* userdata)
BOOL LLPanelScriptLimitsAttachment::requestAttachmentDetails()
{
+ if (!gAgent.getRegion()) return FALSE;
+
LLSD body;
std::string url = gAgent.getRegion()->getCapability("AttachmentResources");
if (!url.empty())
diff --git a/indra/newview/llfloatersidepanelcontainer.cpp b/indra/newview/llfloatersidepanelcontainer.cpp
index 8b3cfa7fd5..64ddeff1b0 100644
--- a/indra/newview/llfloatersidepanelcontainer.cpp
+++ b/indra/newview/llfloatersidepanelcontainer.cpp
@@ -74,7 +74,10 @@ void LLFloaterSidePanelContainer::closeFloater(bool app_quitting)
{
edit_wearable_ptr->onClose();
}
- panel_appearance->showOutfitsInventoryPanel();
+ if(!app_quitting)
+ {
+ panel_appearance->showOutfitsInventoryPanel();
+ }
}
}
}
diff --git a/indra/newview/llfloatersnapshot.cpp b/indra/newview/llfloatersnapshot.cpp
index ba3106913c..2d0002dcd8 100644
--- a/indra/newview/llfloatersnapshot.cpp
+++ b/indra/newview/llfloatersnapshot.cpp
@@ -314,8 +314,8 @@ void LLFloaterSnapshot::Impl::updateControls(LLFloaterSnapshotBase* floater)
}
else
{
- width_ctrl->setMaxValue(6016);
- height_ctrl->setMaxValue(6016);
+ width_ctrl->setMaxValue(MAX_SNAPSHOT_IMAGE_SIZE);
+ height_ctrl->setMaxValue(MAX_SNAPSHOT_IMAGE_SIZE);
}
}
diff --git a/indra/newview/llfolderviewmodelinventory.cpp b/indra/newview/llfolderviewmodelinventory.cpp
index e9f80b795a..d53cf2a9a3 100644
--- a/indra/newview/llfolderviewmodelinventory.cpp
+++ b/indra/newview/llfolderviewmodelinventory.cpp
@@ -258,6 +258,15 @@ bool LLFolderViewModelItemInventory::filter( LLFolderViewFilter& filter)
{
// This is where filter check on the item done (CHUI-849)
const bool passed_filter = filter.check(this);
+ if (passed_filter && mChildren.empty()) // Update the latest filter generation for empty folders
+ {
+ LLFolderViewModelItemInventory* view_model = this;
+ while (view_model && view_model->mMostFilteredDescendantGeneration < filter_generation)
+ {
+ view_model->mMostFilteredDescendantGeneration = filter_generation;
+ view_model = static_cast<LLFolderViewModelItemInventory*>(view_model->mParent);
+ }
+ }
setPassedFilter(passed_filter, filter_generation, filter.getStringMatchOffset(this), filter.getFilterStringSize());
continue_filtering = !filter.isTimedOut();
}
diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp
index feef726630..d62b6300cb 100644
--- a/indra/newview/llimview.cpp
+++ b/indra/newview/llimview.cpp
@@ -3671,8 +3671,7 @@ public:
}
//K now we want to accept the invitation
- std::string url = gAgent.getRegion()->getCapability(
- "ChatSessionRequest");
+ std::string url = gAgent.getRegionCapability("ChatSessionRequest");
if ( url != "" )
{
diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp
index 2751631a59..3f18039376 100644
--- a/indra/newview/llinventorybridge.cpp
+++ b/indra/newview/llinventorybridge.cpp
@@ -204,6 +204,58 @@ const std::string& LLInvFVBridge::getDisplayName() const
return mDisplayName;
}
+std::string LLInvFVBridge::getSearchableDescription() const
+{
+ const LLInventoryModel* model = getInventoryModel();
+ if (model)
+ {
+ const LLInventoryItem *item = model->getItem(mUUID);
+ if(item)
+ {
+ std::string desc = item->getDescription();
+ LLStringUtil::toUpper(desc);
+ return desc;
+ }
+ }
+ return LLStringUtil::null;
+}
+
+std::string LLInvFVBridge::getSearchableCreatorName() const
+{
+ const LLInventoryModel* model = getInventoryModel();
+ if (model)
+ {
+ const LLInventoryItem *item = model->getItem(mUUID);
+ if(item)
+ {
+ LLAvatarName av_name;
+ if (LLAvatarNameCache::get(item->getCreatorUUID(), &av_name))
+ {
+ std::string username = av_name.getUserName();
+ LLStringUtil::toUpper(username);
+ return username;
+ }
+ }
+ }
+ return LLStringUtil::null;
+}
+
+std::string LLInvFVBridge::getSearchableUUIDString() const
+{
+ const LLInventoryModel* model = getInventoryModel();
+ if (model)
+ {
+ const LLViewerInventoryItem *item = model->getItem(mUUID);
+ if(item && (item->getIsFullPerm() || gAgent.isGodlikeWithoutAdminMenuFakery()))
+ {
+ std::string uuid = item->getAssetUUID().asString();
+ LLStringUtil::toUpper(uuid);
+ return uuid;
+ }
+ }
+ return LLStringUtil::null;
+}
+
// Folders have full perms
PermissionMask LLInvFVBridge::getPermissionMask() const
{
@@ -828,6 +880,12 @@ void LLInvFVBridge::getClipboardEntries(bool show_asset_id,
{
disabled_items.push_back(std::string("Properties"));
}
+
+ LLInventoryPanel *active_panel = LLInventoryPanel::getActiveInventoryPanel(FALSE);
+ if (active_panel && (active_panel->getName() != "All Items"))
+ {
+ items.push_back(std::string("Show in Main Panel"));
+ }
}
void LLInvFVBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
@@ -1593,6 +1651,11 @@ void LLItemBridge::performAction(LLInventoryModel* model, std::string action)
gViewerWindow->getWindow()->copyTextToClipboard(utf8str_to_wstring(buffer));
return;
}
+ else if ("show_in_main_panel" == action)
+ {
+ LLInventoryPanel::openInventoryPanelAndSetSelection(TRUE, mUUID, TRUE);
+ return;
+ }
else if ("cut" == action)
{
cutToClipboard();
@@ -1813,13 +1876,19 @@ void LLItemBridge::buildDisplayName() const
{
mDisplayName.assign(LLStringUtil::null);
}
-
+ S32 old_length = mSearchableName.length();
+ S32 new_length = mDisplayName.length() + getLabelSuffix().length();
+
mSearchableName.assign(mDisplayName);
mSearchableName.append(getLabelSuffix());
LLStringUtil::toUpper(mSearchableName);
- //Name set, so trigger a sort
- if(mParent)
+ if ((old_length > new_length) && getInventoryFilter())
+ {
+ getInventoryFilter()->setModified(LLFolderViewFilter::FILTER_MORE_RESTRICTIVE);
+ }
+ //Name set, so trigger a sort
+ if(mParent)
{
mParent->requestSort();
}
@@ -3087,6 +3156,11 @@ void LLFolderBridge::performAction(LLInventoryModel* model, std::string action)
modifyOutfit(TRUE);
return;
}
+ else if ("show_in_main_panel" == action)
+ {
+ LLInventoryPanel::openInventoryPanelAndSetSelection(TRUE, mUUID, TRUE);
+ return;
+ }
else if ("cut" == action)
{
cutToClipboard();
diff --git a/indra/newview/llinventorybridge.h b/indra/newview/llinventorybridge.h
index e6fcb6be96..fd532c609c 100644
--- a/indra/newview/llinventorybridge.h
+++ b/indra/newview/llinventorybridge.h
@@ -94,6 +94,10 @@ public:
virtual const std::string& getDisplayName() const;
const std::string& getSearchableName() const { return mSearchableName; }
+ std::string getSearchableDescription() const;
+ std::string getSearchableCreatorName() const;
+ std::string getSearchableUUIDString() const;
+
virtual PermissionMask getPermissionMask() const;
virtual LLFolderType::EType getPreferredType() const;
virtual time_t getCreationDate() const;
diff --git a/indra/newview/llinventoryfilter.cpp b/indra/newview/llinventoryfilter.cpp
index 1433ea36bf..9193613e9f 100644
--- a/indra/newview/llinventoryfilter.cpp
+++ b/indra/newview/llinventoryfilter.cpp
@@ -29,6 +29,7 @@
#include "llinventoryfilter.h"
// viewer includes
+#include "llagent.h"
#include "llfolderviewmodel.h"
#include "llfolderviewitem.h"
#include "llinventorymodel.h"
@@ -76,10 +77,14 @@ LLInventoryFilter::LLInventoryFilter(const Params& p)
mFilterSubString(p.substring),
mCurrentGeneration(0),
mFirstRequiredGeneration(0),
- mFirstSuccessGeneration(0)
+ mFirstSuccessGeneration(0),
+ mSearchType(SEARCHTYPE_NAME),
+ mFilterCreatorType(FILTERCREATOR_ALL)
{
// copy mFilterOps into mDefaultFilterOps
markDefault();
+ mUsername = gAgentUsername;
+ LLStringUtil::toUpper(mUsername);
}
bool LLInventoryFilter::check(const LLFolderViewModelItem* item)
@@ -93,10 +98,29 @@ bool LLInventoryFilter::check(const LLFolderViewModelItem* item)
return true;
}
- bool passed = (mFilterSubString.size() ? listener->getSearchableName().find(mFilterSubString) != std::string::npos : true);
+ std::string desc = listener->getSearchableCreatorName();
+ switch(mSearchType)
+ {
+ case SEARCHTYPE_CREATOR:
+ desc = listener->getSearchableCreatorName();
+ break;
+ case SEARCHTYPE_DESCRIPTION:
+ desc = listener->getSearchableDescription();
+ break;
+ case SEARCHTYPE_UUID:
+ desc = listener->getSearchableUUIDString();
+ break;
+ case SEARCHTYPE_NAME:
+ default:
+ desc = listener->getSearchableName();
+ break;
+ }
+
+ bool passed = (mFilterSubString.size() ? desc.find(mFilterSubString) != std::string::npos : true);
passed = passed && checkAgainstFilterType(listener);
passed = passed && checkAgainstPermissions(listener);
passed = passed && checkAgainstFilterLinks(listener);
+ passed = passed && checkAgainstCreator(listener);
return passed;
}
@@ -245,6 +269,14 @@ bool LLInventoryFilter::checkAgainstFilterType(const LLFolderViewModelItemInvent
}
}
+ if(filterTypes & FILTERTYPE_WORN)
+ {
+ if (!get_is_item_worn(object_id))
+ {
+ return FALSE;
+ }
+ }
+
////////////////////////////////////////////////////////////////////////////////
// FILTERTYPE_UUID
// Pass if this item is the target UUID or if it links to the target UUID
@@ -453,6 +485,24 @@ bool LLInventoryFilter::checkAgainstFilterLinks(const LLFolderViewModelItemInven
return TRUE;
}
+bool LLInventoryFilter::checkAgainstCreator(const LLFolderViewModelItemInventory* listener) const
+{
+ if (!listener) return TRUE;
+ const BOOL is_folder = listener->getInventoryType() == LLInventoryType::IT_CATEGORY;
+ switch(mFilterCreatorType)
+ {
+ case FILTERCREATOR_SELF:
+ if(is_folder) return FALSE;
+ return (listener->getSearchableCreatorName() == mUsername);
+ case FILTERCREATOR_OTHERS:
+ if(is_folder) return FALSE;
+ return (listener->getSearchableCreatorName() != mUsername);
+ case FILTERCREATOR_ALL:
+ default:
+ return TRUE;
+ }
+}
+
const std::string& LLInventoryFilter::getFilterSubString(BOOL trim) const
{
return mFilterSubString;
@@ -460,7 +510,14 @@ const std::string& LLInventoryFilter::getFilterSubString(BOOL trim) const
std::string::size_type LLInventoryFilter::getStringMatchOffset(LLFolderViewModelItem* item) const
{
- return mFilterSubString.size() ? item->getSearchableName().find(mFilterSubString) : std::string::npos;
+ if (mSearchType == SEARCHTYPE_NAME)
+ {
+ return mFilterSubString.size() ? item->getSearchableName().find(mFilterSubString) : std::string::npos;
+ }
+ else
+ {
+ return std::string::npos;
+ }
}
bool LLInventoryFilter::isDefault() const
@@ -533,6 +590,24 @@ void LLInventoryFilter::updateFilterTypes(U64 types, U64& current_types)
}
}
+void LLInventoryFilter::setSearchType(ESearchType type)
+{
+ if(mSearchType != type)
+ {
+ mSearchType = type;
+ setModified();
+ }
+}
+
+void LLInventoryFilter::setFilterCreator(EFilterCreatorType type)
+{
+ if(mFilterCreatorType != type)
+ {
+ mFilterCreatorType = type;
+ setModified();
+ }
+}
+
void LLInventoryFilter::setFilterObjectTypes(U64 types)
{
updateFilterTypes(types, mFilterOps.mFilterObjectTypes);
@@ -556,6 +631,11 @@ void LLInventoryFilter::setFilterEmptySystemFolders()
mFilterOps.mFilterTypes |= FILTERTYPE_EMPTYFOLDERS;
}
+void LLInventoryFilter::setFilterWorn()
+{
+ mFilterOps.mFilterTypes |= FILTERTYPE_WORN;
+}
+
void LLInventoryFilter::setFilterMarketplaceActiveFolders()
{
mFilterOps.mFilterTypes |= FILTERTYPE_MARKETPLACE_ACTIVE;
diff --git a/indra/newview/llinventoryfilter.h b/indra/newview/llinventoryfilter.h
index eee36b7e40..01754ed023 100644
--- a/indra/newview/llinventoryfilter.h
+++ b/indra/newview/llinventoryfilter.h
@@ -57,7 +57,8 @@ public:
FILTERTYPE_MARKETPLACE_INACTIVE = 0x1 << 7, // pass if folder is a marketplace inactive folder
FILTERTYPE_MARKETPLACE_UNASSOCIATED = 0x1 << 8, // pass if folder is a marketplace non associated (no market ID) folder
FILTERTYPE_MARKETPLACE_LISTING_FOLDER = 0x1 << 9, // pass iff folder is a listing folder
- FILTERTYPE_NO_MARKETPLACE_ITEMS = 0x1 << 10 // pass iff folder is not under the marketplace
+ FILTERTYPE_NO_MARKETPLACE_ITEMS = 0x1 << 10, // pass iff folder is not under the marketplace
+ FILTERTYPE_WORN = 0x1 << 11, // pass if item is worn
};
enum EFilterDateDirection
@@ -82,6 +83,21 @@ public:
SO_FOLDERS_BY_WEIGHT = 0x1 << 3, // Force folder sort by weight, usually, amount of some elements in their descendents
};
+ enum ESearchType
+ {
+ SEARCHTYPE_NAME,
+ SEARCHTYPE_DESCRIPTION,
+ SEARCHTYPE_CREATOR,
+ SEARCHTYPE_UUID
+ };
+
+ enum EFilterCreatorType
+ {
+ FILTERCREATOR_ALL,
+ FILTERCREATOR_SELF,
+ FILTERCREATOR_OTHERS
+ };
+
struct FilterOps
{
struct DateRange : public LLInitParam::Block<DateRange>
@@ -176,12 +192,17 @@ public:
void setFilterUUID(const LLUUID &object_id);
void setFilterWearableTypes(U64 types);
void setFilterEmptySystemFolders();
+ void setFilterWorn();
void setFilterMarketplaceActiveFolders();
void setFilterMarketplaceInactiveFolders();
void setFilterMarketplaceUnassociatedFolders();
void setFilterMarketplaceListingFolders(bool select_only_listing_folders);
void setFilterNoMarketplaceFolder();
void updateFilterTypes(U64 types, U64& current_types);
+ void setSearchType(ESearchType type);
+ ESearchType getSearchType() { return mSearchType; }
+ void setFilterCreator(EFilterCreatorType type);
+ EFilterCreatorType getFilterCreator() { return mFilterCreatorType; }
void setFilterSubString(const std::string& string);
const std::string& getFilterSubString(BOOL trim = FALSE) const;
@@ -277,6 +298,7 @@ private:
bool checkAgainstPermissions(const class LLFolderViewModelItemInventory* listener) const;
bool checkAgainstPermissions(const LLInventoryItem* item) const;
bool checkAgainstFilterLinks(const class LLFolderViewModelItemInventory* listener) const;
+ bool checkAgainstCreator(const class LLFolderViewModelItemInventory* listener) const;
bool checkAgainstClipboard(const LLUUID& object_id) const;
FilterOps mFilterOps;
@@ -285,6 +307,7 @@ private:
std::string mFilterSubString;
std::string mFilterSubStringOrig;
+ std::string mUsername;
const std::string mName;
S32 mCurrentGeneration;
@@ -299,6 +322,9 @@ private:
std::string mFilterText;
std::string mEmptyLookupMessage;
+
+ ESearchType mSearchType;
+ EFilterCreatorType mFilterCreatorType;
};
#endif
diff --git a/indra/newview/llinventoryfunctions.cpp b/indra/newview/llinventoryfunctions.cpp
index d282240bfb..67ddd79230 100644
--- a/indra/newview/llinventoryfunctions.cpp
+++ b/indra/newview/llinventoryfunctions.cpp
@@ -2296,7 +2296,8 @@ void LLInventoryAction::doToSelected(LLInventoryModel* model, LLFolderView* root
if ("delete" == action)
{
static bool sDisplayedAtSession = false;
-
+ const LLUUID &marketplacelistings_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS, false);
+ bool marketplacelistings_item = false;
LLAllDescendentsPassedFilter f;
for (std::set<LLFolderViewItem*>::iterator it = selected_items.begin(); (it != selected_items.end()) && (f.allDescendentsPassedFilter()); ++it)
{
@@ -2304,9 +2305,15 @@ void LLInventoryAction::doToSelected(LLInventoryModel* model, LLFolderView* root
{
folder->applyFunctorRecursively(f);
}
+ LLFolderViewModelItemInventory * viewModel = dynamic_cast<LLFolderViewModelItemInventory *>((*it)->getViewModelItem());
+ if (viewModel && gInventory.isObjectDescendentOf(viewModel->getUUID(), marketplacelistings_id))
+ {
+ marketplacelistings_item = true;
+ break;
+ }
}
// Fall through to the generic confirmation if the user choose to ignore the specialized one
- if ( (!f.allDescendentsPassedFilter()) && (!LLNotifications::instance().getIgnored("DeleteFilteredItems")) )
+ if ( (!f.allDescendentsPassedFilter()) && !marketplacelistings_item && (!LLNotifications::instance().getIgnored("DeleteFilteredItems")) )
{
LLNotificationsUtil::add("DeleteFilteredItems", LLSD(), LLSD(), boost::bind(&LLInventoryAction::onItemsRemovalConfirmation, _1, _2, root->getHandle()));
}
diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp
index f9c91312ee..8f93796ec7 100644
--- a/indra/newview/llinventorypanel.cpp
+++ b/indra/newview/llinventorypanel.cpp
@@ -351,6 +351,11 @@ void LLInventoryPanel::setFilterTypes(U64 types, LLInventoryFilter::EFilterType
getFilter().setFilterCategoryTypes(types);
}
+void LLInventoryPanel::setFilterWorn()
+{
+ getFilter().setFilterWorn();
+}
+
U32 LLInventoryPanel::getFilterObjectTypes() const
{
return getFilter().getFilterObjectTypes();
@@ -420,6 +425,16 @@ void LLInventoryPanel::setFilterLinks(U64 filter_links)
getFilter().setFilterLinks(filter_links);
}
+void LLInventoryPanel::setSearchType(LLInventoryFilter::ESearchType type)
+{
+ getFilter().setSearchType(type);
+}
+
+LLInventoryFilter::ESearchType LLInventoryPanel::getSearchType()
+{
+ return getFilter().getSearchType();
+}
+
void LLInventoryPanel::setShowFolderState(LLInventoryFilter::EFolderShow show)
{
getFilter().setShowFolderState(show);
@@ -1344,9 +1359,14 @@ LLInventoryPanel* LLInventoryPanel::getActiveInventoryPanel(BOOL auto_open)
}
//static
-void LLInventoryPanel::openInventoryPanelAndSetSelection(BOOL auto_open, const LLUUID& obj_id)
+void LLInventoryPanel::openInventoryPanelAndSetSelection(BOOL auto_open, const LLUUID& obj_id, BOOL main_panel)
{
- LLInventoryPanel *active_panel = LLInventoryPanel::getActiveInventoryPanel(auto_open);
+ LLInventoryPanel *active_panel;
+ if (main_panel)
+ {
+ LLFloaterSidePanelContainer::getPanel<LLSidepanelInventory>("inventory")->selectAllItemsPanel();
+ }
+ active_panel = LLInventoryPanel::getActiveInventoryPanel(auto_open);
if (active_panel)
{
diff --git a/indra/newview/llinventorypanel.h b/indra/newview/llinventorypanel.h
index 5ee58707b0..d849647bb6 100644
--- a/indra/newview/llinventorypanel.h
+++ b/indra/newview/llinventorypanel.h
@@ -172,6 +172,7 @@ public:
LLInventoryFilter& getFilter();
const LLInventoryFilter& getFilter() const;
void setFilterTypes(U64 filter, LLInventoryFilter::EFilterType = LLInventoryFilter::FILTERTYPE_OBJECT);
+ void setFilterWorn();
U32 getFilterObjectTypes() const;
void setFilterPermMask(PermissionMask filter_perm_mask);
U32 getFilterPermMask() const;
@@ -183,6 +184,8 @@ public:
void setDateSearchDirection(U32 direction);
BOOL getSinceLogoff();
void setFilterLinks(U64 filter_links);
+ void setSearchType(LLInventoryFilter::ESearchType type);
+ LLInventoryFilter::ESearchType getSearchType();
void setShowFolderState(LLInventoryFilter::EFolderShow show);
LLInventoryFilter::EFolderShow getShowFolderState();
@@ -218,7 +221,7 @@ public:
// "Auto_open" determines if we open an inventory panel if none are open.
static LLInventoryPanel *getActiveInventoryPanel(BOOL auto_open = TRUE);
- static void openInventoryPanelAndSetSelection(BOOL auto_open, const LLUUID& obj_id);
+ static void openInventoryPanelAndSetSelection(BOOL auto_open, const LLUUID& obj_id, BOOL main_panel = FALSE);
void addItemID(const LLUUID& id, LLFolderViewItem* itemp);
void removeItemID(const LLUUID& id);
diff --git a/indra/newview/lllogininstance.cpp b/indra/newview/lllogininstance.cpp
index bb55a3a6c0..8d361d3161 100644
--- a/indra/newview/lllogininstance.cpp
+++ b/indra/newview/lllogininstance.cpp
@@ -57,10 +57,13 @@
#include "llmachineid.h"
#include "llevents.h"
#include "llappviewer.h"
+#include "llsdserialize.h"
#include <boost/scoped_ptr.hpp>
#include <sstream>
+const S32 LOGIN_MAX_RETRIES = 3;
+
class LLLoginInstance::Disposable {
public:
virtual ~Disposable() {}
@@ -207,8 +210,8 @@ void LLLoginInstance::constructAuthParams(LLPointer<LLCredential> user_credentia
request_params["version"] = LLVersionInfo::getVersion();
request_params["channel"] = LLVersionInfo::getChannel();
request_params["platform"] = mPlatform;
- request_params["platform_version"] = mPlatformVersion;
request_params["address_size"] = ADDRESS_SIZE;
+ request_params["platform_version"] = mPlatformVersion;
request_params["platform_string"] = mPlatformVersionName;
request_params["id0"] = mSerialNumber;
request_params["host_id"] = gSavedSettings.getString("HostID");
@@ -227,13 +230,16 @@ void LLLoginInstance::constructAuthParams(LLPointer<LLCredential> user_credentia
request_params[it->first] = it->second;
}
+ // Specify desired timeout/retry options
+ LLSD http_params;
+ http_params["timeout"] = gSavedSettings.getF32("LoginSRVTimeout");
+ http_params["retries"] = LOGIN_MAX_RETRIES;
+
mRequestData.clear();
mRequestData["method"] = "login_to_simulator";
mRequestData["params"] = request_params;
mRequestData["options"] = requested_options;
-
- mRequestData["cfg_srv_timeout"] = gSavedSettings.getF32("LoginSRVTimeout");
- mRequestData["cfg_srv_pump"] = gSavedSettings.getString("LoginSRVPump");
+ mRequestData["http_params"] = http_params;
}
bool LLLoginInstance::handleLoginEvent(const LLSD& event)
@@ -330,10 +336,12 @@ void LLLoginInstance::handleLoginFailure(const LLSD& event)
data["VERSION"] = required_version;
LLNotificationsUtil::add("RequiredUpdate", data, LLSD::emptyMap(), boost::bind(&LLLoginInstance::handleLoginDisallowed, this, _1, _2));
}
- else if(reason_response == "key")
+ else if( reason_response == "key"
+ || reason_response == "presence"
+ || reason_response == "connect"
+ )
{
- // this is a password problem or other restriction
- // an appropriate message has already been displayed
+ // these are events that have already been communicated elsewhere
attemptComplete();
}
else
diff --git a/indra/newview/llmachineid.cpp b/indra/newview/llmachineid.cpp
index b5fd3df0f3..b0ee8e7fcb 100644
--- a/indra/newview/llmachineid.cpp
+++ b/indra/newview/llmachineid.cpp
@@ -37,6 +37,28 @@ using namespace std;
unsigned char static_unique_id[] = {0,0,0,0,0,0};
bool static has_static_unique_id = false;
+#if LL_WINDOWS
+
+class LLComInitialize
+{
+ HRESULT mHR;
+public:
+ LLComInitialize()
+ {
+ mHR = CoInitializeEx(0, COINIT_MULTITHREADED);
+ if (FAILED(mHR))
+ LL_DEBUGS("AppInit") << "Failed to initialize COM library. Error code = 0x" << hex << mHR << LL_ENDL;
+ }
+
+ ~LLComInitialize()
+ {
+ if (SUCCEEDED(mHR))
+ CoUninitialize();
+ }
+};
+
+#endif //LL_WINDOWS
+
// get an unique machine id.
// NOT THREAD SAFE - do before setting up threads.
// MAC Address doesn't work for Windows 7 since the first returned hardware MAC address changes with each reboot, Go figure??
@@ -59,12 +81,7 @@ S32 LLMachineID::init()
// Step 1: --------------------------------------------------
// Initialize COM. ------------------------------------------
- hres = CoInitializeEx(0, COINIT_MULTITHREADED);
- if (FAILED(hres))
- {
- LL_DEBUGS("AppInit") << "Failed to initialize COM library. Error code = 0x" << hex << hres << LL_ENDL;
- return 1; // Program has failed.
- }
+ LLComInitialize comInit;
// Step 2: --------------------------------------------------
// Set general COM security levels --------------------------
@@ -89,7 +106,6 @@ S32 LLMachineID::init()
if (FAILED(hres))
{
LL_WARNS("AppInit") << "Failed to initialize security. Error code = 0x" << hex << hres << LL_ENDL;
- CoUninitialize();
return 1; // Program has failed.
}
@@ -107,7 +123,6 @@ S32 LLMachineID::init()
if (FAILED(hres))
{
LL_WARNS("AppInit") << "Failed to create IWbemLocator object." << " Err code = 0x" << hex << hres << LL_ENDL;
- CoUninitialize();
return 1; // Program has failed.
}
@@ -134,7 +149,6 @@ S32 LLMachineID::init()
{
LL_WARNS("AppInit") << "Could not connect. Error code = 0x" << hex << hres << LL_ENDL;
pLoc->Release();
- CoUninitialize();
return 1; // Program has failed.
}
@@ -160,7 +174,6 @@ S32 LLMachineID::init()
LL_WARNS("AppInit") << "Could not set proxy blanket. Error code = 0x" << hex << hres << LL_ENDL;
pSvc->Release();
pLoc->Release();
- CoUninitialize();
return 1; // Program has failed.
}
@@ -181,7 +194,6 @@ S32 LLMachineID::init()
LL_WARNS("AppInit") << "Query for operating system name failed." << " Error code = 0x" << hex << hres << LL_ENDL;
pSvc->Release();
pLoc->Release();
- CoUninitialize();
return 1; // Program has failed.
}
@@ -236,7 +248,6 @@ S32 LLMachineID::init()
pLoc->Release();
if (pEnumerator)
pEnumerator->Release();
- CoUninitialize();
ret_code=0;
#else
unsigned char * staticPtr = (unsigned char *)(&static_unique_id[0]);
diff --git a/indra/newview/llmediactrl.h b/indra/newview/llmediactrl.h
index 291d87073e..125a67e23e 100644
--- a/indra/newview/llmediactrl.h
+++ b/indra/newview/llmediactrl.h
@@ -176,6 +176,8 @@ public:
virtual bool wantsKeyUpKeyDown() const;
virtual bool wantsReturnKey() const;
+ virtual BOOL acceptsTextInput() const {return TRUE;}
+
protected:
void convertInputCoords(S32& x, S32& y);
diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp
index c2a0393170..df708013fc 100644
--- a/indra/newview/llmeshrepository.cpp
+++ b/indra/newview/llmeshrepository.cpp
@@ -1892,7 +1892,7 @@ LLMeshUploadThread::LLMeshUploadThread(LLMeshUploadThread::instance_list& data,
mOrigin = gAgent.getPositionAgent();
mHost = gAgent.getRegionHost();
- mWholeModelFeeCapability = gAgent.getRegion()->getCapability("NewFileAgentInventory");
+ mWholeModelFeeCapability = gAgent.getRegionCapability("NewFileAgentInventory");
mOrigin += gAgent.getAtAxis() * scale.magVec();
@@ -1980,14 +1980,14 @@ void dump_llsd_to_file(const LLSD& content, std::string filename)
{
if (gSavedSettings.getBOOL("MeshUploadLogXML"))
{
- std::ofstream of(filename.c_str());
+ llofstream of(filename.c_str());
LLSDSerialize::toPrettyXML(content,of);
}
}
LLSD llsd_from_file(std::string filename)
{
- std::ifstream ifs(filename.c_str());
+ llifstream ifs(filename.c_str());
LLSD result;
LLSDSerialize::fromXML(result,ifs);
return result;
diff --git a/indra/newview/lloutfitgallery.cpp b/indra/newview/lloutfitgallery.cpp
index 5518656f3f..cca65f2ce1 100644
--- a/indra/newview/lloutfitgallery.cpp
+++ b/indra/newview/lloutfitgallery.cpp
@@ -699,13 +699,24 @@ void LLOutfitGalleryItem::draw()
const F32 alpha = getTransparencyType() == TT_ACTIVE ? 1.0f : getCurrentTransparency();
if (mTexturep)
{
- LLRect interior = border;
- interior.stretch(-1);
+ if (mImageUpdatePending && mTexturep->getDiscardLevel() >= 0)
+ {
+ mImageUpdatePending = false;
+ if (mTexturep->getOriginalWidth() > MAX_OUTFIT_PHOTO_WIDTH || mTexturep->getOriginalHeight() > MAX_OUTFIT_PHOTO_HEIGHT)
+ {
+ setDefaultImage();
+ }
+ }
+ else
+ {
+ LLRect interior = border;
+ interior.stretch(-1);
- gl_draw_scaled_image(interior.mLeft - 1, interior.mBottom, interior.getWidth(), interior.getHeight(), mTexturep, UI_VERTEX_COLOR % alpha);
+ gl_draw_scaled_image(interior.mLeft - 1, interior.mBottom, interior.getWidth(), interior.getHeight(), mTexturep, UI_VERTEX_COLOR % alpha);
- // Pump the priority
- mTexturep->addTextureStats((F32)(interior.getWidth() * interior.getHeight()));
+ // Pump the priority
+ mTexturep->addTextureStats((F32)(interior.getWidth() * interior.getHeight()));
+ }
}
}
@@ -771,12 +782,19 @@ BOOL LLOutfitGalleryItem::handleDoubleClick(S32 x, S32 y, MASK mask)
return LLPanel::handleDoubleClick(x, y, mask);
}
-void LLOutfitGalleryItem::setImageAssetId(LLUUID image_asset_id)
+bool LLOutfitGalleryItem::setImageAssetId(LLUUID image_asset_id)
{
- mImageAssetId = image_asset_id;
- mTexturep = LLViewerTextureManager::getFetchedTexture(image_asset_id, FTT_DEFAULT, MIPMAP_YES, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE);
- getChildView("preview_outfit")->setVisible(FALSE);
- mDefaultImage = false;
+ LLPointer<LLViewerFetchedTexture> texture = LLViewerTextureManager::getFetchedTexture(image_asset_id, FTT_DEFAULT, MIPMAP_YES, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE);
+ if (texture && texture->getOriginalWidth() <= MAX_OUTFIT_PHOTO_WIDTH && texture->getOriginalHeight() <= MAX_OUTFIT_PHOTO_HEIGHT)
+ {
+ mImageAssetId = image_asset_id;
+ mTexturep = texture;
+ getChildView("preview_outfit")->setVisible(FALSE);
+ mDefaultImage = false;
+ mImageUpdatePending = (texture->getDiscardLevel() == -1);
+ return true;
+ }
+ return false;
}
LLUUID LLOutfitGalleryItem::getImageAssetId()
@@ -790,6 +808,7 @@ void LLOutfitGalleryItem::setDefaultImage()
mImageAssetId.setNull();
getChildView("preview_outfit")->setVisible(TRUE);
mDefaultImage = true;
+ mImageUpdatePending = false;
}
LLContextMenu* LLOutfitGalleryContextMenu::createMenu()
@@ -1025,13 +1044,28 @@ void LLOutfitGallery::refreshOutfit(const LLUUID& category_id)
BOOST_FOREACH(LLViewerInventoryItem* outfit_item, outfit_item_array)
{
LLViewerInventoryItem* linked_item = outfit_item->getLinkedItem();
- if (linked_item != NULL && linked_item->getActualType() == LLAssetType::AT_TEXTURE)
+ LLUUID asset_id, inv_id;
+ std::string item_name;
+ if (linked_item != NULL)
{
- LLUUID asset_id = linked_item->getAssetUUID();
- mOutfitMap[category_id]->setImageAssetId(asset_id);
- photo_loaded = true;
- std::string linked_item_name = linked_item->getName();
- if (!mOutfitRenamePending.isNull() && mOutfitRenamePending.asString() == linked_item_name)
+ if (linked_item->getActualType() == LLAssetType::AT_TEXTURE)
+ {
+ asset_id = linked_item->getAssetUUID();
+ inv_id = linked_item->getUUID();
+ item_name = linked_item->getName();
+ }
+ }
+ else if (outfit_item->getActualType() == LLAssetType::AT_TEXTURE)
+ {
+ asset_id = outfit_item->getAssetUUID();
+ inv_id = outfit_item->getUUID();
+ item_name = outfit_item->getName();
+ }
+ if (asset_id.notNull())
+ {
+ photo_loaded |= mOutfitMap[category_id]->setImageAssetId(asset_id);
+ // Rename links
+ if (!mOutfitRenamePending.isNull() && mOutfitRenamePending.asString() == item_name)
{
LLViewerInventoryCategory *outfit_cat = gInventory.getCategory(mOutfitRenamePending);
LLStringUtil::format_map_t photo_string_args;
@@ -1039,7 +1073,7 @@ void LLOutfitGallery::refreshOutfit(const LLUUID& category_id)
std::string new_name = getString("outfit_photo_string", photo_string_args);
LLSD updates;
updates["name"] = new_name;
- update_inventory_item(linked_item->getUUID(), updates, NULL);
+ update_inventory_item(inv_id, updates, NULL);
mOutfitRenamePending.setNull();
LLFloater* inv_floater = LLFloaterReg::getInstance("inventory");
if (inv_floater)
@@ -1052,7 +1086,11 @@ void LLOutfitGallery::refreshOutfit(const LLUUID& category_id)
appearance_floater->setFocus(TRUE);
}
}
- break;
+ if (item_name == LLAppearanceMgr::sExpectedTextureName)
+ {
+ // Images with "appropriate" name take priority
+ break;
+ }
}
if (!photo_loaded)
{
@@ -1067,6 +1105,7 @@ void LLOutfitGallery::refreshOutfit(const LLUUID& category_id)
}
}
+// Refresh linked textures from "textures" uploads folder
void LLOutfitGallery::refreshTextures(const LLUUID& category_id)
{
LLInventoryModel::cat_array_t cat_array;
@@ -1176,6 +1215,7 @@ void LLOutfitGallery::uploadPhoto(LLUUID outfit_id)
upload_pending_name, callback, expected_upload_cost, nruserdata);
mOutfitLinkPending = outfit_id;
}
+ delete unit;
}
}
diff --git a/indra/newview/lloutfitgallery.h b/indra/newview/lloutfitgallery.h
index 2566247072..b1ca850508 100644
--- a/indra/newview/lloutfitgallery.h
+++ b/indra/newview/lloutfitgallery.h
@@ -259,7 +259,7 @@ public:
/*virtual*/ BOOL handleDoubleClick(S32 x, S32 y, MASK mask);
void setDefaultImage();
- void setImageAssetId(LLUUID asset_id);
+ bool setImageAssetId(LLUUID asset_id);
LLUUID getImageAssetId();
void setOutfitName(std::string name);
void setOutfitWorn(bool value);
@@ -282,6 +282,7 @@ private:
bool mSelected;
bool mWorn;
bool mDefaultImage;
+ bool mImageUpdatePending;
bool mHidden;
std::string mOutfitName;
};
diff --git a/indra/newview/llpanellogin.cpp b/indra/newview/llpanellogin.cpp
index f8a5bbb036..a88c10521c 100644
--- a/indra/newview/llpanellogin.cpp
+++ b/indra/newview/llpanellogin.cpp
@@ -791,7 +791,7 @@ void LLPanelLogin::loadLoginPage()
params["grid"] = LLGridManager::getInstance()->getGridId();
// add OS info
- params["os"] = LLAppViewer::instance()->getOSInfo().getOSStringSimple();
+ params["os"] = LLOSInfo::instance().getOSStringSimple();
// sourceid
params["sourceid"] = gSavedSettings.getString("sourceid");
diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp
index dd75ae9c06..f771a027e0 100644
--- a/indra/newview/llpanelmaininventory.cpp
+++ b/indra/newview/llpanelmaininventory.cpp
@@ -30,6 +30,8 @@
#include "llagent.h"
#include "llagentcamera.h"
#include "llavataractions.h"
+#include "llcheckboxctrl.h"
+#include "llcombobox.h"
#include "lldndbutton.h"
#include "lleconomy.h"
#include "llfilepicker.h"
@@ -84,6 +86,9 @@ public:
BOOL getCheckSinceLogoff();
U32 getDateSearchDirection();
+ void onCreatorSelfFilterCommit();
+ void onCreatorOtherFilterCommit();
+
static void onTimeAgo(LLUICtrl*, void *);
static void onCloseBtn(void* user_data);
static void selectAllTypes(void* user_data);
@@ -92,6 +97,8 @@ private:
LLPanelMainInventory* mPanelMainInventory;
LLSpinCtrl* mSpinSinceDays;
LLSpinCtrl* mSpinSinceHours;
+ LLCheckBoxCtrl* mCreatorSelf;
+ LLCheckBoxCtrl* mCreatorOthers;
LLInventoryFilter* mFilter;
};
@@ -102,6 +109,7 @@ private:
LLPanelMainInventory::LLPanelMainInventory(const LLPanel::Params& p)
: LLPanel(p),
mActivePanel(NULL),
+ mWornItemsPanel(NULL),
mSavedFolderState(NULL),
mFilterText(""),
mMenuGearDefault(NULL),
@@ -158,6 +166,25 @@ BOOL LLPanelMainInventory::postBuild()
recent_items_panel->setSelectCallback(boost::bind(&LLPanelMainInventory::onSelectionChange, this, recent_items_panel, _1, _2));
}
+ mWornItemsPanel = getChild<LLInventoryPanel>("Worn Items");
+ if (mWornItemsPanel)
+ {
+ U32 filter_types = 0x0;
+ filter_types |= 0x1 << LLInventoryType::IT_WEARABLE;
+ filter_types |= 0x1 << LLInventoryType::IT_ATTACHMENT;
+ filter_types |= 0x1 << LLInventoryType::IT_OBJECT;
+ mWornItemsPanel->setFilterTypes(filter_types);
+ mWornItemsPanel->setFilterWorn();
+ mWornItemsPanel->setShowFolderState(LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS);
+ mWornItemsPanel->setFilterLinks(LLInventoryFilter::FILTERLINK_EXCLUDE_LINKS);
+ mWornItemsPanel->getFilter().markDefault();
+ mWornItemsPanel->setSelectCallback(boost::bind(&LLPanelMainInventory::onSelectionChange, this, mWornItemsPanel, _1, _2));
+ }
+ mSearchTypeCombo = getChild<LLComboBox>("search_type");
+ if(mSearchTypeCombo)
+ {
+ mSearchTypeCombo->setCommitCallback(boost::bind(&LLPanelMainInventory::onSelectSearchType, this));
+ }
// Now load the stored settings from disk, if available.
std::string filterSaveName(gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, FILTERS_FILENAME));
LL_INFOS() << "LLPanelMainInventory::init: reading from " << filterSaveName << LL_ENDL;
@@ -262,6 +289,16 @@ LLPanelMainInventory::~LLPanelMainInventory( void )
delete mSavedFolderState;
}
+LLInventoryPanel* LLPanelMainInventory::getAllItemsPanel()
+{
+ return getChild<LLInventoryPanel>("All Items");
+}
+
+void LLPanelMainInventory::selectAllItemsPanel()
+{
+ mFilterTabs->selectFirstTab();
+}
+
void LLPanelMainInventory::startSearch()
{
// this forces focus to line editor portion of search editor
@@ -387,6 +424,48 @@ void LLPanelMainInventory::setSortBy(const LLSD& userdata)
}
}
+void LLPanelMainInventory::onSelectSearchType()
+{
+ std::string new_type = mSearchTypeCombo->getValue();
+ if (new_type == "search_by_name")
+ {
+ getActivePanel()->setSearchType(LLInventoryFilter::SEARCHTYPE_NAME);
+ }
+ if (new_type == "search_by_creator")
+ {
+ getActivePanel()->setSearchType(LLInventoryFilter::SEARCHTYPE_CREATOR);
+ }
+ if (new_type == "search_by_description")
+ {
+ getActivePanel()->setSearchType(LLInventoryFilter::SEARCHTYPE_DESCRIPTION);
+ }
+ if (new_type == "search_by_UUID")
+ {
+ getActivePanel()->setSearchType(LLInventoryFilter::SEARCHTYPE_UUID);
+ }
+}
+
+void LLPanelMainInventory::updateSearchTypeCombo()
+{
+ LLInventoryFilter::ESearchType search_type = getActivePanel()->getSearchType();
+ switch(search_type)
+ {
+ case LLInventoryFilter::SEARCHTYPE_CREATOR:
+ mSearchTypeCombo->setValue("search_by_creator");
+ break;
+ case LLInventoryFilter::SEARCHTYPE_DESCRIPTION:
+ mSearchTypeCombo->setValue("search_by_description");
+ break;
+ case LLInventoryFilter::SEARCHTYPE_UUID:
+ mSearchTypeCombo->setValue("search_by_UUID");
+ break;
+ case LLInventoryFilter::SEARCHTYPE_NAME:
+ default:
+ mSearchTypeCombo->setValue("search_by_name");
+ break;
+ }
+}
+
// static
BOOL LLPanelMainInventory::filtersVisible(void* user_data)
{
@@ -400,7 +479,7 @@ void LLPanelMainInventory::onClearSearch()
{
BOOL initially_active = FALSE;
LLFloater *finder = getFinder();
- if (mActivePanel)
+ if (mActivePanel && (getActivePanel() != mWornItemsPanel))
{
initially_active = mActivePanel->getFilter().isNotDefault();
mActivePanel->setFilterSubString(LLStringUtil::null);
@@ -507,6 +586,11 @@ void LLPanelMainInventory::onFilterSelected()
return;
}
+ if (getActivePanel() == mWornItemsPanel)
+ {
+ mActivePanel->openAllFolders();
+ }
+ updateSearchTypeCombo();
setFilterSubString(mFilterSubString);
LLInventoryFilter& filter = mActivePanel->getFilter();
LLFloaterInventoryFinder *finder = getFinder();
@@ -540,7 +624,7 @@ BOOL LLPanelMainInventory::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
{
// Check to see if we are auto scrolling from the last frame
LLInventoryPanel* panel = (LLInventoryPanel*)this->getActivePanel();
- BOOL needsToScroll = panel->getScrollableContainer()->autoScroll(x, y);
+ BOOL needsToScroll = panel->getScrollableContainer()->canAutoScroll(x, y);
if(mFilterTabs)
{
if(needsToScroll)
@@ -705,6 +789,11 @@ BOOL LLFloaterInventoryFinder::postBuild()
mSpinSinceDays = getChild<LLSpinCtrl>("spin_days_ago");
childSetCommitCallback("spin_days_ago", onTimeAgo, this);
+ mCreatorSelf = getChild<LLCheckBoxCtrl>("check_created_by_me");
+ mCreatorOthers = getChild<LLCheckBoxCtrl>("check_created_by_others");
+ mCreatorSelf->setCommitCallback(boost::bind(&LLFloaterInventoryFinder::onCreatorSelfFilterCommit, this));
+ mCreatorOthers->setCommitCallback(boost::bind(&LLFloaterInventoryFinder::onCreatorOtherFilterCommit, this));
+
childSetAction("Close", onCloseBtn, this);
updateElementsFromFilter();
@@ -763,6 +852,10 @@ void LLFloaterInventoryFinder::updateElementsFromFilter()
U32 hours = mFilter->getHoursAgo();
U32 date_search_direction = mFilter->getDateSearchDirection();
+ LLInventoryFilter::EFilterCreatorType filter_creator = mFilter->getFilterCreator();
+ bool show_created_by_me = ((filter_creator == LLInventoryFilter::FILTERCREATOR_ALL) || (filter_creator == LLInventoryFilter::FILTERCREATOR_SELF));
+ bool show_created_by_others = ((filter_creator == LLInventoryFilter::FILTERCREATOR_ALL) || (filter_creator == LLInventoryFilter::FILTERCREATOR_OTHERS));
+
// update the ui elements
setTitle(mFilter->getName());
@@ -780,6 +873,10 @@ void LLFloaterInventoryFinder::updateElementsFromFilter()
getChild<LLUICtrl>("check_texture")->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_TEXTURE));
getChild<LLUICtrl>("check_snapshot")->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_SNAPSHOT));
getChild<LLUICtrl>("check_show_empty")->setValue(show_folders == LLInventoryFilter::SHOW_ALL_FOLDERS);
+
+ getChild<LLUICtrl>("check_created_by_me")->setValue(show_created_by_me);
+ getChild<LLUICtrl>("check_created_by_others")->setValue(show_created_by_others);
+
getChild<LLUICtrl>("check_since_logoff")->setValue(mFilter->isSinceLogoff());
mSpinSinceHours->set((F32)(hours % 24));
mSpinSinceDays->set((F32)(hours / 24));
@@ -877,6 +974,7 @@ void LLFloaterInventoryFinder::draw()
mPanelMainInventory->getPanel()->setShowFolderState(getCheckShowEmpty() ?
LLInventoryFilter::SHOW_ALL_FOLDERS : LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS);
mPanelMainInventory->getPanel()->setFilterTypes(filter);
+
if (getCheckSinceLogoff())
{
mSpinSinceDays->set(0);
@@ -905,6 +1003,46 @@ void LLFloaterInventoryFinder::draw()
LLPanel::draw();
}
+void LLFloaterInventoryFinder::onCreatorSelfFilterCommit()
+{
+ bool show_creator_self = mCreatorSelf->getValue();
+ bool show_creator_other = mCreatorOthers->getValue();
+
+ if(show_creator_self && show_creator_other)
+ {
+ mFilter->setFilterCreator(LLInventoryFilter::FILTERCREATOR_ALL);
+ }
+ else if(show_creator_self)
+ {
+ mFilter->setFilterCreator(LLInventoryFilter::FILTERCREATOR_SELF);
+ }
+ else if(!show_creator_self || !show_creator_other)
+ {
+ mFilter->setFilterCreator(LLInventoryFilter::FILTERCREATOR_OTHERS);
+ mCreatorOthers->set(TRUE);
+ }
+}
+
+void LLFloaterInventoryFinder::onCreatorOtherFilterCommit()
+{
+ bool show_creator_self = mCreatorSelf->getValue();
+ bool show_creator_other = mCreatorOthers->getValue();
+
+ if(show_creator_self && show_creator_other)
+ {
+ mFilter->setFilterCreator(LLInventoryFilter::FILTERCREATOR_ALL);
+ }
+ else if(show_creator_other)
+ {
+ mFilter->setFilterCreator(LLInventoryFilter::FILTERCREATOR_OTHERS);
+ }
+ else if(!show_creator_other || !show_creator_self)
+ {
+ mFilter->setFilterCreator(LLInventoryFilter::FILTERCREATOR_SELF);
+ mCreatorSelf->set(TRUE);
+ }
+}
+
BOOL LLFloaterInventoryFinder::getCheckShowEmpty()
{
return getChild<LLUICtrl>("check_show_empty")->getValue();
diff --git a/indra/newview/llpanelmaininventory.h b/indra/newview/llpanelmaininventory.h
index 38936804ac..530f4e618c 100644
--- a/indra/newview/llpanelmaininventory.h
+++ b/indra/newview/llpanelmaininventory.h
@@ -34,6 +34,7 @@
#include "llfolderview.h"
+class LLComboBox;
class LLFolderViewItem;
class LLInventoryPanel;
class LLSaveFolderState;
@@ -76,6 +77,8 @@ public:
LLInventoryPanel* getPanel() { return mActivePanel; }
LLInventoryPanel* getActivePanel() { return mActivePanel; }
+ LLInventoryPanel* getAllItemsPanel();
+ void selectAllItemsPanel();
const LLInventoryPanel* getActivePanel() const { return mActivePanel; }
const std::string& getFilterText() const { return mFilterText; }
@@ -120,6 +123,8 @@ protected:
void updateItemcountText();
void onFocusReceived();
+ void onSelectSearchType();
+ void updateSearchTypeCombo();
private:
LLFloaterInventoryFinder* getFinder();
@@ -129,12 +134,14 @@ private:
LLUICtrl* mCounterCtrl;
LLHandle<LLFloater> mFinderHandle;
LLInventoryPanel* mActivePanel;
+ LLInventoryPanel* mWornItemsPanel;
bool mResortActivePanel;
LLSaveFolderState* mSavedFolderState;
std::string mFilterText;
std::string mFilterSubString;
S32 mItemCount;
std::string mItemCountString;
+ LLComboBox* mSearchTypeCombo;
//////////////////////////////////////////////////////////////////////////////////
diff --git a/indra/newview/llpanelobject.cpp b/indra/newview/llpanelobject.cpp
index 5dd44b4444..0bf4d48421 100644
--- a/indra/newview/llpanelobject.cpp
+++ b/indra/newview/llpanelobject.cpp
@@ -1712,7 +1712,7 @@ void LLPanelObject::sendPosition(BOOL btn_down)
if (mObject->isRootEdit())
{
// only offset by parent's translation
- mObject->resetChildrenPosition(LLVector3(-delta), TRUE) ;
+ mObject->resetChildrenPosition(LLVector3(-delta), TRUE, TRUE) ;
}
if(!btn_down)
diff --git a/indra/newview/llpanelobjectinventory.cpp b/indra/newview/llpanelobjectinventory.cpp
index dbfebf901a..b5ee68ba25 100644
--- a/indra/newview/llpanelobjectinventory.cpp
+++ b/indra/newview/llpanelobjectinventory.cpp
@@ -110,6 +110,11 @@ public:
virtual const std::string& getDisplayName() const;
virtual const std::string& getSearchableName() const;
+ virtual std::string getSearchableDescription() const {return LLStringUtil::null;}
+ virtual std::string getSearchableCreatorName() const {return LLStringUtil::null;}
+ virtual std::string getSearchableUUIDString() const {return LLStringUtil::null;}
+
+
virtual PermissionMask getPermissionMask() const { return PERM_NONE; }
/*virtual*/ LLFolderType::EType getPreferredType() const { return LLFolderType::FT_NONE; }
virtual const LLUUID& getUUID() const { return mUUID; }
diff --git a/indra/newview/llpanelsnapshotpostcard.cpp b/indra/newview/llpanelsnapshotpostcard.cpp
index 3d18e837af..f3a4cf36ee 100644
--- a/indra/newview/llpanelsnapshotpostcard.cpp
+++ b/indra/newview/llpanelsnapshotpostcard.cpp
@@ -164,6 +164,8 @@ void LLPanelSnapshotPostcard::sendPostcardFinished(LLSD result)
void LLPanelSnapshotPostcard::sendPostcard()
{
+ if (!gAgent.getRegion()) return;
+
// upload the image
std::string url = gAgent.getRegion()->getCapability("SendPostcard");
if (!url.empty())
diff --git a/indra/newview/llpanelwearing.cpp b/indra/newview/llpanelwearing.cpp
index a150007177..3099a6e039 100644
--- a/indra/newview/llpanelwearing.cpp
+++ b/indra/newview/llpanelwearing.cpp
@@ -416,7 +416,7 @@ bool LLPanelWearing::populateAttachmentsList(bool update)
void LLPanelWearing::requestAttachmentDetails()
{
LLSD body;
- std::string url = gAgent.getRegion()->getCapability("AttachmentResources");
+ std::string url = gAgent.getRegionCapability("AttachmentResources");
if (!url.empty())
{
LLCoros::instance().launch("LLPanelWearing::getAttachmentLimitsCoro",
diff --git a/indra/newview/llpreview.cpp b/indra/newview/llpreview.cpp
index fb21b980dc..fc2de4844e 100644
--- a/indra/newview/llpreview.cpp
+++ b/indra/newview/llpreview.cpp
@@ -62,7 +62,8 @@ LLPreview::LLPreview(const LLSD& key)
mUserResized(FALSE),
mCloseAfterSave(FALSE),
mAssetStatus(PREVIEW_ASSET_UNLOADED),
- mDirty(TRUE)
+ mDirty(TRUE),
+ mSaveDialogShown(FALSE)
{
mAuxItem = new LLInventoryItem;
// don't necessarily steal focus on creation -- sometimes these guys pop up without user action
diff --git a/indra/newview/llpreview.h b/indra/newview/llpreview.h
index 49c114720b..b41aa2be1a 100644
--- a/indra/newview/llpreview.h
+++ b/indra/newview/llpreview.h
@@ -121,7 +121,8 @@ protected:
// for LLInventoryObserver
virtual void changed(U32 mask);
BOOL mDirty;
-
+ BOOL mSaveDialogShown;
+
protected:
LLUUID mItemUUID;
diff --git a/indra/newview/llpreviewanim.cpp b/indra/newview/llpreviewanim.cpp
index fb40af1302..12ac9e6fc5 100644
--- a/indra/newview/llpreviewanim.cpp
+++ b/indra/newview/llpreviewanim.cpp
@@ -148,6 +148,12 @@ void LLPreviewAnim::draw()
}
if(gAgentAvatarp->isMotionActive(this->mItemID) && !this->mDidStart)
{
+ const LLInventoryItem *item = getItem();
+ LLMotion* motion = gAgentAvatarp->findMotion(this->mItemID);
+ if (item && motion)
+ {
+ motion->setName(item->getName());
+ }
this->mDidStart = true;
}
}
diff --git a/indra/newview/llpreviewgesture.cpp b/indra/newview/llpreviewgesture.cpp
index ff9a70d05c..787bd68e58 100644
--- a/indra/newview/llpreviewgesture.cpp
+++ b/indra/newview/llpreviewgesture.cpp
@@ -234,9 +234,13 @@ BOOL LLPreviewGesture::canClose()
}
else
{
- // Bring up view-modal dialog: Save changes? Yes, No, Cancel
- LLNotificationsUtil::add("SaveChanges", LLSD(), LLSD(),
- boost::bind(&LLPreviewGesture::handleSaveChangesDialog, this, _1, _2) );
+ if(!mSaveDialogShown)
+ {
+ mSaveDialogShown = TRUE;
+ // Bring up view-modal dialog: Save changes? Yes, No, Cancel
+ LLNotificationsUtil::add("SaveChanges", LLSD(), LLSD(),
+ boost::bind(&LLPreviewGesture::handleSaveChangesDialog, this, _1, _2) );
+ }
return FALSE;
}
}
@@ -264,6 +268,7 @@ void LLPreviewGesture::onVisibilityChanged ( const LLSD& new_visibility )
bool LLPreviewGesture::handleSaveChangesDialog(const LLSD& notification, const LLSD& response)
{
+ mSaveDialogShown = FALSE;
S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
switch(option)
{
diff --git a/indra/newview/llpreviewnotecard.cpp b/indra/newview/llpreviewnotecard.cpp
index 510d91839d..850c3b350d 100644
--- a/indra/newview/llpreviewnotecard.cpp
+++ b/indra/newview/llpreviewnotecard.cpp
@@ -153,9 +153,12 @@ BOOL LLPreviewNotecard::canClose()
}
else
{
- // Bring up view-modal dialog: Save changes? Yes, No, Cancel
- LLNotificationsUtil::add("SaveChanges", LLSD(), LLSD(), boost::bind(&LLPreviewNotecard::handleSaveChangesDialog,this, _1, _2));
-
+ if(!mSaveDialogShown)
+ {
+ mSaveDialogShown = TRUE;
+ // Bring up view-modal dialog: Save changes? Yes, No, Cancel
+ LLNotificationsUtil::add("SaveChanges", LLSD(), LLSD(), boost::bind(&LLPreviewNotecard::handleSaveChangesDialog,this, _1, _2));
+ }
return FALSE;
}
}
@@ -639,6 +642,7 @@ void LLPreviewNotecard::onSaveComplete(const LLUUID& asset_uuid, void* user_data
bool LLPreviewNotecard::handleSaveChangesDialog(const LLSD& notification, const LLSD& response)
{
+ mSaveDialogShown = FALSE;
S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
switch(option)
{
diff --git a/indra/newview/llpreviewscript.cpp b/indra/newview/llpreviewscript.cpp
index b7fea4e982..6ecc4c7fb9 100644
--- a/indra/newview/llpreviewscript.cpp
+++ b/indra/newview/llpreviewscript.cpp
@@ -376,7 +376,8 @@ LLScriptEdCore::LLScriptEdCore(
mLive(live),
mContainer(container),
mHasScriptData(FALSE),
- mScriptRemoved(FALSE)
+ mScriptRemoved(FALSE),
+ mSaveDialogShown(FALSE)
{
setFollowsAll();
setBorderVisible(FALSE);
@@ -584,6 +585,14 @@ void LLScriptEdCore::setScriptText(const std::string& text, BOOL is_valid)
}
}
+void LLScriptEdCore::makeEditorPristine()
+{
+ if (mEditor)
+ {
+ mEditor->makePristine();
+ }
+}
+
bool LLScriptEdCore::loadScriptText(const std::string& filename)
{
if (filename.empty())
@@ -847,8 +856,12 @@ BOOL LLScriptEdCore::canClose()
}
else
{
- // Bring up view-modal dialog: Save changes? Yes, No, Cancel
- LLNotificationsUtil::add("SaveChanges", LLSD(), LLSD(), boost::bind(&LLScriptEdCore::handleSaveChangesDialog, this, _1, _2));
+ if(!mSaveDialogShown)
+ {
+ mSaveDialogShown = TRUE;
+ // Bring up view-modal dialog: Save changes? Yes, No, Cancel
+ LLNotificationsUtil::add("SaveChanges", LLSD(), LLSD(), boost::bind(&LLScriptEdCore::handleSaveChangesDialog, this, _1, _2));
+ }
return FALSE;
}
}
@@ -861,6 +874,7 @@ void LLScriptEdCore::setEnableEditing(bool enable)
bool LLScriptEdCore::handleSaveChangesDialog(const LLSD& notification, const LLSD& response )
{
+ mSaveDialogShown = FALSE;
S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
switch( option )
{
@@ -1200,7 +1214,7 @@ void LLScriptEdCore::onBtnLoadFromFile( void* data )
std::string filename = file_picker.getFirstFile();
- std::ifstream fin(filename.c_str());
+ llifstream fin(filename.c_str());
std::string line;
std::string text;
@@ -1238,7 +1252,7 @@ void LLScriptEdCore::onBtnSaveToFile( void* userdata )
{
std::string filename = file_picker.getFirstFile();
std::string scriptText=self->mEditor->getText();
- std::ofstream fout(filename.c_str());
+ llofstream fout(filename.c_str());
fout<<(scriptText);
fout.close();
self->mSaveCallback( self->mUserdata, FALSE );
@@ -2026,7 +2040,7 @@ void LLLiveLSLEditor::loadScriptText(LLVFS *vfs, const LLUUID &uuid, LLAssetType
buffer[file_length] = '\0';
mScriptEd->setScriptText(LLStringExplicit(&buffer[0]), TRUE);
- mScriptEd->mEditor->makePristine();
+ mScriptEd->makeEditorPristine();
mScriptEd->setScriptName(getItem()->getName());
}
diff --git a/indra/newview/llpreviewscript.h b/indra/newview/llpreviewscript.h
index 6b31125641..a185d85889 100644
--- a/indra/newview/llpreviewscript.h
+++ b/indra/newview/llpreviewscript.h
@@ -90,6 +90,7 @@ public:
bool canLoadOrSaveToFile( void* userdata );
void setScriptText(const std::string& text, BOOL is_valid);
+ void makeEditorPristine();
bool loadScriptText(const std::string& filename);
bool writeToFile(const std::string& filename);
void sync();
@@ -166,6 +167,7 @@ private:
LLLiveLSLFile* mLiveFile;
LLUUID mAssociatedExperience;
BOOL mScriptRemoved;
+ BOOL mSaveDialogShown;
LLScriptEdContainer* mContainer; // parent view
diff --git a/indra/newview/llproductinforequest.cpp b/indra/newview/llproductinforequest.cpp
index b663df4aae..4abb673555 100644
--- a/indra/newview/llproductinforequest.cpp
+++ b/indra/newview/llproductinforequest.cpp
@@ -41,7 +41,7 @@ LLProductInfoRequestManager::LLProductInfoRequestManager():
void LLProductInfoRequestManager::initSingleton()
{
- std::string url = gAgent.getRegion()->getCapability("ProductInfoRequest");
+ std::string url = gAgent.getRegionCapability("ProductInfoRequest");
if (!url.empty())
{
LLCoros::instance().launch("LLProductInfoRequestManager::getLandDescriptionsCoro",
diff --git a/indra/newview/llscenemonitor.cpp b/indra/newview/llscenemonitor.cpp
index 02912f12a9..5ab0013055 100644
--- a/indra/newview/llscenemonitor.cpp
+++ b/indra/newview/llscenemonitor.cpp
@@ -532,7 +532,7 @@ void LLSceneMonitor::dumpToFile(std::string file_name)
LL_INFOS("SceneMonitor") << "Saving scene load stats to " << file_name << LL_ENDL;
- std::ofstream os(file_name.c_str());
+ llofstream os(file_name.c_str());
os << std::setprecision(10);
diff --git a/indra/newview/llsidepanelinventory.cpp b/indra/newview/llsidepanelinventory.cpp
index c6a0198afd..e25cac8c17 100644
--- a/indra/newview/llsidepanelinventory.cpp
+++ b/indra/newview/llsidepanelinventory.cpp
@@ -696,6 +696,19 @@ LLInventoryPanel *LLSidepanelInventory::getActivePanel()
return NULL;
}
+void LLSidepanelInventory::selectAllItemsPanel()
+{
+ if (!getVisible())
+ {
+ return;
+ }
+ if (mInventoryPanel->getVisible())
+ {
+ mPanelMainInventory->selectAllItemsPanel();
+ }
+
+}
+
BOOL LLSidepanelInventory::isMainInventoryPanelActive() const
{
return mInventoryPanel->getVisible();
diff --git a/indra/newview/llsidepanelinventory.h b/indra/newview/llsidepanelinventory.h
index 5060f7025f..3b8cdb98ab 100644
--- a/indra/newview/llsidepanelinventory.h
+++ b/indra/newview/llsidepanelinventory.h
@@ -57,6 +57,7 @@ public:
/*virtual*/ void onOpen(const LLSD& key);
LLInventoryPanel* getActivePanel(); // Returns an active inventory panel, if any.
+ void selectAllItemsPanel();
LLInventoryPanel* getInboxPanel() const { return mInventoryPanelInbox.get(); }
LLPanelMainInventory* getMainInventoryPanel() const { return mPanelMainInventory; }
diff --git a/indra/newview/llspeakers.cpp b/indra/newview/llspeakers.cpp
index 19d1af34f9..abb936c3e5 100644
--- a/indra/newview/llspeakers.cpp
+++ b/indra/newview/llspeakers.cpp
@@ -818,7 +818,7 @@ void LLIMSpeakerMgr::toggleAllowTextChat(const LLUUID& speaker_id)
LLPointer<LLSpeaker> speakerp = findSpeaker(speaker_id);
if (!speakerp) return;
- std::string url = gAgent.getRegion()->getCapability("ChatSessionRequest");
+ std::string url = gAgent.getRegionCapability("ChatSessionRequest");
LLSD data;
data["method"] = "mute update";
data["session-id"] = getSessionID();
@@ -844,7 +844,7 @@ void LLIMSpeakerMgr::moderateVoiceParticipant(const LLUUID& avatar_id, bool unmu
// do not send voice moderation changes for avatars not in voice channel
if (!is_in_voice) return;
- std::string url = gAgent.getRegion()->getCapability("ChatSessionRequest");
+ std::string url = gAgent.getRegionCapability("ChatSessionRequest");
LLSD data;
data["method"] = "mute update";
data["session-id"] = getSessionID();
@@ -924,7 +924,7 @@ void LLIMSpeakerMgr::processSessionUpdate(const LLSD& session_update)
void LLIMSpeakerMgr::moderateVoiceSession(const LLUUID& session_id, bool disallow_voice)
{
- std::string url = gAgent.getRegion()->getCapability("ChatSessionRequest");
+ std::string url = gAgent.getRegionCapability("ChatSessionRequest");
LLSD data;
data["method"] = "session update";
data["session-id"] = session_id;
diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp
index e50a4a0b5d..bdb8d83e59 100644
--- a/indra/newview/llstartup.cpp
+++ b/indra/newview/llstartup.cpp
@@ -347,7 +347,7 @@ bool idle_startup()
const std::string delims (" ");
std::string system;
int begIdx, endIdx;
- std::string osString = LLAppViewer::instance()->getOSInfo().getOSStringSimple();
+ std::string osString = LLOSInfo::instance().getOSStringSimple();
begIdx = osString.find_first_not_of (delims);
endIdx = osString.find_first_of (delims, begIdx);
@@ -832,7 +832,8 @@ bool idle_startup()
// Don't do anything. Wait for the login view to call the login_callback,
// which will push us to the next state.
- display_startup();
+
+ // display() function will be the one to run display_startup()
// Sleep so we don't spin the CPU
ms_sleep(1);
return FALSE;
diff --git a/indra/newview/lltexturecache.cpp b/indra/newview/lltexturecache.cpp
index a541273621..f0c28041d1 100644
--- a/indra/newview/lltexturecache.cpp
+++ b/indra/newview/lltexturecache.cpp
@@ -31,6 +31,7 @@
#include "llapr.h"
#include "lldir.h"
#include "llimage.h"
+#include "llimagej2c.h" // for version control
#include "lllfsthread.h"
#include "llviewercontrol.h"
@@ -938,6 +939,14 @@ BOOL LLTextureCache::isInLocal(const LLUUID& id)
F32 LLTextureCache::sHeaderCacheVersion = 1.7f;
U32 LLTextureCache::sCacheMaxEntries = 1024 * 1024; //~1 million textures.
S64 LLTextureCache::sCacheMaxTexturesSize = 0; // no limit
+std::string LLTextureCache::sHeaderCacheEncoderVersion = LLImageJ2C::getEngineInfo();
+
+#if defined(ADDRESS_SIZE)
+U32 LLTextureCache::sHeaderCacheAddressSize = ADDRESS_SIZE;
+#else
+U32 LLTextureCache::sHeaderCacheAddressSize = 32;
+#endif
+
const char* entries_filename = "texture.entries";
const char* cache_filename = "texture.cache";
const char* old_textures_dirname = "textures";
@@ -1080,12 +1089,28 @@ void LLTextureCache::readEntriesHeader()
}
else //create an empty entries header.
{
- mHeaderEntriesInfo.mVersion = sHeaderCacheVersion ;
- mHeaderEntriesInfo.mEntries = 0 ;
+ setEntriesHeader();
writeEntriesHeader() ;
}
}
+void LLTextureCache::setEntriesHeader()
+{
+ if (sHeaderEncoderStringSize < sHeaderCacheEncoderVersion.size() + 1)
+ {
+ // For simplicity we use predefined size of header, so if version string
+ // doesn't fit, either getEngineInfo() returned malformed string or
+ // sHeaderEncoderStringSize need to be increased.
+ // Also take into accout that c_str() returns additional null character
+ LL_ERRS() << "Version string doesn't fit in header" << LL_ENDL;
+ }
+
+ mHeaderEntriesInfo.mVersion = sHeaderCacheVersion;
+ mHeaderEntriesInfo.mAdressSize = sHeaderCacheAddressSize;
+ strcpy(mHeaderEntriesInfo.mEncoderVersion, sHeaderCacheEncoderVersion.c_str());
+ mHeaderEntriesInfo.mEntries = 0;
+}
+
void LLTextureCache::writeEntriesHeader()
{
llassert_always(mHeaderAPRFile == NULL);
@@ -1439,10 +1464,13 @@ void LLTextureCache::readHeaderCache()
readEntriesHeader();
- if (mHeaderEntriesInfo.mVersion != sHeaderCacheVersion)
+ if (mHeaderEntriesInfo.mVersion != sHeaderCacheVersion
+ || mHeaderEntriesInfo.mAdressSize != sHeaderCacheAddressSize
+ || strcmp(mHeaderEntriesInfo.mEncoderVersion, sHeaderCacheEncoderVersion.c_str()) != 0)
{
if (!mReadOnly)
{
+ LL_INFOS() << "Texture Cache version mismatch, Purging." << LL_ENDL;
purgeAllTextures(false);
}
}
@@ -1587,9 +1615,9 @@ void LLTextureCache::purgeAllTextures(bool purge_directories)
gDirUtilp->deleteFilesInDir(dirname, mask);
}
}
+ gDirUtilp->deleteFilesInDir(mTexturesDirName, mask); // headers, fast cache
if (purge_directories)
{
- gDirUtilp->deleteFilesInDir(mTexturesDirName, mask);
LLFile::rmdir(mTexturesDirName);
}
}
@@ -1601,8 +1629,7 @@ void LLTextureCache::purgeAllTextures(bool purge_directories)
mUpdatedEntryMap.clear();
// Info with 0 entries
- mHeaderEntriesInfo.mVersion = sHeaderCacheVersion;
- mHeaderEntriesInfo.mEntries = 0;
+ setEntriesHeader();
writeEntriesHeader();
LL_INFOS() << "The entire texture cache is cleared." << LL_ENDL ;
@@ -1960,15 +1987,13 @@ bool LLTextureCache::writeToFastCache(S32 id, LLPointer<LLImageRaw> raw, S32 dis
if(w * h *c > 0) //valid
{
//make a duplicate to keep the original raw image untouched.
- raw = raw->duplicate();
+ raw = raw->scaled(w, h);
if (raw->isBufferInvalid())
{
LL_WARNS() << "Invalid image duplicate buffer" << LL_ENDL;
return false;
}
- raw->scale(w, h) ;
-
discardlevel += i ;
}
}
diff --git a/indra/newview/lltexturecache.h b/indra/newview/lltexturecache.h
index 6ff4c44568..95f9afc2bc 100644
--- a/indra/newview/lltexturecache.h
+++ b/indra/newview/lltexturecache.h
@@ -46,10 +46,13 @@ class LLTextureCache : public LLWorkerThread
private:
// Entries
+ static const U32 sHeaderEncoderStringSize = 32;
struct EntriesInfo
{
- EntriesInfo() : mVersion(0.f), mEntries(0) {}
+ EntriesInfo() : mVersion(0.f), mAdressSize(0), mEntries(0) { memset(mEncoderVersion, 0, sHeaderEncoderStringSize); }
F32 mVersion;
+ U32 mAdressSize;
+ char mEncoderVersion[sHeaderEncoderStringSize];
U32 mEntries;
};
struct Entry
@@ -156,6 +159,7 @@ private:
LLAPRFile* openHeaderEntriesFile(bool readonly, S32 offset);
void closeHeaderEntriesFile();
void readEntriesHeader();
+ void setEntriesHeader();
void writeEntriesHeader();
S32 openAndReadEntry(const LLUUID& id, Entry& entry, bool create);
bool updateEntry(S32& idx, Entry& entry, S32 new_image_size, S32 new_body_size);
@@ -224,6 +228,8 @@ private:
// Statics
static F32 sHeaderCacheVersion;
+ static U32 sHeaderCacheAddressSize;
+ static std::string sHeaderCacheEncoderVersion;
static U32 sCacheMaxEntries;
static S64 sCacheMaxTexturesSize;
};
diff --git a/indra/newview/lltexturefetch.cpp b/indra/newview/lltexturefetch.cpp
index b78d0b51d5..84a2f1b597 100644
--- a/indra/newview/lltexturefetch.cpp
+++ b/indra/newview/lltexturefetch.cpp
@@ -2559,7 +2559,7 @@ LLTextureFetch::LLTextureFetch(LLTextureCache* cache, LLImageDecodeThread* image
mTextureInfoMainThread(false)
{
mMaxBandwidth = gSavedSettings.getF32("ThrottleBandwidthKBPS");
- mTextureInfo.setUpLogging(gSavedSettings.getBOOL("LogTextureDownloadsToViewerLog"), gSavedSettings.getBOOL("LogTextureDownloadsToSimulator"), U32Bytes(gSavedSettings.getU32("TextureLoggingThreshold")));
+ mTextureInfo.setLogging(true);
LLAppCoreHttp & app_core_http(LLAppViewer::instance()->getAppCoreHttp());
mHttpRequest = new LLCore::HttpRequest;
diff --git a/indra/newview/lltextureinfo.cpp b/indra/newview/lltextureinfo.cpp
index 473d8ce709..e79bb62a52 100644
--- a/indra/newview/lltextureinfo.cpp
+++ b/indra/newview/lltextureinfo.cpp
@@ -26,10 +26,19 @@
#include "llviewerprecompiledheaders.h"
+#include "llagent.h"
+#include "llmeshrepository.h"
+#include "llsdutil.h"
#include "lltextureinfo.h"
+#include "lltexturecache.h"
+#include "lltexturefetch.h"
#include "lltexturestats.h"
-#include "llviewercontrol.h"
#include "lltrace.h"
+#include "llviewercontrol.h"
+#include "llviewerregion.h"
+#include "llviewerstats.h"
+#include "llvocache.h"
+#include "llworld.h"
static LLTrace::CountStatHandle<S32> sTextureDownloadsStarted("texture_downloads_started", "number of texture downloads initiated");
static LLTrace::CountStatHandle<S32> sTextureDownloadsCompleted("texture_downloads_completed", "number of texture downloads completed");
@@ -37,10 +46,8 @@ static LLTrace::CountStatHandle<S32Bytes > sTextureDataDownloaded("texture_data_
static LLTrace::CountStatHandle<U32Milliseconds > sTexureDownloadTime("texture_download_time", "amount of time spent fetching textures");
LLTextureInfo::LLTextureInfo(bool postponeStartRecoreder) :
- mLogTextureDownloadsToViewerLog(false),
- mLogTextureDownloadsToSimulator(false),
- mTextureDownloadProtocol("NONE"),
- mTextureLogThreshold(LLUnits::Kilobytes::fromValue(100))
+ mLoggingEnabled(false),
+ mTextureDownloadProtocol("NONE")
{
if (!postponeStartRecoreder)
{
@@ -48,11 +55,9 @@ LLTextureInfo::LLTextureInfo(bool postponeStartRecoreder) :
}
}
-void LLTextureInfo::setUpLogging(bool writeToViewerLog, bool sendToSim, U32Bytes textureLogThreshold)
+void LLTextureInfo::setLogging(bool log_info)
{
- mLogTextureDownloadsToViewerLog = writeToViewerLog;
- mLogTextureDownloadsToSimulator = sendToSim;
- mTextureLogThreshold = U32Bytes(textureLogThreshold);
+ mLoggingEnabled = log_info;
}
LLTextureInfo::~LLTextureInfo()
@@ -147,36 +152,80 @@ void LLTextureInfo::setRequestCompleteTimeAndLog(const LLUUID& id, U64Microsecon
break;
}
- if (mLogTextureDownloadsToViewerLog)
+ if (mLoggingEnabled)
{
- LL_INFOS() << "texture=" << id
- << " start=" << details.mStartTime
- << " end=" << details.mCompleteTime
- << " size=" << details.mSize
- << " offset=" << details.mOffset
- << " length=" << U32Milliseconds(details.mCompleteTime - details.mStartTime)
- << " protocol=" << protocol
- << LL_ENDL;
- }
+ static LLCachedControl<bool> log_to_viewer_log(gSavedSettings, "LogTextureDownloadsToViewerLog", false);
+ static LLCachedControl<bool> log_to_simulator(gSavedSettings, "LogTextureDownloadsToSimulator", false);
+ static LLCachedControl<U32> texture_log_threshold(gSavedSettings, "TextureLoggingThreshold", 1);
- if(mLogTextureDownloadsToSimulator)
- {
- add(sTextureDataDownloaded, details.mSize);
- add(sTexureDownloadTime, details.mCompleteTime - details.mStartTime);
- add(sTextureDownloadsCompleted, 1);
- mTextureDownloadProtocol = protocol;
- if (mRecording.getSum(sTextureDataDownloaded) >= mTextureLogThreshold)
+ if (log_to_viewer_log)
+ {
+ LL_INFOS() << "texture=" << id
+ << " start=" << details.mStartTime
+ << " end=" << details.mCompleteTime
+ << " size=" << details.mSize
+ << " offset=" << details.mOffset
+ << " length=" << U32Milliseconds(details.mCompleteTime - details.mStartTime)
+ << " protocol=" << protocol
+ << LL_ENDL;
+ }
+
+ if(log_to_simulator)
{
- LLSD texture_data;
- std::stringstream startTime;
- startTime << mCurrentStatsBundleStartTime;
- texture_data["start_time"] = startTime.str();
- std::stringstream endTime;
- endTime << completeTime;
- texture_data["end_time"] = endTime.str();
- texture_data["averages"] = getAverages();
- send_texture_stats_to_sim(texture_data);
- resetTextureStatistics();
+ add(sTextureDataDownloaded, details.mSize);
+ add(sTexureDownloadTime, details.mCompleteTime - details.mStartTime);
+ add(sTextureDownloadsCompleted, 1);
+ mTextureDownloadProtocol = protocol;
+ if (mRecording.getSum(sTextureDataDownloaded) >= U32Bytes(texture_log_threshold))
+ {
+ LLSD texture_data;
+ std::stringstream startTime;
+ startTime << mCurrentStatsBundleStartTime;
+ texture_data["start_time"] = startTime.str();
+ std::stringstream endTime;
+ endTime << completeTime;
+ texture_data["end_time"] = endTime.str();
+ texture_data["averages"] = getAverages();
+
+ // Texture cache
+ LLSD texture_cache;
+ U32 cache_read = 0, cache_write = 0, res_wait = 0;
+ F64 cache_hit_rate = 0;
+ LLAppViewer::getTextureFetch()->getStateStats(&cache_read, &cache_write, &res_wait);
+ if (cache_read > 0 || cache_write > 0)
+ {
+ cache_hit_rate = cache_read / (cache_read + cache_write);
+ }
+ texture_cache["cache_read"] = LLSD::Integer(cache_read);
+ texture_cache["cache_write"] = LLSD::Integer(cache_write);
+ texture_cache["hit_rate"] = LLSD::Real(cache_hit_rate);
+ texture_cache["entries"] = LLSD::Integer(LLAppViewer::getTextureCache()->getEntries());
+ texture_cache["space_max"] = ll_sd_from_U64((U64)LLAppViewer::getTextureCache()->getMaxUsage().value()); // bytes
+ texture_cache["space_used"] = ll_sd_from_U64((U64)LLAppViewer::getTextureCache()->getUsage().value()); // bytes
+ texture_data["texture_cache"] = texture_cache;
+
+ // VO and mesh cache
+ LLSD object_cache;
+ object_cache["vo_entries_max"] = LLSD::Integer(LLVOCache::getInstance()->getCacheEntriesMax());
+ object_cache["vo_entries_curent"] = LLSD::Integer(LLVOCache::getInstance()->getCacheEntries());
+ object_cache["vo_active_entries"] = LLSD::Integer(LLWorld::getInstance()->getNumOfActiveCachedObjects());
+ U64 region_hit_count = gAgent.getRegion() != NULL ? gAgent.getRegion()->getRegionCacheHitCount() : 0;
+ U64 region_miss_count = gAgent.getRegion() != NULL ? gAgent.getRegion()->getRegionCacheMissCount() : 0;
+ F64 region_vocache_hit_rate = 0;
+ if (region_hit_count > 0 || region_miss_count > 0)
+ {
+ region_vocache_hit_rate = region_hit_count / (region_hit_count + region_miss_count);
+ }
+ object_cache["vo_region_hitcount"] = ll_sd_from_U64(region_hit_count);
+ object_cache["vo_region_misscount"] = ll_sd_from_U64(region_miss_count);
+ object_cache["vo_region_hitrate"] = LLSD::Real(region_vocache_hit_rate);
+ object_cache["mesh_reads"] = LLSD::Integer(LLMeshRepository::sCacheReads);
+ object_cache["mesh_writes"] = LLSD::Integer(LLMeshRepository::sCacheWrites);
+ texture_data["object_cache"] = object_cache;
+
+ send_texture_stats_to_sim(texture_data);
+ resetTextureStatistics();
+ }
}
}
diff --git a/indra/newview/lltextureinfo.h b/indra/newview/lltextureinfo.h
index 03721bdd73..46378eb7f8 100644
--- a/indra/newview/lltextureinfo.h
+++ b/indra/newview/lltextureinfo.h
@@ -38,7 +38,7 @@ public:
LLTextureInfo(bool postponeStartRecoreder = true);
~LLTextureInfo();
- void setUpLogging(bool writeToViewerLog, bool sendToSim, U32Bytes textureLogThreshold);
+ void setLogging(bool log_info);
bool has(const LLUUID& id);
void setRequestStartTime(const LLUUID& id, U64 startTime);
void setRequestSize(const LLUUID& id, U32 size);
@@ -61,12 +61,11 @@ private:
std::map<LLUUID, LLTextureInfoDetails *> mTextures;
LLSD mAverages;
- bool mLogTextureDownloadsToViewerLog,
- mLogTextureDownloadsToSimulator;
+ bool mLoggingEnabled;
std::string mTextureDownloadProtocol;
- U32Bytes mTextureLogThreshold;
U64Microseconds mCurrentStatsBundleStartTime;
LLTrace::Recording mRecording;
+
};
#endif // LL_LLTEXTUREINFO_H
diff --git a/indra/newview/lltexturestats.cpp b/indra/newview/lltexturestats.cpp
index 8ded148e17..b55b4d9ca4 100644
--- a/indra/newview/lltexturestats.cpp
+++ b/indra/newview/lltexturestats.cpp
@@ -30,6 +30,7 @@
#include "llagent.h"
#include "lltexturefetch.h"
#include "lltexturestats.h"
+#include "llversioninfo.h"
#include "llviewerregion.h"
#include "llcorehttputil.h"
@@ -45,6 +46,8 @@ void send_texture_stats_to_sim(const LLSD &texture_stats)
LLUUID agent_id = gAgent.getID();
texture_stats_report["agent_id"] = agent_id;
texture_stats_report["region_id"] = gAgent.getRegion()->getRegionID();
+ texture_stats_report["viewer_channel"] = LLVersionInfo::getChannel();
+ texture_stats_report["viewer_version"] = LLVersionInfo::getVersion();
texture_stats_report["stats_data"] = texture_stats;
std::string texture_cap_url = gAgent.getRegion()->getCapability("TextureStats");
diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp
index fc052ae3aa..f473000657 100644
--- a/indra/newview/lltoolpie.cpp
+++ b/indra/newview/lltoolpie.cpp
@@ -485,7 +485,8 @@ void LLToolPie::walkToClickedLocation()
mAutoPilotDestination->setColor(LLColor4U(170, 210, 190));
mAutoPilotDestination->setDuration(3.f);
- handle_go_to();
+ LLVector3d pos = LLToolPie::getInstance()->getPick().mPosGlobal;
+ gAgent.startAutoPilotGlobal(pos, std::string(), NULL, NULL, NULL, 0.f, 0.03f, FALSE);
}
// When we get object properties after left-clicking on an object
diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp
index da6b18bb77..6c9fe5e39b 100644
--- a/indra/newview/llviewerinventory.cpp
+++ b/indra/newview/llviewerinventory.cpp
@@ -1511,67 +1511,64 @@ void purge_descendents_of(const LLUUID& id, LLPointer<LLInventoryCallback> cb)
LLPointer<LLViewerInventoryCategory> cat = gInventory.getCategory(id);
if (cat.notNull())
{
- if (LLClipboard::instance().hasContents() && LLClipboard::instance().isCutMode())
+ if (LLClipboard::instance().hasContents())
{
- // Something on the clipboard is in "cut mode" and needs to be preserved
- LL_DEBUGS(LOG_INV) << "purge_descendents_of clipboard case " << cat->getName()
- << " iterate and purge non hidden items" << LL_ENDL;
- LLInventoryModel::cat_array_t* categories;
- LLInventoryModel::item_array_t* items;
- // Get the list of direct descendants in tha categoy passed as argument
- gInventory.getDirectDescendentsOf(id, categories, items);
- std::vector<LLUUID> list_uuids;
- // Make a unique list with all the UUIDs of the direct descendants (items and categories are not treated differently)
- // Note: we need to do that shallow copy as purging things will invalidate the categories or items lists
- for (LLInventoryModel::cat_array_t::const_iterator it = categories->begin(); it != categories->end(); ++it)
- {
- list_uuids.push_back((*it)->getUUID());
- }
- for (LLInventoryModel::item_array_t::const_iterator it = items->begin(); it != items->end(); ++it)
+ // Remove items from clipboard or it will remain active even if there is nothing to paste/copy
+ LLInventoryModel::cat_array_t categories;
+ LLInventoryModel::item_array_t items;
+ gInventory.collectDescendents(id, categories, items, TRUE);
+
+ for (LLInventoryModel::cat_array_t::const_iterator it = categories.begin(); it != categories.end(); ++it)
{
- list_uuids.push_back((*it)->getUUID());
+ if (LLClipboard::instance().isOnClipboard((*it)->getUUID()))
+ {
+ // No sense in removing single items, partial 'paste' will result in confusion only
+ LLClipboard::instance().reset();
+ break;
+ }
}
- // Iterate through the list and only purge the UUIDs that are not on the clipboard
- for (std::vector<LLUUID>::const_iterator it = list_uuids.begin(); it != list_uuids.end(); ++it)
+ if (LLClipboard::instance().hasContents())
{
- if (!LLClipboard::instance().isOnClipboard(*it))
+ for (LLInventoryModel::item_array_t::const_iterator it = items.begin(); it != items.end(); ++it)
{
- remove_inventory_object(*it, NULL);
+ if (LLClipboard::instance().isOnClipboard((*it)->getUUID()))
+ {
+ LLClipboard::instance().reset();
+ break;
+ }
}
}
}
- else
+
+ if (AISAPI::isAvailable())
{
- if (AISAPI::isAvailable())
+ if (cat->getVersion() == LLViewerInventoryCategory::VERSION_UNKNOWN)
{
- if (cat->getVersion() == LLViewerInventoryCategory::VERSION_UNKNOWN)
- {
- LL_WARNS() << "Purging not fetched folder: " << cat->getName() << LL_ENDL;
- }
- AISAPI::completion_t cr = (cb) ? boost::bind(&doInventoryCb, cb, _1) : AISAPI::completion_t();
- AISAPI::PurgeDescendents(id, cr);
+ LL_WARNS() << "Purging not fetched folder: " << cat->getName() << LL_ENDL;
}
- else // no cap
+ AISAPI::completion_t cr = (cb) ? boost::bind(&doInventoryCb, cb, _1) : AISAPI::completion_t();
+ AISAPI::PurgeDescendents(id, cr);
+ }
+ else // no cap
+ {
+ // Fast purge
+ LL_DEBUGS(LOG_INV) << "purge_descendents_of fast case " << cat->getName() << LL_ENDL;
+
+ // send it upstream
+ LLMessageSystem* msg = gMessageSystem;
+ msg->newMessage("PurgeInventoryDescendents");
+ msg->nextBlock("AgentData");
+ msg->addUUID("AgentID", gAgent.getID());
+ msg->addUUID("SessionID", gAgent.getSessionID());
+ msg->nextBlock("InventoryData");
+ msg->addUUID("FolderID", id);
+ gAgent.sendReliableMessage();
+
+ // Update model immediately because there is no callback mechanism.
+ gInventory.onDescendentsPurgedFromServer(id);
+ if (cb)
{
- // Fast purge
- LL_DEBUGS(LOG_INV) << "purge_descendents_of fast case " << cat->getName() << LL_ENDL;
-
- // send it upstream
- LLMessageSystem* msg = gMessageSystem;
- msg->newMessage("PurgeInventoryDescendents");
- msg->nextBlock("AgentData");
- msg->addUUID("AgentID", gAgent.getID());
- msg->addUUID("SessionID", gAgent.getSessionID());
- msg->nextBlock("InventoryData");
- msg->addUUID("FolderID", id);
- gAgent.sendReliableMessage();
-
- // Update model immediately because there is no callback mechanism.
- gInventory.onDescendentsPurgedFromServer(id);
- if (cb)
- {
- cb->fire(id);
- }
+ cb->fire(id);
}
}
}
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index f346f48ef5..5bbf5650ad 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -618,6 +618,7 @@ class LLAdvancedDumpInfoToConsole : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
{
+ gDebugView->mDebugConsolep->setVisible(TRUE);
std::string info_type = userdata.asString();
if ("region" == info_type)
{
@@ -8000,7 +8001,7 @@ void handle_report_bug(const LLSD& param)
LLUIString url(param.asString());
LLStringUtil::format_map_t replace;
- replace["[ENVIRONMENT]"] = LLURI::escape(LLAppViewer::instance()->getViewerInfoString());
+ replace["[ENVIRONMENT]"] = LLURI::escape(LLAppViewer::instance()->getShortViewerInfoString());
LLSLURL location_url;
LLAgentUI::buildSLURL(location_url);
replace["[LOCATION]"] = LLURI::escape(location_url.getSLURLString());
diff --git a/indra/newview/llviewermenufile.cpp b/indra/newview/llviewermenufile.cpp
index 8d0c5af314..90355b7166 100644
--- a/indra/newview/llviewermenufile.cpp
+++ b/indra/newview/llviewermenufile.cpp
@@ -799,7 +799,7 @@ void upload_new_resource(
// uploadInfo->setTransactionId(tid);
- std::string url = gAgent.getRegion()->getCapability("NewFileAgentInventory");
+ std::string url = gAgent.getRegionCapability("NewFileAgentInventory");
if ( !url.empty() )
{
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index 083d2991f8..e7917c043f 100644
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -3569,7 +3569,7 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data)
LLAvatarName av_name;
if (LLAvatarNameCache::get(from_id, &av_name))
{
- chat.mFromName = av_name.getDisplayName();
+ chat.mFromName = av_name.getCompleteName();
}
else
{
@@ -6851,14 +6851,10 @@ void process_teleport_failed(LLMessageSystem *msg, void**)
// Get the message ID
msg->getStringFast(_PREHASH_AlertInfo, _PREHASH_Message, message_id);
big_reason = LLAgent::sTeleportErrorMessages[message_id];
- if ( big_reason.size() > 0 )
- { // Substitute verbose reason from the local map
- args["REASON"] = big_reason;
- }
- else
- { // Nothing found in the map - use what the server returned in the original message block
+ if ( big_reason.size() <= 0 )
+ {
+ // Nothing found in the map - use what the server returned in the original message block
msg->getStringFast(_PREHASH_Info, _PREHASH_Reason, big_reason);
- args["REASON"] = big_reason;
}
LLSD llsd_block;
@@ -6873,6 +6869,16 @@ void process_teleport_failed(LLMessageSystem *msg, void**)
}
else
{
+ if(llsd_block.has("REGION_NAME"))
+ {
+ std::string region_name = llsd_block["REGION_NAME"].asString();
+ if(!region_name.empty())
+ {
+ LLStringUtil::format_map_t name_args;
+ name_args["[REGION_NAME]"] = region_name;
+ LLStringUtil::format(big_reason, name_args);
+ }
+ }
// change notification name in this special case
if (handle_teleport_access_blocked(llsd_block, message_id, args["REASON"]))
{
@@ -6884,7 +6890,7 @@ void process_teleport_failed(LLMessageSystem *msg, void**)
}
}
}
-
+ args["REASON"] = big_reason;
}
else
{ // Extra message payload not found - use what the simulator sent
diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp
index 9299e60b1c..f15c6d26ec 100644
--- a/indra/newview/llviewerobject.cpp
+++ b/indra/newview/llviewerobject.cpp
@@ -6216,7 +6216,7 @@ void LLViewerObject::resetChildrenRotationAndPosition(const std::vector<LLQuater
}
//counter-translation
-void LLViewerObject::resetChildrenPosition(const LLVector3& offset, BOOL simplified)
+void LLViewerObject::resetChildrenPosition(const LLVector3& offset, BOOL simplified, BOOL skip_avatar_child)
{
if(mChildList.empty())
{
@@ -6246,6 +6246,7 @@ void LLViewerObject::resetChildrenPosition(const LLVector3& offset, BOOL simplif
iter != mChildList.end(); iter++)
{
LLViewerObject* childp = *iter;
+
if (!childp->isSelected() && childp->mDrawable.notNull())
{
if (childp->getPCode() != LL_PCODE_LEGACY_AVATAR)
@@ -6255,14 +6256,16 @@ void LLViewerObject::resetChildrenPosition(const LLVector3& offset, BOOL simplif
}
else //avatar
{
- LLVector3 reset_pos = ((LLVOAvatar*)childp)->mDrawable->mXform.getPosition() + child_offset ;
+ if(!skip_avatar_child)
+ {
+ LLVector3 reset_pos = ((LLVOAvatar*)childp)->mDrawable->mXform.getPosition() + child_offset ;
- ((LLVOAvatar*)childp)->mDrawable->mXform.setPosition(reset_pos);
- ((LLVOAvatar*)childp)->mDrawable->getVObj()->setPosition(reset_pos);
-
- LLManip::rebuild(childp);
- }
- }
+ ((LLVOAvatar*)childp)->mDrawable->mXform.setPosition(reset_pos);
+ ((LLVOAvatar*)childp)->mDrawable->getVObj()->setPosition(reset_pos);
+ LLManip::rebuild(childp);
+ }
+ }
+ }
}
return ;
diff --git a/indra/newview/llviewerobject.h b/indra/newview/llviewerobject.h
index 24fcf0517e..7a490f6957 100644
--- a/indra/newview/llviewerobject.h
+++ b/indra/newview/llviewerobject.h
@@ -575,7 +575,7 @@ public:
public:
//counter-translation
- void resetChildrenPosition(const LLVector3& offset, BOOL simplified = FALSE) ;
+ void resetChildrenPosition(const LLVector3& offset, BOOL simplified = FALSE, BOOL skip_avatar_child = FALSE) ;
//counter-rotation
void resetChildrenRotationAndPosition(const std::vector<LLQuaternion>& rotations,
const std::vector<LLVector3>& positions) ;
diff --git a/indra/newview/llviewerobjectlist.cpp b/indra/newview/llviewerobjectlist.cpp
index 8f98d66c0c..3c83e3a006 100644
--- a/indra/newview/llviewerobjectlist.cpp
+++ b/indra/newview/llviewerobjectlist.cpp
@@ -1247,9 +1247,11 @@ void LLViewerObjectList::clearDebugText()
void LLViewerObjectList::cleanupReferences(LLViewerObject *objectp)
{
+ bool new_dead_object = true;
if (mDeadObjects.find(objectp->mID) != mDeadObjects.end())
{
LL_INFOS() << "Object " << objectp->mID << " already on dead list!" << LL_ENDL;
+ new_dead_object = false;
}
else
{
@@ -1286,7 +1288,10 @@ void LLViewerObjectList::cleanupReferences(LLViewerObject *objectp)
// Also, not cleaned up
removeDrawable(objectp->mDrawable);
- mNumDeadObjects++;
+ if(new_dead_object)
+ {
+ mNumDeadObjects++;
+ }
}
static LLTrace::BlockTimerStatHandle FTM_REMOVE_DRAWABLE("Remove Drawable");
diff --git a/indra/newview/llviewerparcelmedia.cpp b/indra/newview/llviewerparcelmedia.cpp
index 0ab3d2b4e7..d31fc0d606 100644
--- a/indra/newview/llviewerparcelmedia.cpp
+++ b/indra/newview/llviewerparcelmedia.cpp
@@ -461,7 +461,7 @@ void LLViewerParcelMedia::processParcelMediaUpdate( LLMessageSystem *msg, void *
// *TODO: I can not find any active code where this method is called...
void LLViewerParcelMedia::sendMediaNavigateMessage(const std::string& url)
{
- std::string region_url = gAgent.getRegion()->getCapability("ParcelNavigateMedia");
+ std::string region_url = gAgent.getRegionCapability("ParcelNavigateMedia");
if (!region_url.empty())
{
// send navigate event to sim for link sharing
diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp
index eb37613c95..3fd2af87de 100644
--- a/indra/newview/llviewerregion.cpp
+++ b/indra/newview/llviewerregion.cpp
@@ -532,7 +532,9 @@ LLViewerRegion::LLViewerRegion(const U64 &handle,
mDead(FALSE),
mLastVisitedEntry(NULL),
mInvisibilityCheckHistory(-1),
- mPaused(FALSE)
+ mPaused(FALSE),
+ mRegionCacheHitCount(0),
+ mRegionCacheMissCount(0)
{
mWidth = region_width_meters;
mImpl->mOriginGlobal = from_region_handle(handle);
@@ -2440,6 +2442,7 @@ LLVOCacheEntry* LLViewerRegion::getCacheEntry(U32 local_id, bool valid)
void LLViewerRegion::addCacheMiss(U32 id, LLViewerRegion::eCacheMissType miss_type)
{
+ mRegionCacheMissCount++;
#if 0
mCacheMissList.insert(CacheMissItem(id, miss_type));
#else
@@ -2491,6 +2494,7 @@ bool LLViewerRegion::probeCache(U32 local_id, U32 crc, U32 flags, U8 &cache_miss
if (entry->getCRC() == crc)
{
// Record a hit
+ mRegionCacheHitCount++;
entry->recordHit();
cache_miss_type = CACHE_MISS_TYPE_NONE;
entry->setUpdateFlags(flags);
diff --git a/indra/newview/llviewerregion.h b/indra/newview/llviewerregion.h
index 61ce5b454d..69fb9c4d4e 100644
--- a/indra/newview/llviewerregion.h
+++ b/indra/newview/llviewerregion.h
@@ -338,6 +338,8 @@ public:
LLVOCacheEntry* getCacheEntryForOctree(U32 local_id);
LLVOCacheEntry* getCacheEntry(U32 local_id, bool valid = true);
bool probeCache(U32 local_id, U32 crc, U32 flags, U8 &cache_miss_type);
+ U64 getRegionCacheHitCount() { return mRegionCacheHitCount; }
+ U64 getRegionCacheMissCount() { return mRegionCacheMissCount; }
void requestCacheMisses();
void addCacheMissFull(const U32 local_id);
//update object cache if the object receives a full-update or terse update
@@ -534,7 +536,9 @@ private:
typedef std::list<CacheMissItem> cache_miss_list_t;
};
CacheMissItem::cache_miss_list_t mCacheMissList;
-
+ U64 mRegionCacheHitCount;
+ U64 mRegionCacheMissCount;
+
caps_received_signal_t mCapabilitiesReceivedSignal;
caps_received_signal_t mSimulatorFeaturesReceivedSignal;
diff --git a/indra/newview/llviewerstats.cpp b/indra/newview/llviewerstats.cpp
index 8ff735a8c1..256e69d029 100644
--- a/indra/newview/llviewerstats.cpp
+++ b/indra/newview/llviewerstats.cpp
@@ -490,7 +490,7 @@ void send_stats()
LLSD &system = body["system"];
system["ram"] = (S32) gSysMemory.getPhysicalMemoryKB().value();
- system["os"] = LLAppViewer::instance()->getOSInfo().getOSStringSimple();
+ system["os"] = LLOSInfo::instance().getOSStringSimple();
system["cpu"] = gSysCPU.getCPUString();
system["address_size"] = ADDRESS_SIZE;
unsigned char MACAddress[MAC_ADDRESS_BYTES];
@@ -587,9 +587,6 @@ void send_stats()
misc["string_1"] = llformat("%d", window_size);
misc["string_2"] = llformat("Texture Time: %.2f, Total Time: %.2f", gTextureTimer.getElapsedTimeF32(), gFrameTimeSeconds.value());
-// misc["int_1"] = LLSD::Integer(gSavedSettings.getU32("RenderQualityPerformance")); // Steve: 1.21
-// misc["int_2"] = LLSD::Integer(gFrameStalls); // Steve: 1.21
-
F32 unbaked_time = LLVOAvatar::sUnbakedTime * 1000.f / gFrameTimeSeconds;
misc["int_1"] = LLSD::Integer(unbaked_time); // Steve: 1.22
F32 grey_time = LLVOAvatar::sGreyTime * 1000.f / gFrameTimeSeconds;
diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp
index cd8dd54fa6..e5a1bed48c 100644
--- a/indra/newview/llviewertexture.cpp
+++ b/indra/newview/llviewertexture.cpp
@@ -1396,8 +1396,7 @@ void LLViewerFetchedTexture::addToCreateTexture()
{
//make a duplicate in case somebody else is using this raw image
- mRawImage = mRawImage->duplicate();
- mRawImage->scale(w >> i, h >> i) ;
+ mRawImage = mRawImage->scaled(w >> i, h >> i);
}
}
}
@@ -2913,8 +2912,7 @@ void LLViewerFetchedTexture::setCachedRawImage()
{
//make a duplicate in case somebody else is using this raw image
- mRawImage = mRawImage->duplicate();
- mRawImage->scale(w >> i, h >> i) ;
+ mRawImage = mRawImage->scaled(w >> i, h >> i);
}
}
mCachedRawImage = mRawImage;
@@ -3966,7 +3964,7 @@ void LLTexturePipelineTester::updateStablizingTime()
}
//virtual
-void LLTexturePipelineTester::compareTestSessions(std::ofstream* os)
+void LLTexturePipelineTester::compareTestSessions(llofstream* os)
{
LLTexturePipelineTester::LLTextureTestSession* base_sessionp = dynamic_cast<LLTexturePipelineTester::LLTextureTestSession*>(mBaseSessionp);
LLTexturePipelineTester::LLTextureTestSession* current_sessionp = dynamic_cast<LLTexturePipelineTester::LLTextureTestSession*>(mCurrentSessionp);
diff --git a/indra/newview/llviewertexture.h b/indra/newview/llviewertexture.h
index 8017d82604..c9dea17f63 100644
--- a/indra/newview/llviewertexture.h
+++ b/indra/newview/llviewertexture.h
@@ -779,7 +779,7 @@ private:
};
/*virtual*/ LLMetricPerformanceTesterWithSession::LLTestSession* loadTestSession(LLSD* log) ;
- /*virtual*/ void compareTestSessions(std::ofstream* os) ;
+ /*virtual*/ void compareTestSessions(llofstream* os) ;
};
#endif
diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp
index a96cede739..6b201ffe37 100644
--- a/indra/newview/llviewerwindow.cpp
+++ b/indra/newview/llviewerwindow.cpp
@@ -4403,6 +4403,11 @@ BOOL LLViewerWindow::saveImageNumbered(LLImageFormatted *image, BOOL force_picke
LLViewerWindow::sSnapshotDir = gDirUtilp->getDirName(filepath);
}
+ if(LLViewerWindow::sSnapshotDir.empty())
+ {
+ return FALSE;
+ }
+
// Check if there is enough free space to save snapshot
#ifdef LL_WINDOWS
boost::filesystem::space_info b_space = boost::filesystem::space(utf8str_to_utf16str(sSnapshotDir));
diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp
index 80c6805ead..efcdb07176 100644
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -3417,10 +3417,62 @@ void LLVOAvatar::updateDebugText()
std::string output;
if (motionp->getName().empty())
{
+ std::string name;
+ if (gAgent.isGodlikeWithoutAdminMenuFakery() || isSelf())
+ {
+ name = motionp->getID().asString();
+ LLVOAvatar::AnimSourceIterator anim_it = mAnimationSources.begin();
+ for (; anim_it != mAnimationSources.end(); ++anim_it)
+ {
+ if (anim_it->second == motionp->getID())
+ {
+ LLViewerObject* object = gObjectList.findObject(anim_it->first);
+ if (!object)
+ {
+ break;
+ }
+ if (object->isAvatar())
+ {
+ if (mMotionController.mIsSelf)
+ {
+ // Searching inventory by asset id is really long
+ // so just mark as inventory
+ // Also item is likely to be named by LLPreviewAnim
+ name += "(inventory)";
+ }
+ }
+ else
+ {
+ LLViewerInventoryItem* item = NULL;
+ if (!object->isInventoryDirty())
+ {
+ item = object->getInventoryItemByAsset(motionp->getID());
+ }
+ if (item)
+ {
+ name = item->getName();
+ }
+ else if (object->isAttachment())
+ {
+ name += "(" + getAttachmentItemName() + ")";
+ }
+ else
+ {
+ // in-world object, name or content unknown
+ name += "(in-world)";
+ }
+ }
+ break;
+ }
+ }
+ }
+ else
+ {
+ name = LLUUID::null.asString();
+ }
+
output = llformat("%s - %d",
- gAgent.isGodlikeWithoutAdminMenuFakery() ?
- motionp->getID().asString().c_str() :
- LLUUID::null.asString().c_str(),
+ name.c_str(),
(U32)motionp->getPriority());
}
else
@@ -5230,10 +5282,6 @@ LLUUID LLVOAvatar::remapMotionID(const LLUUID& id)
if (use_new_walk_run)
result = ANIM_AGENT_FEMALE_RUN_NEW;
}
- else if (id == ANIM_AGENT_SIT)
- {
- result = ANIM_AGENT_SIT_FEMALE;
- }
}
else
{
@@ -8378,7 +8426,7 @@ void dump_sequential_xml(const std::string outprefix, const LLSD& content)
{
std::string outfilename = get_sequential_numbered_file_name(outprefix,".xml");
std::string fullpath = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,outfilename);
- std::ofstream ofs(fullpath.c_str(), std::ios_base::out);
+ llofstream ofs(fullpath.c_str(), std::ios_base::out);
ofs << LLSDOStreamer<LLSDXMLFormatter>(content, LLSDFormatter::OPTIONS_PRETTY);
LL_DEBUGS("Avatar") << "results saved to: " << fullpath << LL_ENDL;
}
diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp
index d62862dfb8..10af524ee7 100644
--- a/indra/newview/llvoavatarself.cpp
+++ b/indra/newview/llvoavatarself.cpp
@@ -2744,7 +2744,7 @@ bool LLVOAvatarSelf::sendAppearanceMessage(LLMessageSystem *mesgsys) const
//------------------------------------------------------------------------
void LLVOAvatarSelf::sendHoverHeight() const
{
- std::string url = gAgent.getRegion()->getCapability("AgentPreferences");
+ std::string url = gAgent.getRegionCapability("AgentPreferences");
if (!url.empty())
{
diff --git a/indra/newview/llvocache.cpp b/indra/newview/llvocache.cpp
index fd1d57a9d0..fb28d9bdb5 100644
--- a/indra/newview/llvocache.cpp
+++ b/indra/newview/llvocache.cpp
@@ -1093,11 +1093,21 @@ void LLVOCache::initCache(ELLPath location, U32 size, U32 cache_version)
}
mCacheSize = llclamp(size, MIN_ENTRIES_TO_PURGE, MAX_NUM_OBJECT_ENTRIES);
mMetaInfo.mVersion = cache_version;
+
+#if defined(ADDRESS_SIZE)
+ U32 expected_address = ADDRESS_SIZE;
+#else
+ U32 expected_address = 32;
+#endif
+ mMetaInfo.mAddressSize = expected_address;
+
readCacheHeader();
- if(mMetaInfo.mVersion != cache_version)
+ if( mMetaInfo.mVersion != cache_version
+ || mMetaInfo.mAddressSize != expected_address)
{
mMetaInfo.mVersion = cache_version ;
+ mMetaInfo.mAddressSize = expected_address;
if(mReadOnly) //disable cache
{
clearCacheInMemory();
diff --git a/indra/newview/llvocache.h b/indra/newview/llvocache.h
index 7aabde1b2d..7d450c5231 100644
--- a/indra/newview/llvocache.h
+++ b/indra/newview/llvocache.h
@@ -237,9 +237,10 @@ private:
struct HeaderMetaInfo
{
- HeaderMetaInfo() : mVersion(0){}
+ HeaderMetaInfo() : mVersion(0), mAddressSize(0) {}
U32 mVersion;
+ U32 mAddressSize;
};
struct header_entry_less
@@ -267,6 +268,9 @@ public:
void setReadOnly(bool read_only) {mReadOnly = read_only;}
+ U32 getCacheEntries() { return mNumEntries; }
+ U32 getCacheEntriesMax() { return mCacheSize; }
+
private:
void setDirNames(ELLPath location);
// determine the cache filename for the region from the region handle
diff --git a/indra/newview/llvoicevivox.cpp b/indra/newview/llvoicevivox.cpp
index 189ed54993..25df528d89 100644
--- a/indra/newview/llvoicevivox.cpp
+++ b/indra/newview/llvoicevivox.cpp
@@ -153,6 +153,7 @@ static bool sMuteListListener_listening = false;
///////////////////////////////////////////////////////////////////////////////////////////////
static LLProcessPtr sGatewayPtr;
+static LLEventStream sGatewayPump("VivoxDaemonPump", true);
static bool isGatewayRunning()
{
@@ -163,6 +164,7 @@ static void killGateway()
{
if (sGatewayPtr)
{
+ sGatewayPump.stopListening("VivoxDaemonPump");
sGatewayPtr->kill();
}
}
@@ -599,6 +601,19 @@ bool LLVivoxVoiceClient::endAndDisconnectSession()
return true;
}
+bool LLVivoxVoiceClient::callbackEndDaemon(const LLSD& data)
+{
+ if (!LLAppViewer::isExiting())
+ {
+ terminateAudioSession(false);
+ closeSocket();
+ cleanUp();
+ LLVoiceClient::getInstance()->setUserPTTState(false);
+ gAgent.setVoiceConnected(false);
+ }
+ sGatewayPump.stopListening("VivoxDaemonPump");
+ return false;
+}
bool LLVivoxVoiceClient::startAndLaunchDaemon()
{
@@ -670,6 +685,9 @@ bool LLVivoxVoiceClient::startAndLaunchDaemon()
params.args.add(LLVivoxSecurity::getInstance()->connectorHandle());
# endif // VIVOX_HANDLE_ARGS
+ params.postend = sGatewayPump.getName();
+ sGatewayPump.listen("VivoxDaemonPump", boost::bind(&LLVivoxVoiceClient::callbackEndDaemon, this, _1));
+
sGatewayPtr = LLProcess::create(params);
mDaemonHost = LLHost(gSavedSettings.getString("VivoxVoiceHost").c_str(), gSavedSettings.getU32("VivoxVoicePort"));
@@ -764,15 +782,13 @@ bool LLVivoxVoiceClient::provisionVoiceAccount()
llcoro::suspend();
}
- LLViewerRegion *region = gAgent.getRegion();
-
- while (!region->capabilitiesReceived())
+ while (!gAgent.getRegion()->capabilitiesReceived())
{
// *TODO* Pump a message for wake up.
llcoro::suspend();
}
- std::string url = region->getCapability("ProvisionVoiceAccountRequest");
+ std::string url = gAgent.getRegionCapability("ProvisionVoiceAccountRequest");
LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID);
LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t
diff --git a/indra/newview/llvoicevivox.h b/indra/newview/llvoicevivox.h
index 81e924e438..c7ce92fff5 100644
--- a/indra/newview/llvoicevivox.h
+++ b/indra/newview/llvoicevivox.h
@@ -623,6 +623,7 @@ private:
bool startAndConnectSession();
bool endAndDisconnectSession();
+ bool callbackEndDaemon(const LLSD& data);
bool startAndLaunchDaemon();
bool provisionVoiceAccount();
bool establishVoiceConnection();
diff --git a/indra/newview/llweb.cpp b/indra/newview/llweb.cpp
index 8026dc3ea8..b816225b07 100644
--- a/indra/newview/llweb.cpp
+++ b/indra/newview/llweb.cpp
@@ -192,7 +192,7 @@ std::string LLWeb::expandURLSubstitutions(const std::string &url,
substitution["CHANNEL"] = LLVersionInfo::getChannel();
substitution["GRID"] = LLGridManager::getInstance()->getGridId();
substitution["GRID_LOWERCASE"] = utf8str_tolower(LLGridManager::getInstance()->getGridId());
- substitution["OS"] = LLAppViewer::instance()->getOSInfo().getOSStringSimple();
+ substitution["OS"] = LLOSInfo::instance().getOSStringSimple();
substitution["SESSION_ID"] = gAgent.getSessionID();
substitution["FIRST_LOGIN"] = gAgent.isFirstLogin();
@@ -224,6 +224,22 @@ std::string LLWeb::expandURLSubstitutions(const std::string &url,
}
substitution["PARCEL_ID"] = llformat("%d", parcel_id);
+ // find the grid
+ std::string current_grid = LLGridManager::getInstance()->getGridId();
+ std::transform(current_grid.begin(), current_grid.end(), current_grid.begin(), ::tolower);
+ if (current_grid == "agni")
+ {
+ substitution["GRID"] = "secondlife.com";
+ }
+ else if (current_grid == "damballah")
+ {
+ // Staging grid has its own naming scheme.
+ substitution["GRID"] = "secondlife-staging.com";
+ }
+ else
+ {
+ substitution["GRID"] = llformat("%s.lindenlab.com", current_grid.c_str());
+ }
// expand all of the substitution strings and escape the url
std::string expanded_url = url;
LLStringUtil::format(expanded_url, substitution);
diff --git a/indra/newview/llwlhandlers.cpp b/indra/newview/llwlhandlers.cpp
index 87e8c3008e..ea65a0c6d9 100644
--- a/indra/newview/llwlhandlers.cpp
+++ b/indra/newview/llwlhandlers.cpp
@@ -74,7 +74,7 @@ void LLEnvironmentRequest::onRegionCapsReceived(const LLUUID& region_id)
// static
bool LLEnvironmentRequest::doRequest()
{
- std::string url = gAgent.getRegion()->getCapability("EnvironmentSettings");
+ std::string url = gAgent.getRegionCapability("EnvironmentSettings");
if (url.empty())
{
LL_INFOS("WindlightCaps") << "Skipping windlight setting request - we don't have this capability" << LL_ENDL;
@@ -162,7 +162,7 @@ bool LLEnvironmentApply::initiateRequest(const LLSD& content)
sLastUpdate = current;
// Send update request.
- std::string url = gAgent.getRegion()->getCapability("EnvironmentSettings");
+ std::string url = gAgent.getRegionCapability("EnvironmentSettings");
if (url.empty())
{
LL_WARNS("WindlightCaps") << "Applying windlight settings not supported" << LL_ENDL;
diff --git a/indra/newview/llxmlrpclistener.cpp b/indra/newview/llxmlrpclistener.cpp
index cc3645131d..99070d5bee 100644
--- a/indra/newview/llxmlrpclistener.cpp
+++ b/indra/newview/llxmlrpclistener.cpp
@@ -312,7 +312,7 @@ public:
}
XMLRPC_RequestSetData(request, xparams);
- mTransaction.reset(new LLXMLRPCTransaction(mUri, request));
+ mTransaction.reset(new LLXMLRPCTransaction(mUri, request, true, command.has("http_params")? LLSD(command["http_params"]) : LLSD()));
mPreviousStatus = mTransaction->status(NULL);
// Free the XMLRPC_REQUEST object and the attached data values.
diff --git a/indra/newview/llxmlrpctransaction.cpp b/indra/newview/llxmlrpctransaction.cpp
index f8b38669b6..0c8495a6e4 100644
--- a/indra/newview/llxmlrpctransaction.cpp
+++ b/indra/newview/llxmlrpctransaction.cpp
@@ -208,7 +208,7 @@ public:
std::string mCertStore;
LLPointer<LLCertificate> mErrorCert;
- Impl(const std::string& uri, XMLRPC_REQUEST request, bool useGzip);
+ Impl(const std::string& uri, XMLRPC_REQUEST request, bool useGzip, const LLSD& httpParams);
Impl(const std::string& uri,
const std::string& method, LLXMLRPCValue params, bool useGzip);
~Impl();
@@ -219,7 +219,7 @@ public:
void setHttpStatus(const LLCore::HttpStatus &status);
private:
- void init(XMLRPC_REQUEST request, bool useGzip);
+ void init(XMLRPC_REQUEST request, bool useGzip, const LLSD& httpParams);
};
LLXMLRPCTransaction::Handler::Handler(LLCore::HttpRequest::ptr_t &request,
@@ -315,13 +315,13 @@ void LLXMLRPCTransaction::Handler::onCompleted(LLCore::HttpHandle handle,
//=========================================================================
LLXMLRPCTransaction::Impl::Impl(const std::string& uri,
- XMLRPC_REQUEST request, bool useGzip)
+ XMLRPC_REQUEST request, bool useGzip, const LLSD& httpParams)
: mHttpRequest(),
mStatus(LLXMLRPCTransaction::StatusNotStarted),
mURI(uri),
mResponse(0)
{
- init(request, useGzip);
+ init(request, useGzip, httpParams);
}
@@ -337,7 +337,7 @@ LLXMLRPCTransaction::Impl::Impl(const std::string& uri,
XMLRPC_RequestSetRequestType(request, xmlrpc_request_call);
XMLRPC_RequestSetData(request, params.getValue());
- init(request, useGzip);
+ init(request, useGzip, LLSD());
// DEV-28398: without this XMLRPC_RequestFree() call, it looks as though
// the 'request' object is simply leaked. It's less clear to me whether we
// should also ask to free request value data (second param 1), since the
@@ -345,7 +345,7 @@ LLXMLRPCTransaction::Impl::Impl(const std::string& uri,
XMLRPC_RequestFree(request, 1);
}
-void LLXMLRPCTransaction::Impl::init(XMLRPC_REQUEST request, bool useGzip)
+void LLXMLRPCTransaction::Impl::init(XMLRPC_REQUEST request, bool useGzip, const LLSD& httpParams)
{
LLCore::HttpOptions::ptr_t httpOpts;
LLCore::HttpHeaders::ptr_t httpHeaders;
@@ -359,7 +359,15 @@ void LLXMLRPCTransaction::Impl::init(XMLRPC_REQUEST request, bool useGzip)
// LLRefCounted starts with a 1 ref, so don't add a ref in the smart pointer
httpOpts = LLCore::HttpOptions::ptr_t(new LLCore::HttpOptions());
- httpOpts->setTimeout(40L);
+ // delay between repeats will start from 5 sec and grow to 20 sec with each repeat
+ httpOpts->setMinBackoff(5E6L);
+ httpOpts->setMaxBackoff(20E6L);
+
+ httpOpts->setTimeout(httpParams.has("timeout") ? httpParams["timeout"].asInteger() : 40L);
+ if (httpParams.has("retries"))
+ {
+ httpOpts->setRetries(httpParams["retries"].asInteger());
+ }
bool vefifySSLCert = !gSavedSettings.getBOOL("NoVerifySSLCert");
mCertStore = gSavedSettings.getString("CertStore");
@@ -526,8 +534,8 @@ void LLXMLRPCTransaction::Impl::setHttpStatus(const LLCore::HttpStatus &status)
LLXMLRPCTransaction::LLXMLRPCTransaction(
- const std::string& uri, XMLRPC_REQUEST request, bool useGzip)
-: impl(* new Impl(uri, request, useGzip))
+ const std::string& uri, XMLRPC_REQUEST request, bool useGzip, const LLSD& httpParams)
+: impl(* new Impl(uri, request, useGzip, httpParams))
{ }
diff --git a/indra/newview/llxmlrpctransaction.h b/indra/newview/llxmlrpctransaction.h
index 3a1c9c82b7..7a9bc991f7 100644
--- a/indra/newview/llxmlrpctransaction.h
+++ b/indra/newview/llxmlrpctransaction.h
@@ -85,7 +85,7 @@ class LLXMLRPCTransaction
{
public:
LLXMLRPCTransaction(const std::string& uri,
- XMLRPC_REQUEST request, bool useGzip = true);
+ XMLRPC_REQUEST request, bool useGzip = true, const LLSD& httpParams = LLSD());
// does not take ownership of the request object
// request can be freed as soon as the transaction is constructed
diff --git a/indra/newview/skins/default/xui/de/menu_viewer.xml b/indra/newview/skins/default/xui/de/menu_viewer.xml
index c484f11590..5feedef965 100644
--- a/indra/newview/skins/default/xui/de/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/de/menu_viewer.xml
@@ -173,6 +173,7 @@
</menu>
<menu label="Hilfe" name="Help">
<menu_item_call label="Anweisungen..." name="How To"/>
+ <menu_item_call label="Kurzanleitung" name="Quickstart"/>
<menu_item_call label="Knowledge Base" name="Knowledge Base"/>
<menu_item_call label="Wiki" name="Wiki"/>
<menu_item_call label="Community-Foren" name="Community Forums"/>
diff --git a/indra/newview/skins/default/xui/de/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/de/panel_preferences_advanced.xml
index 60e4fb19a7..b8ddc63b93 100644
--- a/indra/newview/skins/default/xui/de/panel_preferences_advanced.xml
+++ b/indra/newview/skins/default/xui/de/panel_preferences_advanced.xml
@@ -6,7 +6,7 @@
<text name="Cache:">
Cache:
</text>
- <spinner label="Cache-Größe (64 – 9.984 MB)" name="cachesizespinner"/>
+ <spinner label="Cache-Größe (256 – 9.984 MB)" name="cachesizespinner"/>
<text name="text_box5">
MB
</text>
diff --git a/indra/newview/skins/default/xui/en/floater_avatar_picker.xml b/indra/newview/skins/default/xui/en/floater_avatar_picker.xml
index 1a55dc2e2c..dddb258ed9 100644
--- a/indra/newview/skins/default/xui/en/floater_avatar_picker.xml
+++ b/indra/newview/skins/default/xui/en/floater_avatar_picker.xml
@@ -16,6 +16,10 @@
&apos;[TEXT]&apos; not found
</floater.string>
<floater.string
+ name="not_found_text">
+ Resident wasn't found.
+ </floater.string>
+ <floater.string
name="no_one_near">
No one near
</floater.string>
diff --git a/indra/newview/skins/default/xui/en/floater_grid_status.xml b/indra/newview/skins/default/xui/en/floater_grid_status.xml
index b97bd8056d..bf78204282 100644
--- a/indra/newview/skins/default/xui/en/floater_grid_status.xml
+++ b/indra/newview/skins/default/xui/en/floater_grid_status.xml
@@ -12,7 +12,6 @@
save_rect="true"
save_visibility="true"
title=""
- initial_mime_type="text/html"
width="780"
tab_stop="true"
filename="floater_web_content.xml"/>
diff --git a/indra/newview/skins/default/xui/en/floater_inventory_view_finder.xml b/indra/newview/skins/default/xui/en/floater_inventory_view_finder.xml
index 519d3e043c..1b4992b4ca 100644
--- a/indra/newview/skins/default/xui/en/floater_inventory_view_finder.xml
+++ b/indra/newview/skins/default/xui/en/floater_inventory_view_finder.xml
@@ -2,7 +2,7 @@
<floater
legacy_header_height="18"
can_minimize="false"
- height="440"
+ height="468"
layout="topleft"
name="Inventory Finder"
help_topic="inventory_finder"
@@ -245,11 +245,36 @@
layout="topleft"
left="10"
name="horiz_separator"
- top_pad="8"
+ top_pad="10"
width="260"/>
<check_box
height="16"
- top="324"
+ label="Created by me"
+ layout="topleft"
+ left="8"
+ name="check_created_by_me"
+ top_delta="8"
+ width="130" />
+ <check_box
+ height="16"
+ label="Created by others"
+ layout="topleft"
+ left_pad="0"
+ name="check_created_by_others"
+ top_delta="0"
+ width="70" />
+ <view_border
+ bevel_style="none"
+ follows="top|left"
+ height="0"
+ layout="topleft"
+ left="10"
+ name="horiz_separator2"
+ top_pad="10"
+ width="260"/>
+ <check_box
+ height="16"
+ top="352"
label="Since Logoff"
layout="topleft"
left_delta="0"
@@ -265,7 +290,7 @@
layout="topleft"
left_delta="0"
name="- OR -"
- top="342"
+ top="370"
width="144">
- OR -
</text>
@@ -273,7 +298,7 @@
height="16"
layout="topleft"
name="date_search_direction"
- top="360"
+ top="388"
left="8"
width="270">
<radio_item
@@ -343,6 +368,6 @@
layout="topleft"
name="Close"
right="-6"
- top="406"
+ top="434"
width="76" />
</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_web_content.xml b/indra/newview/skins/default/xui/en/floater_web_content.xml
index 4473ce0cda..fe9ffba6cd 100644
--- a/indra/newview/skins/default/xui/en/floater_web_content.xml
+++ b/indra/newview/skins/default/xui/en/floater_web_content.xml
@@ -10,7 +10,6 @@
help_topic="floater_web_content"
save_rect="true"
title=""
- initial_mime_type="text/html"
width="780">
<layout_stack
bottom="775"
diff --git a/indra/newview/skins/default/xui/en/menu_inventory.xml b/indra/newview/skins/default/xui/en/menu_inventory.xml
index ec9f947338..5b45364127 100644
--- a/indra/newview/skins/default/xui/en/menu_inventory.xml
+++ b/indra/newview/skins/default/xui/en/menu_inventory.xml
@@ -569,6 +569,14 @@
function="Inventory.DoToSelected"
parameter="copy_uuid" />
</menu_item_call>
+ <menu_item_call
+ label="Show in Main Panel"
+ layout="topleft"
+ name="Show in Main Panel">
+ <menu_item_call.on_click
+ function="Inventory.DoToSelected"
+ parameter="show_in_main_panel" />
+ </menu_item_call>
<menu_item_separator
layout="topleft"
name="Copy Separator" />
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index b6b58d5f4b..a0130b568a 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -6285,6 +6285,13 @@ Although you&apos;re very nice, you can&apos;t add yourself as a friend.
<notification
icon="notifytip.tga"
+ name="AddSelfRenderExceptions"
+ type="notifytip">
+You can&apos;t add yourself to the rendering exceptions list.
+ </notification>
+
+ <notification
+ icon="notifytip.tga"
name="UploadingAuctionSnapshot"
type="notifytip">
Uploading in-world and web site snapshots...
@@ -8566,6 +8573,21 @@ Please check your network and firewall setup.
</notification>
<notification
+ icon="alertmodal.tga"
+ name="NoVoiceConnect-GIAB"
+ type="alertmodal">
+We're having trouble connecting to your voice server.
+
+Voice communications will not be available.
+Please check your network and firewall setup.
+ <tag>voice</tag>
+ <tag>fail</tag>
+ <usetemplate
+ name="okbutton"
+ yestext="OK"/>
+ </notification>
+
+ <notification
icon="notifytip.tga"
name="AvatarRezLeftNotification"
type="notifytip">
diff --git a/indra/newview/skins/default/xui/en/panel_active_object_row.xml b/indra/newview/skins/default/xui/en/panel_active_object_row.xml
index 3e3271b181..656171ff96 100644
--- a/indra/newview/skins/default/xui/en/panel_active_object_row.xml
+++ b/indra/newview/skins/default/xui/en/panel_active_object_row.xml
@@ -18,15 +18,7 @@
left="5"
height="25"
width="25"
- visible="false"
- speaker.name="speaker_p2p"
- speaker.width="20"
- speaker.height="25"
- speaker.left="25"
- speaker.top="25"
- speaker.auto_update="true"
- speaker.draw_border="false"
- speaker.visible="false">
+ visible="false">
</chiclet_script>
<chiclet_offer
name="inv_offer_chiclet"
@@ -36,15 +28,7 @@
left="5"
height="25"
width="25"
- visible="false"
- speaker.name="speaker_p2p"
- speaker.width="20"
- speaker.height="25"
- speaker.left="25"
- speaker.top="25"
- speaker.auto_update="true"
- speaker.draw_border="false"
- speaker.visible="false">
+ visible="false">
</chiclet_offer>
<text
type="string"
diff --git a/indra/newview/skins/default/xui/en/panel_main_inventory.xml b/indra/newview/skins/default/xui/en/panel_main_inventory.xml
index 0a85477bf4..df70398599 100644
--- a/indra/newview/skins/default/xui/en/panel_main_inventory.xml
+++ b/indra/newview/skins/default/xui/en/panel_main_inventory.xml
@@ -41,13 +41,37 @@
text_pad_left="10"
follows="left|top|right"
height="23"
- label="Filter Inventory"
+ label="Enter search text"
layout="topleft"
left="10"
max_length_chars="300"
name="inventory search editor"
top="18"
- width="303" />
+ width="208" />
+ <combo_box
+ height="23"
+ layout="topleft"
+ left_pad="4"
+ name="search_type"
+ follows="top|right"
+ width="90">
+ <item
+ label="Name"
+ name="Name"
+ value="search_by_name"/>
+ <item
+ label="Creator"
+ name="Creator"
+ value="search_by_creator"/>
+ <item
+ label="Description"
+ name="Description"
+ value="search_by_description"/>
+ <item
+ label="UUID"
+ name="UUID"
+ value="search_by_UUID"/>
+ </combo_box>
<tab_container
follows="all"
halign="center"
@@ -92,6 +116,20 @@
name="Recent Items"
show_item_link_overlays="true"
width="290" />
+ <inventory_panel
+ name="Worn Items"
+ label="WORN"
+ show_empty_message="false"
+ follows="all"
+ layout="topleft"
+ width="290"
+ bg_opaque_color="DkGray2"
+ bg_alpha_color="DkGray2"
+ background_visible="true"
+ border="false"
+ bevel_style="none"
+ scroll.reserve_scroll_corner="false">
+ </inventory_panel>
</tab_container>
<layout_stack
animate="false"
diff --git a/indra/newview/skins/default/xui/en/panel_media_settings_general.xml b/indra/newview/skins/default/xui/en/panel_media_settings_general.xml
index e844a15118..2316beeb36 100644
--- a/indra/newview/skins/default/xui/en/panel_media_settings_general.xml
+++ b/indra/newview/skins/default/xui/en/panel_media_settings_general.xml
@@ -193,7 +193,7 @@
follows="left|top"
height="16"
increment="1"
- initial_val="256"
+ initial_value="256"
label=""
label_width="0"
left_delta="68"
@@ -213,7 +213,7 @@
follows="left|top"
height="16"
increment="1"
- initial_val="256"
+ initial_value="256"
label=""
label_width="0"
left_delta="20"
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml
index 0cd56af6d7..4f0bb9d3b7 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml
@@ -32,12 +32,12 @@
height="23"
increment="64"
initial_value="1024"
- label="Cache size (64 - 9984MB)"
+ label="Cache size (256 - 9984MB)"
label_width="150"
layout="topleft"
left="80"
max_val="9984"
- min_val="64"
+ min_val="256"
top_pad="10"
name="cachesizespinner"
width="200" />
@@ -87,7 +87,7 @@
height="23"
layout="topleft"
left="80"
- max_length="4096"
+ max_length_bytes="4096"
name="cache_location"
top_pad="5"
width="205" />
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_chat.xml b/indra/newview/skins/default/xui/en/panel_preferences_chat.xml
index 78f771cd51..9e7023d2f2 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_chat.xml
@@ -1,7 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel
border="true"
- has_border="true"
height="408"
label="Text Chat"
layout="topleft"
@@ -541,7 +540,7 @@
height="23"
layout="topleft"
left_pad="55"
- max_length="4096"
+ max_length_bytes="4096"
name="log_path_string"
top_delta="-5"
width="185">
diff --git a/indra/newview/skins/default/xui/es/menu_viewer.xml b/indra/newview/skins/default/xui/es/menu_viewer.xml
index 805b24e290..447dd2629c 100644
--- a/indra/newview/skins/default/xui/es/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/es/menu_viewer.xml
@@ -173,6 +173,7 @@
</menu>
<menu label="Ayuda" name="Help">
<menu_item_call label="Cómo..." name="How To"/>
+ <menu_item_call label="Guía rápida" name="Quickstart"/>
<menu_item_call label="Base de Conocimientos" name="Knowledge Base"/>
<menu_item_call label="Wiki" name="Wiki"/>
<menu_item_call label="Foros comunitarios" name="Community Forums"/>
diff --git a/indra/newview/skins/default/xui/es/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/es/panel_preferences_advanced.xml
index efa003c17e..4cb816a120 100644
--- a/indra/newview/skins/default/xui/es/panel_preferences_advanced.xml
+++ b/indra/newview/skins/default/xui/es/panel_preferences_advanced.xml
@@ -6,7 +6,7 @@
<text name="Cache:">
Caché:
</text>
- <spinner label="Tamaño de la caché (64 - 9984 MB)" name="cachesizespinner"/>
+ <spinner label="Tamaño de la caché (256 - 9984 MB)" name="cachesizespinner"/>
<text name="text_box5">
MB
</text>
diff --git a/indra/newview/skins/default/xui/es/strings.xml b/indra/newview/skins/default/xui/es/strings.xml
index 67e45076e1..d1472a74f9 100644
--- a/indra/newview/skins/default/xui/es/strings.xml
+++ b/indra/newview/skins/default/xui/es/strings.xml
@@ -78,7 +78,7 @@ Versión de Voice Server: [VOICE_VERSION]
Paquetes perdidos: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%)
</string>
<string name="AboutTime">
- [mes, fecha_hora, slt] [día, fecha_hora, slt] [año, fecha_hora, slt] [hora, fecha_hora, slt]:[min, fecha_hora, slt]:[segundo,fecha_hora,slt]
+ [month, datetime, slt] [day, datetime, slt] [year, datetime, slt] [hour, datetime, slt]:[min, datetime, slt]:[second,datetime,slt]
</string>
<string name="ErrorFetchingServerReleaseNotesURL">
Error al obtener la URL de las notas de la versión del servidor.
diff --git a/indra/newview/skins/default/xui/fr/menu_viewer.xml b/indra/newview/skins/default/xui/fr/menu_viewer.xml
index 451d45bedd..04fa85d488 100644
--- a/indra/newview/skins/default/xui/fr/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/fr/menu_viewer.xml
@@ -173,6 +173,7 @@
</menu>
<menu label="Aide" name="Help">
<menu_item_call label="Aide rapide..." name="How To"/>
+ <menu_item_call label="Démarrage rapide" name="Quickstart"/>
<menu_item_call label="Base de connaissances" name="Knowledge Base"/>
<menu_item_call label="Wiki" name="Wiki"/>
<menu_item_call label="Forums de la communauté" name="Community Forums"/>
diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/fr/panel_preferences_advanced.xml
index f61dc5aa35..b96cb6dc49 100644
--- a/indra/newview/skins/default/xui/fr/panel_preferences_advanced.xml
+++ b/indra/newview/skins/default/xui/fr/panel_preferences_advanced.xml
@@ -6,7 +6,7 @@
<text name="Cache:">
Cache :
</text>
- <spinner label="Taille du cache (64 - 9984 Mo)" name="cachesizespinner"/>
+ <spinner label="Taille du cache (256 - 9984 Mo)" name="cachesizespinner"/>
<text name="text_box5">
Mo
</text>
diff --git a/indra/newview/skins/default/xui/it/menu_viewer.xml b/indra/newview/skins/default/xui/it/menu_viewer.xml
index e010ec1591..607171d9be 100644
--- a/indra/newview/skins/default/xui/it/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/it/menu_viewer.xml
@@ -173,6 +173,7 @@
</menu>
<menu label="Aiuto" name="Help">
<menu_item_call label="Istruzioni..." name="How To"/>
+ <menu_item_call label="Guida introduttiva" name="Quickstart"/>
<menu_item_call label="Base di conoscenza" name="Knowledge Base"/>
<menu_item_call label="Wiki" name="Wiki"/>
<menu_item_call label="Forum della comunità" name="Community Forums"/>
diff --git a/indra/newview/skins/default/xui/it/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/it/panel_preferences_advanced.xml
index 85cbfb92ef..87cee345fa 100644
--- a/indra/newview/skins/default/xui/it/panel_preferences_advanced.xml
+++ b/indra/newview/skins/default/xui/it/panel_preferences_advanced.xml
@@ -6,7 +6,7 @@
<text name="Cache:">
Cache:
</text>
- <spinner label="Dimensione cache (64 - 9984 MB)" name="cachesizespinner"/>
+ <spinner label="Dimensione cache (256 - 9984 MB)" name="cachesizespinner"/>
<text name="text_box5">
MB
</text>
diff --git a/indra/newview/skins/default/xui/ja/menu_viewer.xml b/indra/newview/skins/default/xui/ja/menu_viewer.xml
index f2d989f17f..9154f327c1 100644
--- a/indra/newview/skins/default/xui/ja/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/ja/menu_viewer.xml
@@ -173,6 +173,7 @@
</menu>
<menu label="ヘルプ" name="Help">
<menu_item_call label="ハウツー..." name="How To"/>
+ <menu_item_call label="クイックスタート" name="Quickstart"/>
<menu_item_call label="ナレッジベース" name="Knowledge Base"/>
<menu_item_call label="Wiki" name="Wiki"/>
<menu_item_call label="コミュニティフォーラム" name="Community Forums"/>
diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/ja/panel_preferences_advanced.xml
index 62b8daeb4e..266809f4da 100644
--- a/indra/newview/skins/default/xui/ja/panel_preferences_advanced.xml
+++ b/indra/newview/skins/default/xui/ja/panel_preferences_advanced.xml
@@ -6,7 +6,7 @@
<text name="Cache:">
キャッシュ:
</text>
- <spinner label="キャッシュサイズ(64~9,984MB)" name="cachesizespinner"/>
+ <spinner label="キャッシュサイズ(256~9,984MB)" name="cachesizespinner"/>
<text name="text_box5">
MB
</text>
diff --git a/indra/newview/skins/default/xui/pl/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/pl/panel_preferences_advanced.xml
index cc85ec20f6..4609b2f916 100644
--- a/indra/newview/skins/default/xui/pl/panel_preferences_advanced.xml
+++ b/indra/newview/skins/default/xui/pl/panel_preferences_advanced.xml
@@ -3,7 +3,7 @@
<text name="Cache:">
Pamięć podręczna:
</text>
- <spinner label="Rozmiar (64 - 9984 MB)" name="cachesizespinner" />
+ <spinner label="Rozmiar (256 - 9984 MB)" name="cachesizespinner" />
<button label="Wyczyść" label_selected="Wyczyść" name="clear_cache" />
<text name="Cache location">
Położenie buforu pamięci podręcznej:
diff --git a/indra/newview/skins/default/xui/pt/menu_viewer.xml b/indra/newview/skins/default/xui/pt/menu_viewer.xml
index f4a18cfc2c..cef0f02070 100644
--- a/indra/newview/skins/default/xui/pt/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/pt/menu_viewer.xml
@@ -173,6 +173,7 @@
</menu>
<menu label="Ajuda" name="Help">
<menu_item_call label="Como..." name="How To"/>
+ <menu_item_call label="Início rápido" name="Quickstart"/>
<menu_item_call label="Base de conhecimento" name="Knowledge Base"/>
<menu_item_call label="Wiki" name="Wiki"/>
<menu_item_call label="Fóruns da comunidade" name="Community Forums"/>
diff --git a/indra/newview/skins/default/xui/pt/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/pt/panel_preferences_advanced.xml
index 15340a9a5f..56065d95a3 100644
--- a/indra/newview/skins/default/xui/pt/panel_preferences_advanced.xml
+++ b/indra/newview/skins/default/xui/pt/panel_preferences_advanced.xml
@@ -6,7 +6,7 @@
<text name="Cache:">
Cache:
</text>
- <spinner label="Cache (64 - 9984 MB)" name="cachesizespinner"/>
+ <spinner label="Cache (256 - 9984 MB)" name="cachesizespinner"/>
<text name="text_box5">
MB
</text>
diff --git a/indra/newview/skins/default/xui/ru/menu_viewer.xml b/indra/newview/skins/default/xui/ru/menu_viewer.xml
index b92e266b8d..309253213c 100644
--- a/indra/newview/skins/default/xui/ru/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/ru/menu_viewer.xml
@@ -170,6 +170,7 @@
</menu>
<menu label="Справка" name="Help">
<menu_item_call label="Инструкции..." name="How To"/>
+ <menu_item_call label="Краткое руководство" name="Quickstart"/>
<menu_item_call label="База знаний" name="Knowledge Base"/>
<menu_item_call label="Wiki" name="Wiki"/>
<menu_item_call label="Форумы сообщества" name="Community Forums"/>
diff --git a/indra/newview/skins/default/xui/ru/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/ru/panel_preferences_advanced.xml
index 88bcc22414..03295084dc 100644
--- a/indra/newview/skins/default/xui/ru/panel_preferences_advanced.xml
+++ b/indra/newview/skins/default/xui/ru/panel_preferences_advanced.xml
@@ -6,7 +6,7 @@
<text name="Cache:">
Кэш:
</text>
- <spinner label="Размер кэша (64 - 9984 МБ)" name="cachesizespinner"/>
+ <spinner label="Размер кэша (256 - 9984 МБ)" name="cachesizespinner"/>
<text name="text_box5">
МБ
</text>
diff --git a/indra/newview/skins/default/xui/tr/menu_viewer.xml b/indra/newview/skins/default/xui/tr/menu_viewer.xml
index 04b05ee2bb..ad134c717e 100644
--- a/indra/newview/skins/default/xui/tr/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/tr/menu_viewer.xml
@@ -171,6 +171,7 @@
</menu>
<menu label="Yardım" name="Help">
<menu_item_call label="Nasıl yapılır..." name="How To"/>
+ <menu_item_call label="Hızlı Başlangıç" name="Quickstart"/>
<menu_item_call label="Bilgi Bankası" name="Knowledge Base"/>
<menu_item_call label="Wiki" name="Wiki"/>
<menu_item_call label="Topluluk Forumları" name="Community Forums"/>
diff --git a/indra/newview/skins/default/xui/tr/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/tr/panel_preferences_advanced.xml
index c3ac198d08..f8aa17f0c6 100644
--- a/indra/newview/skins/default/xui/tr/panel_preferences_advanced.xml
+++ b/indra/newview/skins/default/xui/tr/panel_preferences_advanced.xml
@@ -6,7 +6,7 @@
<text name="Cache:">
Önbellek:
</text>
- <spinner label="Önbellek boyutu (64-9984 MB)" name="cachesizespinner"/>
+ <spinner label="Önbellek boyutu (256-9984 MB)" name="cachesizespinner"/>
<text name="text_box5">
MB
</text>
diff --git a/indra/newview/skins/default/xui/zh/menu_viewer.xml b/indra/newview/skins/default/xui/zh/menu_viewer.xml
index 0388b891d6..433e34758a 100644
--- a/indra/newview/skins/default/xui/zh/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/zh/menu_viewer.xml
@@ -171,6 +171,7 @@
</menu>
<menu label="幫助" name="Help">
<menu_item_call label="簡易教學…" name="How To"/>
+ <menu_item_call label="快速上手" name="Quickstart"/>
<menu_item_call label="知識庫" name="Knowledge Base"/>
<menu_item_call label="維基" name="Wiki"/>
<menu_item_call label="社群論壇" name="Community Forums"/>
diff --git a/indra/newview/skins/default/xui/zh/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/zh/panel_preferences_advanced.xml
index 170cdddb8c..47f1069254 100644
--- a/indra/newview/skins/default/xui/zh/panel_preferences_advanced.xml
+++ b/indra/newview/skins/default/xui/zh/panel_preferences_advanced.xml
@@ -6,7 +6,7 @@
<text name="Cache:">
快取:
</text>
- <spinner label="快取大小 (64 - 9984MB)" name="cachesizespinner"/>
+ <spinner label="快取大小 (256 - 9984MB)" name="cachesizespinner"/>
<text name="text_box5">
MB
</text>
diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py
index 900e9f7b1b..71e348db3f 100755
--- a/indra/newview/viewer_manifest.py
+++ b/indra/newview/viewer_manifest.py
@@ -61,7 +61,7 @@ class ViewerManifest(LLManifest):
self.path(src="../../etc/message.xml", dst="app_settings/message.xml")
if self.is_packaging_viewer():
- if self.prefix(src="app_settings"):
+ with self.prefix(src="app_settings"):
self.exclude("logcontrol.xml")
self.exclude("logcontrol-dev.xml")
self.path("*.pem")
@@ -84,9 +84,8 @@ class ViewerManifest(LLManifest):
# ... and the included spell checking dictionaries
pkgdir = os.path.join(self.args['build'], os.pardir, 'packages')
- if self.prefix(src=pkgdir,dst=""):
+ with self.prefix(src=pkgdir,dst=""):
self.path("dictionaries")
- self.end_prefix(pkgdir)
# include the extracted packages information (see BuildPackagesInfo.cmake)
self.path(src=os.path.join(self.args['build'],"packages-info.txt"), dst="packages-info.txt")
@@ -129,24 +128,21 @@ class ViewerManifest(LLManifest):
"settings_install.xml",
src="environment")
- self.end_prefix("app_settings")
- if self.prefix(src="character"):
+ with self.prefix(src="character"):
self.path("*.llm")
self.path("*.xml")
self.path("*.tga")
- self.end_prefix("character")
# Include our fonts
- if self.prefix(src="fonts"):
+ with self.prefix(src="fonts"):
self.path("*.ttf")
self.path("*.txt")
- self.end_prefix("fonts")
# skins
- if self.prefix(src="skins"):
+ with self.prefix(src="skins"):
# include the entire textures directory recursively
- if self.prefix(src="*/textures"):
+ with self.prefix(src="*/textures"):
self.path("*/*.tga")
self.path("*/*.j2c")
self.path("*/*.jpg")
@@ -156,7 +152,6 @@ class ViewerManifest(LLManifest):
self.path("*.jpg")
self.path("*.png")
self.path("textures.xml")
- self.end_prefix("*/textures")
self.path("*/xui/*/*.xml")
self.path("*/xui/*/widgets/*.xml")
self.path("*/*.xml")
@@ -168,19 +163,16 @@ class ViewerManifest(LLManifest):
# we're wrong, a user actually does have the relevant
# files; s/he just needs to rename every html.old
# directory back to html to recover them.
- if self.prefix(src="*/html", dst="*/html.old"):
+ with self.prefix(src="*/html", dst="*/html.old"):
self.path("*.png")
self.path("*/*/*.html")
self.path("*/*/*.gif")
- self.end_prefix("*/html")
- self.end_prefix("skins")
# local_assets dir (for pre-cached textures)
- if self.prefix(src="local_assets"):
+ with self.prefix(src="local_assets"):
self.path("*.j2c")
self.path("*.tga")
- self.end_prefix("local_assets")
# File in the newview/ directory
self.path("gpu_table.txt")
@@ -368,28 +360,27 @@ class WindowsManifest(ViewerManifest):
self.path(src='%s/secondlife-bin.exe' % self.args['configuration'], dst=self.final_exe())
# include the compiled launcher scripts so that it gets included in the file_list
- self.path(src='%s/apply_update.exe' % vmpdir, dst="apply_update.exe")
self.path(src='%s/download_update.exe' % vmpdir, dst="download_update.exe")
self.path(src='%s/SL_Launcher.exe' % vmpdir, dst="SL_Launcher.exe")
- self.path(src='%s/update_manager.exe' % vmpdir, dst="update_manager.exe")
#IUM is not normally executed directly, just imported. No exe needed.
self.path2basename(vmpdir,"InstallerUserMessage.py")
+ with self.prefix(src=self.icon_path(), dst="vmp_icons"):
+ self.path("secondlife.ico")
+
#VMP Tkinter icons
- if self.prefix("vmp_icons"):
+ with self.prefix("vmp_icons"):
self.path("*.png")
self.path("*.gif")
- self.end_prefix("vmp_icons")
#before, we only needed llbase at build time. With VMP, we need it at run time.
llbase_path = os.path.join(self.get_dst_prefix(),'llbase')
if not os.path.exists(llbase_path):
os.makedirs(llbase_path)
- if self.prefix(dst="llbase"):
+ with self.prefix(dst="llbase"):
self.path2basename(llbasedir,"*.py")
self.path2basename(llbasedir,"_cllsd.so")
- self.end_prefix()
# Plugin host application
self.path2basename(os.path.join(os.pardir,
@@ -397,7 +388,7 @@ class WindowsManifest(ViewerManifest):
"slplugin.exe")
# Get shared libs from the shared libs staging directory
- if self.prefix(src=os.path.join(os.pardir, 'sharedlibs', self.args['configuration']),
+ with self.prefix(src=os.path.join(os.pardir, 'sharedlibs', self.args['configuration']),
dst=""):
# Get llcommon and deps. If missing assume static linkage and continue.
@@ -466,31 +457,27 @@ class WindowsManifest(ViewerManifest):
except:
print "Skipping libtcmalloc_minimal.dll"
- self.end_prefix()
self.path(src="licenses-win32.txt", dst="licenses.txt")
self.path("featuretable.txt")
self.path("ca-bundle.crt")
# Media plugins - CEF
- if self.prefix(src='../media_plugins/cef/%s' % self.args['configuration'], dst="llplugin"):
+ with self.prefix(src='../media_plugins/cef/%s' % self.args['configuration'], dst="llplugin"):
self.path("media_plugin_cef.dll")
- self.end_prefix()
# Media plugins - LibVLC
- if self.prefix(src='../media_plugins/libvlc/%s' % self.args['configuration'], dst="llplugin"):
+ with self.prefix(src='../media_plugins/libvlc/%s' % self.args['configuration'], dst="llplugin"):
self.path("media_plugin_libvlc.dll")
- self.end_prefix()
# Media plugins - Example (useful for debugging - not shipped with release viewer)
if self.channel_type() != 'release':
- if self.prefix(src='../media_plugins/example/%s' % self.args['configuration'], dst="llplugin"):
+ with self.prefix(src='../media_plugins/example/%s' % self.args['configuration'], dst="llplugin"):
self.path("media_plugin_example.dll")
- self.end_prefix()
# CEF runtime files - debug
if self.args['configuration'].lower() == 'debug':
- if self.prefix(src=os.path.join(os.pardir, 'packages', 'bin', 'debug'), dst="llplugin"):
+ with self.prefix(src=os.path.join(os.pardir, 'packages', 'bin', 'debug'), dst="llplugin"):
self.path("chrome_elf.dll")
self.path("d3dcompiler_43.dll")
self.path("d3dcompiler_47.dll")
@@ -501,10 +488,9 @@ class WindowsManifest(ViewerManifest):
self.path("natives_blob.bin")
self.path("snapshot_blob.bin")
self.path("widevinecdmadapter.dll")
- self.end_prefix()
else:
# CEF runtime files - not debug (release, relwithdebinfo etc.)
- if self.prefix(src=os.path.join(os.pardir, 'packages', 'bin', 'release'), dst="llplugin"):
+ with self.prefix(src=os.path.join(os.pardir, 'packages', 'bin', 'release'), dst="llplugin"):
self.path("chrome_elf.dll")
self.path("d3dcompiler_43.dll")
self.path("d3dcompiler_47.dll")
@@ -515,25 +501,22 @@ class WindowsManifest(ViewerManifest):
self.path("natives_blob.bin")
self.path("snapshot_blob.bin")
self.path("widevinecdmadapter.dll")
- self.end_prefix()
# MSVC DLLs needed for CEF and have to be in same directory as plugin
- if self.prefix(src=os.path.join(os.pardir, 'sharedlibs', 'Release'), dst="llplugin"):
+ with self.prefix(src=os.path.join(os.pardir, 'sharedlibs', 'Release'), dst="llplugin"):
self.path("msvcp120.dll")
self.path("msvcr120.dll")
- self.end_prefix()
# CEF files common to all configurations
- if self.prefix(src=os.path.join(os.pardir, 'packages', 'resources'), dst="llplugin"):
+ with self.prefix(src=os.path.join(os.pardir, 'packages', 'resources'), dst="llplugin"):
self.path("cef.pak")
self.path("cef_100_percent.pak")
self.path("cef_200_percent.pak")
self.path("cef_extensions.pak")
self.path("devtools_resources.pak")
self.path("icudtl.dat")
- self.end_prefix()
- if self.prefix(src=os.path.join(os.pardir, 'packages', 'resources', 'locales'), dst=os.path.join('llplugin', 'locales')):
+ with self.prefix(src=os.path.join(os.pardir, 'packages', 'resources', 'locales'), dst=os.path.join('llplugin', 'locales')):
self.path("am.pak")
self.path("ar.pak")
self.path("bg.pak")
@@ -587,13 +570,11 @@ class WindowsManifest(ViewerManifest):
self.path("vi.pak")
self.path("zh-CN.pak")
self.path("zh-TW.pak")
- self.end_prefix()
- if self.prefix(src=os.path.join(os.pardir, 'packages', 'bin', 'release'), dst="llplugin"):
+ with self.prefix(src=os.path.join(os.pardir, 'packages', 'bin', 'release'), dst="llplugin"):
self.path("libvlc.dll")
self.path("libvlccore.dll")
self.path("plugins/")
- self.end_prefix()
# pull in the crash logger and updater from other projects
# tag:"crash-logger" here as a cue to the exporter
@@ -709,10 +690,8 @@ class WindowsManifest(ViewerManifest):
# note that the enclosing setup exe is signed later, after the makensis makes it.
# Unlike the viewer binary, the VMP filenames are invariant with respect to version, os, etc.
for exe in (
- "apply_update.exe",
"download_update.exe",
"SL_Launcher.exe",
- "update_manager.exe",
):
self.sign(exe)
@@ -796,14 +775,14 @@ class DarwinManifest(ViewerManifest):
chardetdir = os.path.join(pkgdir, "lib", "python", "chardet")
idnadir = os.path.join(pkgdir, "lib", "python", "idna")
- if self.prefix(src="", dst="Contents"): # everything goes in Contents
+ with self.prefix(src="", dst="Contents"): # everything goes in Contents
self.path("Info.plist", dst="Info.plist")
# copy additional libs in <bundle>/Contents/MacOS/
self.path(os.path.join(relpkgdir, "libndofdev.dylib"), dst="Resources/libndofdev.dylib")
self.path(os.path.join(relpkgdir, "libhunspell-1.3.0.dylib"), dst="Resources/libhunspell-1.3.0.dylib")
- if self.prefix(dst="MacOS"):
+ with self.prefix(dst="MacOS"):
#this copies over the python wrapper script, associated utilities and required libraries, see SL-321, SL-322, SL-323
self.path2basename(vmpdir,"SL_Launcher")
self.path2basename(vmpdir,"*.py")
@@ -811,52 +790,44 @@ class DarwinManifest(ViewerManifest):
certifi_path = os.path.join(self.get_dst_prefix(),'certifi')
if not os.path.exists(certifi_path):
os.makedirs(certifi_path)
- if self.prefix(dst="certifi"):
+ with self.prefix(dst="certifi"):
self.path2basename(os.path.join(vmpdir,"certifi"),"*")
- self.end_prefix()
# llbase provides our llrest service layer and llsd decoding
llbase_path = os.path.join(self.get_dst_prefix(),'llbase')
if not os.path.exists(llbase_path):
os.makedirs(llbase_path)
- if self.prefix(dst="llbase"):
+ with self.prefix(dst="llbase"):
self.path2basename(llbasedir,"*.py")
self.path2basename(llbasedir,"_cllsd.so")
- self.end_prefix()
#requests module needed by llbase/llrest.py
#this is only needed on POSIX, because in Windows we compile it into the EXE
requests_path = os.path.join(self.get_dst_prefix(),'requests')
if not os.path.exists(requests_path):
os.makedirs(requests_path)
- if self.prefix(dst="requests"):
+ with self.prefix(dst="requests"):
self.path2basename(requestsdir,"*")
- self.end_prefix()
urllib3_path = os.path.join(self.get_dst_prefix(),'urllib3')
if not os.path.exists(urllib3_path):
os.makedirs(urllib3_path)
- if self.prefix(dst="urllib3"):
+ with self.prefix(dst="urllib3"):
self.path2basename(urllib3dir,"*")
- self.end_prefix()
chardet_path = os.path.join(self.get_dst_prefix(),'chardet')
if not os.path.exists(chardet_path):
os.makedirs(chardet_path)
- if self.prefix(dst="chardet"):
+ with self.prefix(dst="chardet"):
self.path2basename(chardetdir,"*")
- self.end_prefix()
idna_path = os.path.join(self.get_dst_prefix(),'idna')
if not os.path.exists(idna_path):
os.makedirs(idna_path)
- if self.prefix(dst="idna"):
+ with self.prefix(dst="idna"):
self.path2basename(idnadir,"*")
- self.end_prefix()
- self.end_prefix()
# most everything goes in the Resources directory
- if self.prefix(src="", dst="Resources"):
+ with self.prefix(src="", dst="Resources"):
super(DarwinManifest, self).construct()
- if self.prefix("cursors_mac"):
+ with self.prefix("cursors_mac"):
self.path("*.tif")
- self.end_prefix("cursors_mac")
self.path("licenses-mac.txt", dst="licenses.txt")
self.path("featuretable_mac.txt")
@@ -864,15 +835,16 @@ class DarwinManifest(ViewerManifest):
self.path("ca-bundle.crt")
icon_path = self.icon_path()
- if self.prefix(src=icon_path, dst="") :
+ with self.prefix(src=icon_path, dst="") :
self.path("secondlife.icns")
- self.end_prefix(icon_path)
+
+ with self.prefix(src=icon_path, dst="vmp_icons"):
+ self.path("secondlife.ico")
#VMP Tkinter icons
- if self.prefix("vmp_icons"):
+ with self.prefix("vmp_icons"):
self.path("*.png")
self.path("*.gif")
- self.end_prefix("vmp_icons")
self.path("SecondLife.nib")
@@ -978,7 +950,7 @@ class DarwinManifest(ViewerManifest):
print "Can't symlink %s -> %s: %s" % (src, dst, err)
# Dullahan helper apps go inside SLPlugin.app
- if self.prefix(src="", dst="SLPlugin.app/Contents/Frameworks"):
+ with self.prefix(src="", dst="SLPlugin.app/Contents/Frameworks"):
helperappfile = 'DullahanHelper.app'
self.path2basename(relpkgdir, helperappfile)
@@ -994,15 +966,14 @@ class DarwinManifest(ViewerManifest):
self.dst_path_of('DullahanHelper.app/Contents/MacOS/'
'Frameworks/Chromium Embedded Framework.framework')
- self.end_prefix()
- helperexecutablepath = self.dst_path_of('SLPlugin.app/Contents/Frameworks/DullahanHelper.app/Contents/MacOS/DullahanHelper')
- self.run_command('install_name_tool -change '
- '"@rpath/Frameworks/Chromium Embedded Framework.framework/Chromium Embedded Framework" '
- '"@executable_path/Frameworks/Chromium Embedded Framework.framework/Chromium Embedded Framework" "%s"' % helperexecutablepath)
+ helperexecutablepath = self.dst_path_of('SLPlugin.app/Contents/Frameworks/DullahanHelper.app/Contents/MacOS/DullahanHelper')
+ self.run_command('install_name_tool -change '
+ '"@rpath/Frameworks/Chromium Embedded Framework.framework/Chromium Embedded Framework" '
+ '"@executable_path/Frameworks/Chromium Embedded Framework.framework/Chromium Embedded Framework" "%s"' % helperexecutablepath)
# SLPlugin plugins
- if self.prefix(src="", dst="llplugin"):
+ with self.prefix(src="", dst="llplugin"):
self.path2basename("../media_plugins/cef/" + self.args['configuration'],
"media_plugin_cef.dylib")
@@ -1011,74 +982,68 @@ class DarwinManifest(ViewerManifest):
"media_plugin_libvlc.dylib")
# copy LibVLC dynamic libraries
- if self.prefix(src=os.path.join(os.pardir, 'packages', 'lib', 'release' ), dst="lib"):
+ with self.prefix(src=os.path.join(os.pardir, 'packages', 'lib', 'release' ), dst="lib"):
self.path( "libvlc*.dylib*" )
- self.end_prefix()
# copy LibVLC plugins folder
- if self.prefix(src=os.path.join(os.pardir, 'packages', 'lib', 'release', 'plugins' ), dst="lib"):
+ with self.prefix(src=os.path.join(os.pardir, 'packages', 'lib', 'release', 'plugins' ), dst="lib"):
self.path( "*.dylib" )
self.path( "plugins.dat" )
- self.end_prefix()
-
- self.end_prefix("llplugin")
-
- # do this install_name_tool *after* media plugin is copied over
- dylibexecutablepath = self.dst_path_of('llplugin/media_plugin_cef.dylib')
- self.run_command('install_name_tool -change '
- '"@rpath/Frameworks/Chromium Embedded Framework.framework/Chromium Embedded Framework" '
- '"@executable_path/../Frameworks/Chromium Embedded Framework.framework/Chromium Embedded Framework" "%s"' % dylibexecutablepath)
-
- self.end_prefix("Resources")
-
- # CEF framework goes inside Second Life.app/Contents/Frameworks
- if self.prefix(src="", dst="Frameworks"):
- frameworkfile="Chromium Embedded Framework.framework"
- self.path2basename(relpkgdir, frameworkfile)
- self.end_prefix("Frameworks")
-
- # This code constructs a relative path from the
- # target framework folder back to the location of the symlink.
- # It needs to be relative so that the symlink still works when
- # (as is normal) the user moves the app bundle out of the DMG
- # and into the /Applications folder. Note we also call 'raise'
- # to terminate the process if we get an error since without
- # this symlink, Second Life web media can't possibly work.
- # Real Framework folder:
- # Second Life.app/Contents/Frameworks/Chromium Embedded Framework.framework/
- # Location of symlink and why it's relative
- # Second Life.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/Chromium Embedded Framework.framework/
- # Real Frameworks folder, with the symlink inside the bundled SLPlugin.app (and why it's relative)
- # <top level>.app/Contents/Frameworks/Chromium Embedded Framework.framework/
- # <top level>.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/Chromium Embedded Framework.framework ->
- # It might seem simpler just to create a symlink Frameworks to
- # the parent of Chromimum Embedded Framework.framework. But
- # that would create a symlink cycle, which breaks our
- # packaging step. So make a symlink from Chromium Embedded
- # Framework.framework to the directory of the same name, which
- # is NOT an ancestor of the symlink.
- frameworkpath = os.path.join(os.pardir, os.pardir, os.pardir,
- os.pardir, "Frameworks",
- "Chromium Embedded Framework.framework")
- try:
- # from SLPlugin.app/Contents/Frameworks/Chromium Embedded
- # Framework.framework back to Second
- # Life.app/Contents/Frameworks/Chromium Embedded Framework.framework
- origin, target = pluginframeworkpath, frameworkpath
- symlinkf(target, origin)
- # from SLPlugin.app/Contents/Frameworks/Dullahan
- # Helper.app/Contents/MacOS/Frameworks/Chromium Embedded
- # Framework.framework back to
- # SLPlugin.app/Contents/Frameworks/Chromium Embedded Framework.framework
- self.cmakedirs(os.path.dirname(helperframeworkpath))
- origin = helperframeworkpath
- target = os.path.join(os.pardir, frameworkpath)
- symlinkf(target, origin)
- except OSError as err:
- print "Can't symlink %s -> %s: %s" % (origin, target, err)
- raise
-
- self.end_prefix("Contents")
+
+
+ # do this install_name_tool *after* media plugin is copied over
+ dylibexecutablepath = self.dst_path_of('llplugin/media_plugin_cef.dylib')
+ self.run_command('install_name_tool -change '
+ '"@rpath/Frameworks/Chromium Embedded Framework.framework/Chromium Embedded Framework" '
+ '"@executable_path/../Frameworks/Chromium Embedded Framework.framework/Chromium Embedded Framework" "%s"' % dylibexecutablepath)
+
+
+ # CEF framework goes inside Second Life.app/Contents/Frameworks
+ with self.prefix(src="", dst="Frameworks"):
+ frameworkfile="Chromium Embedded Framework.framework"
+ self.path2basename(relpkgdir, frameworkfile)
+
+ # This code constructs a relative path from the
+ # target framework folder back to the location of the symlink.
+ # It needs to be relative so that the symlink still works when
+ # (as is normal) the user moves the app bundle out of the DMG
+ # and into the /Applications folder. Note we also call 'raise'
+ # to terminate the process if we get an error since without
+ # this symlink, Second Life web media can't possibly work.
+ # Real Framework folder:
+ # Second Life.app/Contents/Frameworks/Chromium Embedded Framework.framework/
+ # Location of symlink and why it's relative
+ # Second Life.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/Chromium Embedded Framework.framework/
+ # Real Frameworks folder, with the symlink inside the bundled SLPlugin.app (and why it's relative)
+ # <top level>.app/Contents/Frameworks/Chromium Embedded Framework.framework/
+ # <top level>.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/Chromium Embedded Framework.framework ->
+ # It might seem simpler just to create a symlink Frameworks to
+ # the parent of Chromimum Embedded Framework.framework. But
+ # that would create a symlink cycle, which breaks our
+ # packaging step. So make a symlink from Chromium Embedded
+ # Framework.framework to the directory of the same name, which
+ # is NOT an ancestor of the symlink.
+ frameworkpath = os.path.join(os.pardir, os.pardir, os.pardir,
+ os.pardir, "Frameworks",
+ "Chromium Embedded Framework.framework")
+ try:
+ # from SLPlugin.app/Contents/Frameworks/Chromium Embedded
+ # Framework.framework back to Second
+ # Life.app/Contents/Frameworks/Chromium Embedded Framework.framework
+ origin, target = pluginframeworkpath, frameworkpath
+ symlinkf(target, origin)
+ # from SLPlugin.app/Contents/Frameworks/Dullahan
+ # Helper.app/Contents/MacOS/Frameworks/Chromium Embedded
+ # Framework.framework back to
+ # SLPlugin.app/Contents/Frameworks/Chromium Embedded Framework.framework
+ self.cmakedirs(os.path.dirname(helperframeworkpath))
+ origin = helperframeworkpath
+ target = os.path.join(os.pardir, frameworkpath)
+ symlinkf(target, origin)
+ except OSError as err:
+ print "Can't symlink %s -> %s: %s" % (origin, target, err)
+ raise
+
# NOTE: the -S argument to strip causes it to keep enough info for
# annotated backtraces (i.e. function names in the crash log). 'strip' with no
@@ -1275,21 +1240,19 @@ class LinuxManifest(ViewerManifest):
debpkgdir = os.path.join(pkgdir, "lib", "debug")
self.path("licenses-linux.txt","licenses.txt")
- if self.prefix("linux_tools", dst=""):
+ with self.prefix("linux_tools", dst=""):
self.path("client-readme.txt","README-linux.txt")
self.path("client-readme-voice.txt","README-linux-voice.txt")
self.path("client-readme-joystick.txt","README-linux-joystick.txt")
self.path("wrapper.sh","secondlife")
- if self.prefix(src="", dst="etc"):
+ with self.prefix(src="", dst="etc"):
self.path("handle_secondlifeprotocol.sh")
self.path("register_secondlifeprotocol.sh")
self.path("refresh_desktop_app_entry.sh")
self.path("launch_url.sh")
- self.end_prefix("etc")
self.path("install.sh")
- self.end_prefix("linux_tools")
- if self.prefix(src="", dst="bin"):
+ with self.prefix(src="", dst="bin"):
self.path("secondlife-bin","do-not-directly-run-secondlife-bin")
self.path("../linux_crash_logger/linux-crash-logger","linux-crash-logger.bin")
self.path2basename("../llplugin/slplugin", "SLPlugin")
@@ -1299,40 +1262,33 @@ class LinuxManifest(ViewerManifest):
llbase_path = os.path.join(self.get_dst_prefix(),'llbase')
if not os.path.exists(llbase_path):
os.makedirs(llbase_path)
- if self.prefix(dst="llbase"):
+ with self.prefix(dst="llbase"):
self.path2basename("../packages/lib/python/llbase","*.py")
self.path2basename("../packages/lib/python/llbase","_cllsd.so")
- self.end_prefix("bin")
- if self.prefix("res-sdl"):
+ with self.prefix("res-sdl"):
self.path("*")
# recurse
- self.end_prefix("res-sdl")
# Get the icons based on the channel type
icon_path = self.icon_path()
print "DEBUG: icon_path '%s'" % icon_path
- if self.prefix(src=icon_path, dst="") :
+ with self.prefix(src=icon_path, dst="") :
self.path("secondlife_256.png","secondlife_icon.png")
- if self.prefix(src="",dst="res-sdl") :
+ with self.prefix(src="",dst="res-sdl") :
self.path("secondlife_256.BMP","ll_icon.BMP")
- self.end_prefix("res-sdl")
- self.end_prefix(icon_path)
# plugins
- if self.prefix(src="", dst="bin/llplugin"):
+ with self.prefix(src="", dst="bin/llplugin"):
self.path("../media_plugins/gstreamer010/libmedia_plugin_gstreamer010.so", "libmedia_plugin_gstreamer.so")
self.path("../media_plugins/libvlc/libmedia_plugin_libvlc.so", "libmedia_plugin_libvlc.so")
- self.end_prefix("bin/llplugin")
- if self.prefix(src=os.path.join(os.pardir, 'packages', 'lib', 'vlc', 'plugins'), dst="bin/llplugin/vlc/plugins"):
+ with self.prefix(src=os.path.join(os.pardir, 'packages', 'lib', 'vlc', 'plugins'), dst="bin/llplugin/vlc/plugins"):
self.path( "plugins.dat" )
self.path( "*/*.so" )
- self.end_prefix()
- if self.prefix(src=os.path.join(os.pardir, 'packages', 'lib' ), dst="lib"):
+ with self.prefix(src=os.path.join(os.pardir, 'packages', 'lib' ), dst="lib"):
self.path( "libvlc*.so*" )
- self.end_prefix()
# llcommon
if not self.path("../llcommon/libllcommon.so", "lib/libllcommon.so"):
@@ -1395,7 +1351,7 @@ class Linux_i686_Manifest(LinuxManifest):
relpkgdir = os.path.join(pkgdir, "lib", "release")
debpkgdir = os.path.join(pkgdir, "lib", "debug")
- if self.prefix(relpkgdir, dst="lib"):
+ with self.prefix(relpkgdir, dst="lib"):
self.path("libapr-1.so")
self.path("libapr-1.so.0")
self.path("libapr-1.so.0.4.5")
@@ -1455,21 +1411,18 @@ class Linux_i686_Manifest(LinuxManifest):
print "Skipping libfmodex.so - not found"
pass
- self.end_prefix("lib")
- # Vivox runtimes
- if self.prefix(src=relpkgdir, dst="bin"):
- self.path("SLVoice")
- self.end_prefix()
- if self.prefix(src=relpkgdir, dst="lib"):
- self.path("libortp.so")
- self.path("libsndfile.so.1")
- #self.path("libvivoxoal.so.1") # no - we'll re-use the viewer's own OpenAL lib
- self.path("libvivoxsdk.so")
- self.path("libvivoxplatform.so")
- self.end_prefix("lib")
-
- self.strip_binaries()
+ # Vivox runtimes
+ with self.prefix(src=relpkgdir, dst="bin"):
+ self.path("SLVoice")
+ with self.prefix(src=relpkgdir, dst="lib"):
+ self.path("libortp.so")
+ self.path("libsndfile.so.1")
+ #self.path("libvivoxoal.so.1") # no - we'll re-use the viewer's own OpenAL lib
+ self.path("libvivoxsdk.so")
+ self.path("libvivoxplatform.so")
+
+ self.strip_binaries()
class Linux_x86_64_Manifest(LinuxManifest):
diff --git a/indra/test/test.cpp b/indra/test/test.cpp
index 630af2b73b..1c0317df1d 100644
--- a/indra/test/test.cpp
+++ b/indra/test/test.cpp
@@ -136,7 +136,7 @@ public:
private:
NamedTempFile mTempFile;
- std::ofstream mFile;
+ llofstream mFile;
};
class LLReplayLogReal: public LLReplayLog, public boost::noncopyable
@@ -569,7 +569,7 @@ int main(int argc, char **argv)
apr_status_t apr_err;
const char* opt_arg = NULL;
int opt_id = 0;
- boost::scoped_ptr<std::ofstream> output;
+ boost::scoped_ptr<llofstream> output;
const char *touch = NULL;
while(true)
@@ -599,7 +599,7 @@ int main(int argc, char **argv)
verbose_mode = true;
break;
case 'o':
- output.reset(new std::ofstream);
+ output.reset(new llofstream);
output->open(opt_arg);
break;
case 's': // --sourcedir
@@ -673,7 +673,7 @@ int main(int argc, char **argv)
if (touch && success)
{
- std::ofstream s;
+ llofstream s;
s.open(touch);
s << "ok" << std::endl;
s.close();
diff --git a/indra/win_crash_logger/llcrashloggerwindows.cpp b/indra/win_crash_logger/llcrashloggerwindows.cpp
index 167acf6ac7..267224a79b 100644
--- a/indra/win_crash_logger/llcrashloggerwindows.cpp
+++ b/indra/win_crash_logger/llcrashloggerwindows.cpp
@@ -377,7 +377,7 @@ bool LLCrashLoggerWindows::initCrashServer()
std::wstring wpipe_name;
wpipe_name = mCrashReportPipeStr + std::wstring(wstringize(mPID));
- std::wstring wdump_path( wstringize(dump_path) );
+ std::wstring wdump_path(utf8str_to_utf16str(dump_path));
//Pipe naming conventions: http://msdn.microsoft.com/en-us/library/aa365783%28v=vs.85%29.aspx
mCrashHandler = new CrashGenerationServer( wpipe_name,
diff --git a/indra/win_crash_logger/win_crash_logger.cpp b/indra/win_crash_logger/win_crash_logger.cpp
index 7466dbb766..58746eba02 100644
--- a/indra/win_crash_logger/win_crash_logger.cpp
+++ b/indra/win_crash_logger/win_crash_logger.cpp
@@ -29,15 +29,26 @@
#include <stdlib.h>
#include "llcrashloggerwindows.h"
+#ifdef _UNICODE
+int APIENTRY wWinMain(HINSTANCE hInstance,
+ HINSTANCE hPrevInstance,
+ LPWSTR lpCmdLine,
+ int nCmdShow)
+#else
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
+#endif //_UNICODE
{
LL_INFOS() << "Starting crash reporter with args" << &lpCmdLine << LL_ENDL;
LLCrashLoggerWindows app;
app.setHandle(hInstance);
+#ifdef _UNICODE
+ app.parseCommandOptions(__argc, __wargv);
+#else
app.parseCommandOptions(__argc, __argv);
+#endif //_UNICODE
LLSD options = LLApp::instance()->getOptionData(
LLApp::PRIORITY_COMMAND_LINE);