Merge from default branch

--HG--
branch : product-engine
meow-7.2.2
Vadim Savchuk 2010-08-09 16:15:59 +03:00
commit fcc19791b3
14 changed files with 132 additions and 32 deletions

View File

@ -417,7 +417,11 @@ apr_pool_t* LLAPRFile::getAPRFilePool(apr_pool_t* pool)
// File I/O
S32 LLAPRFile::read(void *buf, S32 nbytes)
{
llassert_always(mFile) ;
if(!mFile)
{
llwarns << "apr mFile is removed by somebody else. Can not read." << llendl ;
return 0;
}
apr_size_t sz = nbytes;
apr_status_t s = apr_file_read(mFile, buf, &sz);
@ -435,7 +439,11 @@ S32 LLAPRFile::read(void *buf, S32 nbytes)
S32 LLAPRFile::write(const void *buf, S32 nbytes)
{
llassert_always(mFile) ;
if(!mFile)
{
llwarns << "apr mFile is removed by somebody else. Can not write." << llendl ;
return 0;
}
apr_size_t sz = nbytes;
apr_status_t s = apr_file_write(mFile, buf, &sz);

View File

@ -522,6 +522,9 @@ void LLLandmarksPanel::setParcelID(const LLUUID& parcel_id)
{
if (!parcel_id.isNull())
{
//ext-4655, defensive. remove now incase this gets called twice without a remove
LLRemoteParcelInfoProcessor::getInstance()->removeObserver(parcel_id, this);
LLRemoteParcelInfoProcessor::getInstance()->addObserver(parcel_id, this);
LLRemoteParcelInfoProcessor::getInstance()->sendParcelInfoRequest(parcel_id);
}

View File

@ -210,6 +210,9 @@ void LLPanelPickInfo::sendParcelInfoRequest()
{
if (mParcelId != mRequestedId)
{
//ext-4655, remove now incase this gets called twice without a remove
LLRemoteParcelInfoProcessor::getInstance()->removeObserver(mRequestedId, this);
LLRemoteParcelInfoProcessor::getInstance()->addObserver(mParcelId, this);
LLRemoteParcelInfoProcessor::getInstance()->sendParcelInfoRequest(mParcelId);

View File

@ -202,6 +202,9 @@ void LLPanelPlace::sendParcelInfoRequest()
{
if (mParcelID != mRequestedID)
{
//ext-4655, remove now incase this gets called twice without a remove
LLRemoteParcelInfoProcessor::getInstance()->removeObserver(mRequestedID, this);
LLRemoteParcelInfoProcessor::getInstance()->addObserver(mParcelID, this);
LLRemoteParcelInfoProcessor::getInstance()->sendParcelInfoRequest(mParcelID);

View File

@ -133,6 +133,10 @@ void LLPanelPlaceInfo::sendParcelInfoRequest()
{
if (mParcelID != mRequestedID)
{
//ext-4655, defensive. remove now incase this gets called twice without a remove
//as panel never closes its ok atm (but wrong :)
LLRemoteParcelInfoProcessor::getInstance()->removeObserver(mRequestedID, this);
LLRemoteParcelInfoProcessor::getInstance()->addObserver(mParcelID, this);
LLRemoteParcelInfoProcessor::getInstance()->sendParcelInfoRequest(mParcelID);

View File

@ -985,6 +985,13 @@ void LLPanelPrimMediaControls::onClickZoom()
void LLPanelPrimMediaControls::nextZoomLevel()
{
LLViewerObject* objectp = getTargetObject();
if(objectp && objectp->isHUDAttachment())
{
// Never allow zooming on HUD attachments.
return;
}
int index = 0;
while (index < kNumZoomLevels)
{

View File

@ -998,7 +998,11 @@ LLAPRFile* LLTextureCache::openHeaderEntriesFile(bool readonly, S32 offset)
void LLTextureCache::closeHeaderEntriesFile()
{
llassert_always(mHeaderAPRFile != NULL);
if(!mHeaderAPRFile)
{
return ;
}
delete mHeaderAPRFile;
mHeaderAPRFile = NULL;
}
@ -1115,7 +1119,7 @@ S32 LLTextureCache::openAndReadEntry(const LLUUID& id, Entry& entry, bool create
}
//mHeaderMutex is locked before calling this.
void LLTextureCache::writeEntryToHeaderImmediately(S32 idx, Entry& entry, bool write_header)
void LLTextureCache::writeEntryToHeaderImmediately(S32& idx, Entry& entry, bool write_header)
{
LLAPRFile* aprfile ;
S32 bytes_written ;
@ -1124,7 +1128,13 @@ void LLTextureCache::writeEntryToHeaderImmediately(S32 idx, Entry& entry, bool w
{
aprfile = openHeaderEntriesFile(false, 0);
bytes_written = aprfile->write((U8*)&mHeaderEntriesInfo, sizeof(EntriesInfo)) ;
llassert_always(bytes_written == sizeof(EntriesInfo));
if(bytes_written != sizeof(EntriesInfo))
{
clearCorruptedCache() ; //clear the cache.
idx = -1 ;//mark the idx invalid.
return ;
}
mHeaderAPRFile->seek(APR_SET, offset);
}
else
@ -1132,19 +1142,31 @@ void LLTextureCache::writeEntryToHeaderImmediately(S32 idx, Entry& entry, bool w
aprfile = openHeaderEntriesFile(false, offset);
}
bytes_written = aprfile->write((void*)&entry, (S32)sizeof(Entry));
llassert_always(bytes_written == sizeof(Entry));
if(bytes_written != sizeof(Entry))
{
clearCorruptedCache() ; //clear the cache.
idx = -1 ;//mark the idx invalid.
return ;
}
closeHeaderEntriesFile();
mUpdatedEntryMap.erase(idx) ;
}
//mHeaderMutex is locked before calling this.
void LLTextureCache::readEntryFromHeaderImmediately(S32 idx, Entry& entry)
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();
if(bytes_read != sizeof(Entry))
{
clearCorruptedCache() ; //clear the cache.
idx = -1 ;//mark the idx invalid.
}
}
//mHeaderMutex is locked before calling this.
@ -1169,7 +1191,7 @@ void LLTextureCache::updateEntryTimeStamp(S32 idx, Entry& entry)
}
//update an existing entry, write to header file immediately.
bool LLTextureCache::updateEntry(S32 idx, Entry& entry, S32 new_image_size, S32 new_data_size)
bool LLTextureCache::updateEntry(S32& idx, Entry& entry, S32 new_image_size, S32 new_data_size)
{
S32 new_body_size = llmax(0, new_data_size - TEXTURE_CACHE_ENTRY_SIZE) ;
@ -1240,6 +1262,10 @@ U32 LLTextureCache::openAndReadEntries(std::vector<Entry>& entries)
{
aprfile = openHeaderEntriesFile(false, 0);
updatedHeaderEntriesFile() ;
if(!aprfile)
{
return 0;
}
aprfile->seek(APR_SET, (S32)sizeof(EntriesInfo));
}
for (U32 idx=0; idx<num_entries; idx++)
@ -1281,7 +1307,11 @@ void LLTextureCache::writeEntriesAndClose(const std::vector<Entry>& entries)
for (S32 idx=0; idx<num_entries; idx++)
{
S32 bytes_written = aprfile->write((void*)(&entries[idx]), (S32)sizeof(Entry));
llassert_always(bytes_written == sizeof(Entry));
if(bytes_written != sizeof(Entry))
{
clearCorruptedCache() ; //clear the cache.
return ;
}
}
closeHeaderEntriesFile();
}
@ -1307,7 +1337,11 @@ void LLTextureCache::updatedHeaderEntriesFile()
//entriesInfo
mHeaderAPRFile->seek(APR_SET, 0);
S32 bytes_written = mHeaderAPRFile->write((U8*)&mHeaderEntriesInfo, sizeof(EntriesInfo)) ;
llassert_always(bytes_written == sizeof(EntriesInfo));
if(bytes_written != sizeof(EntriesInfo))
{
clearCorruptedCache() ; //clear the cache.
return ;
}
//write each updated entry
S32 entry_size = (S32)sizeof(Entry) ;
@ -1323,7 +1357,11 @@ void LLTextureCache::updatedHeaderEntriesFile()
}
bytes_written = mHeaderAPRFile->write((void*)(&iter->second), entry_size);
llassert_always(bytes_written == entry_size);
if(bytes_written != entry_size)
{
clearCorruptedCache() ; //clear the cache.
return ;
}
}
mUpdatedEntryMap.clear() ;
}
@ -1444,6 +1482,29 @@ void LLTextureCache::readHeaderCache()
//////////////////////////////////////////////////////////////////////////////
//the header mutex is locked before calling this.
void LLTextureCache::clearCorruptedCache()
{
llwarns << "the texture cache is corrupted, need to be cleared." << llendl ;
closeHeaderEntriesFile();//close possible file handler
purgeAllTextures(false) ; //clear the cache.
if (!mReadOnly) //regenerate the directory tree if not exists.
{
LLFile::mkdir(mTexturesDirName);
const char* subdirs = "0123456789abcdef";
for (S32 i=0; i<16; i++)
{
std::string dirname = mTexturesDirName + gDirUtilp->getDirDelimiter() + subdirs[i];
LLFile::mkdir(dirname);
}
}
return ;
}
void LLTextureCache::purgeAllTextures(bool purge_directories)
{
if (!mReadOnly)
@ -1472,11 +1533,14 @@ void LLTextureCache::purgeAllTextures(bool purge_directories)
mTexturesSizeTotal = 0;
mFreeList.clear();
mTexturesSizeTotal = 0;
mUpdatedEntryMap.clear();
// Info with 0 entries
mHeaderEntriesInfo.mVersion = sHeaderCacheVersion;
mHeaderEntriesInfo.mEntries = 0;
writeEntriesHeader();
llinfos << "The entire texture cache is cleared." << llendl ;
}
void LLTextureCache::purgeTextures(bool validate)
@ -1644,7 +1708,8 @@ S32 LLTextureCache::setHeaderCacheEntry(const LLUUID& id, Entry& entry, S32 imag
{
updateEntry(idx, entry, imagesize, datasize);
}
else // retry
if(idx < 0) // retry
{
readHeaderCache(); // We couldn't write an entry, so refresh the LRU

View File

@ -154,6 +154,7 @@ protected:
private:
void setDirNames(ELLPath location);
void readHeaderCache();
void clearCorruptedCache();
void purgeAllTextures(bool purge_directories);
void purgeTextures(bool validate);
LLAPRFile* openHeaderEntriesFile(bool readonly, S32 offset);
@ -161,12 +162,12 @@ private:
void readEntriesHeader();
void writeEntriesHeader();
S32 openAndReadEntry(const LLUUID& id, Entry& entry, bool create);
bool updateEntry(S32 idx, Entry& entry, S32 new_image_size, S32 new_body_size);
bool 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 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, Entry& entry);

View File

@ -1270,7 +1270,6 @@ bool LLToolPie::handleMediaClick(const LLPickInfo& pick)
if (!parcel ||
objectp.isNull() ||
objectp->isHUDAttachment() ||
pick.mObjectFace < 0 ||
pick.mObjectFace >= objectp->getNumTEs())
{

View File

@ -3053,20 +3053,25 @@ void LLViewerMediaImpl::calculateInterest()
// Calculate distance from the avatar, for use in the proximity calculation.
mProximityDistance = 0.0f;
mProximityCamera = 0.0f;
if(!mObjectList.empty())
{
// Just use the first object in the list. We could go through the list and find the closest object, but this should work well enough.
std::list< LLVOVolume* >::iterator iter = mObjectList.begin() ;
LLVOVolume* objp = *iter ;
llassert_always(objp != NULL) ;
// The distance calculation is invalid for HUD attachments -- leave both mProximityDistance and mProximityCamera at 0 for them.
if(!objp->isHUDAttachment())
{
LLVector3d obj_global = objp->getPositionGlobal() ;
LLVector3d agent_global = gAgent.getPositionGlobal() ;
LLVector3d global_delta = agent_global - obj_global ;
mProximityDistance = global_delta.magVecSquared(); // use distance-squared because it's cheaper and sorts the same.
LLVector3d obj_global = objp->getPositionGlobal() ;
LLVector3d agent_global = gAgent.getPositionGlobal() ;
LLVector3d global_delta = agent_global - obj_global ;
mProximityDistance = global_delta.magVecSquared(); // use distance-squared because it's cheaper and sorts the same.
LLVector3d camera_delta = gAgentCamera.getCameraPositionGlobal() - obj_global;
mProximityCamera = camera_delta.magVec();
LLVector3d camera_delta = gAgentCamera.getCameraPositionGlobal() - obj_global;
mProximityCamera = camera_delta.magVec();
}
}
if(mNeedsMuteCheck)

View File

@ -3137,14 +3137,16 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent)
if (motionp->getName().empty())
{
output = llformat("%s - %d",
motionp->getID().asString().c_str(),
(U32)motionp->getPriority());
gAgent.isGodlikeWithoutAdminMenuFakery() ?
motionp->getID().asString().c_str() :
LLUUID::null.asString().c_str(),
(U32)motionp->getPriority());
}
else
{
output = llformat("%s - %d",
motionp->getName().c_str(),
(U32)motionp->getPriority());
motionp->getName().c_str(),
(U32)motionp->getPriority());
}
addDebugText(output);
}

View File

@ -13,13 +13,13 @@
Attendre :
</floater.string>
<floater.string name="stop_txt">
Stop
Arrêter
</floater.string>
<floater.string name="preview_txt">
Prévisualiser
</floater.string>
<floater.string name="none_text">
-- Aucune --
- Aucun choix -
</floater.string>
<floater.string name="Title">
Geste : [NAME]

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="menu_gesture_gear">
<menu_item_call label="Ajouter/Supprimer des Favoris" name="activate"/>
<menu_item_call label="Ajouter/Supprimer des favoris" name="activate"/>
<menu_item_call label="Copier" name="copy_gesture"/>
<menu_item_call label="Coller" name="paste"/>
<menu_item_call label="Copier l&apos;UUID" name="copy_uuid"/>

View File

@ -27,7 +27,7 @@
Médias proches
</text>
<text name="show_text">
Afficher :
Voir :
</text>
<combo_box name="show_combo">
<combo_box.item label="Tout" name="All"/>