summaryrefslogtreecommitdiff
path: root/indra
diff options
context:
space:
mode:
authorNyx Linden <nyx@lindenlab.com>2013-02-14 13:42:09 -0500
committerNyx Linden <nyx@lindenlab.com>2013-02-14 13:42:09 -0500
commite8a28a8e217b724c08338876b1197d17ff240824 (patch)
tree597d2b11e2471fd8862f5b5e4781de01ea3528a8 /indra
parent705a23ac0d80da44e61b0b78515dca0768909b32 (diff)
parentc99e206374f6afdcc038a97934314dec1a742b2e (diff)
merge
Diffstat (limited to 'indra')
-rwxr-xr-x[-rw-r--r--]indra/llprimitive/llprimitive.cpp1
-rw-r--r--indra/media_plugins/webkit/windows_volume_catcher.cpp2
-rw-r--r--indra/newview/CMakeLists.txt1
-rwxr-xr-xindra/newview/llagent.cpp17
-rwxr-xr-xindra/newview/llagentwearables.cpp1
-rwxr-xr-xindra/newview/llappearancemgr.cpp1
-rw-r--r--indra/newview/lldrawable.cpp10
-rwxr-xr-xindra/newview/llmeshrepository.cpp33
-rw-r--r--indra/newview/llpaneloutfitedit.cpp14
-rw-r--r--indra/newview/llviewerparcelmgr.cpp11
-rwxr-xr-xindra/newview/llviewerstats.cpp2
-rwxr-xr-xindra/newview/llvoavatar.cpp77
-rwxr-xr-xindra/newview/llvoavatar.h20
-rwxr-xr-xindra/newview/llvoavatarself.cpp87
-rwxr-xr-xindra/newview/llvoavatarself.h5
-rw-r--r--indra/newview/skins/default/xui/en/notifications.xml1738
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml8
-rw-r--r--indra/newview/viewer_manifest.py14
-rw-r--r--indra/viewer_components/updater/scripts/linux/update_install219
19 files changed, 394 insertions, 1867 deletions
diff --git a/indra/llprimitive/llprimitive.cpp b/indra/llprimitive/llprimitive.cpp
index 4e36723eec..faf98883d9 100644..100755
--- a/indra/llprimitive/llprimitive.cpp
+++ b/indra/llprimitive/llprimitive.cpp
@@ -1246,6 +1246,7 @@ S32 LLPrimitive::parseTEMessage(LLMessageSystem* mesgsys, char const* block_name
if (tec.size == 0)
{
+ tec.face_count = 0;
return retval;
}
diff --git a/indra/media_plugins/webkit/windows_volume_catcher.cpp b/indra/media_plugins/webkit/windows_volume_catcher.cpp
index 957704da47..0cfb810906 100644
--- a/indra/media_plugins/webkit/windows_volume_catcher.cpp
+++ b/indra/media_plugins/webkit/windows_volume_catcher.cpp
@@ -71,7 +71,7 @@ VolumeCatcherImpl::VolumeCatcherImpl()
{
mSystemIsVistaOrHigher = isWindowsVistaOrHigher();
- if ( mSystemIsVistaOrHigher )
+ if ( ! mSystemIsVistaOrHigher )
{
HMODULE handle = ::LoadLibrary(L"winmm.dll");
if(handle)
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index 7282b8978f..baedac1f2d 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -1854,7 +1854,6 @@ if (LINUX)
set(COPY_INPUT_DEPENDENCIES
${VIEWER_BINARY_NAME}
linux-crash-logger
- linux-updater
SLPlugin
media_plugin_webkit
media_plugin_gstreamer010
diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp
index c86b75791d..e15c1a5104 100755
--- a/indra/newview/llagent.cpp
+++ b/indra/newview/llagent.cpp
@@ -812,6 +812,8 @@ void LLAgent::handleServerBakeRegionTransition(const LLUUID& region_id)
{
llinfos << "called" << llendl;
+
+ // Old-style appearance entering a server-bake region.
if (isAgentAvatarValid() &&
!gAgentAvatarp->isUsingServerBakes() &&
(mRegionp->getCentralBakeVersion()>0))
@@ -819,6 +821,14 @@ void LLAgent::handleServerBakeRegionTransition(const LLUUID& region_id)
llinfos << "update requested due to region transition" << llendl;
LLAppearanceMgr::instance().requestServerAppearanceUpdate();
}
+ // new-style appearance entering a non-bake region,
+ // need to check for existence of the baking service.
+ else if (isAgentAvatarValid() &&
+ gAgentAvatarp->isUsingServerBakes() &&
+ mRegionp->getCentralBakeVersion()==0)
+ {
+ gAgentAvatarp->checkForUnsupportedServerBakeAppearance();
+ }
}
//-----------------------------------------------------------------------------
@@ -4335,13 +4345,6 @@ void LLAgent::sendAgentSetAppearance()
return;
}
- if (!gAgentWearables.changeInProgress())
- {
- // Change is fully resolved, can close some open phases.
- gAgentAvatarp->stopPhase("process_initial_wearables_update");
- gAgentAvatarp->stopPhase("wear_inventory_category");
- }
-
if (!isAgentAvatarValid() || (getRegion() && getRegion()->getCentralBakeVersion())) return;
// At this point we have a complete appearance to send and are in a non-baking region.
diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp
index 0c79ac0ba3..ba04991a02 100755
--- a/indra/newview/llagentwearables.cpp
+++ b/indra/newview/llagentwearables.cpp
@@ -796,7 +796,6 @@ void LLAgentWearables::processAgentInitialWearablesUpdate(LLMessageSystem* mesgs
if (isAgentAvatarValid())
{
- //gAgentAvatarp->clearPhases(); // reset phase timers for outfit loading.
gAgentAvatarp->startPhase("process_initial_wearables_update");
gAgentAvatarp->outputRezTiming("Received initial wearables update");
}
diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp
index ecbb922adc..10523ca998 100755
--- a/indra/newview/llappearancemgr.cpp
+++ b/indra/newview/llappearancemgr.cpp
@@ -2008,6 +2008,7 @@ void LLAppearanceMgr::updateAppearanceFromCOF(bool update_base_outfit_ordering)
}
BoolSetter setIsInUpdateAppearanceFromCOF(mIsInUpdateAppearanceFromCOF);
+ selfStartPhase("update_appearance_from_cof");
LL_INFOS("Avatar") << self_av_string() << "starting" << LL_ENDL;
diff --git a/indra/newview/lldrawable.cpp b/indra/newview/lldrawable.cpp
index d8b1887a90..24413caf6a 100644
--- a/indra/newview/lldrawable.cpp
+++ b/indra/newview/lldrawable.cpp
@@ -523,6 +523,7 @@ F32 LLDrawable::updateXform(BOOL undamped)
dist_squared = dist_vec_squared(new_pos, target_pos);
LLQuaternion new_rot = nlerp(lerp_amt, old_rot, target_rot);
+ // FIXME: This can be negative! It is be possible for some rots to 'cancel out' pos or size changes.
dist_squared += (1.f - dot(new_rot, target_rot)) * 10.f;
LLVector3 new_scale = lerp(old_scale, target_scale, lerp_amt);
@@ -548,9 +549,12 @@ F32 LLDrawable::updateXform(BOOL undamped)
}
else
{
- dist_squared = dist_vec_squared(old_pos, target_pos);
- dist_squared += (1.f - dot(old_rot, target_rot)) * 10.f;
- dist_squared += dist_vec_squared(old_scale, target_scale);
+ // The following fixes MAINT-1742 but breaks vehicles similar to MAINT-2275
+ // dist_squared = dist_vec_squared(old_pos, target_pos);
+
+ // The following fixes MAINT-2247 but causes MAINT-2275
+ //dist_squared += (1.f - dot(old_rot, target_rot)) * 10.f;
+ //dist_squared += dist_vec_squared(old_scale, target_scale);
}
LLVector3 vec = mCurrentScale-target_scale;
diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp
index 39a429e9c6..17311dd75e 100755
--- a/indra/newview/llmeshrepository.cpp
+++ b/indra/newview/llmeshrepository.cpp
@@ -215,17 +215,19 @@ public:
~LLMeshHeaderResponder()
{
- if (!mProcessed && !LLApp::isQuitting())
- { //something went wrong, retry
- llwarns << "Timeout or service unavailable, retrying." << llendl;
- LLMeshRepository::sHTTPRetryCount++;
- LLMeshRepoThread::HeaderRequest req(mMeshParams);
- LLMutexLock lock(gMeshRepo.mThread->mMutex);
- gMeshRepo.mThread->mHeaderReqQ.push(req);
+ if (!LLApp::isQuitting())
+ {
+ if (!mProcessed)
+ { //something went wrong, retry
+ llwarns << "Timeout or service unavailable, retrying." << llendl;
+ LLMeshRepository::sHTTPRetryCount++;
+ LLMeshRepoThread::HeaderRequest req(mMeshParams);
+ LLMutexLock lock(gMeshRepo.mThread->mMutex);
+ gMeshRepo.mThread->mHeaderReqQ.push(req);
+ }
+ LLMeshRepoThread::decActiveHeaderRequests();
}
-
- LLMeshRepoThread::decActiveHeaderRequests();
}
virtual void completedRaw(U32 status, const std::string& reason,
@@ -252,13 +254,16 @@ public:
~LLMeshLODResponder()
{
- if (!mProcessed && !LLApp::isQuitting())
+ if (!LLApp::isQuitting())
{
- llwarns << "Killed without being processed, retrying." << llendl;
- LLMeshRepository::sHTTPRetryCount++;
- gMeshRepo.mThread->lockAndLoadMeshLOD(mMeshParams, mLOD);
+ if (!mProcessed)
+ {
+ llwarns << "Killed without being processed, retrying." << llendl;
+ LLMeshRepository::sHTTPRetryCount++;
+ gMeshRepo.mThread->lockAndLoadMeshLOD(mMeshParams, mLOD);
+ }
+ LLMeshRepoThread::decActiveLODRequests();
}
- LLMeshRepoThread::decActiveLODRequests();
}
virtual void completedRaw(U32 status, const std::string& reason,
diff --git a/indra/newview/llpaneloutfitedit.cpp b/indra/newview/llpaneloutfitedit.cpp
index 35e2e96bab..36234b9536 100644
--- a/indra/newview/llpaneloutfitedit.cpp
+++ b/indra/newview/llpaneloutfitedit.cpp
@@ -186,8 +186,11 @@ private:
// Populate the menu with items like "New Skin", "New Pants", etc.
static void populateCreateWearableSubmenus(LLMenuGL* menu)
{
- LLView* menu_clothes = gMenuHolder->getChildView("COF.Gear.New_Clothes", FALSE);
- LLView* menu_bp = gMenuHolder->getChildView("COF.Geear.New_Body_Parts", FALSE);
+ // MAINT-2276...these menus are created as dummies because they are not available
+ // when this function is called. This prevents their parent from popping up later.
+ //
+ //LLView* menu_clothes = gMenuHolder->getChildView("COF.Gear.New_Clothes", FALSE);
+ //LLView* menu_bp = gMenuHolder->getChildView("COF.Geear.New_Body_Parts", FALSE);
for (U8 i = LLWearableType::WT_SHAPE; i != (U8) LLWearableType::WT_COUNT; ++i)
{
@@ -200,8 +203,11 @@ private:
p.on_click.function_name = "Wearable.Create";
p.on_click.parameter = LLSD(type_name);
- LLView* parent = LLWearableType::getAssetType(type) == LLAssetType::AT_CLOTHING ?
- menu_clothes : menu_bp;
+ //LLView* parent = LLWearableType::getAssetType(type) == LLAssetType::AT_CLOTHING ? menu_clothes : menu_bp;
+ // This is a work-around for MAINT-2276 wherein the parent toggleable menu does not appear
+ // It puts everything under one menu, but that menu appears, which is better than not.
+ //
+ LLView* parent = menu;
LLUICtrlFactory::create<LLMenuItemCallGL>(p, parent);
}
}
diff --git a/indra/newview/llviewerparcelmgr.cpp b/indra/newview/llviewerparcelmgr.cpp
index 5da1561afe..4cdb568d17 100644
--- a/indra/newview/llviewerparcelmgr.cpp
+++ b/indra/newview/llviewerparcelmgr.cpp
@@ -1540,17 +1540,6 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use
// Actually extract the data.
if (parcel)
{
- if (sequence_id == SELECTED_PARCEL_SEQ_ID
- && parcel->getLocalID() != INVALID_PARCEL_ID
- && parcel->getLocalID() != local_id)
- {
- // The parcel has a valid parcel ID but it doesn't match the parcel
- // for the data received.
- llinfos << "Expecting data for parcel " << parcel->getLocalID() \
- << " but got data for parcel " << local_id << llendl;
- return;
- }
-
parcel->init(owner_id,
FALSE, FALSE, FALSE,
claim_date, claim_price_per_meter, rent_price_per_meter,
diff --git a/indra/newview/llviewerstats.cpp b/indra/newview/llviewerstats.cpp
index 65cae9b338..17bb03b889 100755
--- a/indra/newview/llviewerstats.cpp
+++ b/indra/newview/llviewerstats.cpp
@@ -763,7 +763,7 @@ void LLViewerStats::PhaseMap::stopPhase(const std::string& phase_name)
{
if (iter->second.getStarted())
{
- // Going from started to paused state - record stats.
+ // Going from started to stopped state - record stats.
iter->second.stop();
}
}
diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp
index 346c55e589..735589414d 100755
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -729,6 +729,8 @@ LLVOAvatar::~LLVOAvatar()
debugAvatarRezTime("AvatarRezLeftNotification","left sometime after declouding");
}
+ logPendingPhases();
+
lldebugs << "LLVOAvatar Destructor (0x" << this << ") id:" << mID << llendl;
std::for_each(mAttachmentPoints.begin(), mAttachmentPoints.end(), DeletePairedPointer());
@@ -1796,13 +1798,13 @@ LLViewerFetchedTexture *LLVOAvatar::getBakedTextureImage(const U8 te, const LLUU
const std::string url = getImageURL(te,uuid);
if (!url.empty())
{
- llinfos << "texture URL " << url << llendl;
+ LL_DEBUGS("Avatar") << avString() << "from URL " << url << llendl;
result = LLViewerTextureManager::getFetchedTextureFromUrl(
url, TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE, 0, 0, uuid);
}
else
{
- llinfos << "get texture from host " << uuid << llendl;
+ LL_DEBUGS("Avatar") << avString() << "from host " << uuid << llendl;
LLHost host = getObjectHost();
result = LLViewerTextureManager::getFetchedTexture(
uuid, TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE, 0, 0, host);
@@ -4190,15 +4192,15 @@ void LLVOAvatar::releaseOldTextures()
std::set<LLUUID> local_texture_ids;
collectLocalTextureUUIDs(local_texture_ids);
- S32 new_local_mem = totalTextureMemForUUIDS(local_texture_ids);
+ //S32 new_local_mem = totalTextureMemForUUIDS(local_texture_ids);
std::set<LLUUID> new_texture_ids;
new_texture_ids.insert(baked_texture_ids.begin(),baked_texture_ids.end());
new_texture_ids.insert(local_texture_ids.begin(),local_texture_ids.end());
S32 new_total_mem = totalTextureMemForUUIDS(new_texture_ids);
- S32 old_total_mem = totalTextureMemForUUIDS(mTextureIDs);
- LL_DEBUGS("Avatar") << getFullname() << " old_total_mem: " << old_total_mem << " new_total_mem (L/B): " << new_total_mem << " (" << new_local_mem <<", " << new_baked_mem << ")" << llendl;
+ //S32 old_total_mem = totalTextureMemForUUIDS(mTextureIDs);
+ //LL_DEBUGS("Avatar") << getFullname() << " old_total_mem: " << old_total_mem << " new_total_mem (L/B): " << new_total_mem << " (" << new_local_mem <<", " << new_baked_mem << ")" << llendl;
if (!isSelf() && new_total_mem > new_baked_mem)
{
llwarns << "extra local textures stored for non-self av" << llendl;
@@ -4456,6 +4458,7 @@ void LLVOAvatar::setTexEntry(const U8 index, const LLTextureEntry &te)
const std::string LLVOAvatar::getImageURL(const U8 te, const LLUUID &uuid)
{
+ llassert(isIndexBakedTexture(ETextureIndex(te)));
std::string url = "";
if (isUsingServerBakes())
{
@@ -5872,43 +5875,15 @@ BOOL LLVOAvatar::getIsCloud() const
void LLVOAvatar::updateRezzedStatusTimers()
{
- // State machine for rezzed status. Statuses are -1 on startup, 0 = cloud, 1 = gray, 2 = textured, 3 = textured_and_downloaded.
- // Purpose is to collect time data for each period of cloud or cloud+gray.
+ // State machine for rezzed status. Statuses are -1 on startup, 0
+ // = cloud, 1 = gray, 2 = textured, 3 = textured_and_downloaded.
+ // Purpose is to collect time data for each it takes avatar to reach
+ // various loading landmarks: gray, textured (partial), textured fully.
S32 rez_status = getRezzedStatus();
if (rez_status != mLastRezzedStatus)
{
LL_DEBUGS("Avatar") << avString() << "rez state change: " << mLastRezzedStatus << " -> " << rez_status << LL_ENDL;
-#if 0
- bool is_cloud_or_gray = (rez_status==0 || rez_status==1);
- bool was_cloud_or_gray = (mLastRezzedStatus==0 || mLastRezzedStatus==1);
- bool is_cloud = (rez_status==0);
- bool was_cloud = (mLastRezzedStatus==0);
-
- // Non-cloud to cloud
- if (is_cloud && !was_cloud)
- {
- // start cloud timer.
- startPhase("cloud");
- }
- else if (was_cloud && !is_cloud)
- {
- // stop cloud timer, which will capture stats.
- stopPhase("cloud");
- }
-
- // Non-cloud-or-gray to cloud-or-gray
- if (is_cloud_or_gray && !was_cloud_or_gray)
- {
- // start cloud-or-gray timer.
- startPhase("cloud-or-gray");
- }
- else if (was_cloud_or_gray && !is_cloud_or_gray)
- {
- // stop cloud-or-gray timer, which will capture stats.
- stopPhase("cloud-or-gray");
- }
-#endif
if (mLastRezzedStatus == -1 && rez_status != -1)
{
@@ -5933,6 +5908,13 @@ void LLVOAvatar::updateRezzedStatusTimers()
{
stopPhase("load_" + LLVOAvatar::rezStatusToString(i));
}
+ if (rez_status == 3)
+ {
+ // "fully loaded", mark any pending appearance change complete.
+ selfStopPhase("update_appearance_from_cof");
+ selfStopPhase("wear_inventory_category", false);
+ selfStopPhase("process_initial_wearables_update", false);
+ }
}
mLastRezzedStatus = rez_status;
@@ -5952,7 +5934,7 @@ void LLVOAvatar::startPhase(const std::string& phase_name)
{
if (!completed)
{
- LL_DEBUGS("Avatar") << "start when started already for " << phase_name << llendl;
+ LL_DEBUGS("Avatar") << avString() << "no-op, start when started already for " << phase_name << llendl;
return;
}
}
@@ -5960,7 +5942,7 @@ void LLVOAvatar::startPhase(const std::string& phase_name)
getPhases().startPhase(phase_name);
}
-void LLVOAvatar::stopPhase(const std::string& phase_name)
+void LLVOAvatar::stopPhase(const std::string& phase_name, bool err_check)
{
F32 elapsed;
bool completed;
@@ -5968,19 +5950,25 @@ void LLVOAvatar::stopPhase(const std::string& phase_name)
{
if (!completed)
{
- LL_DEBUGS("Avatar") << "stopped phase " << phase_name << llendl;
getPhases().stopPhase(phase_name);
completed = true;
logMetricsTimerRecord(phase_name, elapsed, completed);
+ LL_DEBUGS("Avatar") << avString() << "stopped phase " << phase_name << " elapsed " << elapsed << llendl;
}
else
{
- LL_DEBUGS("Avatar") << "stop when stopped already for " << phase_name << llendl;
+ if (err_check)
+ {
+ LL_DEBUGS("Avatar") << "no-op, stop when stopped already for " << phase_name << llendl;
+ }
}
}
else
{
- LL_DEBUGS("Avatar") << "stop when not started for " << phase_name << llendl;
+ if (err_check)
+ {
+ LL_DEBUGS("Avatar") << "no-op, stop when not started for " << phase_name << llendl;
+ }
}
}
@@ -6037,9 +6025,11 @@ void LLVOAvatar::logMetricsTimerRecord(const std::string& phase_name, F32 elapse
record["is_self"] = isSelf();
+#if 0 // verbose logging
std::ostringstream ostr;
ostr << LLSDNotationStreamer(record);
LL_DEBUGS("Avatar") << "record\n" << ostr.str() << llendl;
+#endif
if (isAgentAvatarValid())
{
@@ -6258,7 +6248,8 @@ void LLVOAvatar::updateMeshTextures()
#ifndef LL_RELEASE_FOR_DOWNLOAD
LLViewerFetchedTexture* existing_baked_img = LLViewerTextureManager::getFetchedTexture(mBakedTextureDatas[i].mLastTextureID);
#endif
- const std::string url = getImageURL(i, mBakedTextureDatas[i].mLastTextureID);
+ ETextureIndex te = ETextureIndex(mBakedTextureDatas[i].mTextureIndex);
+ const std::string url = getImageURL(te, mBakedTextureDatas[i].mLastTextureID);
if (!url.empty())
{
baked_img = LLViewerTextureManager::getFetchedTextureFromUrl(url, TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE, 0, 0, mBakedTextureDatas[i].mLastTextureID);
diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h
index c8915383ca..c989673cdf 100755
--- a/indra/newview/llvoavatar.h
+++ b/indra/newview/llvoavatar.h
@@ -294,7 +294,7 @@ public:
void startPhase(const std::string& phase_name);
- void stopPhase(const std::string& phase_name);
+ void stopPhase(const std::string& phase_name, bool err_check = true);
void clearPhases();
void logPendingPhases();
static void logPendingPhasesAllAvatars();
@@ -316,24 +316,6 @@ private:
LLFrameTimer mFullyLoadedTimer;
LLFrameTimer mRuthTimer;
-public:
- class ScopedPhaseSetter
- {
- public:
- ScopedPhaseSetter(LLVOAvatar *avatarp, std::string phase_name):
- mAvatar(avatarp), mPhaseName(phase_name)
- {
- if (mAvatar) { mAvatar->getPhases().startPhase(mPhaseName); }
- }
- ~ScopedPhaseSetter()
- {
- if (mAvatar) { mAvatar->getPhases().stopPhase(mPhaseName); }
- }
- private:
- std::string mPhaseName;
- LLVOAvatar* mAvatar;
- };
-
private:
LLViewerStats::PhaseMap mPhases;
diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp
index e30d62869f..1a1564e1a8 100755
--- a/indra/newview/llvoavatarself.cpp
+++ b/indra/newview/llvoavatarself.cpp
@@ -86,11 +86,11 @@ void selfStartPhase(const std::string& phase_name)
}
}
-void selfStopPhase(const std::string& phase_name)
+void selfStopPhase(const std::string& phase_name, bool err_check)
{
if (isAgentAvatarValid())
{
- gAgentAvatarp->stopPhase(phase_name);
+ gAgentAvatarp->stopPhase(phase_name, err_check);
}
}
@@ -179,6 +179,24 @@ bool output_self_av_texture_diagnostics()
return false;
}
+bool update_avatar_rez_metrics()
+{
+ if (!isAgentAvatarValid())
+ return true;
+
+ gAgentAvatarp->updateAvatarRezMetrics(false);
+ return false;
+}
+
+bool check_for_unsupported_baked_appearance()
+{
+ if (!isAgentAvatarValid())
+ return true;
+
+ gAgentAvatarp->checkForUnsupportedServerBakeAppearance();
+ return false;
+}
+
void LLVOAvatarSelf::initInstance()
{
BOOL status = TRUE;
@@ -214,7 +232,8 @@ void LLVOAvatarSelf::initInstance()
}
//doPeriodically(output_self_av_texture_diagnostics, 30.0);
- doPeriodically(boost::bind(&LLVOAvatarSelf::updateAvatarRezMetrics, this, false), 5.0);
+ doPeriodically(update_avatar_rez_metrics, 5.0);
+ doPeriodically(check_for_unsupported_baked_appearance, 120.0);
}
// virtual
@@ -2250,7 +2269,11 @@ bool LLVOAvatarSelf::updateAvatarRezMetrics(bool force_send)
// Stats for completed phases have been getting logged as they
// complete. This will give us stats for any timers that
// haven't finished as of the metric's being sent.
- LLVOAvatar::logPendingPhasesAllAvatars();
+
+ if (force_send)
+ {
+ LLVOAvatar::logPendingPhasesAllAvatars();
+ }
sendViewerAppearanceChangeMetrics();
}
@@ -2371,6 +2394,62 @@ void LLVOAvatarSelf::sendViewerAppearanceChangeMetrics()
}
}
+class CheckAgentAppearanceServiceResponder: public LLHTTPClient::Responder
+{
+public:
+ CheckAgentAppearanceServiceResponder()
+ {
+ }
+
+ virtual ~CheckAgentAppearanceServiceResponder()
+ {
+ }
+
+ /* virtual */ void result(const LLSD& content)
+ {
+ LL_DEBUGS("Avatar") << "status OK" << llendl;
+ }
+
+ // Error
+ /*virtual*/ void error(U32 status, const std::string& reason)
+ {
+ if (isAgentAvatarValid())
+ {
+ LL_DEBUGS("Avatar") << "failed, will rebake" << llendl;
+ forceAppearanceUpdate();
+ }
+ }
+
+ static void forceAppearanceUpdate()
+ {
+ // Trying to rebake immediately after crossing region boundary
+ // seems to be failure prone; adding a delay factor. Yes, this
+ // fix is ad-hoc and not guaranteed to work in all cases.
+ doAfterInterval(boost::bind(&LLVOAvatarSelf::forceBakeAllTextures,
+ gAgentAvatarp.get(), true), 5.0);
+ }
+};
+
+void LLVOAvatarSelf::checkForUnsupportedServerBakeAppearance()
+{
+ // Need to check only if we have a server baked appearance and are
+ // in a non-baking region.
+ if (!gAgentAvatarp->isUsingServerBakes())
+ return;
+ if (!gAgent.getRegion() || gAgent.getRegion()->getCentralBakeVersion()!=0)
+ return;
+
+ // if baked image service is unknown, need to refresh.
+ if (gSavedSettings.getString("AgentAppearanceServiceURL").empty())
+ {
+ CheckAgentAppearanceServiceResponder::forceAppearanceUpdate();
+ }
+ // query baked image service to check status.
+ std::string image_url = gAgentAvatarp->getImageURL(TEX_HEAD_BAKED,
+ getTE(TEX_HEAD_BAKED)->getID());
+ LLHTTPClient::head(image_url, new CheckAgentAppearanceServiceResponder);
+}
+
const LLUUID& LLVOAvatarSelf::grabBakedTexture(EBakedTextureIndex baked_index) const
{
if (canGrabBakedTexture(baked_index))
diff --git a/indra/newview/llvoavatarself.h b/indra/newview/llvoavatarself.h
index 04b0fb760c..78728cff20 100755
--- a/indra/newview/llvoavatarself.h
+++ b/indra/newview/llvoavatarself.h
@@ -402,6 +402,7 @@ public:
const std::string debugDumpLocalTextureDataInfo(const LLViewerTexLayerSet* layerset) const; // Lists out state of this particular baked texture layer
const std::string debugDumpAllLocalTextureDataInfo() const; // Lists out which baked textures are at highest LOD
void sendViewerAppearanceChangeMetrics(); // send data associated with completing a change.
+ void checkForUnsupportedServerBakeAppearance();
private:
LLFrameTimer mDebugSelfLoadTimer;
F32 mDebugTimeWearablesLoaded;
@@ -421,9 +422,7 @@ extern LLPointer<LLVOAvatarSelf> gAgentAvatarp;
BOOL isAgentAvatarValid();
void selfStartPhase(const std::string& phase_name);
-void selfStopPhase(const std::string& phase_name);
+void selfStopPhase(const std::string& phase_name, bool err_check = true);
void selfClearPhases();
-void update_avatar_rez_metrics(bool force_send);
-
#endif // LL_VO_AVATARSELF_H
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index 44c18c2cce..c8f5cbb2b0 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -8874,14 +8874,6 @@ Cannot save to object contents: This would modify the attachment permissions.
<notification
icon="alertmodal.tga"
- name="NoPermToEdit"
- type="notify">
- <tag>fail</tag>
-Not permitted to edit this!
- </notification>
-
- <notification
- icon="alertmodal.tga"
name="TooManyScripts"
type="notify">
<tag>fail</tag>
@@ -8922,47 +8914,6 @@ You cannot modify the navmesh across region boundaries.
<notification
icon="alertmodal.tga"
- name="NoPermModifyObject"
- type="notify">
- <tag>fail</tag>
-You don't have permission to modify that object.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="CantEnablePhysObjContributesToNav"
- type="notify">
- <tag>fail</tag>
-Can't enable physics for an object that contributes to the navmesh.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="CantEnablePhysKeyframedObj"
- type="notify">
- <tag>fail</tag>
-Can't enable physics for keyframed objects.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="CantEnablePhysNotEnoughLandResources"
- type="notify">
- <tag>fail</tag>
-Can't enable physics for object -- insufficient land resources.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="CantEnablePhysCostTooGreat"
- persist="true"
- type="notify">
- <tag>fail</tag>
-Can't enable physics for object with physics resource cost greater than [MAX_OBJECTS]
- </notification>
-
- <notification
- icon="alertmodal.tga"
name="NoSetPhysicsPropertiesOnObjectType"
type="notify">
<tag>fail</tag>
@@ -9987,1693 +9938,4 @@ An internal error prevented us from properly updating your viewer. The L$ balan
Cannot create large prims that intersect other players. Please re-try when other players have moved.
</notification>
-
- <notification
- icon="alertmodal.tga"
- name="AvatarFrozen"
- type="notify">
- <tag>fail</tag>
-[AV_FREEZER] has frozen you. You cannot move or interact with the world.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="AvatarFrozenDuration"
- type="notify">
- <tag>fail</tag>
-[AV_FREEZER] has frozen you for [AV_FREEZE_TIME] seconds. You cannot move or interact with the world.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="YouFrozeAvatar"
- type="notify">
- <tag>fail</tag>
-Avatar frozen.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="AvatarHasUnFrozenYou"
- type="notify">
- <tag>fail</tag>
-[AV_FREEZER] has unfrozen you.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="AvatarUnFrozen"
- type="notify">
- <tag>fail</tag>
-Avatar unfrozen.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="AvatarFreezeFailure"
- type="notify">
- <tag>fail</tag>
-Freeze failed because you don't have admin permission for that parcel.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="AvatarFreezeThaw"
- type="notify">
- <tag>fail</tag>
-Your freeze expired, go about your business.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="AvatarCantFreeze"
- type="notify">
- <tag>fail</tag>
-Sorry, can't freeze that user.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="NowOwnObject"
- type="notify">
- <tag>fail</tag>
-You are now the owner of object [OBJECT_NAME]
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="CantRezOnLand"
- type="notify">
- <tag>fail</tag>
-Can't rez object at [OBJECT_POS] because the owner of this land does not allow it. Use the land tool to see land ownership.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="RezFailTooManyRequests"
- type="notify">
- <tag>fail</tag>
-Object can not be rezzed because there are too many requests.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="SitFailCantMove"
- type="notify">
- <tag>fail</tag>
-You cannot sit because you cannot move at this time.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="SitFailNotAllowedOnLand"
- type="notify">
- <tag>fail</tag>
-You cannot sit because you are not allowed on that land.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="SitFailNotSameRegion"
- type="notify">
- <tag>fail</tag>
-Try moving closer. Can't sit on object because
-it is not in the same region as you.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="NoNewObjectRegionFull"
- type="notify">
- <tag>fail</tag>
-Unable to create new object. The region is full.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="FailedToPlaceObject"
- type="notify">
- <tag>fail</tag>
-Failed to place object at specified location. Please try again.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="NoOwnNoGardening"
- type="notify">
- <tag>fail</tag>
-You Can't create trees and grass on land you don't own.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="NoCopyPermsNoObject"
- type="notify">
- <tag>fail</tag>
-Copy failed because you lack permission to copy the object '[OBJ_NAME]'.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="NoTransPermsNoObject"
- type="notify">
- <tag>fail</tag>
-Copy failed because the object '[OBJ_NAME]' cannot be transferred to you.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="AddToNavMeshNoCopy"
- type="notify">
- <tag>fail</tag>
-Copy failed because the object '[OBJ_NAME]' contributes to navmesh.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="DupeWithNoRootsSelected"
- type="notify">
- <tag>fail</tag>
-Duplicate with no root objects selected.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="CantDupeCuzRegionIsFull"
- type="notify">
- <tag>fail</tag>
-Can't duplicate objects because the region is full.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="CantDupeCuzParcelNotFound"
- type="notify">
- <tag>fail</tag>
-Can't duplicate objects - Can't find the parcel they are on.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="CantCreateCuzParcelFull"
- type="notify">
- <tag>fail</tag>
-Can't create object because
-the parcel is full.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="RezAttemptFailed"
- type="notify">
- <tag>fail</tag>
-Attempt to rez an object failed.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="ToxicInvRezAttemptFailed"
- type="notify">
- <tag>fail</tag>
-Unable to create item that has caused problems on this region.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="InvItemIsBlacklisted"
- type="notify">
- <tag>fail</tag>
-That inventory item has been blacklisted.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="NoCanRezObjects"
- type="notify">
- <tag>fail</tag>
-You are not currently allowed to create objects.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="LandSearchBlocked"
- type="notify">
- <tag>fail</tag>
-Land Search Blocked.
-You have performed too many land searches too quickly.
-Please try again in a minute.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="NotEnoughResourcesToAttach"
- type="notify">
- <tag>fail</tag>
-Not enough script resources available to attach object!
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="YouDiedAndGotTPHome"
- type="notify">
- <tag>fail</tag>
-You died and have been teleported to your home location
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="EjectComingSoon"
- type="notify">
- <tag>fail</tag>
-You are no longer allowed here and have [EJECT_TIME] seconds to leave.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="NoEnterServerFull"
- type="notify">
- <tag>fail</tag>
-You can't enter this region because
-the server is full.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="SaveBackToInvDisabled"
- type="notify">
- <tag>fail</tag>
-Save Back To Inventory has been disabled.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="NoExistNoSaveToContents"
- type="notify">
- <tag>fail</tag>
-Cannot save '[OBJ_NAME]' to object contents because the object it was rezzed from no longer exists.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="NoModNoSaveToContents"
- type="notify">
- <tag>fail</tag>
-Cannot save '[OBJ_NAME]' to object contents because you do not have permission to modify the object '[DEST_NAME]'.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="NoSaveBackToInvDisabled"
- type="notify">
- <tag>fail</tag>
-Cannot save '[OBJ_NAME]' back to inventory -- this operation has been disabled.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="NoCopyNoSelCopy"
- type="notify">
- <tag>fail</tag>
-You cannot copy your selection because you do not have permission to copy the object '[OBJ_NAME]'.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="NoTransNoSelCopy"
- type="notify">
- <tag>fail</tag>
-You cannot copy your selection because the object '[OBJ_NAME]' is not transferrable.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="NoTransNoCopy"
- type="notify">
- <tag>fail</tag>
-You cannot copy your selection because the object '[OBJ_NAME]' is not transferrable.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="NoPermsNoRemoval"
- type="notify">
- <tag>fail</tag>
-Removal of the object '[OBJ_NAME]' from the simulator is disallowed by the permissions system.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="NoModNoSaveSelection"
- type="notify">
- <tag>fail</tag>
-Cannot save your selection because you do not have permission to modify the object '[OBJ_NAME]'.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="NoCopyNoSaveSelection"
- type="notify">
- <tag>fail</tag>
-Cannot save your selection because the object '[OBJ_NAME]' is not copyable.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="NoModNoTaking"
- type="notify">
- <tag>fail</tag>
-You cannot take your selection because you do not have permission to modify the object '[OBJ_NAME]'.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="RezDestInternalError"
- type="notify">
- <tag>fail</tag>
-Internal Error: Unknown destination type.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="DeleteFailObjNotFound"
- type="notify">
- <tag>fail</tag>
-Delete failed because object not found
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="SorryCantEjectUser"
- type="notify">
- <tag>fail</tag>
-Sorry, can't eject that user.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="RegionSezNotAHome"
- type="notify">
- <tag>fail</tag>
-This region does not allow you to set your home location here.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="HomeLocationLimits"
- type="notify">
- <tag>fail</tag>
-You can only set your 'Home Location' on your land or at a mainland Infohub.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="HomePositionSet"
- type="notify">
- <tag>fail</tag>
-Home position set.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="AvatarEjected"
- type="notify">
- <tag>fail</tag>
-Avatar ejected.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="AvatarEjectFailed"
- type="notify">
- <tag>fail</tag>
-Eject failed because you don't have admin permission for that parcel.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="CantMoveObjectParcelFull"
- type="notify">
- <tag>fail</tag>
-Can't move object '[OBJECT_NAME]' to
-[OBJ_POSITION] in region [REGION_NAME] because the parcel is full.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="CantMoveObjectParcelPerms"
- type="notify">
- <tag>fail</tag>
-Can't move object '[OBJECT_NAME]' to
-[OBJ_POSITION] in region [REGION_NAME] because your objects are not allowed on this parcel.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="CantMoveObjectParcelResources"
- type="notify">
- <tag>fail</tag>
-Can't move object '[OBJECT_NAME]' to
-[OBJ_POSITION] in region [REGION_NAME] because there are not enough resources for this object on this parcel.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="CantMoveObjectRegionVersion"
- type="notify">
- <tag>fail</tag>
-Can't move object '[OBJECT_NAME]' to
-[OBJ_POSITION] in region [REGION_NAME] because the other region is running an older version which does not support receiving this object via region crossing.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="CantMoveObjectNavMesh"
- type="notify">
- <tag>fail</tag>
-Can't move object '[OBJECT_NAME]' to
-[OBJ_POSITION] in region [REGION_NAME] because you cannot modify the navmesh across region boundaries.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="CantMoveObjectWTF"
- type="notify">
- <tag>fail</tag>
-Can't move object '[OBJECT_NAME]' to
-[OBJ_POSITION] in region [REGION_NAME] because of an unknown reason. ([FAILURE_TYPE])
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="NoPermModifyObject"
- type="notify">
- <tag>fail</tag>
-You don't have permission to modify that object
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="CantEnablePhysObjContributesToNav"
- type="notify">
- <tag>fail</tag>
-Can't enable physics for an object that contributes to the navmesh.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="CantEnablePhysKeyframedObj"
- type="notify">
- <tag>fail</tag>
-Can't enable physics for keyframed objects.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="CantEnablePhysNotEnoughLandResources"
- type="notify">
- <tag>fail</tag>
-Can't enable physics for object -- insufficient land resources.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="CantEnablePhysCostTooGreat"
- persist="true"
- type="notify">
- <tag>fail</tag>
-Can't enable physics for object with physics resource cost greater than [MAX_OBJECTS]
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="PhantomWithConcavePiece"
- type="notify">
- <tag>fail</tag>
-This object cannot have a concave piece because it is phantom and contributes to the navmesh.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="UnableAddItem"
- type="notify">
- <tag>fail</tag>
-Unable to add item!
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="UnableEditItem"
- type="notify">
- <tag>fail</tag>
-Unable to edit this!
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="NoPermToEdit"
- type="notify">
- <tag>fail</tag>
-Not permitted to edit this.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="NoPermToCopyInventory"
- type="notify">
- <tag>fail</tag>
-Not permitted to copy that inventory.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="CantSaveItemDoesntExist"
- type="notify">
- <tag>fail</tag>
-Cannot save to object contents: Item no longer exists.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="CantSaveItemAlreadyExists"
- type="notify">
- <tag>fail</tag>
-Cannot save to object contents: Item with that name already exists in inventory
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="CantSaveModifyAttachment"
- type="notify">
- <tag>fail</tag>
-Cannot save to object contents: This would modify the attachment permissions.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="NoPermToEdit"
- type="notify">
- <tag>fail</tag>
-Not permitted to edit this!
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="TooManyScripts"
- type="notify">
- <tag>fail</tag>
-Too many scripts.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="UnableAddScript"
- type="notify">
- <tag>fail</tag>
-Unable to add script!
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="AssetServerTimeoutObjReturn"
- type="notify">
- <tag>fail</tag>
-Asset server didn't respond in a timely fashion. Object returned to sim.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="RegionDisablePhysicsShapes"
- type="notify">
- <tag>fail</tag>
-This region does not have physics shapes enabled.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="NoModNavmeshAcrossRegions"
- type="notify">
- <tag>fail</tag>
-You cannot modify the navmesh across region boundaries.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="NoPermModifyObject"
- type="notify">
- <tag>fail</tag>
-You don't have permission to modify that object.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="CantEnablePhysObjContributesToNav"
- type="notify">
- <tag>fail</tag>
-Can't enable physics for an object that contributes to the navmesh.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="CantEnablePhysKeyframedObj"
- type="notify">
- <tag>fail</tag>
-Can't enable physics for keyframed objects.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="CantEnablePhysNotEnoughLandResources"
- type="notify">
- <tag>fail</tag>
-Can't enable physics for object -- insufficient land resources.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="CantEnablePhysCostTooGreat"
- persist="true"
- type="notify">
- <tag>fail</tag>
-Can't enable physics for object with physics resource cost greater than [MAX_OBJECTS]
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="NoSetPhysicsPropertiesOnObjectType"
- type="notify">
- <tag>fail</tag>
-Cannot set physics properties on that object type.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="NoSetRootPrimWithNoShape"
- type="notify">
- <tag>fail</tag>
-Cannot set root prim to have no shape.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="NoRegionSupportPhysMats"
- type="notify">
- <tag>fail</tag>
-This region does not have physics materials enabled.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="OnlyRootPrimPhysMats"
- type="notify">
- <tag>fail</tag>
-Only root prims may have their physics materials adjusted.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="NoSupportCharacterPhysMats"
- type="notify">
- <tag>fail</tag>
-Setting physics materials on characters is not yet supported.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="InvalidPhysMatProperty"
- type="notify">
- <tag>fail</tag>
-One or more of the specified physics material properties was invalid.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="NoPermsAlterStitchingMeshObj"
- type="notify">
- <tag>fail</tag>
-You may not alter the stitching type of a mesh object.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="NoPermsAlterShapeMeshObj"
- type="notify">
- <tag>fail</tag>
-You may not alter the shape of a mesh object
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="FullRegionCantEnter"
- type="notify">
- <tag>fail</tag>
-You can't enter this region because \nthe region is full.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="LinkFailedOwnersDiffer"
- type="notify">
- <tag>fail</tag>
-Link failed -- owners differ
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="LinkFailedNoModNavmeshAcrossRegions"
- type="notify">
- <tag>fail</tag>
-Link failed -- cannot modify the navmesh across region boundaries.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="LinkFailedNoPermToEdit"
- type="notify">
- <tag>fail</tag>
-Link failed because you do not have edit permission.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="LinkFailedTooManyPrims"
- type="notify">
- <tag>fail</tag>
-Link failed -- too many primitives
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="LinkFailedCantLinkNoCopyNoTrans"
- type="notify">
- <tag>fail</tag>
-Link failed -- cannot link no-copy with no-transfer
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="LinkFailedNothingLinkable"
- type="notify">
- <tag>fail</tag>
-Link failed -- nothing linkable.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="LinkFailedTooManyPathfindingChars"
- type="notify">
- <tag>fail</tag>
-Link failed -- too many pathfinding characters
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="LinkFailedInsufficientLand"
- type="notify">
- <tag>fail</tag>
-Link failed -- insufficient land resources
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="LinkFailedTooMuchPhysics"
- type="notify">
- <tag>fail</tag>
-Object uses too many physics resources -- its dynamics have been disabled.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="TeleportedHomeByObjectOnParcel"
- persist="true"
- type="notify">
- <tag>fail</tag>
-You have been teleported home by the object '[OBJECT_NAME]' on the parcel '[PARCEL_NAME]'
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="TeleportedHomeByObject"
- persist="true"
- type="notify">
- <tag>fail</tag>
-You have been teleported home by the object '[OBJECT_NAME]'
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="TeleportedByAttachment"
- type="notify">
- <tag>fail</tag>
-You have been teleported by an attachment on [ITEM_ID]
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="TeleportedByObjectOnParcel"
- type="notify">
- <tag>fail</tag>
-You have been teleported by the object '[OBJECT_NAME]' on the parcel '[PARCEL_NAME]'
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="TeleportedByObjectOwnedBy"
- type="notify">
- <tag>fail</tag>
-You have been teleported by the object '[OBJECT_NAME]' owned by [OWNER_ID]
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="TeleportedByObjectUnknownUser"
- type="notify">
- <tag>fail</tag>
-You have been teleported by the object '[OBJECT_NAME]' owned by an unknown user.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="CantCreateObjectRegionFull"
- type="notify">
- <tag>fail</tag>
-Unable to create requested object. The region is full.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="CantAttackMultipleObjOneSpot"
- type="notify">
- <tag>fail</tag>
-You can't attach multiple objects to one spot.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="CantCreateMultipleObjAtLoc"
- type="notify">
- <tag>fail</tag>
-You can't create multiple objects here.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="UnableToCreateObjTimeOut"
- type="notify">
- <tag>fail</tag>
-Unable to create requested object. Object is missing from database.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="UnableToCreateObjUnknown"
- type="notify">
- <tag>fail</tag>
-Unable to create requested object. The request timed out. Please try again.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="UnableToCreateObjMissingFromDB"
- type="notify">
- <tag>fail</tag>
-Unable to create requested object. Please try again.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="RezFailureTookTooLong"
- type="notify">
- <tag>fail</tag>
-Rez failed, requested object took too long to load.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="FailedToPlaceObjAtLoc"
- type="notify">
- <tag>fail</tag>
-Failed to place object at specified location. Please try again.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="CantCreatePlantsOnLand"
- type="notify">
- <tag>fail</tag>
-You cannot create plants on this land.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="CantRestoreObjectNoWorldPos"
- type="notify">
- <tag>fail</tag>
-Cannot restore object. No world position found.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="CantRezObjectInvalidMeshData"
- type="notify">
- <tag>fail</tag>
-Unable to rez object because its mesh data is invalid.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="CantRezObjectTooManyScripts"
- type="notify">
- <tag>fail</tag>
-Unable to rez object because there are already too many scripts in this region.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="CantCreateObjectNoAccess"
- type="notify">
- <tag>fail</tag>
-Your access privileges don't allow you to create objects there.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="CantCreateObject"
- type="notify">
- <tag>fail</tag>
-You are not currently allowed to create objects.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="InvalidObjectParams"
- type="notify">
- <tag>fail</tag>
-Invalid object parameters
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="CantDuplicateObjectNoAcess"
- type="notify">
- <tag>fail</tag>
-Your access privileges don't allow you to duplicate objects here.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="CantChangeShape"
- type="notify">
- <tag>fail</tag>
-You are not allowed to change this shape.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="NoAccessToClaimObjects"
- type="notify">
- <tag>fail</tag>
-Your access privileges don't allow you to claim objects here.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="DeedFailedNoPermToDeedForGroup"
- type="notify">
- <tag>fail</tag>
-Deed failed because you do not have permission to deed objects for your group.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="NoPrivsToBuyObject"
- type="notify">
- <tag>fail</tag>
-Your access privileges don't allow you to buy objects here.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="CantAttachObjectAvatarSittingOnIt"
- type="notify">
- <tag>fail</tag>
-Cannot attach object because an avatar is sitting on it.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="WhyAreYouTryingToWearShrubbery"
- type="notify">
- <tag>fail</tag>
-Trees and grasses cannot be worn as attachments.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="CantAttachGroupOwnedObjs"
- type="notify">
- <tag>fail</tag>
-Cannot attach group-owned objects.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="CantAttachObjectsNotOwned"
- type="notify">
- <tag>fail</tag>
-Cannot attach objects that you don't own.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="CantAttachNavmeshObjects"
- type="notify">
- <tag>fail</tag>
-Cannot attach objects that contribute to navmesh.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="CantAttachObjectNoMovePermissions"
- type="notify">
- <tag>fail</tag>
-Cannot attach object because you do not have permission to move it.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="CantAttachNotEnoughScriptResources"
- type="notify">
- <tag>fail</tag>
-Not enough script resources available to attach object!
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="CantDropItemTrialUser"
- type="notify">
- <tag>fail</tag>
-You can't drop objects here; try the Free Trial area.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="CantDropMeshAttachment"
- type="notify">
- <tag>fail</tag>
-You can't drop mesh attachments. Detach to inventory and then rez in world.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="CantDropAttachmentNoPermission"
- type="notify">
- <tag>fail</tag>
-Failed to drop attachment: you don't have permission to drop there.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="CantDropAttachmentInsufficientLandResources"
- type="notify">
- <tag>fail</tag>
-Failed to drop attachment: insufficient available land resource.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="CantDropAttachmentInsufficientResources"
- type="notify">
- <tag>fail</tag>
-Failed to drop attachments: insufficient available resources.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="CantDropObjectFullParcel"
- type="notify">
- <tag>fail</tag>
-Cannot drop object here. Parcel is full.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="CantTouchObjectBannedFromParcel"
- type="notify">
- <tag>fail</tag>
-Can't touch/grab this object because you are banned from the land parcel.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="PlzNarrowDeleteParams"
- type="notify">
- <tag>fail</tag>
-Please narrow your delete parameters.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="UnableToUploadAsset"
- type="notify">
- <tag>fail</tag>
-Unable to upload asset.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="CantTeleportCouldNotFindUser"
- type="notify">
- <tag>fail</tag>
-Could not find user to teleport home
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="GodlikeRequestFailed"
- type="notify">
- <tag>fail</tag>
-godlike request failed
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="GenericRequestFailed"
- type="notify">
- <tag>fail</tag>
-generic request failed
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="CantUploadPostcard"
- type="notify">
- <tag>fail</tag>
-Unable to upload postcard. Try again later.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="CantFetchInventoryForGroupNotice"
- type="notify">
- <tag>fail</tag>
-Unable to fetch inventory details for the group notice.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="CantSendGroupNoticeNotPermitted"
- type="notify">
- <tag>fail</tag>
-Unable to send group notice -- not permitted.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="CantSendGroupNoticeCantConstructInventory"
- type="notify">
- <tag>fail</tag>
-Unable to send group notice -- could not construct inventory.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="CantParceInventoryInNotice"
- type="notify">
- <tag>fail</tag>
-Unable to parse inventory in notice.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="TerrainUploadFailed"
- type="notify">
- <tag>fail</tag>
-Terrain upload failed.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="TerrainFileWritten"
- type="notify">
- <tag>fail</tag>
-Terrain file written.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="TerrainFileWrittenStartingDownload"
- type="notify">
- <tag>fail</tag>
-Terrain file written, starting download...
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="TerrainBaked"
- type="notify">
- <tag>fail</tag>
-Terrain baked.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="TenObjectsDisabledPlzRefresh"
- type="notify">
- <tag>fail</tag>
-Only the first 10 selected objects have been disabled. Refresh and make additional selections if required.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="UpdateViewerBuyParcel"
- type="notify">
- <tag>fail</tag>
-You need to update your viewer to buy this parcel.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="LandBuyAccessBlocked"
- type="notify">
- <tag>fail</tag>
-You can't buy this land due to your maturity Rating. You may need to validate your age and/or install the latest Viewer. Please go to the Knowledge Base for details on accessing areas with this maturity Rating.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="CantBuyParcelNotForSale"
- type="notify">
- <tag>fail</tag>
-Unable to buy, this parcel is not for sale.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="CantBuySalePriceOrLandAreaChanged"
- type="notify">
- <tag>fail</tag>
-Unable to buy, the sale price or land area has changed.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="CantBuyParcelNotAuthorized"
- type="notify">
- <tag>fail</tag>
-You are not the authorized buyer for this parcel.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="CantBuyParcelAwaitingPurchaseAuth"
- type="notify">
- <tag>fail</tag>
-You cannot purchase this parcel because it is already awaiting purchase aut
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="CantBuildOverflowParcel"
- type="notify">
- <tag>fail</tag>
-You cannot build objects here because doing so would overflow the parcel.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="SelectedMultipleOwnedLand"
- type="notify">
- <tag>fail</tag>
-You selected land with different owners. Please select a smaller area and try again.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="CantJoinTooFewLeasedParcels"
- type="notify">
- <tag>fail</tag>
-Not enough leased parcels in selection to join.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="CantDivideLandMultipleParcelsSelected"
- type="notify">
- <tag>fail</tag>
-Can't divide land.\nThere is more than one parcel selected.\nTry selecting a smaller piece of land.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="CantDivideLandCantFindParcel"
- type="notify">
- <tag>fail</tag>
-Can't divide land.\nCan't find the parcel.\nPlease report with Help -> Reprt Bug...
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="CantDivideLandWholeParcelSelected"
- type="notify">
- <tag>fail</tag>
-Can't divide land. Whole parcel is selected.\nTry selecting a smaller piece of land.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="LandHasBeenDivided"
- type="notify">
- <tag>fail</tag>
-Land has been divided.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="PassPurchased"
- type="notify">
- <tag>fail</tag>
-You purchased a pass.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="RegionDisallowsClassifieds"
- type="notify">
- <tag>fail</tag>
-Region does not allow classified advertisements.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="LandPassExpireSoon"
- type="notify">
- <tag>fail</tag>
-Your pass to this land is about to expire.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="CantSitNoSuitableSurface"
- type="notify">
- <tag>fail</tag>
-There is no suitable surface to sit on, try another spot.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="CantSitNoRoom"
- type="notify">
- <tag>fail</tag>
-No room to sit here, try another spot.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="AutopilotCanceled"
- type="notify">
- <tag>fail</tag>
-Autopilot canceled
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="ClaimObjectFailedNoPermission"
- type="notify">
- <tag>fail</tag>
-Claim object failed because you don't have permission
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="ClaimObjectFailedNoMoney"
- type="notify">
- <tag>fail</tag>
-Claim object failed because you don't have enough L$.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="CantDeedGroupLand"
- type="notify">
- <tag>fail</tag>
-Cannot deed group-owned land.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="BuyObjectFailedNoMoney"
- type="notify">
- <tag>fail</tag>
-Buy object failed because you don't have enough L$.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="BuyInventoryFailedNoMoney"
- type="notify">
- <tag>fail</tag>
-Buy inventory failed because you do not have enough L$
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="BuyPassFailedNoMoney"
- type="notify">
- <tag>fail</tag>
-You don't have enough L$ to buy a pass to this land.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="CantBuyPassTryAgain"
- type="notify">
- <tag>fail</tag>
-Unable to buy pass right now. Try again later.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="CantCreateObjectParcelFull"
- type="notify">
- <tag>fail</tag>
-Can't create object because \nthe parcel is full.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="FailedPlacingObject"
- type="notify">
- <tag>fail</tag>
-Failed to place object at specified location. Please try again.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="CantCreateLandmarkForEvent"
- type="notify">
- <tag>fail</tag>
-Unable to create landmark for event.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="GodBeatsFreeze"
- type="notify">
- <tag>fail</tag>
-Your godlike powers break the freeze!
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="SpecialPowersRequestFailedLogged"
- type="notify">
- <tag>fail</tag>
-Request for special powers failed. This request has been logged.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="ExpireExplanation"
- type="notify">
- <tag>fail</tag>
-The system is currently unable to process your request. The request timed out.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="DieExplanation"
- type="notify">
- <tag>fail</tag>
-The system is unable to process your request.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="AddPrimitiveFailure"
- type="notify">
- <tag>fail</tag>
-Insufficient funds to create primitve.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="RezObjectFailure"
- type="notify">
- <tag>fail</tag>
-Insufficient funds to create object.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="ResetHomePositionNotLegal"
- type="notify">
- <tag>fail</tag>
-Reset Home position since Home wasn't legal.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="CantInviteRegionFull"
- type="notify">
- <tag>fail</tag>
-You cannot currently invite anyone to your location because the region is full. Try again later.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="CantSetHomeAtRegion"
- type="notify">
- <tag>fail</tag>
-This region does not allow you to set your home location here.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="ListValidHomeLocations"
- type="notify">
- <tag>fail</tag>
-You can only set your 'Home Location' on your land or at a mainland Infohub.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="SetHomePosition"
- type="notify">
- <tag>fail</tag>
-Home position set.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="CantDerezInventoryError"
- type="notify">
- <tag>fail</tag>
-Cannot derez object due to inventory fault.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="CantCreateRequestedInv"
- type="notify">
- <tag>fail</tag>
-Cannot create requested inventory.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="CantCreateRequestedInvFolder"
- type="notify">
- <tag>fail</tag>
-Cannot create requested inventory folder.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="CantCreateInventory"
- type="notify">
- <tag>fail</tag>
-Cannot create that inventory.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="CantCreateLandmark"
- type="notify">
- <tag>fail</tag>
-Cannot create landmark.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="CantCreateOutfit"
- type="notify">
- <tag>fail</tag>
-Cannot create outfit right now. Try again in a minute.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="InventoryNotForSale"
- type="notify">
- <tag>fail</tag>
-Inventory is not for sale.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="CantFindInvItem"
- type="notify">
- <tag>fail</tag>
-Unable to find inventory item.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="CantFindObject"
- type="notify">
- <tag>fail</tag>
-Unable to find object.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="CantTransfterMoneyRegionDisabled"
- type="notify">
- <tag>fail</tag>
-Money transfers to objects are currently disabled in this region.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="CantPayNoAgent"
- type="notify">
- <tag>fail</tag>
-Could not figure out who to pay.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="CantDonateToPublicObjects"
- type="notify">
- <tag>fail</tag>
-You cannot give L$ to public objects.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="InventoryCreationInWorldObjectFailed"
- type="notify">
- <tag>fail</tag>
-Inventory creation on in-world object failed.
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="UserBalanceOrLandUsageError"
- type="notify">
- <tag>fail</tag>
-An internal error prevented us from properly updating your viewer. The L$ balance or parcel holdings displayed in your viewer may not reflect your actual balance on the servers.
- </notification>
-
-
</notifications>
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml
index 849f3ef73d..cd243d40a4 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml
@@ -147,12 +147,12 @@
height="12"
layout="topleft"
left_delta="87"
- name="ShadersPrefText3"
+ name="ShadersPrefText2"
top_delta="0"
width="80">
Mid
</text>
- <text
+ <text
type="string"
length="1"
follows="left|top"
@@ -163,8 +163,8 @@
name="ShadersPrefText3"
top_delta="0"
width="80">
- High
- </text>
+ High
+ </text>
<text
type="string"
length="1"
diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py
index 7a41520429..69248e26bc 100644
--- a/indra/newview/viewer_manifest.py
+++ b/indra/newview/viewer_manifest.py
@@ -968,7 +968,6 @@ class LinuxManifest(ViewerManifest):
if 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.path("../linux_updater/linux-updater", "linux-updater.bin")
self.path2basename("../llplugin/slplugin", "SLPlugin")
self.path2basename("../viewer_components/updater/scripts/linux", "update_install")
self.end_prefix("bin")
@@ -1017,9 +1016,7 @@ class LinuxManifest(ViewerManifest):
else:
installer_name += '_' + self.channel_oneword().upper()
- if self.args['buildtype'].lower() == 'release' and self.is_packaging_viewer():
- print "* Going strip-crazy on the packaged binaries, since this is a RELEASE build"
- self.run_command("find %(d)r/bin %(d)r/lib -type f \\! -name update_install | xargs --no-run-if-empty strip -S" % {'d': self.get_dst_prefix()} ) # makes some small assumptions about our packaged dir structure
+ self.strip_binaries()
# Fix access permissions
self.run_command("""
@@ -1054,6 +1051,11 @@ class LinuxManifest(ViewerManifest):
'dst': self.get_dst_prefix(),
'inst': self.build_path_of(installer_name)})
+ def strip_binaries(self):
+ if self.args['buildtype'].lower() == 'release' and self.is_packaging_viewer():
+ print "* Going strip-crazy on the packaged binaries, since this is a RELEASE build"
+ self.run_command(r"find %(d)r/bin %(d)r/lib -type f \! -name update_install | xargs --no-run-if-empty strip -S" % {'d': self.get_dst_prefix()} ) # makes some small assumptions about our packaged dir structure
+
class Linux_i686Manifest(LinuxManifest):
def construct(self):
super(Linux_i686Manifest, self).construct()
@@ -1139,9 +1141,7 @@ class Linux_i686Manifest(LinuxManifest):
self.path("libvivoxplatform.so")
self.end_prefix("lib")
- if self.args['buildtype'].lower() == 'release' and self.is_packaging_viewer():
- print "* Going strip-crazy on the packaged binaries, since this is a RELEASE build"
- self.run_command("find %(d)r/bin %(d)r/lib -type f \\! -name update_install | xargs --no-run-if-empty strip -S" % {'d': self.get_dst_prefix()} ) # makes some small assumptions about our packaged dir structure
+ self.strip_binaries()
class Linux_x86_64Manifest(LinuxManifest):
diff --git a/indra/viewer_components/updater/scripts/linux/update_install b/indra/viewer_components/updater/scripts/linux/update_install
index e0505a9f72..a9df9042fd 100644
--- a/indra/viewer_components/updater/scripts/linux/update_install
+++ b/indra/viewer_components/updater/scripts/linux/update_install
@@ -1,10 +1,217 @@
#! /bin/bash
-INSTALL_DIR=$(cd "$(dirname "$0")/.." ; pwd)
-export LD_LIBRARY_PATH="$INSTALL_DIR/lib"
-bin/linux-updater.bin --file "$1" --dest "$INSTALL_DIR" --name "Second Life Viewer" --stringsdir "$INSTALL_DIR/skins/default/xui/en" --stringsfile "strings.xml"
-if [ $? -ne 0 ]
- then echo $3 >> "$2"
+# @file update_install
+# @author Nat Goodspeed
+# @date 2013-01-09
+# @brief Update the containing Second Life application bundle to the version in
+# the specified tarball.
+#
+# This bash implementation is derived from the previous linux-updater.bin
+# application.
+#
+# $LicenseInfo:firstyear=2013&license=viewerlgpl$
+# Copyright (c) 2013, Linden Research, Inc.
+# $/LicenseInfo$
+
+# ****************************************************************************
+# script parameters
+# ****************************************************************************
+tarball="$1" # the file to install
+markerfile="$2" # create this file on failure
+mandatory="$3" # what to write to markerfile on failure
+
+# ****************************************************************************
+# helper functions
+# ****************************************************************************
+# empty array
+cleanups=()
+
+# add a cleanup action to execute on exit
+function cleanup {
+ # wacky bash syntax for appending to array
+ cleanups[${#cleanups[*]}]="$*"
+}
+
+# called implicitly on exit
+function onexit {
+ for action in "${cleanups[@]}"
+ do # don't quote, support actions consisting of multiple words
+ $action
+ done
+}
+trap 'onexit' EXIT
+
+# write to log file
+function log {
+ # our log file will be open as stderr -- but until we set up that
+ # redirection, logging to stderr is better than nothing
+ echo "$*" 1>&2
+}
+
+# We display status by leaving one background xmessage process running. This
+# is the pid of that process.
+statuspid=""
+
+function clear_message {
+ [ -n "$statuspid" ] && kill $statuspid
+ statuspid=""
+}
+
+# make sure we remove any message box we might have put up
+cleanup clear_message
+
+# can we use zenity, or must we fall back to xmessage?
+zenpath="$(which zenity)"
+if [ -n "$zenpath" ]
+then # zenity on PATH and is executable
+ # display a message box and continue
+ function status {
+ # clear any previous message
+ clear_message
+ # put up a new zenity box and capture its pid
+ "$zenpath" --info --title "Second Life Viewer Updater" \
+ --width=320 --height=120 --text="$*" &
+ statuspid=$!
+ }
+
+ # display an error box and wait for user
+ function errorbox {
+ "$zenpath" --error --title "Second Life Viewer Updater" \
+ --width=320 --height=120 --text="$*"
+ }
+
+else # no zenity, use xmessage instead
+ # display a message box and continue
+ function status {
+ # clear any previous message
+ clear_message
+ # put up a new xmessage and capture its pid
+ xmessage -buttons OK:2 -center "$*" &
+ statuspid=$!
+ }
+
+ # display an error box and wait for user
+ function errorbox {
+ xmessage -buttons OK:2 -center "$*"
+ }
+fi
+
+# display an error box and terminate
+function fail {
+ # Log the message
+ log "$@"
+ # tell subsequent viewer things went south
+ echo "$mandatory" > "$markerfile"
+ # add boilerplate
+ errorbox "An error occurred while updating Second Life:
+$*
+Please download the latest viewer from www.secondlife.com."
+ exit 1
+}
+
+# Find a graphical sudo program and define mysudo function. On error, $? is
+# nonzero; output is in $err instead of being written to stdout/stderr.
+gksudo="$(which gksudo)"
+kdesu="$(which kdesu)"
+if [ -n "$gksudo" ]
+then function mysudo {
+ # gksudo allows you to specify description
+ err="$("$gksudo" --description "Second Life Viewer Updater" "$@" 2>&1)"
+ }
+elif [ -n "$kdesu" ]
+then function mysudo {
+ err="$("$kdesu" "$@" 2>&1)"
+ }
+else # couldn't find either one, just try it anyway
+ function mysudo {
+ err="$("$@" 2>&1)"
+ }
fi
-rm -f "$1"
+# Move directories, using mysudo if we think it necessary. On error, $? is
+# nonzero; output is in $err instead of being written to stdout/stderr.
+function sudo_mv {
+ # If we have write permission to both parent directories, shouldn't need
+ # sudo.
+ if [ -w "$(dirname "$1")" -a -w "$(dirname "$2")" ]
+ then err="$(mv "$@" 2>&1)"
+ else # use available sudo program; mysudo sets $? and $err
+ mysudo mv "$@"
+ fi
+}
+
+# ****************************************************************************
+# main script logic
+# ****************************************************************************
+mydir="$(dirname "$0")"
+# We happen to know that the viewer specifies a marker-file pathname within
+# the logs directory.
+logsdir="$(dirname "$markerfile")"
+logname="$logsdir/updater.log"
+
+# move aside old updater.log; we're about to create a new one
+[ -f "$logname" ] && mv "$logname" "$logname.old"
+
+# Set up redirections for this script such that stderr is logged. (But first
+# move the previous stderr to file descriptor 3.)
+exec 3>&2- 2> "$logname"
+
+# Rather than setting up a special pipeline to timestamp every line of stderr,
+# produce header lines into log file indicating timestamp and the arguments
+# with which we were invoked.
+date 1>&2
+log "$0 $*"
+
+# Log every command we execute, along with any stderr it might produce
+set -x
+
+status 'Installing Second Life...'
+
+# Creating tempdir under /tmp means it's possible that tempdir is on a
+# different filesystem than INSTALL_DIR. One is tempted to create tempdir on a
+# path derived from `dirname INSTALL_DIR` -- but it seems modern 'mv' can
+# handle moving across filesystems??
+tempdir="$(mktemp -d)"
+tempinstall="$tempdir/install"
+# capture the actual error message, if any
+err="$(mkdir -p "$tempinstall" 2>&1)" || fail "$err"
+cleanup rm -rf "$tempdir"
+
+# If we already knew the name of the tarball's top-level directory, we could
+# just move that when all was said and done. Since we don't, untarring to the
+# 'install' subdir with --strip 1 effectively renames that top-level
+# directory.
+# untar failures tend to be voluminous -- don't even try to capture, just log
+tar --strip 1 -xjf "$tarball" -C "$tempinstall" || fail "Untar command failed"
+
+INSTALL_DIR="$(cd "$mydir/.." ; pwd)"
+
+# Considering we're launched from a subdirectory of INSTALL_DIR, would be
+# surprising if it did NOT already exist...
+if [ -e "$INSTALL_DIR" ]
+then backup="$INSTALL_DIR.backup"
+ backupn=1
+ while [ -e "$backup" ]
+ do backup="$INSTALL_DIR.backup.$backupn"
+ ((backupn += 1))
+ done
+ # on error, fail with actual error message from sudo_mv: permissions,
+ # cross-filesystem mv, ...?
+ sudo_mv "$INSTALL_DIR" "$backup" || fail "$err"
+fi
+# We unpacked the tarball into tempinstall. Move that.
+if ! sudo_mv "$tempinstall" "$INSTALL_DIR"
+then # If we failed to move the temp install to INSTALL_DIR, try to restore
+ # INSTALL_DIR from backup. Save $err because next sudo_mv will trash it!
+ realerr="$err"
+ sudo_mv "$backup" "$INSTALL_DIR"
+ fail "$realerr"
+fi
+
+# Removing the tarball here, rather than with a 'cleanup' action, means we
+# only remove it if we succeeded.
+rm -f "$tarball"
+
+# Launch the updated viewer. Restore original stderr from file descriptor 3,
+# though -- otherwise updater.log gets cluttered with the viewer log!
+"$INSTALL_DIR/secondlife" 2>&3- &