Merge remote-tracking branch 'Liru/master'

This commit is contained in:
Damian Zhaoying
2014-09-13 14:46:59 -03:00
24 changed files with 1030 additions and 755 deletions

View File

@@ -182,9 +182,6 @@ LLAvatarAppearance::LLAvatarAppearance(LLWearableData* wearable_data) :
} }
mIsBuilt = FALSE; mIsBuilt = FALSE;
mNumCollisionVolumes = 0;
mCollisionVolumes = NULL;
} }
// virtual // virtual
@@ -294,7 +291,7 @@ LLAvatarAppearance::~LLAvatarAppearance()
mJointMap.clear(); mJointMap.clear();
clearSkeleton(); clearSkeleton();
deleteAndClearArray(mCollisionVolumes); clearCollisionVolumes();
std::for_each(mPolyMeshes.begin(), mPolyMeshes.end(), DeletePairedPointer()); std::for_each(mPolyMeshes.begin(), mPolyMeshes.end(), DeletePairedPointer());
mPolyMeshes.clear(); mPolyMeshes.clear();
@@ -575,12 +572,12 @@ BOOL LLAvatarAppearance::setupBone(const LLAvatarBoneInfo* info, LLJoint* parent
} }
else // collision volume else // collision volume
{ {
if (volume_num >= (S32)mNumCollisionVolumes) if (volume_num >= (S32)mCollisionVolumes.size())
{ {
llwarns << "Too many bones" << llendl; llwarns << "Too many bones" << llendl;
return FALSE; return FALSE;
} }
joint = (&mCollisionVolumes[volume_num]); joint = (mCollisionVolumes[volume_num]);
joint->setName( info->mName ); joint->setName( info->mName );
} }
@@ -1250,12 +1247,12 @@ LLVector3 LLAvatarAppearance::getVolumePos(S32 joint_index, LLVector3& volume_of
return LLVector3::zero; return LLVector3::zero;
} }
if (joint_index > mNumCollisionVolumes) if (joint_index > (S32)mCollisionVolumes.size())
{ {
return LLVector3::zero; return LLVector3::zero;
} }
return mCollisionVolumes[joint_index].getVolumePos(volume_offset); return mCollisionVolumes[joint_index]->getVolumePos(volume_offset);
} }
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
@@ -1266,12 +1263,12 @@ LLJoint* LLAvatarAppearance::findCollisionVolume(U32 volume_id)
//SNOW-488: As mNumCollisionVolumes is a S32 and we are casting from a U32 to a S32 //SNOW-488: As mNumCollisionVolumes is a S32 and we are casting from a U32 to a S32
//to compare we also need to be sure of the wrap around case producing (S32) <0 //to compare we also need to be sure of the wrap around case producing (S32) <0
//or in terms of the U32 an out of bounds index in the array. //or in terms of the U32 an out of bounds index in the array.
if ((S32)volume_id > mNumCollisionVolumes || (S32)volume_id<0) if ((S32)volume_id > (S32)mCollisionVolumes.size() || (S32)volume_id<0)
{ {
return NULL; return NULL;
} }
return &mCollisionVolumes[volume_id]; return mCollisionVolumes[volume_id];
} }
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
@@ -1279,9 +1276,9 @@ LLJoint* LLAvatarAppearance::findCollisionVolume(U32 volume_id)
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
S32 LLAvatarAppearance::getCollisionVolumeID(std::string &name) S32 LLAvatarAppearance::getCollisionVolumeID(std::string &name)
{ {
for (S32 i = 0; i < mNumCollisionVolumes; i++) for (S32 i = 0; i < (S32)mCollisionVolumes.size(); i++)
{ {
if (mCollisionVolumes[i].getName() == name) if (mCollisionVolumes[i]->getName() == name)
{ {
return i; return i;
} }
@@ -1530,21 +1527,34 @@ LLTexLayerSet* LLAvatarAppearance::getAvatarLayerSet(EBakedTextureIndex baked_in
return mBakedTextureDatas[baked_index].mTexLayerSet; return mBakedTextureDatas[baked_index].mTexLayerSet;
} }
void LLAvatarAppearance::clearCollisionVolumes()
{
std::for_each(mCollisionVolumes.begin(), mCollisionVolumes.end(),
DeletePointer());
mCollisionVolumes.clear();
}
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// allocateCollisionVolumes() // allocateCollisionVolumes()
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
BOOL LLAvatarAppearance::allocateCollisionVolumes( U32 num ) BOOL LLAvatarAppearance::allocateCollisionVolumes( U32 num )
{ {
deleteAndClearArray(mCollisionVolumes); mCollisionVolumes.reserve(num);
mNumCollisionVolumes = 0;
mCollisionVolumes = new LLAvatarJointCollisionVolume[num]; LLAvatarJointCollisionVolume* cv;
if (!mCollisionVolumes) for (U32 i = 0; i < num; ++i)
{ {
return FALSE; cv = new LLAvatarJointCollisionVolume();
if (cv)
{
mCollisionVolumes.push_back(cv);
}
else
{
clearCollisionVolumes();
return false;
}
} }
mNumCollisionVolumes = num;
return TRUE; return TRUE;
} }

View File

@@ -337,9 +337,9 @@ protected:
// Collision volumes // Collision volumes
//-------------------------------------------------------------------- //--------------------------------------------------------------------
public: public:
S32 mNumCollisionVolumes; std::vector<LLAvatarJointCollisionVolume*> mCollisionVolumes;
LLAvatarJointCollisionVolume* mCollisionVolumes;
protected: protected:
void clearCollisionVolumes();
BOOL allocateCollisionVolumes(U32 num); BOOL allocateCollisionVolumes(U32 num);
/** Physics /** Physics

View File

@@ -647,11 +647,11 @@ BOOL LLPolyMorphTarget::setInfo(LLPolyMorphTargetInfo* info)
for (iter = getInfo()->mVolumeInfoList.begin(); iter != getInfo()->mVolumeInfoList.end(); iter++) for (iter = getInfo()->mVolumeInfoList.begin(); iter != getInfo()->mVolumeInfoList.end(); iter++)
{ {
LLPolyVolumeMorphInfo *volume_info = &(*iter); LLPolyVolumeMorphInfo *volume_info = &(*iter);
for (S32 i = 0; i < avatarp->mNumCollisionVolumes; i++) for (S32 i = 0; i < (S32)avatarp->mCollisionVolumes.size(); i++)
{ {
if (avatarp->mCollisionVolumes[i].getName() == volume_info->mName) if (avatarp->mCollisionVolumes[i]->getName() == volume_info->mName)
{ {
mVolumeMorphs.push_back(LLPolyVolumeMorph(&avatarp->mCollisionVolumes[i], mVolumeMorphs.push_back(LLPolyVolumeMorph(avatarp->mCollisionVolumes[i],
volume_info->mScale, volume_info->mScale,
volume_info->mPos)); volume_info->mPos));
break; break;

View File

@@ -206,6 +206,7 @@ namespace
return "Unknown"; return "Unknown";
} }
#if LL_LINUX
std::string compute_CPUFamilyName(const char* cpu_vendor, int composed_family) std::string compute_CPUFamilyName(const char* cpu_vendor, int composed_family)
{ {
const char* intel_string = "GenuineIntel"; const char* intel_string = "GenuineIntel";
@@ -221,6 +222,7 @@ namespace
return "Unknown"; return "Unknown";
} }
#else
std::string compute_CPUFamilyName(const char* cpu_vendor, int family, int ext_family) std::string compute_CPUFamilyName(const char* cpu_vendor, int family, int ext_family)
{ {
const char* intel_string = "GenuineIntel"; const char* intel_string = "GenuineIntel";
@@ -239,6 +241,7 @@ namespace
} }
return "Unknown"; return "Unknown";
} }
#endif
} // end unnamed namespace } // end unnamed namespace

View File

@@ -905,7 +905,6 @@ AIHTTPTimeoutPolicy const* AIHTTPTimeoutPolicy::getTimeoutPolicyByName(std::stri
#define P2(n, b) AIHTTPTimeoutPolicy n##_timeout(#n, b) #define P2(n, b) AIHTTPTimeoutPolicy n##_timeout(#n, b)
// Policy name Policy // Policy name Policy
P(assetUploadResponder);
P(assetReportHandler); P(assetReportHandler);
P(avatarPickerResponder); P(avatarPickerResponder);
P(authHandler); P(authHandler);
@@ -952,7 +951,6 @@ P2(meshPhysicsShapeResponder, connect_30s);
P2(meshSkinInfoResponder, connect_30s); P2(meshSkinInfoResponder, connect_30s);
P(mimeDiscoveryResponder); P(mimeDiscoveryResponder);
P(moderationResponder); P(moderationResponder);
P(newAgentInventoryVariablePriceResponder);
P(objectCostResponder); P(objectCostResponder);
P(physicsFlagsResponder); P(physicsFlagsResponder);
P(productInfoRequestResponder); P(productInfoRequestResponder);

View File

@@ -7735,6 +7735,17 @@ This should be as low as possible, but too low may break functionality</string>
<key>Value</key> <key>Value</key>
<integer>1</integer> <integer>1</integer>
</map> </map>
<key>RadarAlertShowDist</key>
<map>
<key>Comment</key>
<string>Show distance in radar announcements.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>1</integer>
</map>
<key>RadarAlertSim</key> <key>RadarAlertSim</key>
<map> <map>
<key>Comment</key> <key>Comment</key>

View File

@@ -37,6 +37,7 @@
#include "llagent.h" #include "llagent.h"
#include "llcompilequeue.h" #include "llcompilequeue.h"
#include "llfloaterbuycurrency.h" #include "llfloaterbuycurrency.h"
#include "statemachine/aifilepicker.h"
#include "llinventorydefines.h" #include "llinventorydefines.h"
#include "llinventoryobserver.h" #include "llinventoryobserver.h"
#include "llinventorypanel.h" #include "llinventorypanel.h"
@@ -66,8 +67,6 @@
#include "llsdutil.h" #include "llsdutil.h"
#include "llvfs.h" #include "llvfs.h"
#include "statemachine/aifilepicker.h"
// When uploading multiple files, don't display any of them when uploading more than this number. // When uploading multiple files, don't display any of them when uploading more than this number.
static const S32 FILE_COUNT_DISPLAY_THRESHOLD = 5; static const S32 FILE_COUNT_DISPLAY_THRESHOLD = 5;
@@ -190,7 +189,8 @@ void on_new_single_inventory_upload_complete(
LLAssetUploadResponder::LLAssetUploadResponder(const LLSD &post_data, LLAssetUploadResponder::LLAssetUploadResponder(const LLSD &post_data,
const LLUUID& vfile_id, const LLUUID& vfile_id,
LLAssetType::EType asset_type) LLAssetType::EType asset_type)
: mPostData(post_data), :
mPostData(post_data),
mVFileID(vfile_id), mVFileID(vfile_id),
mAssetType(asset_type) mAssetType(asset_type)
{ {
@@ -207,7 +207,8 @@ LLAssetUploadResponder::LLAssetUploadResponder(
const LLSD &post_data, const LLSD &post_data,
const std::string& file_name, const std::string& file_name,
LLAssetType::EType asset_type) LLAssetType::EType asset_type)
: mPostData(post_data), :
mPostData(post_data),
mFileName(file_name), mFileName(file_name),
mAssetType(asset_type) mAssetType(asset_type)
{ {
@@ -223,7 +224,7 @@ LLAssetUploadResponder::~LLAssetUploadResponder()
} }
// virtual // virtual
void LLAssetUploadResponder::httpFailure(void) void LLAssetUploadResponder::httpFailure()
{ {
llinfos << "LLAssetUploadResponder::error " << mStatus llinfos << "LLAssetUploadResponder::error " << mStatus
<< " reason: " << mReason << llendl; << " reason: " << mReason << llendl;
@@ -248,15 +249,21 @@ void LLAssetUploadResponder::httpFailure(void)
} }
//virtual //virtual
void LLAssetUploadResponder::httpSuccess(void) void LLAssetUploadResponder::httpSuccess()
{ {
const LLSD& content = getContent();
if (!content.isMap())
{
failureResult(HTTP_INTERNAL_ERROR_OTHER, "Malformed response contents", content);
return;
}
lldebugs << "LLAssetUploadResponder::result from capabilities" << llendl; lldebugs << "LLAssetUploadResponder::result from capabilities" << llendl;
std::string state = mContent["state"]; const std::string& state = content["state"].asString();
if (state == "upload") if (state == "upload")
{ {
uploadUpload(mContent); uploadUpload(content);
} }
else if (state == "complete") else if (state == "complete")
{ {
@@ -264,20 +271,20 @@ void LLAssetUploadResponder::httpSuccess(void)
if (mFileName.empty()) if (mFileName.empty())
{ {
// rename the file in the VFS to the actual asset id // rename the file in the VFS to the actual asset id
// llinfos << "Changing uploaded asset UUID to " << mContent["new_asset"].asUUID() << llendl; // LL_INFOS() << "Changing uploaded asset UUID to " << content["new_asset"].asUUID() << LL_ENDL;
gVFS->renameFile(mVFileID, mAssetType, mContent["new_asset"].asUUID(), mAssetType); gVFS->renameFile(mVFileID, mAssetType, content["new_asset"].asUUID(), mAssetType);
} }
uploadComplete(mContent); uploadComplete(content);
} }
else else
{ {
uploadFailure(mContent); uploadFailure(content);
} }
} }
void LLAssetUploadResponder::uploadUpload(const LLSD& content) void LLAssetUploadResponder::uploadUpload(const LLSD& content)
{ {
std::string uploader = content["uploader"]; const std::string& uploader = content["uploader"].asString();
if (mFileName.empty()) if (mFileName.empty())
{ {
LLHTTPClient::postFile(uploader, mVFileID, mAssetType, this); LLHTTPClient::postFile(uploader, mVFileID, mAssetType, this);
@@ -293,7 +300,7 @@ void LLAssetUploadResponder::uploadFailure(const LLSD& content)
// remove the "Uploading..." message // remove the "Uploading..." message
LLUploadDialog::modalUploadFinished(); LLUploadDialog::modalUploadFinished();
std::string reason = content["state"]; const std::string& reason = content["state"].asString();
// deal with L$ errors // deal with L$ errors
if (reason == "insufficient funds") if (reason == "insufficient funds")
{ {
@@ -316,10 +323,8 @@ void LLAssetUploadResponder::uploadComplete(const LLSD& content)
LLNewAgentInventoryResponder::LLNewAgentInventoryResponder( LLNewAgentInventoryResponder::LLNewAgentInventoryResponder(
const LLSD& post_data, const LLSD& post_data,
const LLUUID& vfile_id, const LLUUID& vfile_id,
LLAssetType::EType asset_type, LLAssetType::EType asset_type)
void (*callback)(bool, void*), : LLAssetUploadResponder(post_data, vfile_id, asset_type)
void* user_data)
: LLAssetUploadResponder(post_data, vfile_id, asset_type), mCallBack(callback), mUserData(user_data)
{ {
} }
@@ -327,17 +332,13 @@ LLNewAgentInventoryResponder::LLNewAgentInventoryResponder(
const LLSD& post_data, const LLSD& post_data,
const std::string& file_name, const std::string& file_name,
LLAssetType::EType asset_type) LLAssetType::EType asset_type)
: LLAssetUploadResponder(post_data, file_name, asset_type), mCallBack(NULL), mUserData(NULL) : LLAssetUploadResponder(post_data, file_name, asset_type)
{ {
} }
// virtual // virtual
void LLNewAgentInventoryResponder::httpFailure(void) void LLNewAgentInventoryResponder::httpFailure()
{ {
if (mCallBack)
{
(*mCallBack)(false, mUserData);
}
LLAssetUploadResponder::httpFailure(); LLAssetUploadResponder::httpFailure();
//LLImportColladaAssetCache::getInstance()->assetUploaded(mVFileID, LLUUID(), FALSE); //LLImportColladaAssetCache::getInstance()->assetUploaded(mVFileID, LLUUID(), FALSE);
} }
@@ -346,10 +347,6 @@ void LLNewAgentInventoryResponder::httpFailure(void)
//virtual //virtual
void LLNewAgentInventoryResponder::uploadFailure(const LLSD& content) void LLNewAgentInventoryResponder::uploadFailure(const LLSD& content)
{ {
if (mCallBack)
{
(*mCallBack)(false, mUserData);
}
LLAssetUploadResponder::uploadFailure(content); LLAssetUploadResponder::uploadFailure(content);
//LLImportColladaAssetCache::getInstance()->assetUploaded(mVFileID, content["new_asset"], FALSE); //LLImportColladaAssetCache::getInstance()->assetUploaded(mVFileID, content["new_asset"], FALSE);
@@ -360,14 +357,9 @@ void LLNewAgentInventoryResponder::uploadComplete(const LLSD& content)
{ {
lldebugs << "LLNewAgentInventoryResponder::result from capabilities" << llendl; lldebugs << "LLNewAgentInventoryResponder::result from capabilities" << llendl;
if (mCallBack)
{
(*mCallBack)(true, mUserData);
}
//std::ostringstream llsdxml; //std::ostringstream llsdxml;
//LLSDSerialize::toXML(content, llsdxml); //LLSDSerialize::toXML(content, llsdxml);
//llinfos << "upload complete content:\n " << llsdxml.str() << llendl; //LL_INFOS() << "upload complete content:\n " << llsdxml.str() << LL_ENDL;
LLAssetType::EType asset_type = LLAssetType::lookup(mPostData["asset_type"].asString()); LLAssetType::EType asset_type = LLAssetType::lookup(mPostData["asset_type"].asString());
LLInventoryType::EType inventory_type = LLInventoryType::lookup(mPostData["inventory_type"].asString()); LLInventoryType::EType inventory_type = LLInventoryType::lookup(mPostData["inventory_type"].asString());
@@ -456,57 +448,6 @@ void LLNewAgentInventoryResponder::uploadComplete(const LLSD& content)
*/ */
} }
LLSendTexLayerResponder::LLSendTexLayerResponder(const LLSD& post_data,
const LLUUID& vfile_id,
LLAssetType::EType asset_type,
LLBakedUploadData * baked_upload_data) :
LLAssetUploadResponder(post_data, vfile_id, asset_type),
mBakedUploadData(baked_upload_data)
{
}
LLSendTexLayerResponder::~LLSendTexLayerResponder()
{
// mBakedUploadData is normally deleted by calls to LLViewerTexLayerSetBuffer::onTextureUploadComplete() below
if (mBakedUploadData)
{ // ...but delete it in the case where uploadComplete() is never called
delete mBakedUploadData;
mBakedUploadData = NULL;
}
}
// Baked texture upload completed
void LLSendTexLayerResponder::uploadComplete(const LLSD& content)
{
LLUUID item_id = mPostData["item_id"];
std::string result = content["state"];
LLUUID new_id = content["new_asset"];
llinfos << "result: " << result << " new_id: " << new_id << llendl;
if (result == "complete"
&& mBakedUploadData != NULL)
{ // Invoke
LLViewerTexLayerSetBuffer::onTextureUploadComplete(new_id, (void*) mBakedUploadData, 0, LL_EXSTAT_NONE);
mBakedUploadData = NULL; // deleted in onTextureUploadComplete()
}
else
{ // Invoke the original callback with an error result
LLViewerTexLayerSetBuffer::onTextureUploadComplete(new_id, (void*) mBakedUploadData, -1, LL_EXSTAT_NONE);
mBakedUploadData = NULL; // deleted in onTextureUploadComplete()
}
}
void LLSendTexLayerResponder::httpFailure(void)
{
llinfos << "status: " << mStatus << " reason: " << mReason << llendl;
// Invoke the original callback with an error result
LLViewerTexLayerSetBuffer::onTextureUploadComplete(LLUUID(), (void*) mBakedUploadData, -1, LL_EXSTAT_NONE);
mBakedUploadData = NULL; // deleted in onTextureUploadComplete()
}
LLUpdateAgentInventoryResponder::LLUpdateAgentInventoryResponder( LLUpdateAgentInventoryResponder::LLUpdateAgentInventoryResponder(
const LLSD& post_data, const LLSD& post_data,
const LLUUID& vfile_id, const LLUUID& vfile_id,
@@ -533,7 +474,7 @@ void LLUpdateAgentInventoryResponder::uploadComplete(const LLSD& content)
if(!item) if(!item)
{ {
llwarns << "Inventory item for " << mVFileID llwarns << "Inventory item for " << mVFileID
<< " is no longer in agent inventory." << llendl; << " is no longer in agent inventory." << LL_ENDL;
return; return;
} }
@@ -544,7 +485,7 @@ void LLUpdateAgentInventoryResponder::uploadComplete(const LLSD& content)
gInventory.notifyObservers(); gInventory.notifyObservers();
llinfos << "Inventory item " << item->getName() << " saved into " llinfos << "Inventory item " << item->getName() << " saved into "
<< content["new_asset"].asString() << llendl; << content["new_asset"].asString() << LL_ENDL;
LLInventoryType::EType inventory_type = new_item->getInventoryType(); LLInventoryType::EType inventory_type = new_item->getInventoryType();
switch(inventory_type) switch(inventory_type)
@@ -605,6 +546,7 @@ void LLUpdateAgentInventoryResponder::uploadComplete(const LLSD& content)
{ {
previewp->onUpdateSucceeded(); previewp->onUpdateSucceeded();
} }
break; break;
} }
case LLInventoryType::IT_WEARABLE: case LLInventoryType::IT_WEARABLE:
@@ -650,8 +592,7 @@ void LLUpdateTaskInventoryResponder::uploadComplete(const LLSD& content)
case LLAssetType::AT_NOTECARD: case LLAssetType::AT_NOTECARD:
{ {
// Update the UI with the new asset. // Update the UI with the new asset.
LLPreviewNotecard* nc; LLPreviewNotecard* nc = (LLPreviewNotecard*)LLPreview::find(item_id);
nc = (LLPreviewNotecard*)LLPreview::find(item_id);
if (nc) if (nc)
{ {
// *HACK: we have to delete the asset in the VFS so // *HACK: we have to delete the asset in the VFS so
@@ -674,8 +615,7 @@ void LLUpdateTaskInventoryResponder::uploadComplete(const LLSD& content)
{ {
if (mQueueId.notNull()) if (mQueueId.notNull())
{ {
LLFloaterCompileQueue* queue = LLFloaterCompileQueue* queue = (LLFloaterCompileQueue*) LLFloaterScriptQueue::findInstance(mQueueId);
(LLFloaterCompileQueue*) LLFloaterScriptQueue::findInstance(mQueueId);
if (NULL != queue) if (NULL != queue)
{ {
queue->removeItemByItemID(item_id); queue->removeItemByItemID(item_id);
@@ -724,7 +664,7 @@ public:
{ {
llwarns llwarns
<< "LLAssetUploadResponder called with nonexistant " << "LLAssetUploadResponder called with nonexistant "
<< "vfile_id " << vfile_id << llendl; << "vfile_id " << vfile_id << LL_ENDL;
mVFileID.setNull(); mVFileID.setNull();
mAssetType = LLAssetType::AT_NONE; mAssetType = LLAssetType::AT_NONE;
} }
@@ -1020,17 +960,15 @@ LLNewAgentInventoryVariablePriceResponder::~LLNewAgentInventoryVariablePriceResp
delete mImpl; delete mImpl;
} }
void LLNewAgentInventoryVariablePriceResponder::httpFailure(void) void LLNewAgentInventoryVariablePriceResponder::httpFailure()
{ {
lldebugs const LLSD& content = getContent();
<< "LLNewAgentInventoryVariablePrice::error " << mStatus LL_WARNS("Upload") << dumpResponse() << LL_ENDL;
<< " reason: " << mReason << llendl;
if ( mContent.has("error") )
{
static const std::string _ERROR = "error"; static const std::string _ERROR = "error";
if ( content.has(_ERROR) )
mImpl->onTransportError(mContent[_ERROR]); {
mImpl->onTransportError(content[_ERROR]);
} }
else else
{ {
@@ -1038,8 +976,14 @@ void LLNewAgentInventoryVariablePriceResponder::httpFailure(void)
} }
} }
void LLNewAgentInventoryVariablePriceResponder::httpSuccess(void) void LLNewAgentInventoryVariablePriceResponder::httpSuccess()
{ {
const LLSD& content = getContent();
if (!content.isMap())
{
failureResult(HTTP_INTERNAL_ERROR_OTHER, "Malformed response contents", content);
return;
}
// Parse out application level errors and the appropriate // Parse out application level errors and the appropriate
// responses for them // responses for them
static const std::string _ERROR = "error"; static const std::string _ERROR = "error";
@@ -1053,13 +997,14 @@ void LLNewAgentInventoryVariablePriceResponder::httpSuccess(void)
static const std::string _RSVP = "rsvp"; static const std::string _RSVP = "rsvp";
// Check for application level errors // Check for application level errors
if (mContent.has(_ERROR)) if ( content.has(_ERROR) )
{ {
onApplicationLevelError(mContent[_ERROR]); LL_WARNS("Upload") << dumpResponse() << LL_ENDL;
onApplicationLevelError(content[_ERROR]);
return; return;
} }
std::string state = mContent[_STATE]; std::string state = content[_STATE];
LLAssetType::EType asset_type = mImpl->getAssetType(); LLAssetType::EType asset_type = mImpl->getAssetType();
if (_COMPLETE == state) if (_COMPLETE == state)
@@ -1068,11 +1013,11 @@ void LLNewAgentInventoryVariablePriceResponder::httpSuccess(void)
if (mImpl->getFilename().empty()) if (mImpl->getFilename().empty())
{ {
// rename the file in the VFS to the actual asset id // rename the file in the VFS to the actual asset id
// llinfos << "Changing uploaded asset UUID to " << mContent["new_asset"].asUUID() << llendl; // LL_INFOS() << "Changing uploaded asset UUID to " << content["new_asset"].asUUID() << LL_ENDL;
gVFS->renameFile( gVFS->renameFile(
mImpl->getVFileID(), mImpl->getVFileID(),
asset_type, asset_type,
mContent["new_asset"].asUUID(), content["new_asset"].asUUID(),
asset_type); asset_type);
} }
@@ -1083,8 +1028,8 @@ void LLNewAgentInventoryVariablePriceResponder::httpSuccess(void)
mImpl->getFolderID(), mImpl->getFolderID(),
mImpl->getItemName(), mImpl->getItemName(),
mImpl->getItemDescription(), mImpl->getItemDescription(),
mContent, content,
mContent[_UPLOAD_PRICE].asInteger()); content[_UPLOAD_PRICE].asInteger());
// TODO* Add bulk (serial) uploading or add // TODO* Add bulk (serial) uploading or add
// a super class of this that does so // a super class of this that does so
@@ -1092,12 +1037,13 @@ void LLNewAgentInventoryVariablePriceResponder::httpSuccess(void)
else if ( _CONFIRM_UPLOAD == state ) else if ( _CONFIRM_UPLOAD == state )
{ {
showConfirmationDialog( showConfirmationDialog(
mContent[_UPLOAD_PRICE].asInteger(), content[_UPLOAD_PRICE].asInteger(),
mContent[_RESOURCE_COST].asInteger(), content[_RESOURCE_COST].asInteger(),
mContent[_RSVP].asString()); content[_RSVP].asString());
} }
else else
{ {
LL_WARNS("Upload") << dumpResponse() << LL_ENDL;
onApplicationLevelError(""); onApplicationLevelError("");
} }
} }
@@ -1170,3 +1116,4 @@ void LLNewAgentInventoryVariablePriceResponder::showConfirmationDialog(
} }
} }

View File

@@ -36,10 +36,6 @@
#include "llhttpclient.h" #include "llhttpclient.h"
#include "llinventory.h" #include "llinventory.h"
class AIHTTPTimeoutPolicy;
extern AIHTTPTimeoutPolicy assetUploadResponder_timeout;
extern AIHTTPTimeoutPolicy newAgentInventoryVariablePriceResponder_timeout;
void on_new_single_inventory_upload_complete(LLAssetType::EType asset_type, void on_new_single_inventory_upload_complete(LLAssetType::EType asset_type,
LLInventoryType::EType inventory_type, LLInventoryType::EType inventory_type,
const std::string inventory_type_string, const std::string inventory_type_string,
@@ -53,6 +49,8 @@ void on_new_single_inventory_upload_complete(LLAssetType::EType asset_type,
// via capabilities // via capabilities
class LLAssetUploadResponder : public LLHTTPClient::ResponderWithResult class LLAssetUploadResponder : public LLHTTPClient::ResponderWithResult
{ {
protected:
LOG_CLASS(LLAssetUploadResponder);
public: public:
LLAssetUploadResponder(const LLSD& post_data, LLAssetUploadResponder(const LLSD& post_data,
const LLUUID& vfile_id, const LLUUID& vfile_id,
@@ -61,10 +59,12 @@ public:
const std::string& file_name, const std::string& file_name,
LLAssetType::EType asset_type); LLAssetType::EType asset_type);
~LLAssetUploadResponder(); ~LLAssetUploadResponder();
/*virtual*/ void httpFailure(void);
/*virtual*/ void httpSuccess(void);
/*virtual*/ AIHTTPTimeoutPolicy const& getHTTPTimeoutPolicy(void) const { return assetUploadResponder_timeout; }
protected:
virtual void httpFailure();
virtual void httpSuccess();
public:
virtual void uploadUpload(const LLSD& content); virtual void uploadUpload(const LLSD& content);
virtual void uploadComplete(const LLSD& content); virtual void uploadComplete(const LLSD& content);
virtual void uploadFailure(const LLSD& content); virtual void uploadFailure(const LLSD& content);
@@ -76,25 +76,24 @@ protected:
std::string mFileName; std::string mFileName;
}; };
// TODO*: Remove this once deprecated
class LLNewAgentInventoryResponder : public LLAssetUploadResponder class LLNewAgentInventoryResponder : public LLAssetUploadResponder
{ {
void (*mCallBack)(bool, void*); LOG_CLASS(LLNewAgentInventoryResponder);
void* mUserData;
public: public:
LLNewAgentInventoryResponder( LLNewAgentInventoryResponder(
const LLSD& post_data, const LLSD& post_data,
const LLUUID& vfile_id, const LLUUID& vfile_id,
LLAssetType::EType asset_type, LLAssetType::EType asset_type);
void (*callback)(bool, void*) = NULL,
void* user_data = NULL);
LLNewAgentInventoryResponder( LLNewAgentInventoryResponder(
const LLSD& post_data, const LLSD& post_data,
const std::string& file_name, const std::string& file_name,
LLAssetType::EType asset_type); LLAssetType::EType asset_type);
/*virtual*/ void httpFailure(void);
virtual void uploadComplete(const LLSD& content); virtual void uploadComplete(const LLSD& content);
virtual void uploadFailure(const LLSD& content); virtual void uploadFailure(const LLSD& content);
/*virtual*/ char const* getName(void) const { return "LLNewAgentInventoryResponder"; } /*virtual*/ char const* getName() const { return "LLNewAgentInventoryResponder"; }
protected:
virtual void httpFailure();
}; };
// A base class which goes through and performs some default // A base class which goes through and performs some default
@@ -104,6 +103,7 @@ public:
class LLNewAgentInventoryVariablePriceResponder : class LLNewAgentInventoryVariablePriceResponder :
public LLHTTPClient::ResponderWithResult public LLHTTPClient::ResponderWithResult
{ {
LOG_CLASS(LLNewAgentInventoryVariablePriceResponder);
public: public:
LLNewAgentInventoryVariablePriceResponder( LLNewAgentInventoryVariablePriceResponder(
const LLUUID& vfile_id, const LLUUID& vfile_id,
@@ -116,10 +116,11 @@ public:
const LLSD& inventory_info); const LLSD& inventory_info);
virtual ~LLNewAgentInventoryVariablePriceResponder(); virtual ~LLNewAgentInventoryVariablePriceResponder();
/*virtual*/ void httpFailure(void); private:
/*virtual*/ void httpSuccess(void); /* virtual */ void httpFailure();
/*virtual*/ AIHTTPTimeoutPolicy const& getHTTPTimeoutPolicy(void) const { return newAgentInventoryVariablePriceResponder_timeout; } /* virtual */ void httpSuccess();
public:
virtual void onApplicationLevelError( virtual void onApplicationLevelError(
const LLSD& error); const LLSD& error);
virtual void showConfirmationDialog( virtual void showConfirmationDialog(
@@ -132,25 +133,6 @@ private:
Impl* mImpl; Impl* mImpl;
}; };
struct LLBakedUploadData;
class LLSendTexLayerResponder : public LLAssetUploadResponder
{
LOG_CLASS(LLSendTexLayerResponder);
public:
LLSendTexLayerResponder(const LLSD& post_data,
const LLUUID& vfile_id,
LLAssetType::EType asset_type,
LLBakedUploadData * baked_upload_data);
~LLSendTexLayerResponder();
/*virtual*/ void uploadComplete(const LLSD& content);
/*virtual*/ void httpFailure(void);
/*virtual*/ char const* getName(void) const { return "LLSendTexLayerResponder"; }
LLBakedUploadData * mBakedUploadData;
};
class LLUpdateAgentInventoryResponder : public LLAssetUploadResponder class LLUpdateAgentInventoryResponder : public LLAssetUploadResponder
{ {
public: public:
@@ -161,7 +143,7 @@ public:
const std::string& file_name, const std::string& file_name,
LLAssetType::EType asset_type); LLAssetType::EType asset_type);
virtual void uploadComplete(const LLSD& content); virtual void uploadComplete(const LLSD& content);
/*virtual*/ char const* getName(void) const { return "LLUpdateAgentInventoryResponder"; } /*virtual*/ char const* getName() const { return "LLUpdateAgentInventoryResponder"; }
}; };
class LLUpdateTaskInventoryResponder : public LLAssetUploadResponder class LLUpdateTaskInventoryResponder : public LLAssetUploadResponder
@@ -179,7 +161,7 @@ public:
LLAssetType::EType asset_type); LLAssetType::EType asset_type);
virtual void uploadComplete(const LLSD& content); virtual void uploadComplete(const LLSD& content);
/*virtual*/ char const* getName(void) const { return "LLUpdateTaskInventoryResponder"; } /*virtual*/ char const* getName() const { return "LLUpdateTaskInventoryResponder"; }
private: private:
LLUUID mQueueId; LLUUID mQueueId;

View File

@@ -68,7 +68,7 @@ extern U32 gFrameCount;
namespace namespace
{ {
void chat_avatar_status(const std::string& name, const LLUUID& key, ERadarStatType type, bool entering) void chat_avatar_status(const std::string& name, const LLUUID& key, ERadarStatType type, bool entering, const F32& dist)
{ {
if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)) return; // RLVa:LF Don't announce people are around when blind, that cheats the system. if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)) return; // RLVa:LF Don't announce people are around when blind, that cheats the system.
static LLCachedControl<bool> radar_chat_alerts(gSavedSettings, "RadarChatAlerts"); static LLCachedControl<bool> radar_chat_alerts(gSavedSettings, "RadarChatAlerts");
@@ -96,6 +96,11 @@ namespace
if (args.find("[RANGE]") != args.end()) if (args.find("[RANGE]") != args.end())
chat.mText = self->getString("template", args); chat.mText = self->getString("template", args);
else if (chat.mText.empty()) return; else if (chat.mText.empty()) return;
if (entering) // Note: If we decide to make this for leaving as well, change this check to dist != F32_MIN
{
static const LLCachedControl<bool> radar_show_dist("RadarAlertShowDist");
if (radar_show_dist) chat.mText += llformat(" (%.2fm)", dist);
}
chat.mFromName = name; chat.mFromName = name;
chat.mURL = llformat("secondlife:///app/agent/%s/about",key.asString().c_str()); chat.mURL = llformat("secondlife:///app/agent/%s/about",key.asString().c_str());
chat.mSourceType = CHAT_SOURCE_SYSTEM; chat.mSourceType = CHAT_SOURCE_SYSTEM;
@@ -160,7 +165,7 @@ void LLAvatarListEntry::processProperties(void* data, EAvatarProcessorType type)
static const LLCachedControl<U32> sAvatarAgeAlertDays(gSavedSettings, "AvatarAgeAlertDays"); static const LLCachedControl<U32> sAvatarAgeAlertDays(gSavedSettings, "AvatarAgeAlertDays");
if ((U32)mAge < sAvatarAgeAlertDays) if ((U32)mAge < sAvatarAgeAlertDays)
{ {
chat_avatar_status(mName, mID, STAT_TYPE_AGE, mStats[STAT_TYPE_AGE] = true); chat_avatar_status(mName, mID, STAT_TYPE_AGE, mStats[STAT_TYPE_AGE] = true, (mPosition - gAgent.getPositionGlobal()).magVec());
} }
} }
// If one wanted more information that gets displayed on profiles to be displayed, here would be the place to do it. // If one wanted more information that gets displayed on profiles to be displayed, here would be the place to do it.
@@ -168,14 +173,18 @@ void LLAvatarListEntry::processProperties(void* data, EAvatarProcessorType type)
} }
} }
void LLAvatarListEntry::setPosition(const LLVector3d& position, bool this_sim, bool drawn, bool chatrange, bool shoutrange) void LLAvatarListEntry::setPosition(const LLVector3d& position, const F32& dist, bool drawn)
{ {
mPosition = position; mPosition = position;
mFrame = gFrameCount; mFrame = gFrameCount;
if (this_sim != mStats[STAT_TYPE_SIM]) chat_avatar_status(mName, mID, STAT_TYPE_SIM, mStats[STAT_TYPE_SIM] = this_sim); bool here(dist != F32_MIN); // F32_MIN only if dead
if (drawn != mStats[STAT_TYPE_DRAW]) chat_avatar_status(mName, mID, STAT_TYPE_DRAW, mStats[STAT_TYPE_DRAW] = drawn); bool this_sim(here && (gAgent.getRegion()->pointInRegionGlobal(position) || !(LLWorld::getInstance()->positionRegionValidGlobal(position))));
if (shoutrange != mStats[STAT_TYPE_SHOUTRANGE]) chat_avatar_status(mName, mID, STAT_TYPE_SHOUTRANGE, mStats[STAT_TYPE_SHOUTRANGE] = shoutrange); if (this_sim != mStats[STAT_TYPE_SIM]) chat_avatar_status(mName, mID, STAT_TYPE_SIM, mStats[STAT_TYPE_SIM] = this_sim, dist);
if (chatrange != mStats[STAT_TYPE_CHATRANGE]) chat_avatar_status(mName, mID, STAT_TYPE_CHATRANGE, mStats[STAT_TYPE_CHATRANGE] = chatrange); if (drawn != mStats[STAT_TYPE_DRAW]) chat_avatar_status(mName, mID, STAT_TYPE_DRAW, mStats[STAT_TYPE_DRAW] = drawn, dist);
bool shoutrange(here && dist < LFSimFeatureHandler::getInstance()->shoutRange());
if (shoutrange != mStats[STAT_TYPE_SHOUTRANGE]) chat_avatar_status(mName, mID, STAT_TYPE_SHOUTRANGE, mStats[STAT_TYPE_SHOUTRANGE] = shoutrange, dist);
bool chatrange(here && dist < LFSimFeatureHandler::getInstance()->sayRange());
if (chatrange != mStats[STAT_TYPE_CHATRANGE]) chat_avatar_status(mName, mID, STAT_TYPE_CHATRANGE, mStats[STAT_TYPE_CHATRANGE] = chatrange, dist);
mUpdateTimer.start(); mUpdateTimer.start();
} }
@@ -553,8 +562,7 @@ void LLFloaterAvatarList::updateAvatarList()
} }
// Announce position // Announce position
F32 dist((position - mypos).magVec()); entry->setPosition(position, (position - mypos).magVec(), avatarp);
entry->setPosition(position, gAgent.getRegion()->pointInRegionGlobal(position) || !(LLWorld::getInstance()->positionRegionValidGlobal(position)), avatarp, dist < LFSimFeatureHandler::getInstance()->sayRange(), dist < LFSimFeatureHandler::getInstance()->shoutRange());
// Mark as typing if they are typing // Mark as typing if they are typing
if (avatarp && avatarp->isTyping()) entry->setActivity(LLAvatarListEntry::ACTIVITY_TYPING); if (avatarp && avatarp->isTyping()) entry->setActivity(LLAvatarListEntry::ACTIVITY_TYPING);
@@ -621,7 +629,7 @@ void LLFloaterAvatarList::expireAvatarList()
} }
else else
{ {
entry->setPosition(entry->getPosition(), false, false, false, false); // Dead and gone entry->setPosition(entry->getPosition(), F32_MIN, false); // Dead and gone
it = mAvatars.erase(it); it = mAvatars.erase(it);
} }
} }
@@ -700,6 +708,9 @@ void LLFloaterAvatarList::refreshAvatarList()
LLScrollListItem::Params element; LLScrollListItem::Params element;
element.value = av_id; element.value = av_id;
static const LLCachedControl<bool> hide_mark("RadarColumnMarkHidden");
if (!hide_mark)
{
LLScrollListCell::Params mark; LLScrollListCell::Params mark;
mark.column = "marked"; mark.column = "marked";
mark.type = "text"; mark.type = "text";
@@ -709,7 +720,17 @@ void LLFloaterAvatarList::refreshAvatarList()
mark.color = LLColor4::blue; mark.color = LLColor4::blue;
mark.font_style = "BOLD"; mark.font_style = "BOLD";
} }
element.columns.add(mark);
}
static const LLCachedControl<LLColor4> unselected_color(gColors, "ScrollUnselectedColor", LLColor4(0.f, 0.f, 0.f, 0.8f));
static const LLCachedControl<LLColor4> sDefaultListText(gColors, "DefaultListText");
static const LLCachedControl<LLColor4> ascent_muted_color("AscentMutedColor", LLColor4(0.7f,0.7f,0.7f,1.f));
LLColor4 color = sDefaultListText;
// Name never hidden
{
LLScrollListCell::Params name; LLScrollListCell::Params name;
name.column = "avatar_name"; name.column = "avatar_name";
name.type = "text"; name.type = "text";
@@ -722,22 +743,10 @@ void LLFloaterAvatarList::refreshAvatarList()
//<edit> custom colors for certain types of avatars! //<edit> custom colors for certain types of avatars!
//Changed a bit so people can modify them in settings. And since they're colors, again it's possibly account-based. Starting to think I need a function just to determine that. - HgB //Changed a bit so people can modify them in settings. And since they're colors, again it's possibly account-based. Starting to think I need a function just to determine that. - HgB
//name.color = gColors.getColor( "MapAvatar" ); //name.color = gColors.getColor( "MapAvatar" );
LLViewerRegion* parent_estate = LLWorld::getInstance()->getRegionFromPosGlobal(entry->getPosition());
LLUUID estate_owner = LLUUID::null; LLUUID estate_owner = LLUUID::null;
if (parent_estate && parent_estate->isAlive()) if (LLViewerRegion* parent_estate = LLWorld::getInstance()->getRegionFromPosGlobal(entry->getPosition()))
{ if (parent_estate->isAlive())
estate_owner = parent_estate->getOwner(); estate_owner = parent_estate->getOwner();
}
static const LLCachedControl<LLColor4> unselected_color(gColors, "ScrollUnselectedColor", LLColor4(0.f, 0.f, 0.f, 0.8f));
static LLCachedControl<LLColor4> sDefaultListText(gColors, "DefaultListText");
static LLCachedControl<LLColor4> sRadarTextChatRange(gColors, "RadarTextChatRange");
static LLCachedControl<LLColor4> sRadarTextShoutRange(gColors, "RadarTextShoutRange");
static LLCachedControl<LLColor4> sRadarTextDrawDist(gColors, "RadarTextDrawDist");
static LLCachedControl<LLColor4> sRadarTextYoung(gColors, "RadarTextYoung");
static const LLCachedControl<LLColor4> ascent_muted_color("AscentMutedColor", LLColor4(0.7f,0.7f,0.7f,1.f));
LLColor4 color = sDefaultListText;
//Lindens are always more Linden than your friend, make that take precedence //Lindens are always more Linden than your friend, make that take precedence
if (mm_getMarkerColor(av_id, color)) {} if (mm_getMarkerColor(av_id, color)) {}
@@ -764,12 +773,17 @@ void LLFloaterAvatarList::refreshAvatarList()
color = ascent_muted_color; color = ascent_muted_color;
} }
name.color = color*0.5f + unselected_color*0.5f; name.color = color*0.5f + unselected_color*0.5f;
element.columns.add(name);
}
char temp[32]; char temp[32];
// Distance never hidden
{
color = sDefaultListText; color = sDefaultListText;
LLScrollListCell::Params dist; LLScrollListCell::Params dist;
dist.column = "distance"; dist.column = "distance";
dist.type = "text"; dist.type = "text";
static const LLCachedControl<LLColor4> sRadarTextDrawDist(gColors, "RadarTextDrawDist");
if (UnknownAltitude) if (UnknownAltitude)
{ {
strcpy(temp, "?"); strcpy(temp, "?");
@@ -782,6 +796,8 @@ void LLFloaterAvatarList::refreshAvatarList()
{ {
if (distance <= LFSimFeatureHandler::getInstance()->shoutRange()) if (distance <= LFSimFeatureHandler::getInstance()->shoutRange())
{ {
static const LLCachedControl<LLColor4> sRadarTextChatRange(gColors, "RadarTextChatRange");
static const LLCachedControl<LLColor4> sRadarTextShoutRange(gColors, "RadarTextShoutRange");
snprintf(temp, sizeof(temp), "%.1f", distance); snprintf(temp, sizeof(temp), "%.1f", distance);
color = (distance > LFSimFeatureHandler::getInstance()->sayRange()) ? sRadarTextShoutRange : sRadarTextChatRange; color = (distance > LFSimFeatureHandler::getInstance()->sayRange()) ? sRadarTextShoutRange : sRadarTextChatRange;
} }
@@ -794,7 +810,12 @@ void LLFloaterAvatarList::refreshAvatarList()
dist.value = temp; dist.value = temp;
dist.color = color * 0.7f + unselected_color * 0.3f; // Liru: Blend testing! dist.color = color * 0.7f + unselected_color * 0.3f; // Liru: Blend testing!
//dist.color = color; //dist.color = color;
element.columns.add(dist);
}
static const LLCachedControl<bool> hide_pos("RadarColumnPositionHidden");
if (!hide_pos)
{
LLScrollListCell::Params pos; LLScrollListCell::Params pos;
position -= simpos; position -= simpos;
@@ -827,7 +848,12 @@ void LLFloaterAvatarList::refreshAvatarList()
pos.column = "position"; pos.column = "position";
pos.type = "text"; pos.type = "text";
pos.value = temp; pos.value = temp;
element.columns.add(pos);
}
static const LLCachedControl<bool> hide_alt("RadarColumnAltitudeHidden");
if (!hide_alt)
{
LLScrollListCell::Params alt; LLScrollListCell::Params alt;
alt.column = "altitude"; alt.column = "altitude";
alt.type = "text"; alt.type = "text";
@@ -840,11 +866,13 @@ void LLFloaterAvatarList::refreshAvatarList()
snprintf(temp, sizeof(temp), "%d", (S32)position.mdV[VZ]); snprintf(temp, sizeof(temp), "%d", (S32)position.mdV[VZ]);
} }
alt.value = temp; alt.value = temp;
element.columns.add(alt);
}
LLScrollListCell::Params act;
static const LLCachedControl<bool> hide_act("RadarColumnActivityHidden"); static const LLCachedControl<bool> hide_act("RadarColumnActivityHidden");
if (!hide_act) if (!hide_act)
{ {
LLScrollListCell::Params act;
act.column = "activity"; act.column = "activity";
act.type = "icon"; act.type = "icon";
switch(entry->getActivity()) switch(entry->getActivity())
@@ -880,12 +908,13 @@ void LLFloaterAvatarList::refreshAvatarList()
default: default:
break; break;
} }
element.columns.add(act);
} }
LLScrollListCell::Params voice;
static const LLCachedControl<bool> hide_voice("RadarColumnVoiceHidden"); static const LLCachedControl<bool> hide_voice("RadarColumnVoiceHidden");
if (!hide_voice) if (!hide_voice)
{ {
LLScrollListCell::Params voice;
voice.column("voice"); voice.column("voice");
voice.type("icon"); voice.type("icon");
// transplant from llparticipantlist.cpp, update accordingly. // transplant from llparticipantlist.cpp, update accordingly.
@@ -914,8 +943,12 @@ void LLFloaterAvatarList::refreshAvatarList()
voice.color(speakerp->mStatus > LLSpeaker::STATUS_VOICE_ACTIVE ? LLColor4::transparent : speakerp->mDotColor); voice.color(speakerp->mStatus > LLSpeaker::STATUS_VOICE_ACTIVE ? LLColor4::transparent : speakerp->mDotColor);
} }
} }
element.columns.add(voice);
} }
static const LLCachedControl<bool> hide_age("RadarColumnAgeHidden");
if (!hide_age)
{
LLScrollListCell::Params agep; LLScrollListCell::Params agep;
agep.column = "age"; agep.column = "age";
agep.type = "text"; agep.type = "text";
@@ -925,15 +958,23 @@ void LLFloaterAvatarList::refreshAvatarList()
{ {
static const LLCachedControl<U32> sAvatarAgeAlertDays(gSavedSettings, "AvatarAgeAlertDays"); static const LLCachedControl<U32> sAvatarAgeAlertDays(gSavedSettings, "AvatarAgeAlertDays");
if ((U32)entry->mAge < sAvatarAgeAlertDays) if ((U32)entry->mAge < sAvatarAgeAlertDays)
{
static const LLCachedControl<LLColor4> sRadarTextYoung(gColors, "RadarTextYoung");
color = sRadarTextYoung; color = sRadarTextYoung;
} }
}
else else
{ {
age = "?"; age = "?";
} }
agep.value = age; agep.value = age;
agep.color = color; agep.color = color;
element.columns.add(agep);
}
static const LLCachedControl<bool> hide_time("RadarColumnTimeHidden");
if (!hide_time)
{
int dur = difftime(time(NULL), entry->getTime()); int dur = difftime(time(NULL), entry->getTime());
int hours = dur / 3600; int hours = dur / 3600;
int mins = (dur % 3600) / 60; int mins = (dur % 3600) / 60;
@@ -943,7 +984,12 @@ void LLFloaterAvatarList::refreshAvatarList()
time.column = "time"; time.column = "time";
time.type = "text"; time.type = "text";
time.value = llformat("%d:%02d:%02d", hours, mins, secs); time.value = llformat("%d:%02d:%02d", hours, mins, secs);
element.columns.add(time);
}
static const LLCachedControl<bool> hide_client("RadarColumnClientHidden");
if (!hide_client)
{
LLScrollListCell::Params viewer; LLScrollListCell::Params viewer;
viewer.column = "client"; viewer.column = "client";
viewer.type = "text"; viewer.type = "text";
@@ -967,18 +1013,8 @@ void LLFloaterAvatarList::refreshAvatarList()
} }
//Blend to make the color show up better //Blend to make the color show up better
viewer.color = color *.5f + unselected_color * .5f; viewer.color = color *.5f + unselected_color * .5f;
// Add individual column cell params to the item param
element.columns.add(mark);
element.columns.add(name);
element.columns.add(dist);
element.columns.add(pos);
element.columns.add(alt);
if (!hide_act) element.columns.add(act);
if (!hide_voice) element.columns.add(voice);
element.columns.add(agep);
element.columns.add(time);
element.columns.add(viewer); element.columns.add(viewer);
}
// Add to list // Add to list
mAvatarList->addRow(element); mAvatarList->addRow(element);

View File

@@ -80,7 +80,7 @@ enum ACTIVITY_TYPE
* Update world position. * Update world position.
* Affects age. * Affects age.
*/ */
void setPosition(const LLVector3d& position, bool this_sim, bool drawn, bool chatrange, bool shoutrange); void setPosition(const LLVector3d& position, const F32& dist, bool drawn);
const LLVector3d& getPosition() const { return mPosition; } const LLVector3d& getPosition() const { return mPosition; }

View File

@@ -1426,7 +1426,7 @@ void LLSnapshotLivePreview::saveTexture()
LLAssetStorage::LLStoreAssetCallback callback = &LLSnapshotLivePreview::saveTextureDone; LLAssetStorage::LLStoreAssetCallback callback = &LLSnapshotLivePreview::saveTextureDone;
S32 expected_upload_cost = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload(); S32 expected_upload_cost = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload();
saveTextureUserData* user_data = new saveTextureUserData(this, sSnapshotIndex, gSavedSettings.getBOOL("TemporaryUpload")); saveTextureUserData* user_data = new saveTextureUserData(this, sSnapshotIndex, gSavedSettings.getBOOL("TemporaryUpload"));
if (!upload_new_resource(tid, // tid if (upload_new_resource(tid, // tid
LLAssetType::AT_TEXTURE, LLAssetType::AT_TEXTURE,
"Snapshot : " + pos_string, "Snapshot : " + pos_string,
"Taken by " + who_took_it + " at " + pos_string, "Taken by " + who_took_it + " at " + pos_string,
@@ -1437,7 +1437,11 @@ void LLSnapshotLivePreview::saveTexture()
LLFloaterPerms::getGroupPerms("Uploads"), // that is more permissive than other uploads LLFloaterPerms::getGroupPerms("Uploads"), // that is more permissive than other uploads
LLFloaterPerms::getEveryonePerms("Uploads"), LLFloaterPerms::getEveryonePerms("Uploads"),
"Snapshot : " + pos_string, "Snapshot : " + pos_string,
callback, expected_upload_cost, user_data, &LLSnapshotLivePreview::saveTextureDone2)) callback, expected_upload_cost, user_data))
{
saveTextureDone2(true, user_data);
}
else
{ {
// Something went wrong. // Something went wrong.
delete user_data; delete user_data;

View File

@@ -101,7 +101,6 @@ void LLMediaFilter::filterAudioUrl(const std::string& url)
{ {
if (url.empty()) if (url.empty())
{ {
gAudiop->startInternetStream(url);
return; return;
} }
if (url == mCurrentAudioURL) return; if (url == mCurrentAudioURL) return;

View File

@@ -5201,7 +5201,9 @@ void LLSelectMgr::processObjectProperties(LLMessageSystem* msg, void** user_data
{ {
if (node->mInventorySerial != inv_serial) if (node->mInventorySerial != inv_serial)
{ {
node->getObject()->dirtyInventory(); if (LLViewerObject* object = node->getObject())
if (object->getInventorySerial() != inv_serial) // Singu Note: the serial number in the object may be correct.
object->dirtyInventory();
} }
// save texture data as soon as we get texture perms first time // save texture data as soon as we get texture perms first time

View File

@@ -1177,8 +1177,7 @@ bool upload_new_resource(
const std::string& display_name, const std::string& display_name,
LLAssetStorage::LLStoreAssetCallback callback, LLAssetStorage::LLStoreAssetCallback callback,
S32 expected_upload_cost, S32 expected_upload_cost,
void *userdata, void *userdata)
void (*callback2)(bool, void*))
{ {
if(gDisconnected) if(gDisconnected)
{ {
@@ -1230,9 +1229,7 @@ bool upload_new_resource(
new LLNewAgentInventoryResponder( new LLNewAgentInventoryResponder(
body, body,
uuid, uuid,
asset_type, asset_type));
callback2,
userdata));
} }
else else
{ {
@@ -1294,17 +1291,16 @@ bool upload_new_resource(
LLAssetID generate_asset_id_for_new_upload(const LLTransactionID& tid) LLAssetID generate_asset_id_for_new_upload(const LLTransactionID& tid)
{ {
LLAssetID uuid;
if (gDisconnected) if (gDisconnected)
{ {
uuid.setNull(); LLAssetID rv;
}
else rv.setNull();
{ return rv;
uuid = tid.makeAssetID(gAgent.getSecureSessionID());
} }
LLAssetID uuid = tid.makeAssetID(gAgent.getSecureSessionID());
return uuid; return uuid;
} }

View File

@@ -78,8 +78,7 @@ bool upload_new_resource(const LLTransactionID &tid,
const std::string& display_name, const std::string& display_name,
LLAssetStorage::LLStoreAssetCallback callback, LLAssetStorage::LLStoreAssetCallback callback,
S32 expected_upload_cost, S32 expected_upload_cost,
void *userdata, void *userdata);
void (*callback2)(bool, void*) = NULL);
// The default callback functions, called when 'callback' == NULL (for normal and temporary uploads). // The default callback functions, called when 'callback' == NULL (for normal and temporary uploads).
// user_data must be a LLResourceData allocated with new (or NULL). // user_data must be a LLResourceData allocated with new (or NULL).

File diff suppressed because it is too large Load Diff

View File

@@ -30,10 +30,22 @@
#ifndef LL_LLVIEWEROBJECTBACKUP_H #ifndef LL_LLVIEWEROBJECTBACKUP_H
#define LL_LLVIEWEROBJECTBACKUP_H #define LL_LLVIEWEROBJECTBACKUP_H
#include <deque>
#include <string>
#include <vector>
#include "boost/unordered_map.hpp" #include "boost/unordered_map.hpp"
#include "boost/unordered_set.hpp" #include "boost/unordered_set.hpp"
#include "llfloater.h"
#include "statemachine/aifilepicker.h"
#include "lluuid.h"
#include "llviewerinventory.h" #include "llviewerinventory.h"
#include "llviewerobject.h"
class LLSelectNode;
class LLViewerObject;
enum export_states { enum export_states {
EXPORT_INIT, EXPORT_INIT,
@@ -43,24 +55,27 @@ enum export_states {
EXPORT_TEXTURES, EXPORT_TEXTURES,
EXPORT_LLSD, EXPORT_LLSD,
EXPORT_DONE, EXPORT_DONE,
EXPORT_FAILED EXPORT_FAILED,
EXPORT_ABORTED
}; };
class LLObjectBackup : public LLFloater class LLObjectBackup : public LLFloater,
public LLFloaterSingleton<LLObjectBackup>
{ {
friend class LLUISingleton<LLObjectBackup, VisibilityPolicy<LLFloater> >;
protected:
LOG_CLASS(LLObjectBackup);
public: public:
virtual ~LLObjectBackup(); ///////////////////////////////////////////////////////////////////////////
// LLFloater interface
// Floater stuff /*virtual*/ ~LLObjectBackup();
virtual void show(bool exporting); /*virtual*/ void onClose(bool app_quitting);
virtual void onClose(bool app_quitting);
// Static accessor ///////////////////////////////////////////////////////////////////////////
static LLObjectBackup* getInstance(); // Public interface for invoking the object backup feature
static bool instanceExists() { return sInstance != NULL; }
// Export idle callback
static void exportWorker(void *userdata);
// Import entry point // Import entry point
void importObject(bool upload = false); void importObject(bool upload = false);
@@ -70,47 +85,44 @@ public:
void exportObject(); void exportObject();
void exportObject_continued(AIFilePicker* filepicker); void exportObject_continued(AIFilePicker* filepicker);
///////////////////////////////////////////////////////////////////////////
// Public methods used in callbacks, workers and responders
// Update map from texture worker // Update map from texture worker
void updateMap(LLUUID uploaded_asset); void updateMap(LLUUID uploaded_asset);
// Move to next texture upload // Move to next texture upload, called by the agent inventory responder
void uploadNextAsset(); void uploadNextAsset();
// Folder public geter // Export idle callback
std::string getfolder() { return mFolder; } static void exportWorker(void *userdata);
// Prim updated callback // Prim updated callback, called in llviewerobjectlist.cpp
void primUpdate(LLViewerObject* object); static void primUpdate(LLViewerObject* object);
// New prim call back // New prim call back, called in llviewerobjectlist.cpp
bool newPrim(LLViewerObject* pobject); static void newPrim(LLViewerObject* object);
static const U32 TEXTURE_OK = 0x00; // Folder public getter, used by the texture cache responder
static const U32 TEXTURE_BAD_PERM = 0x01; std::string getFolder() { return mFolder; }
static const U32 TEXTURE_MISSING = 0x02;
static const U32 TEXTURE_BAD_ENCODING = 0x04;
static const U32 TEXTURE_IS_NULL = 0x08;
static const U32 TEXTURE_SAVED_FAILED = 0x10;
// Set when the region supports the extra physics flags
bool mGotExtraPhysics;
// Are we ready to check for next texture?
bool mCheckNextTexture;
// Export state machine
enum export_states mExportState;
// Export result flags for textures.
U32 mNonExportedTextures;
static void setDefaultTextures(); static void setDefaultTextures();
// Is exporting these objects allowed // Permissions checking
bool validatePerms(const LLPermissions* item_permissions); static bool validatePerms(const LLPermissions* item_permissions);
static bool validateTexturePerms(const LLUUID& asset_id);
static bool validateNode(LLSelectNode* node);
private: private:
LLObjectBackup(); // Open only via the importObject() and exportObject() methods defined
// above.
LLObjectBackup(const LLSD&);
void showFloater(bool exporting);
static bool confirmCloseCallback(const LLSD& notification,
const LLSD& response);
// Update the floater with status numbers // Update the floater with status numbers
void updateImportNumbers(); void updateImportNumbers();
@@ -133,7 +145,7 @@ private:
void exportNextTexture(); void exportNextTexture();
// Apply LLSD to object // Apply LLSD to object
void xmlToPrim(LLSD prim_llsd, LLViewerObject* pobject); void xmlToPrim(LLSD prim_llsd, LLViewerObject* object);
// Rez a prim at a given position // Rez a prim at a given position
void rezAgentOffset(LLVector3 offset); void rezAgentOffset(LLVector3 offset);
@@ -141,9 +153,28 @@ private:
// Get an offset from the agent based on rotation and current pos // Get an offset from the agent based on rotation and current pos
LLVector3 offsetAgent(LLVector3 offset); LLVector3 offsetAgent(LLVector3 offset);
private: public:
static LLObjectBackup* sInstance; // Public static constants, used in callbacks, workers and responders
static const U32 TEXTURE_OK = 0x00;
static const U32 TEXTURE_BAD_PERM = 0x01;
static const U32 TEXTURE_MISSING = 0x02;
static const U32 TEXTURE_BAD_ENCODING = 0x04;
static const U32 TEXTURE_IS_NULL = 0x08;
static const U32 TEXTURE_SAVED_FAILED = 0x10;
// Export state machine
enum export_states mExportState;
// Export result flags for textures.
U32 mNonExportedTextures;
// Set when the region supports the extra physics flags
bool mGotExtraPhysics;
// Are we ready to check for next texture?
bool mCheckNextTexture;
private:
// Are we active flag // Are we active flag
bool mRunning; bool mRunning;
@@ -156,7 +187,7 @@ private:
U32 mPrims; U32 mPrims;
U32 mCurPrim; U32 mCurPrim;
// No prims rezed // Number of rezzed prims
U32 mRezCount; U32 mRezCount;
// Root pos and rotation and central root pos for link set // Root pos and rotation and central root pos for link set
@@ -168,31 +199,39 @@ private:
// Agent inital pos and rot when starting import // Agent inital pos and rot when starting import
LLVector3 mAgentPos; LLVector3 mAgentPos;
LLQuaternion mAgentRot; LLQuaternion mAgentRot;
// Rebase map
boost::unordered_map<LLUUID, LLUUID> mAssetMap; LLUUID mCurrentAsset;
LLUUID mExpectingUpdate;
// Working llsd iterators for objects and linksets
LLSD::map_const_iterator mPrimImportIter;
LLSD::array_const_iterator mGroupPrimImportIter;
// File and folder name control
std::string mFileName;
std::string mFolder;
// Export texture list // Export texture list
typedef boost::unordered_set<LLUUID> textures_set_t; typedef boost::unordered_set<LLUUID> textures_set_t;
textures_set_t mTexturesList; textures_set_t mTexturesList;
textures_set_t mBadPermsTexturesList; textures_set_t mBadPermsTexturesList;
// Rebase map
boost::unordered_map<LLUUID, LLUUID> mAssetMap;
// Import object tracking // Import object tracking
std::vector<LLViewerObject*> mToSelect; std::vector<LLViewerObject*> mToSelect;
std::vector<LLViewerObject*>::iterator mProcessIter; std::vector<LLViewerObject*>::iterator mProcessIter;
// File and folder name control
std::string mFileName;
std::string mFolder;
// Working LLSD holders // Working LLSD holders
LLUUID mCurrentAsset;
LLUUID mExpectingUpdate;
LLSD mLLSD; LLSD mLLSD;
LLSD mThisGroup; LLSD mThisGroup;
// Working llsd itterators for objects and linksets
LLSD::map_const_iterator mPrimImportIter;
LLSD::array_const_iterator mGroupPrimImportIter;
}; };
#endif extern LLUUID LL_TEXTURE_PLYWOOD;
extern LLUUID LL_TEXTURE_BLANK;
extern LLUUID LL_TEXTURE_INVISIBLE;
extern LLUUID LL_TEXTURE_TRANSPARENT;
extern LLUUID LL_TEXTURE_MEDIA;
#endif // LL_LLVIEWEROBJECTBACKUP_H

View File

@@ -272,7 +272,7 @@ void LLViewerObjectList::processUpdateCore(LLViewerObject* objectp,
} }
else else
{ {
LLObjectBackup::getInstance()->primUpdate(objectp); LLObjectBackup::primUpdate(objectp);
} }
@@ -310,7 +310,7 @@ void LLViewerObjectList::processUpdateCore(LLViewerObject* objectp,
gViewerWindow->getWindow()->decBusyCount(); gViewerWindow->getWindow()->decBusyCount();
gViewerWindow->getWindow()->setCursor( UI_CURSOR_ARROW ); gViewerWindow->getWindow()->setCursor( UI_CURSOR_ARROW );
LLObjectBackup::getInstance()->newPrim(objectp); LLObjectBackup::newPrim(objectp);
} }
} }
@@ -1216,6 +1216,17 @@ void LLViewerObjectList::fetchPhysicsFlags()
} }
} }
bool LLViewerObjectList::gotObjectPhysicsFlags(LLViewerObject* objectp)
{
// This will insert objectp in mStalePhysicsFlags if needed:
objectp->getPhysicsShapeType();
// Data has been retrieved if the object is not in either of the
// two lists:
const LLUUID& id = objectp->getID();
return mPendingPhysicsFlags.count(id) == 0 &&
mStalePhysicsFlags.count(id) == 0;
}
void LLViewerObjectList::clearDebugText() void LLViewerObjectList::clearDebugText()
{ {
for (vobj_list_t::iterator iter = mObjects.begin(); iter != mObjects.end(); ++iter) for (vobj_list_t::iterator iter = mObjects.begin(); iter != mObjects.end(); ++iter)

View File

@@ -99,6 +99,8 @@ public:
void fetchObjectCosts(); void fetchObjectCosts();
void fetchPhysicsFlags(); void fetchPhysicsFlags();
bool gotObjectPhysicsFlags(LLViewerObject* objectp);
void updateObjectCost(LLViewerObject* object); void updateObjectCost(LLViewerObject* object);
void updateObjectCost(const LLUUID& object_id, F32 object_cost, F32 link_cost, F32 physics_cost, F32 link_physics_cost); void updateObjectCost(const LLUUID& object_id, F32 object_cost, F32 link_cost, F32 physics_cost, F32 link_physics_cost);
void onObjectCostFetchFailure(const LLUUID& object_id); void onObjectCostFetchFailure(const LLUUID& object_id);

View File

@@ -361,6 +361,51 @@ BOOL LLViewerTexLayerSetBuffer::requestUpdateImmediate()
return result; return result;
} }
class LLSendTexLayerResponder : public LLAssetUploadResponder
{
LOG_CLASS(LLSendTexLayerResponder);
public:
LLSendTexLayerResponder(const LLSD& post_data, const LLUUID& vfile_id, LLAssetType::EType asset_type, LLBakedUploadData * baked_upload_data)
: LLAssetUploadResponder(post_data, vfile_id, asset_type)
, mBakedUploadData(baked_upload_data)
{}
~LLSendTexLayerResponder()
{
// mBakedUploadData is normally deleted by calls to LLViewerTexLayerSetBuffer::onTextureUploadComplete() below
if (mBakedUploadData)
{ // ...but delete it in the case where uploadComplete() is never called
delete mBakedUploadData;
mBakedUploadData = NULL;
}
}
// Baked texture upload completed
/*virtual*/ void uploadComplete(const LLSD& content)
{
const std::string& result = content["state"];
const LLUUID& new_id = content["new_asset"];
llinfos << "result: " << result << " new_id: " << new_id << llendl;
LLViewerTexLayerSetBuffer::onTextureUploadComplete(new_id, (void*) mBakedUploadData, (result == "complete" && mBakedUploadData) ? 0 : -1, LL_EXSTAT_NONE);
mBakedUploadData = NULL; // deleted in onTextureUploadComplete()
}
/*virtual*/ void httpFailure()
{
llinfos << dumpResponse() << llendl;
// Invoke the original callback with an error result
LLViewerTexLayerSetBuffer::onTextureUploadComplete(LLUUID::null, (void*) mBakedUploadData, -1, LL_EXSTAT_NONE);
mBakedUploadData = NULL; // deleted in onTextureUploadComplete()
}
/*virtual*/ char const* getName() const { return "LLSendTexLayerResponder"; }
private:
LLBakedUploadData* mBakedUploadData;
};
// Create the baked texture, send it out to the server, then wait for it to come // Create the baked texture, send it out to the server, then wait for it to come
// back so we can switch to using it. // back so we can switch to using it.
void LLViewerTexLayerSetBuffer::doUpload() void LLViewerTexLayerSetBuffer::doUpload()

View File

@@ -1799,10 +1799,10 @@ void LLVOAvatar::renderCollisionVolumes()
{ {
std::ostringstream ostr; std::ostringstream ostr;
LLGLDepthTest gls_depth(GL_FALSE); LLGLDepthTest gls_depth(GL_FALSE);
for (S32 i = 0; i < mNumCollisionVolumes; i++) for (S32 i = 0; i < (S32)mCollisionVolumes.size(); i++)
{ {
mCollisionVolumes[i].renderCollision(); mCollisionVolumes[i]->renderCollision();
ostr << mCollisionVolumes[i].getName() << ", "; ostr << mCollisionVolumes[i]->getName() << ", ";
} }
if (mNameText.notNull()) if (mNameText.notNull())
@@ -1920,11 +1920,11 @@ BOOL LLVOAvatar::lineSegmentIntersect(const LLVector4a& start, const LLVector4a&
if (lineSegmentBoundingBox(start, end)) if (lineSegmentBoundingBox(start, end))
{ {
for (S32 i = 0; i < mNumCollisionVolumes; ++i) for (S32 i = 0; i < (S32)mCollisionVolumes.size(); ++i)
{ {
mCollisionVolumes[i].updateWorldMatrix(); mCollisionVolumes[i]->updateWorldMatrix();
const LLMatrix4a& mat = mCollisionVolumes[i].getXform()->getWorldMatrix(); const LLMatrix4a& mat = mCollisionVolumes[i]->getXform()->getWorldMatrix();
LLMatrix4a inverse = mat; LLMatrix4a inverse = mat;
inverse.invert(); inverse.invert();
LLMatrix4a norm_mat = inverse; LLMatrix4a norm_mat = inverse;

View File

@@ -1,6 +1,14 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?> <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater can_close="true" can_drag_on_left="false" can_minimize="true" can_resize="false" <floater name="Object Backup" title="Progress" rect_control="FloaterObjectBackuptRect"
rect_control="FloaterObjectBackuptRect" can_close="true" can_drag_on_left="false" can_minimize="true" can_resize="false"
height="80" width="200" name="Import" title="Import progress" mouse_opaque="true"> height="80" width="200" mouse_opaque="true">
<text height="30" left="10" name="name_label" top="-20"> Progress </text> <text height="30" left="10" name="name_label" top="-20">
Progress
</text>
<string name="export">
Object export
</string>
<string name="import">
Object import
</string>
</floater> </floater>

View File

@@ -119,6 +119,10 @@
<on_check control="RadarAlertAge"/> <on_check control="RadarAlertAge"/>
</menu_item_check> </menu_item_check>
<menu_item_separator/> <menu_item_separator/>
<menu_item_check label="Include distance in alerts" name="Include distance in alerts">
<on_click function="ToggleControl" userdata="RadarAlertShowDist"/>
<on_check control="RadarAlertShowDist"/>
</menu_item_check>
<menu_item_check label="Announce even when closed" name="Announce even when closed"> <menu_item_check label="Announce even when closed" name="Announce even when closed">
<on_click function="ToggleControl" userdata="RadarKeepOpen"/> <on_click function="ToggleControl" userdata="RadarKeepOpen"/>
<on_check control="RadarKeepOpen"/> <on_check control="RadarKeepOpen"/>

View File

@@ -5938,11 +5938,25 @@ A login URI is required to retrieve the grid info.
Builds with extended hollow or extended hole size do not render properly on other viewers. Please keep this option checked, if you want your builds looking properly in other viewers. Builds with extended hollow or extended hole size do not render properly on other viewers. Please keep this option checked, if you want your builds looking properly in other viewers.
</notification> </notification>
<notification
icon="alertmodal.tga"
name="ImportFailed"
type="alertmodal">
Bad XML file. Import aborted.
</notification>
<notification
icon="notifytip.tga"
name="ExportAborted"
type="notifytip">
The Object was deselected before the export could occur. Export aborted.
</notification>
<notification <notification
icon="alertmodal.tga" icon="alertmodal.tga"
name="ExportFailed" name="ExportFailed"
type="alertmodal"> type="alertmodal">
None of the selected objects are exportable. Export aborted. Bad permissions for the exported object. Export aborted.
</notification> </notification>
<notification <notification
@@ -5959,6 +5973,23 @@ Object exported. Some textures could not be saved due to: [REASON]
Export successful. Export successful.
</notification> </notification>
<notification
icon="alertmodal.tga"
name="ConfirmAbortBackup"
type="alertmodal">
Are you sure you want to abort the current object backup operation?
<form name="form">
<button
index="0"
name="Yes"
text="Yes"/>
<button
index="1"
name="No"
text="No"/>
</form>
</notification>
<notification <notification
icon="notifytip.tga" icon="notifytip.tga"
name="SystemMessageTip" name="SystemMessageTip"