diff options
author | Nyx Linden <nyx@lindenlab.com> | 2013-02-14 13:42:09 -0500 |
---|---|---|
committer | Nyx Linden <nyx@lindenlab.com> | 2013-02-14 13:42:09 -0500 |
commit | e8a28a8e217b724c08338876b1197d17ff240824 (patch) | |
tree | 597d2b11e2471fd8862f5b5e4781de01ea3528a8 /indra | |
parent | 705a23ac0d80da44e61b0b78515dca0768909b32 (diff) | |
parent | c99e206374f6afdcc038a97934314dec1a742b2e (diff) |
merge
Diffstat (limited to 'indra')
-rwxr-xr-x[-rw-r--r--] | indra/llprimitive/llprimitive.cpp | 1 | ||||
-rw-r--r-- | indra/media_plugins/webkit/windows_volume_catcher.cpp | 2 | ||||
-rw-r--r-- | indra/newview/CMakeLists.txt | 1 | ||||
-rwxr-xr-x | indra/newview/llagent.cpp | 17 | ||||
-rwxr-xr-x | indra/newview/llagentwearables.cpp | 1 | ||||
-rwxr-xr-x | indra/newview/llappearancemgr.cpp | 1 | ||||
-rw-r--r-- | indra/newview/lldrawable.cpp | 10 | ||||
-rwxr-xr-x | indra/newview/llmeshrepository.cpp | 33 | ||||
-rw-r--r-- | indra/newview/llpaneloutfitedit.cpp | 14 | ||||
-rw-r--r-- | indra/newview/llviewerparcelmgr.cpp | 11 | ||||
-rwxr-xr-x | indra/newview/llviewerstats.cpp | 2 | ||||
-rwxr-xr-x | indra/newview/llvoavatar.cpp | 77 | ||||
-rwxr-xr-x | indra/newview/llvoavatar.h | 20 | ||||
-rwxr-xr-x | indra/newview/llvoavatarself.cpp | 87 | ||||
-rwxr-xr-x | indra/newview/llvoavatarself.h | 5 | ||||
-rw-r--r-- | indra/newview/skins/default/xui/en/notifications.xml | 1738 | ||||
-rw-r--r-- | indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml | 8 | ||||
-rw-r--r-- | indra/newview/viewer_manifest.py | 14 | ||||
-rw-r--r-- | indra/viewer_components/updater/scripts/linux/update_install | 219 |
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- & |