summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--indra/newview/llagentwearables.cpp12
-rw-r--r--indra/newview/lltexturecache.cpp275
-rw-r--r--indra/newview/lltexturecache.h10
-rw-r--r--indra/newview/llviewertexture.cpp11
-rw-r--r--indra/newview/llwearablelist.h6
-rw-r--r--indra/newview/llworldmapview.cpp6
-rw-r--r--indra/newview/skins/default/xui/de/floater_about_land.xml3
-rw-r--r--indra/newview/skins/default/xui/de/panel_edit_pick.xml5
-rw-r--r--indra/newview/skins/default/xui/de/panel_main_inventory.xml30
-rw-r--r--indra/newview/skins/default/xui/de/panel_nearby_media.xml9
-rw-r--r--indra/newview/skins/default/xui/de/panel_preferences_advanced.xml5
-rw-r--r--indra/newview/skins/default/xui/de/panel_preferences_chat.xml6
-rw-r--r--indra/newview/skins/default/xui/de/strings.xml112
-rw-r--r--indra/newview/skins/default/xui/fr/panel_edit_profile.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/sidepanel_task_info.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/strings.xml4
16 files changed, 363 insertions, 135 deletions
diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp
index ea10917901..65503d4998 100644
--- a/indra/newview/llagentwearables.cpp
+++ b/indra/newview/llagentwearables.cpp
@@ -1702,6 +1702,16 @@ void LLAgentWearables::setWearableOutfit(const LLInventoryItem::item_array_t& it
LLWearable* old_wearable = getWearable(type, 0);
if (old_wearable)
{
+ // Special case where you're putting on a wearable that has the same assetID
+ // as the previous (e.g. wear a shirt then wear a copy of that shirt) since in this
+ // case old_wearable == new_wearable.
+ if (old_wearable == new_wearable)
+ {
+ old_wearable->setLabelUpdated();
+ new_wearable->setName(new_item->getName());
+ new_wearable->setItemID(new_item->getUUID());
+ }
+
const LLUUID& old_item_id = getWearableItemID(type, 0);
if ((old_wearable->getAssetID() == new_wearable->getAssetID()) &&
(old_item_id == new_item->getUUID()))
@@ -1717,7 +1727,7 @@ void LLAgentWearables::setWearableOutfit(const LLInventoryItem::item_array_t& it
continue;
}
}
-
+
new_wearable->setItemID(new_item->getUUID());
setWearable(type,0,new_wearable);
}
diff --git a/indra/newview/lltexturecache.cpp b/indra/newview/lltexturecache.cpp
index 49770030c6..54ac3850fd 100644
--- a/indra/newview/lltexturecache.cpp
+++ b/indra/newview/lltexturecache.cpp
@@ -550,7 +550,7 @@ bool LLTextureCacheRemoteWorker::doWrite()
S32 cur_imagesize = 0;
// Checks if this image is already in the entry list
idx = mCache->getHeaderCacheEntry(mID, cur_imagesize);
- if (idx >= 0 && (cur_imagesize >= 0))
+ if (idx >= 0 && (cur_imagesize > 0))
{
alreadyCached = true; // already there and non empty
}
@@ -846,9 +846,8 @@ bool LLTextureCache::updateTextureEntryList(const LLUUID& id, S32 bodysize)
S32 idx = openAndReadEntry(id, entry, false);
if (idx < 0)
{
- llwarns << "Failed to open entry: " << id << llendl;
- removeHeaderCacheEntry(id);
- LLAPRFile::remove(getTextureFileName(id), getLocalAPRFilePool());
+ llwarns << "Failed to open entry: " << id << llendl;
+ removeCachedTexture(id) ;
return false;
}
else if (oldbodysize != entry.mBodySize)
@@ -857,11 +856,7 @@ bool LLTextureCache::updateTextureEntryList(const LLUUID& id, S32 bodysize)
llerrs << "Entry mismatch in mTextureSizeMap / mHeaderIDMap"
<< " idx=" << idx << " oldsize=" << oldbodysize << " entrysize=" << entry.mBodySize << llendl;
}
- entry.mBodySize = bodysize;
- writeEntryAndClose(idx, entry);
-
- mTexturesSizeTotal -= oldbodysize;
- mTexturesSizeTotal += bodysize;
+ updateEntry(idx, entry, entry.mImageSize, bodysize);
if (mTexturesSizeTotal > sCacheMaxTexturesSize)
{
@@ -1002,7 +997,10 @@ LLAPRFile* LLTextureCache::openHeaderEntriesFile(bool readonly, S32 offset)
llassert_always(mHeaderAPRFile == NULL);
apr_int32_t flags = readonly ? APR_READ|APR_BINARY : APR_READ|APR_WRITE|APR_BINARY;
mHeaderAPRFile = new LLAPRFile(mHeaderEntriesFileName, flags, getLocalAPRFilePool());
- mHeaderAPRFile->seek(APR_SET, offset);
+ if(offset > 0)
+ {
+ mHeaderAPRFile->seek(APR_SET, offset);
+ }
return mHeaderAPRFile;
}
@@ -1022,6 +1020,12 @@ void LLTextureCache::readEntriesHeader()
LLAPRFile::readEx(mHeaderEntriesFileName, (U8*)&mHeaderEntriesInfo, 0, sizeof(EntriesInfo),
getLocalAPRFilePool());
}
+ else //create an empty entries header.
+ {
+ mHeaderEntriesInfo.mVersion = sHeaderCacheVersion ;
+ mHeaderEntriesInfo.mEntries = 0 ;
+ writeEntriesHeader() ;
+ }
}
void LLTextureCache::writeEntriesHeader()
@@ -1034,8 +1038,7 @@ void LLTextureCache::writeEntriesHeader()
}
}
-static S32 mHeaderEntriesMaxWriteIdx = 0;
-
+//mHeaderMutex is locked before calling this.
S32 LLTextureCache::openAndReadEntry(const LLUUID& id, Entry& entry, bool create)
{
S32 idx = -1;
@@ -1075,8 +1078,7 @@ S32 LLTextureCache::openAndReadEntry(const LLUUID& id, Entry& entry, bool create
if (iter3 != mHeaderIDMap.end() && iter3->second >= 0)
{
idx = iter3->second;
- mHeaderIDMap.erase(oldid);
- mTexturesSizeMap.erase(oldid);
+ removeCachedTexture(oldid) ;//remove the existing cached texture to release the entry index.
break;
}
}
@@ -1086,22 +1088,9 @@ S32 LLTextureCache::openAndReadEntry(const LLUUID& id, Entry& entry, bool create
}
if (idx >= 0)
{
- // Set the header index
- mHeaderIDMap[id] = idx;
- llassert_always(mTexturesSizeMap.erase(id) == 0);
- // Initialize the entry (will get written later)
- entry.init(id, time(NULL));
- // Update Header
- writeEntriesHeader();
-
- //the new entry, write immediately.
- // Write Entry
- S32 offset = sizeof(EntriesInfo) + idx * sizeof(Entry);
- LLAPRFile* aprfile = openHeaderEntriesFile(false, offset);
- S32 bytes_written = aprfile->write((void*)&entry, (S32)sizeof(Entry));
- llassert_always(bytes_written == sizeof(Entry));
- mHeaderEntriesMaxWriteIdx = llmax(mHeaderEntriesMaxWriteIdx, idx);
- closeHeaderEntriesFile();
+ entry.mID = id ;
+ entry.mImageSize = -1 ; //mark it is a brand-new entry.
+ entry.mBodySize = 0 ;
}
}
}
@@ -1117,36 +1106,108 @@ S32 LLTextureCache::openAndReadEntry(const LLUUID& id, Entry& entry, bool create
}
else
{
- S32 offset = sizeof(EntriesInfo) + idx * sizeof(Entry);
- LLAPRFile* aprfile = openHeaderEntriesFile(true, offset);
- S32 bytes_read = aprfile->read((void*)&entry, (S32)sizeof(Entry));
- llassert_always(bytes_read == sizeof(Entry));
- closeHeaderEntriesFile();
+ readEntryFromHeaderImmediately(idx, entry) ;
}
- llassert_always(entry.mImageSize == 0 || entry.mImageSize == -1 || entry.mImageSize > entry.mBodySize);
+ llassert_always(entry.mImageSize > entry.mBodySize);
}
return idx;
}
-void LLTextureCache::writeEntryAndClose(S32 idx, Entry& entry)
+//mHeaderMutex is locked before calling this.
+void LLTextureCache::writeEntryToHeaderImmediately(S32 idx, Entry& entry, bool write_header)
+{
+ LLAPRFile* aprfile ;
+ S32 bytes_written ;
+ S32 offset = sizeof(EntriesInfo) + idx * sizeof(Entry);
+ if(write_header)
+ {
+ aprfile = openHeaderEntriesFile(false, 0);
+ bytes_written = aprfile->write((U8*)&mHeaderEntriesInfo, sizeof(EntriesInfo)) ;
+ llassert_always(bytes_written == sizeof(EntriesInfo));
+ mHeaderAPRFile->seek(APR_SET, offset);
+ }
+ else
+ {
+ aprfile = openHeaderEntriesFile(false, offset);
+ }
+ bytes_written = aprfile->write((void*)&entry, (S32)sizeof(Entry));
+ llassert_always(bytes_written == sizeof(Entry));
+ closeHeaderEntriesFile();
+ mUpdatedEntryMap.erase(idx) ;
+}
+
+//mHeaderMutex is locked before calling this.
+void LLTextureCache::readEntryFromHeaderImmediately(S32 idx, Entry& entry)
{
+ S32 offset = sizeof(EntriesInfo) + idx * sizeof(Entry);
+ LLAPRFile* aprfile = openHeaderEntriesFile(true, offset);
+ S32 bytes_read = aprfile->read((void*)&entry, (S32)sizeof(Entry));
+ llassert_always(bytes_read == sizeof(Entry));
+ closeHeaderEntriesFile();
+}
+
+//mHeaderMutex is locked before calling this.
+//update an existing entry time stamp, delay writing.
+void LLTextureCache::updateEntryTimeStamp(S32 idx, Entry& entry)
+{
+ static const U32 MAX_ENTRIES_WITHOUT_TIME_STAMP = (U32)LLTextureCache::sCacheMaxEntries * 0.75f ;
+
+ if(mHeaderEntriesInfo.mEntries < MAX_ENTRIES_WITHOUT_TIME_STAMP)
+ {
+ return ; //there are enough empty entry index space, no need to stamp time.
+ }
+
if (idx >= 0)
{
if (!mReadOnly)
{
- entry.mTime = time(NULL);
- llassert_always(entry.mImageSize == 0 || entry.mImageSize == -1 || entry.mImageSize > entry.mBodySize);
- if (entry.mBodySize > 0)
+ llassert_always(entry.mImageSize > entry.mBodySize);
+
+ entry.mTime = time(NULL);
+ mUpdatedEntryMap[idx] = entry ;
+ }
+ }
+}
+
+//mHeaderMutex is locked before calling this.
+//update an existing entry, write to header file immediately.
+void LLTextureCache::updateEntry(S32 idx, Entry& entry, S32 new_image_size, S32 new_body_size)
+{
+ llassert_always(new_image_size > -1) ;
+
+ if(new_image_size == entry.mImageSize && new_body_size == entry.mBodySize)
+ {
+ updateEntryTimeStamp(idx, entry) ; //nothing changed.
+ }
+ else if (idx >= 0)
+ {
+ if (!mReadOnly)
+ {
+ llassert_always(new_image_size > new_body_size) ;
+
+ bool update_header = false ;
+ if(entry.mImageSize < 0) //is a brand-new entry
{
- mTexturesSizeMap[entry.mID] = entry.mBodySize;
- }
- else if(mTexturesSizeMap.find(entry.mID) != mTexturesSizeMap.end() && mTexturesSizeMap[entry.mID] > 0)
+ mHeaderIDMap[entry.mID] = idx;
+ mTexturesSizeMap[entry.mID] = new_body_size ;
+ mTexturesSizeTotal += new_body_size ;
+
+ // Update Header
+ update_header = true ;
+ }
+ else if (entry.mBodySize != new_body_size)
{
- llerrs << "mTexturesSizeMap / mHeaderIDMap corrupted." << llendl ;
+ //already in mHeaderIDMap.
+ mTexturesSizeMap[entry.mID] = new_body_size ;
+ mTexturesSizeTotal -= entry.mBodySize ;
+ mTexturesSizeTotal += new_body_size ;
}
-// llinfos << "Updating TE: " << idx << ": " << id << " Size: " << entry.mBodySize << " Time: " << entry.mTime << llendl;
- mHeaderEntriesMaxWriteIdx = llmax(mHeaderEntriesMaxWriteIdx, idx);
- mUpdatedEntryMap[idx] = entry ;
+ entry.mTime = time(NULL);
+ entry.mImageSize = new_image_size ;
+ entry.mBodySize = new_body_size ;
+
+// llinfos << "Updating TE: " << idx << ": " << id << " Size: " << entry.mBodySize << " Time: " << entry.mTime << llendl;
+ writeEntryToHeaderImmediately(idx, entry, update_header) ;
}
}
}
@@ -1160,8 +1221,9 @@ U32 LLTextureCache::openAndReadEntries(std::vector<Entry>& entries)
mFreeList.clear();
mTexturesSizeTotal = 0;
- LLAPRFile* aprfile = openHeaderEntriesFile(false, (S32)sizeof(EntriesInfo));
+ LLAPRFile* aprfile = openHeaderEntriesFile(true, 0);
updatedHeaderEntriesFile() ;
+ aprfile->seek(APR_SET, (S32)sizeof(EntriesInfo));
for (U32 idx=0; idx<num_entries; idx++)
{
Entry entry;
@@ -1175,19 +1237,15 @@ U32 LLTextureCache::openAndReadEntries(std::vector<Entry>& entries)
}
entries.push_back(entry);
// llinfos << "ENTRY: " << entry.mTime << " TEX: " << entry.mID << " IDX: " << idx << " Size: " << entry.mImageSize << llendl;
- if (entry.mImageSize < 0)
+ if(entry.mImageSize > entry.mBodySize)
{
- mFreeList.insert(idx);
+ mHeaderIDMap[entry.mID] = idx;
+ mTexturesSizeMap[entry.mID] = entry.mBodySize;
+ mTexturesSizeTotal += entry.mBodySize;
}
else
{
- mHeaderIDMap[entry.mID] = idx;
- if (entry.mBodySize > 0)
- {
- mTexturesSizeMap[entry.mID] = entry.mBodySize;
- mTexturesSizeTotal += entry.mBodySize;
- }
- llassert_always(entry.mImageSize == 0 || entry.mImageSize > entry.mBodySize);
+ mFreeList.insert(idx);
}
}
closeHeaderEntriesFile();
@@ -1207,7 +1265,6 @@ void LLTextureCache::writeEntriesAndClose(const std::vector<Entry>& entries)
S32 bytes_written = aprfile->write((void*)(&entries[idx]), (S32)sizeof(Entry));
llassert_always(bytes_written == sizeof(Entry));
}
- mHeaderEntriesMaxWriteIdx = llmax(mHeaderEntriesMaxWriteIdx, num_entries-1);
closeHeaderEntriesFile();
}
}
@@ -1280,12 +1337,11 @@ void LLTextureCache::readHeaderCache()
U32 empty_entries = 0;
typedef std::pair<U32, S32> lru_data_t;
std::set<lru_data_t> lru;
- std::set<LLUUID> purge_list;
+ std::set<U32> purge_list;
for (U32 i=0; i<num_entries; i++)
{
Entry& entry = entries[i];
- const LLUUID& id = entry.mID;
- if (entry.mImageSize < 0)
+ if (entry.mImageSize <= 0)
{
// This will be in the Free List, don't put it in the LRU
++empty_entries;
@@ -1298,9 +1354,8 @@ void LLTextureCache::readHeaderCache()
if (entry.mBodySize > entry.mImageSize)
{
// Shouldn't happen, failsafe only
- llwarns << "Bad entry: " << i << ": " << id << ": BodySize: " << entry.mBodySize << llendl;
- purge_list.insert(entry.mID);
- entry.mImageSize = -1; // empty/available
+ llwarns << "Bad entry: " << i << ": " << entry.mID << ": BodySize: " << entry.mBodySize << llendl;
+ purge_list.insert(i);
}
}
}
@@ -1315,14 +1370,9 @@ void LLTextureCache::readHeaderCache()
{
for (std::set<lru_data_t>::iterator iter = lru.begin(); iter != lru.end(); ++iter)
{
- S32 idx = iter->second;
- if (entries[idx].mImageSize >= 0)
- {
- purge_list.insert(entries[idx].mID);
- entries[idx].mImageSize = -1;
- if (purge_list.size() >= entries_to_purge)
- break;
- }
+ purge_list.insert(iter->second);
+ if (purge_list.size() >= entries_to_purge)
+ break;
}
}
llassert_always(purge_list.size() >= entries_to_purge);
@@ -1332,9 +1382,7 @@ void LLTextureCache::readHeaderCache()
S32 lru_entries = (S32)((F32)sCacheMaxEntries * TEXTURE_CACHE_LRU_SIZE);
for (std::set<lru_data_t>::iterator iter = lru.begin(); iter != lru.end(); ++iter)
{
- S32 idx = iter->second;
- const LLUUID& id = entries[idx].mID;
- mLRU.insert(id);
+ mLRU.insert(entries[iter->second].mID);
// llinfos << "LRU: " << iter->first << " : " << iter->second << llendl;
if (--lru_entries <= 0)
break;
@@ -1343,12 +1391,9 @@ void LLTextureCache::readHeaderCache()
if (purge_list.size() > 0)
{
- for (std::set<LLUUID>::iterator iter = purge_list.begin(); iter != purge_list.end(); ++iter)
+ for (std::set<U32>::iterator iter = purge_list.begin(); iter != purge_list.end(); ++iter)
{
- const LLUUID& id = *iter;
- bool res = removeHeaderCacheEntry(id); // sets entry size on disk to -1
- llassert_always(res);
- LLAPRFile::remove(getTextureFileName(id), getLocalAPRFilePool());
+ removeEntry(*iter, entries[*iter], getTextureFileName(entries[*iter].mID));
}
// If we removed any entries, we need to rebuild the entries list,
// write the header, and call this again
@@ -1356,13 +1401,14 @@ void LLTextureCache::readHeaderCache()
for (U32 i=0; i<num_entries; i++)
{
const Entry& entry = entries[i];
- if (entry.mImageSize >=0)
+ if (entry.mImageSize > 0)
{
new_entries.push_back(entry);
}
}
llassert_always(new_entries.size() <= sCacheMaxEntries);
mHeaderEntriesInfo.mEntries = new_entries.size();
+ writeEntriesHeader();
writeEntriesAndClose(new_entries);
mHeaderMutex.unlock(); // unlock the mutex before calling again
readHeaderCache(); // repeat with new entries file
@@ -1370,7 +1416,7 @@ void LLTextureCache::readHeaderCache()
}
else
{
- writeEntriesAndClose(entries);
+ //entries are not changed, nothing here.
}
}
}
@@ -1398,6 +1444,7 @@ void LLTextureCache::purgeAllTextures(bool purge_directories)
}
if (purge_directories)
{
+ gDirUtilp->deleteFilesInDir(mTexturesDirName,mask);
LLFile::rmdir(mTexturesDirName);
}
}
@@ -1435,7 +1482,6 @@ void LLTextureCache::purgeTextures(bool validate)
U32 num_entries = openAndReadEntries(entries);
if (!num_entries)
{
- writeEntriesAndClose(entries);
return; // nothing to purge
}
@@ -1509,11 +1555,8 @@ void LLTextureCache::purgeTextures(bool validate)
{
purge_count++;
LL_DEBUGS("TextureCache") << "PURGING: " << filename << LL_ENDL;
- LLAPRFile::remove(filename, getLocalAPRFilePool());
+ removeEntry(idx, entries[idx], filename) ;
cache_size -= entries[idx].mBodySize;
- mTexturesSizeTotal -= entries[idx].mBodySize;
- entries[idx].mBodySize = 0;
- mTexturesSizeMap.erase(entries[idx].mID);
}
}
@@ -1568,7 +1611,7 @@ S32 LLTextureCache::getHeaderCacheEntry(const LLUUID& id, S32& imagesize)
if (idx >= 0)
{
imagesize = entry.mImageSize;
- writeEntryAndClose(idx, entry); // updates time
+ updateEntryTimeStamp(idx, entry); // updates time
}
return idx;
}
@@ -1582,8 +1625,7 @@ S32 LLTextureCache::setHeaderCacheEntry(const LLUUID& id, S32 imagesize)
S32 idx = openAndReadEntry(id, entry, true);
if (idx >= 0)
{
- entry.mImageSize = imagesize;
- writeEntryAndClose(idx, entry);
+ updateEntry(idx, entry, imagesize, entry.mBodySize);
mHeaderMutex.unlock();
}
else // retry
@@ -1722,34 +1764,55 @@ void LLTextureCache::addCompleted(Responder* responder, bool success)
//////////////////////////////////////////////////////////////////////////////
-// Called from MAIN thread (endWork())
-// Ensure that mHeaderMutex is locked first!
-bool LLTextureCache::removeHeaderCacheEntry(const LLUUID& id)
+//called after mHeaderMutex is locked.
+void LLTextureCache::removeCachedTexture(const LLUUID& id)
{
- Entry entry;
- S32 idx = openAndReadEntry(id, entry, false);
- if (idx >= 0)
+ if(mTexturesSizeMap.find(id) != mTexturesSizeMap.end())
+ {
+ mTexturesSizeTotal -= mTexturesSizeMap[id] ;
+ mTexturesSizeMap.erase(id);
+ }
+ mHeaderIDMap.erase(id);
+ LLAPRFile::remove(getTextureFileName(id), getLocalAPRFilePool());
+}
+
+//called after mHeaderMutex is locked.
+void LLTextureCache::removeEntry(S32 idx, Entry& entry, std::string& filename)
+{
+ if(idx >= 0) //valid entry
{
entry.mImageSize = -1;
entry.mBodySize = 0;
- writeEntryAndClose(idx, entry);
- mFreeList.insert(idx);
- mHeaderIDMap.erase(id);
- mTexturesSizeMap.erase(id);
- return true;
+ mHeaderIDMap.erase(entry.mID);
+ mTexturesSizeMap.erase(entry.mID);
+
+ mTexturesSizeTotal -= entry.mBodySize;
+ mFreeList.insert(idx);
}
- return false;
+
+ LLAPRFile::remove(filename, getLocalAPRFilePool());
}
-void LLTextureCache::removeFromCache(const LLUUID& id)
+bool LLTextureCache::removeFromCache(const LLUUID& id)
{
//llwarns << "Removing texture from cache: " << id << llendl;
+ bool ret = false ;
if (!mReadOnly)
{
- LLMutexLock lock(&mHeaderMutex);
- removeHeaderCacheEntry(id);
- LLAPRFile::remove(getTextureFileName(id), getLocalAPRFilePool());
+ lockHeaders() ;
+
+ Entry entry;
+ S32 idx = openAndReadEntry(id, entry, false);
+ removeEntry(idx, entry, getTextureFileName(id)) ;
+ if (idx >= 0)
+ {
+ writeEntryToHeaderImmediately(idx, entry);
+ ret = true;
+ }
+
+ unlockHeaders() ;
}
+ return ret ;
}
//////////////////////////////////////////////////////////////////////////////
diff --git a/indra/newview/lltexturecache.h b/indra/newview/lltexturecache.h
index b840619c1f..ca8815ee7e 100644
--- a/indra/newview/lltexturecache.h
+++ b/indra/newview/lltexturecache.h
@@ -123,7 +123,7 @@ public:
bool writeComplete(handle_t handle, bool abort = false);
void prioritizeWrite(handle_t handle);
- void removeFromCache(const LLUUID& id);
+ bool removeFromCache(const LLUUID& id);
// For LLTextureCacheWorker::Responder
LLTextureCacheWorker* getReader(handle_t handle);
@@ -161,12 +161,16 @@ private:
void readEntriesHeader();
void writeEntriesHeader();
S32 openAndReadEntry(const LLUUID& id, Entry& entry, bool create);
- void writeEntryAndClose(S32 idx, Entry& entry);
+ void updateEntry(S32 idx, Entry& entry, S32 new_image_size, S32 new_body_size);
+ void updateEntryTimeStamp(S32 idx, Entry& entry) ;
U32 openAndReadEntries(std::vector<Entry>& entries);
void writeEntriesAndClose(const std::vector<Entry>& entries);
+ void readEntryFromHeaderImmediately(S32 idx, Entry& entry) ;
+ void writeEntryToHeaderImmediately(S32 idx, Entry& entry, bool write_header = false) ;
+ void removeEntry(S32 idx, Entry& entry, std::string& filename);
+ void removeCachedTexture(const LLUUID& id) ;
S32 getHeaderCacheEntry(const LLUUID& id, S32& imagesize);
S32 setHeaderCacheEntry(const LLUUID& id, S32 imagesize);
- bool removeHeaderCacheEntry(const LLUUID& id);
void writeUpdatedEntries() ;
void updatedHeaderEntriesFile() ;
void lockHeaders() { mHeaderMutex.lock(); }
diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp
index 133b6ee8c9..dbbf0219c9 100644
--- a/indra/newview/llviewertexture.cpp
+++ b/indra/newview/llviewertexture.cpp
@@ -2262,11 +2262,14 @@ void LLViewerFetchedTexture::destroyRawImage()
{
sRawCount--;
- if(mForceToSaveRawImage)
+ if(mIsRawImageValid)
{
- saveRawImage() ;
- }
- setCachedRawImage() ;
+ if(mForceToSaveRawImage)
+ {
+ saveRawImage() ;
+ }
+ setCachedRawImage() ;
+ }
}
mRawImage = NULL;
diff --git a/indra/newview/llwearablelist.h b/indra/newview/llwearablelist.h
index cf1a9bddff..5e564ba953 100644
--- a/indra/newview/llwearablelist.h
+++ b/indra/newview/llwearablelist.h
@@ -39,6 +39,12 @@
#include "llassetstorage.h"
// Globally constructed; be careful that there's no dependency with gAgent.
+/*
+ BUG: mList's system of mapping between assetIDs and wearables is flawed
+ since LLWearable* has an associated itemID, and you can have multiple
+ inventory items pointing to the same asset (i.e. more than one ItemID
+ per assetID). EXT-6252
+*/
class LLWearableList : public LLSingleton<LLWearableList>
{
public:
diff --git a/indra/newview/llworldmapview.cpp b/indra/newview/llworldmapview.cpp
index 5edf72d4ae..27757d19e5 100644
--- a/indra/newview/llworldmapview.cpp
+++ b/indra/newview/llworldmapview.cpp
@@ -45,6 +45,7 @@
#include "llagent.h"
#include "llcallingcard.h"
+#include "llcommandhandler.h"
#include "llviewercontrol.h"
#include "llfloatermap.h"
#include "llfloaterworldmap.h"
@@ -1726,7 +1727,10 @@ BOOL LLWorldMapView::handleDoubleClick( S32 x, S32 y, MASK mask )
id.toString(uuid_str);
uuid_str = uuid_str.substr(28);
sscanf(uuid_str.c_str(), "%X", &event_id);
- LLFloaterReg::showInstance("search", LLSD().with("category", "events").with("id", event_id));
+ // Invoke the event details floater if someone is clicking on an event.
+ LLSD params(LLSD::emptyArray());
+ params.append(event_id);
+ LLCommandDispatcher::dispatch("event", params, LLSD(), NULL, true);
break;
}
case MAP_ITEM_LAND_FOR_SALE:
diff --git a/indra/newview/skins/default/xui/de/floater_about_land.xml b/indra/newview/skins/default/xui/de/floater_about_land.xml
index 186c2932c3..81c2f97263 100644
--- a/indra/newview/skins/default/xui/de/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/de/floater_about_land.xml
@@ -443,6 +443,9 @@ Nur große Parzellen können in der Suche aufgeführt werden.
<panel.string name="access_estate_defined">
(Durch Grundstück festgelegt)
</panel.string>
+ <panel.string name="allow_public_access">
+ Öffentlichen Zugang erlauben ([MATURITY])
+ </panel.string>
<panel.string name="estate_override">
Eine oder mehrere dieser Optionen gelten auf Grundstücksebene
</panel.string>
diff --git a/indra/newview/skins/default/xui/de/panel_edit_pick.xml b/indra/newview/skins/default/xui/de/panel_edit_pick.xml
index 0cb14177af..1ec4f09161 100644
--- a/indra/newview/skins/default/xui/de/panel_edit_pick.xml
+++ b/indra/newview/skins/default/xui/de/panel_edit_pick.xml
@@ -1,5 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Auswahl bearbeiten" name="panel_edit_pick">
+ <panel.string name="location_notice">
+ (wird nach Speichern aktualisiert)
+ </panel.string>
<text name="title">
Auswahl bearbeiten
</text>
@@ -22,7 +25,7 @@
</panel>
</scroll_container>
<panel label="bottom_panel" name="bottom_panel">
- <button label="[WHAT] speichern" name="save_changes_btn"/>
+ <button label="Auswahl speichern" name="save_changes_btn"/>
<button label="Abbrechen" name="cancel_btn"/>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_main_inventory.xml b/indra/newview/skins/default/xui/de/panel_main_inventory.xml
index 7d57a3b3f2..d3eb9ae04c 100644
--- a/indra/newview/skins/default/xui/de/panel_main_inventory.xml
+++ b/indra/newview/skins/default/xui/de/panel_main_inventory.xml
@@ -1,18 +1,14 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Sonstiges" name="main inventory panel">
- <panel.string name="Title">
- Sonstiges
+ <panel.string name="ItemcountFetching">
+ Inventar ([ITEM_COUNT] Artikel werden abgerufen... [FILTER]
</panel.string>
- <filter_editor label="Inventar filtern" name="inventory search editor"/>
- <tab_container name="inventory filter tabs">
- <inventory_panel label="MEIN INVENTAR" name="All Items"/>
- <inventory_panel label="AKTUELL" name="Recent Items"/>
- </tab_container>
- <panel name="bottom_panel">
- <button name="options_gear_btn" tool_tip="Zusätzliche Optionen anzeigen"/>
- <button name="add_btn" tool_tip="Neues Objekt hinzufügen"/>
- <dnd_button name="trash_btn" tool_tip="Auswahl löschen"/>
- </panel>
+ <panel.string name="ItemcountCompleted">
+ [ITEM_COUNT] Objekte [FILTER]
+ </panel.string>
+ <text name="ItemcountText">
+ Objekte:
+ </text>
<menu_bar name="Inventory Menu">
<menu label="Datei" name="File">
<menu_item_call label="Öffnen" name="Open"/>
@@ -61,4 +57,14 @@
<menu_item_check label="Systemordner nach oben" name="System Folders To Top"/>
</menu>
</menu_bar>
+ <filter_editor label="Inventar filtern" name="inventory search editor"/>
+ <tab_container name="inventory filter tabs">
+ <inventory_panel label="MEIN INVENTAR" name="All Items"/>
+ <inventory_panel label="AKTUELL" name="Recent Items"/>
+ </tab_container>
+ <panel name="bottom_panel">
+ <button name="options_gear_btn" tool_tip="Zusätzliche Optionen anzeigen"/>
+ <button name="add_btn" tool_tip="Neues Objekt hinzufügen"/>
+ <dnd_button name="trash_btn" tool_tip="Auswahl löschen"/>
+ </panel>
</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_nearby_media.xml b/indra/newview/skins/default/xui/de/panel_nearby_media.xml
index 2d97a25fa9..ad26f71245 100644
--- a/indra/newview/skins/default/xui/de/panel_nearby_media.xml
+++ b/indra/newview/skins/default/xui/de/panel_nearby_media.xml
@@ -19,10 +19,17 @@
<button label="Mehr &gt;&gt;" label_selected="Weniger &lt;&lt;" name="more_less_btn" tool_tip="Erweiterte Steuerung"/>
</panel>
<panel name="nearby_media_panel">
+ <text name="nearby_media">
+ Medien in der Nähe
+ </text>
+ <text name="show">
+ Anzeigen:
+ </text>
<combo_box name="show_combo">
<combo_box.item label="Alle" name="All"/>
<combo_box.item label="Auf dieser Parzelle" name="WithinParcel"/>
<combo_box.item label="Außerhalb dieser Parzelle" name="OutsideParcel"/>
+ <combo_box.item label="An anderen Avataren" name="OnOthers"/>
</combo_box>
<scroll_list name="media_list">
<scroll_list.columns label="Umgebung" name="media_proximity"/>
@@ -31,7 +38,7 @@
<scroll_list.columns label="Name" name="media_name"/>
<scroll_list.columns label="Fehler beseitigen" name="media_debug"/>
</scroll_list>
- <panel>
+ <panel name="media_controls_panel">
<layout_stack name="media_controls">
<layout_panel name="stop">
<button name="stop_btn" tool_tip="Ausgewählte Medien stoppen"/>
diff --git a/indra/newview/skins/default/xui/de/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/de/panel_preferences_advanced.xml
index 78c495e377..c0ab69fcdf 100644
--- a/indra/newview/skins/default/xui/de/panel_preferences_advanced.xml
+++ b/indra/newview/skins/default/xui/de/panel_preferences_advanced.xml
@@ -3,6 +3,9 @@
<panel.string name="aspect_ratio_text">
[NUM]:[DEN]
</panel.string>
+ <panel.string name="middle_mouse">
+ Mittlere Maustaste
+ </panel.string>
<slider label="Sichtwinkel" name="camera_fov"/>
<slider label="Abstand" name="camera_offset_scale"/>
<text name="heading2">
@@ -16,7 +19,7 @@
<check_box label="Avatarlippen beim Sprechen bewegen" name="enable_lip_sync"/>
<check_box label="Blasen-Chat" name="bubble_text_chat"/>
<slider label="Deckkraft" label_width="66" name="bubble_chat_opacity"/>
- <color_swatch name="background" tool_tip="Farbe für Blasen-Chat auswählen" left_pad="35"/>
+ <color_swatch left_pad="35" name="background" tool_tip="Farbe für Blasen-Chat auswählen"/>
<check_box label="Skript-Fehler anzeigen:" name="show_script_errors"/>
<radio_group name="show_location">
<radio_item label="Chat in der Nähe" name="0"/>
diff --git a/indra/newview/skins/default/xui/de/panel_preferences_chat.xml b/indra/newview/skins/default/xui/de/panel_preferences_chat.xml
index 45b560c759..aa1a93efac 100644
--- a/indra/newview/skins/default/xui/de/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/de/panel_preferences_chat.xml
@@ -46,6 +46,12 @@
<check_box initial_value="true" label="Beim Chatten Tippanimation abspielen" name="play_typing_animation"/>
<check_box label="IMs per Email zuschicken, wenn ich offline bin" name="send_im_to_email"/>
<check_box label="Kompakten Text-Chatverlauf aktivieren" name="plain_text_chat_history"/>
+ <text name="show_ims_in_label">
+ IMs anzeigen in:
+ </text>
+ <text name="requires_restart_label">
+ (Neustart erforderlich)
+ </text>
<radio_group name="chat_window" tool_tip="Zeigen Sie Ihre Sofortnachrichten (Instant Messages) in einem anderen Fenster oder in einem einzigen Fenster mit viele Registerkarten an (Neustart erforderlich).">
<radio_item label="Getrennte Fenster" name="radio" value="0"/>
<radio_item label="Registerkarten" name="radio2" value="1"/>
diff --git a/indra/newview/skins/default/xui/de/strings.xml b/indra/newview/skins/default/xui/de/strings.xml
index fc01b69461..b99f31c892 100644
--- a/indra/newview/skins/default/xui/de/strings.xml
+++ b/indra/newview/skins/default/xui/de/strings.xml
@@ -23,7 +23,22 @@
Hardware wird erfasst...
</string>
<string name="StartupLoading">
- Wird geladen
+ [APP_NAME] wird geladen...
+ </string>
+ <string name="StartupClearingCache">
+ Cache wird gelöscht...
+ </string>
+ <string name="StartupInitializingTextureCache">
+ Textur-Cache wird initialisiert...
+ </string>
+ <string name="StartupInitializingVFS">
+ VFS wird initialisiert...
+ </string>
+ <string name="ProgressRestoring">
+ Wird wiederhergestellt...
+ </string>
+ <string name="ProgressChangingResolution">
+ Auflösung wird geändert...
</string>
<string name="Fullbright">
Fullbright (Legacy)
@@ -88,6 +103,9 @@
<string name="LoginFailedNoNetwork">
Netzwerk Fehler: Eine Verbindung konnte nicht hergestellt werden. Bitte überprüfen Sie Ihre Netzwerkverbindung.
</string>
+ <string name="LoginFailed">
+ Anmeldung fehlgeschlagen
+ </string>
<string name="Quit">
Beenden
</string>
@@ -97,6 +115,24 @@
<string name="AgentLostConnection">
In dieser Region kann es zu Problemen kommen. Bitte überprüfen Sie Ihre Internetverbindung.
</string>
+ <string name="SavingSettings">
+ Ihr Einstellungen werden gespeichert...
+ </string>
+ <string name="LoggingOut">
+ Abmeldung erfolgt...
+ </string>
+ <string name="ShuttingDown">
+ Programm wird beendet...
+ </string>
+ <string name="YouHaveBeenDisconnected">
+ Die Verbindung zu der Region ist abgebrochen.
+ </string>
+ <string name="SentToInvalidRegion">
+ Sie wurden in eine ungültige Region geschickt.
+ </string>
+ <string name="TestingDisconnect">
+ Verbindungsabbruch wird getestet
+ </string>
<string name="TooltipPerson">
Person
</string>
@@ -151,6 +187,24 @@
<string name="TooltipAgentUrl">
Anklicken, um das Profil dieses Einwohners anzuzeigen
</string>
+ <string name="TooltipAgentMute">
+ Klicken, um diesen Einwohner stummzuschalten
+ </string>
+ <string name="TooltipAgentUnmute">
+ Klicken, um diesen Einwohner freizuschalten
+ </string>
+ <string name="TooltipAgentIM">
+ Klicken, um diesem Einwohner eine IM zu schicken.
+ </string>
+ <string name="TooltipAgentPay">
+ Klicken, um diesen Einwohner zu bezahlen
+ </string>
+ <string name="TooltipAgentOfferTeleport">
+ Klicken, um diesem Einwohner einen Teleport anzubieten.
+ </string>
+ <string name="TooltipAgentRequestFriend">
+ Klicken, um diesem Einwohner ein Freundschaftsangebot zu schicken.
+ </string>
<string name="TooltipGroupUrl">
Anklicken, um Beschreibung der Gruppe anzuzeigen
</string>
@@ -176,12 +230,31 @@
Anklicken, um Befehl secondlife:// auszuführen
</string>
<string name="CurrentURL" value=" CurrentURL: [CurrentURL]"/>
+ <string name="TooltipPrice" value="[PRICE] L$"/>
<string name="SLurlLabelTeleport">
Teleportieren nach
</string>
<string name="SLurlLabelShowOnMap">
Karte anzeigen für
</string>
+ <string name="SLappAgentMute">
+ Stummschalten
+ </string>
+ <string name="SLappAgentUnmute">
+ Stummschaltung aufheben
+ </string>
+ <string name="SLappAgentIM">
+ IM
+ </string>
+ <string name="SLappAgentPay">
+ Bezahlen
+ </string>
+ <string name="SLappAgentOfferTeleport">
+ Teleportangebot an
+ </string>
+ <string name="SLappAgentRequestFriend">
+ Freundschaftsangebot
+ </string>
<string name="BUTTON_CLOSE_DARWIN">
Schließen (⌘W)
</string>
@@ -335,6 +408,9 @@
<string name="symbolic link">
Link
</string>
+ <string name="symbolic folder link">
+ Link zu Ordner
+ </string>
<string name="AvatarEditingAppearance">
(Aussehen wird bearbeitet)
</string>
@@ -849,6 +925,7 @@
Keine Inhalte
</string>
<string name="WornOnAttachmentPoint" value=" (getragen am [ATTACHMENT_POINT])"/>
+ <string name="ActiveGesture" value="[GESLABEL] (aktiviert)"/>
<string name="PermYes">
Ja
</string>
@@ -948,6 +1025,9 @@
<string name="InvFolder My Outfits">
Meine Outfits
</string>
+ <string name="InvFolder Accessories">
+ Zubehör
+ </string>
<string name="InvFolder Friends">
Freunde
</string>
@@ -1471,6 +1551,9 @@
<string name="PanelContentsNewScript">
Neues Skript
</string>
+ <string name="PanelContentsTooltip">
+ Objektinhalt
+ </string>
<string name="BusyModeResponseDefault">
Der Einwohner/Die Einwohnerin ist „beschäftigt&quot;, d.h. er/sie möchte im Moment nicht gestört werden. Ihre Nachricht wird dem Einwohner/der Einwohnerin als IM angezeigt, und kann später beantwortet werden.
</string>
@@ -3375,4 +3458,31 @@ Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_
<string name="unread_chat_multiple">
[SOURCES] haben etwas Neues gesagt
</string>
+ <string name="paid_you_ldollars">
+ [NAME] hat Ihnen [AMOUNT] L$ bezahlt.
+ </string>
+ <string name="giving">
+ Giving
+ </string>
+ <string name="uploading_costs">
+ Kosten für Hochladen
+ </string>
+ <string name="this_costs">
+ Kosten:
+ </string>
+ <string name="buying_selected_land">
+ Ausgewähltes Land wird gekauft
+ </string>
+ <string name="this_object_costs">
+ Dieses Objekt kostet
+ </string>
+ <string name="group_role_everyone">
+ Jeder
+ </string>
+ <string name="group_role_officers">
+ Offiziere
+ </string>
+ <string name="group_role_owners">
+ Eigentümer
+ </string>
</strings>
diff --git a/indra/newview/skins/default/xui/fr/panel_edit_profile.xml b/indra/newview/skins/default/xui/fr/panel_edit_profile.xml
index 7c8365fdee..4be12054df 100644
--- a/indra/newview/skins/default/xui/fr/panel_edit_profile.xml
+++ b/indra/newview/skins/default/xui/fr/panel_edit_profile.xml
@@ -40,7 +40,7 @@
Page d&apos;accueil :
</text>
<line_editor name="homepage_edit" value="http://"/>
- <check_box label="Afficher dans les résultats de recherche" name="show_in_search_checkbox"/>
+ <check_box label="Afficher avec la recherche" name="show_in_search_checkbox"/>
<text name="title_acc_status_text" value="Mon compte :"/>
<text_editor name="acc_status_text" value="Résident. Aucune info de paiement enregistrée."/>
<text name="my_account_link" value="[[URL] Accéder à ma Page d&apos;accueil]"/>
diff --git a/indra/newview/skins/default/xui/fr/sidepanel_task_info.xml b/indra/newview/skins/default/xui/fr/sidepanel_task_info.xml
index cc99b1a07c..c8e76118a1 100644
--- a/indra/newview/skins/default/xui/fr/sidepanel_task_info.xml
+++ b/indra/newview/skins/default/xui/fr/sidepanel_task_info.xml
@@ -100,7 +100,7 @@
<combo_box.item label="Original" name="Original"/>
</combo_box>
<spinner label="Prix : L$" name="Edit Cost"/>
- <check_box label="Afficher dans les résultats de recherche" name="search_check" tool_tip="Permettre aux autres résidents de voir cet objet dans les résultats de recherche"/>
+ <check_box label="Afficher avec la recherche" name="search_check" tool_tip="Permettre aux autres résidents de voir cet objet dans les résultats de recherche"/>
<text name="B:">
B :
</text>
diff --git a/indra/newview/skins/default/xui/fr/strings.xml b/indra/newview/skins/default/xui/fr/strings.xml
index c031762d4b..32aff9dd79 100644
--- a/indra/newview/skins/default/xui/fr/strings.xml
+++ b/indra/newview/skins/default/xui/fr/strings.xml
@@ -2272,7 +2272,7 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE].
Brillant
</string>
<string name="Glove Fingers">
- Doigts avec gants
+ Gants avec doigts
</string>
<string name="Glove Length">
Longueur des gants
@@ -3034,7 +3034,7 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE].
Cheveux lisses
</string>
<string name="Socks Length">
- Longueur des chaussettes
+ Longueur
</string>
<string name="Soulpatch">
Barbichette