diff options
author | Nat Goodspeed <nat@lindenlab.com> | 2024-06-20 12:28:09 -0400 |
---|---|---|
committer | Nat Goodspeed <nat@lindenlab.com> | 2024-06-20 12:28:09 -0400 |
commit | d110358472b83f2f31d60ea0d76f1b426a087f56 (patch) | |
tree | 83617196e7d444c1063075e4a4c50fe19490a4ce /indra/newview/llwearablelist.cpp | |
parent | bb1f3f08cf93facbf926e57384674441be7e2884 (diff) | |
parent | e92689063bdbe34907348a12f1db39bc81132783 (diff) |
Merge branch 'release/luau-scripting' into lua-speedometer-demo
Diffstat (limited to 'indra/newview/llwearablelist.cpp')
-rw-r--r-- | indra/newview/llwearablelist.cpp | 386 |
1 files changed, 193 insertions, 193 deletions
diff --git a/indra/newview/llwearablelist.cpp b/indra/newview/llwearablelist.cpp index de01fbb73d..5cbc158f8d 100644 --- a/indra/newview/llwearablelist.cpp +++ b/indra/newview/llwearablelist.cpp @@ -1,25 +1,25 @@ -/** +/** * @file llwearablelist.cpp * @brief LLWearableList class implementation * * $LicenseInfo:firstyear=2002&license=viewerlgpl$ * Second Life Viewer Source Code * Copyright (C) 2010, Linden Research, Inc. - * + * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; * version 2.1 of the License only. - * + * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. - * + * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * + * * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA * $/LicenseInfo$ */ @@ -40,25 +40,25 @@ // Callback struct struct LLWearableArrivedData { - LLWearableArrivedData(LLAssetType::EType asset_type, - const std::string& wearable_name, - LLAvatarAppearance* avatarp, - void(*asset_arrived_callback)(LLViewerWearable*, void* userdata), - void* userdata) : - mAssetType( asset_type ), - mCallback( asset_arrived_callback ), - mUserdata( userdata ), - mName( wearable_name ), - mRetries(0), - mAvatarp(avatarp) - {} - - LLAssetType::EType mAssetType; - void (*mCallback)(LLViewerWearable*, void* userdata); - void* mUserdata; - std::string mName; - S32 mRetries; - LLAvatarAppearance *mAvatarp; + LLWearableArrivedData(LLAssetType::EType asset_type, + const std::string& wearable_name, + LLAvatarAppearance* avatarp, + void(*asset_arrived_callback)(LLViewerWearable*, void* userdata), + void* userdata) : + mAssetType( asset_type ), + mCallback( asset_arrived_callback ), + mUserdata( userdata ), + mName( wearable_name ), + mRetries(0), + mAvatarp(avatarp) + {} + + LLAssetType::EType mAssetType; + void (*mCallback)(LLViewerWearable*, void* userdata); + void* mUserdata; + std::string mName; + S32 mRetries; + LLAvatarAppearance *mAvatarp; }; //////////////////////////////////////////////////////////////////////////// @@ -66,213 +66,213 @@ struct LLWearableArrivedData LLWearableList::~LLWearableList() { - cleanup(); + cleanup(); } -void LLWearableList::cleanup() +void LLWearableList::cleanup() { - for_each(mList.begin(), mList.end(), DeletePairedPointer()); - mList.clear(); + for_each(mList.begin(), mList.end(), DeletePairedPointer()); + mList.clear(); } void LLWearableList::getAsset(const LLAssetID& assetID, const std::string& wearable_name, LLAvatarAppearance* avatarp, LLAssetType::EType asset_type, void(*asset_arrived_callback)(LLViewerWearable*, void* userdata), void* userdata) { - llassert( (asset_type == LLAssetType::AT_CLOTHING) || (asset_type == LLAssetType::AT_BODYPART) ); - LLViewerWearable* instance = get_if_there(mList, assetID, (LLViewerWearable*)NULL ); - if( instance ) - { - LL_DEBUGS("Avatar") << "wearable " << assetID << " found in LLWearableList" << LL_ENDL; - asset_arrived_callback( instance, userdata ); - } - else - { - gAssetStorage->getAssetData(assetID, - asset_type, - LLWearableList::processGetAssetReply, - (void*)new LLWearableArrivedData( asset_type, wearable_name, avatarp, asset_arrived_callback, userdata ), - TRUE); - } + llassert( (asset_type == LLAssetType::AT_CLOTHING) || (asset_type == LLAssetType::AT_BODYPART) ); + LLViewerWearable* instance = get_if_there(mList, assetID, (LLViewerWearable*)NULL ); + if( instance ) + { + LL_DEBUGS("Avatar") << "wearable " << assetID << " found in LLWearableList" << LL_ENDL; + asset_arrived_callback( instance, userdata ); + } + else + { + gAssetStorage->getAssetData(assetID, + asset_type, + LLWearableList::processGetAssetReply, + (void*)new LLWearableArrivedData( asset_type, wearable_name, avatarp, asset_arrived_callback, userdata ), + TRUE); + } } // static void LLWearableList::processGetAssetReply( const char* filename, const LLAssetID& uuid, void* userdata, S32 status, LLExtStat ext_status ) { - BOOL isNewWearable = FALSE; - LLWearableArrivedData* data = (LLWearableArrivedData*) userdata; - LLViewerWearable* wearable = NULL; // NULL indicates failure - LLAvatarAppearance *avatarp = data->mAvatarp; - - if( !filename ) - { - LL_WARNS("Wearable") << "Bad Wearable Asset: missing file." << LL_ENDL; - } - else if(!avatarp) - { - LL_WARNS("Wearable") << "Bad asset request: missing avatar pointer." << LL_ENDL; - } - else if (status >= 0) - { - // read the file - llifstream ifs(filename, llifstream::binary); - if( !ifs.is_open() ) - { - LL_WARNS("Wearable") << "Bad Wearable Asset: unable to open file: '" << filename << "'" << LL_ENDL; - } - else - { - wearable = new LLViewerWearable(uuid); - LLWearable::EImportResult result = wearable->importStream( - ifs, avatarp ); - if (LLWearable::SUCCESS != result) - { - if (wearable->getType() == LLWearableType::WT_COUNT) - { - isNewWearable = TRUE; - } - delete wearable; - wearable = NULL; - } - - if(filename) - { - if (ifs.is_open()) - { - ifs.close(); - } - LLFile::remove(std::string(filename)); - } - } - } - else - { - if(filename) - { - LLFile::remove(std::string(filename)); - } - - LL_WARNS("Wearable") << "Wearable download failed: " << LLAssetStorage::getErrorString( status ) << " " << uuid << LL_ENDL; - switch( status ) - { - case LL_ERR_ASSET_REQUEST_NOT_IN_DATABASE: - { - // Fail - break; - } - default: - { - static const S32 MAX_RETRIES = 3; - if (data->mRetries < MAX_RETRIES) - { - // Try again - data->mRetries++; - gAssetStorage->getAssetData(uuid, - data->mAssetType, - LLWearableList::processGetAssetReply, - userdata); // re-use instead of deleting. - return; - } - else - { - // Fail - break; - } - } - } - } - - if (wearable) // success - { - LLWearableList::instance().mList[ uuid ] = wearable; - LL_DEBUGS("Wearable") << "processGetAssetReply()" << LL_ENDL; - LL_DEBUGS("Wearable") << wearable << LL_ENDL; - } - else - { - LLSD args; - args["TYPE"] =LLTrans::getString(LLAssetType::lookupHumanReadable(data->mAssetType)); - if (isNewWearable) - { - LLNotificationsUtil::add("InvalidWearable"); - } - else if (data->mName.empty()) - { - LLNotificationsUtil::add("FailedToFindWearableUnnamed", args); - } - else - { - args["DESC"] = data->mName; - LLNotificationsUtil::add("FailedToFindWearable", args); - } - } - // Always call callback; wearable will be NULL if we failed - { - if( data->mCallback ) - { - data->mCallback( wearable, data->mUserdata ); - } - } - delete data; + BOOL isNewWearable = FALSE; + LLWearableArrivedData* data = (LLWearableArrivedData*) userdata; + LLViewerWearable* wearable = NULL; // NULL indicates failure + LLAvatarAppearance *avatarp = data->mAvatarp; + + if( !filename ) + { + LL_WARNS("Wearable") << "Bad Wearable Asset: missing file." << LL_ENDL; + } + else if(!avatarp) + { + LL_WARNS("Wearable") << "Bad asset request: missing avatar pointer." << LL_ENDL; + } + else if (status >= 0) + { + // read the file + llifstream ifs(filename, llifstream::binary); + if( !ifs.is_open() ) + { + LL_WARNS("Wearable") << "Bad Wearable Asset: unable to open file: '" << filename << "'" << LL_ENDL; + } + else + { + wearable = new LLViewerWearable(uuid); + LLWearable::EImportResult result = wearable->importStream( + ifs, avatarp ); + if (LLWearable::SUCCESS != result) + { + if (wearable->getType() == LLWearableType::WT_COUNT) + { + isNewWearable = TRUE; + } + delete wearable; + wearable = NULL; + } + + if(filename) + { + if (ifs.is_open()) + { + ifs.close(); + } + LLFile::remove(std::string(filename)); + } + } + } + else + { + if(filename) + { + LLFile::remove(std::string(filename)); + } + + LL_WARNS("Wearable") << "Wearable download failed: " << LLAssetStorage::getErrorString( status ) << " " << uuid << LL_ENDL; + switch( status ) + { + case LL_ERR_ASSET_REQUEST_NOT_IN_DATABASE: + { + // Fail + break; + } + default: + { + static const S32 MAX_RETRIES = 3; + if (data->mRetries < MAX_RETRIES) + { + // Try again + data->mRetries++; + gAssetStorage->getAssetData(uuid, + data->mAssetType, + LLWearableList::processGetAssetReply, + userdata); // re-use instead of deleting. + return; + } + else + { + // Fail + break; + } + } + } + } + + if (wearable) // success + { + LLWearableList::instance().mList[ uuid ] = wearable; + LL_DEBUGS("Wearable") << "processGetAssetReply()" << LL_ENDL; + LL_DEBUGS("Wearable") << wearable << LL_ENDL; + } + else + { + LLSD args; + args["TYPE"] =LLTrans::getString(LLAssetType::lookupHumanReadable(data->mAssetType)); + if (isNewWearable) + { + LLNotificationsUtil::add("InvalidWearable"); + } + else if (data->mName.empty()) + { + LLNotificationsUtil::add("FailedToFindWearableUnnamed", args); + } + else + { + args["DESC"] = data->mName; + LLNotificationsUtil::add("FailedToFindWearable", args); + } + } + // Always call callback; wearable will be NULL if we failed + { + if( data->mCallback ) + { + data->mCallback( wearable, data->mUserdata ); + } + } + delete data; } LLViewerWearable* LLWearableList::createCopy(const LLViewerWearable* old_wearable, const std::string& new_name) { - LL_DEBUGS() << "LLWearableList::createCopy()" << LL_ENDL; + LL_DEBUGS() << "LLWearableList::createCopy()" << LL_ENDL; - LLViewerWearable *wearable = generateNewWearable(); - wearable->copyDataFrom(old_wearable); + LLViewerWearable *wearable = generateNewWearable(); + wearable->copyDataFrom(old_wearable); - LLPermissions perm(old_wearable->getPermissions()); - perm.setOwnerAndGroup(LLUUID::null, gAgent.getID(), LLUUID::null, true); - wearable->setPermissions(perm); + LLPermissions perm(old_wearable->getPermissions()); + perm.setOwnerAndGroup(LLUUID::null, gAgent.getID(), LLUUID::null, true); + wearable->setPermissions(perm); - if (!new_name.empty()) wearable->setName(new_name); + if (!new_name.empty()) wearable->setName(new_name); - // Send to the dataserver - wearable->saveNewAsset(); + // Send to the dataserver + wearable->saveNewAsset(); - return wearable; + return wearable; } LLViewerWearable* LLWearableList::createNewWearable( LLWearableType::EType type, LLAvatarAppearance *avatarp ) { - LL_DEBUGS() << "LLWearableList::createNewWearable()" << LL_ENDL; + LL_DEBUGS() << "LLWearableList::createNewWearable()" << LL_ENDL; + + LLViewerWearable *wearable = generateNewWearable(); + wearable->setType( type, avatarp ); - LLViewerWearable *wearable = generateNewWearable(); - wearable->setType( type, avatarp ); - // LLWearableType has pre-translated getTypeLabel(), but it returns 'name', not 'New Name'. - std::string name = LLTrans::getString( LLWearableType::getInstance()->getTypeDefaultNewName(wearable->getType()) ); - wearable->setName( name ); + std::string name = LLTrans::getString( LLWearableType::getInstance()->getTypeDefaultNewName(wearable->getType()) ); + wearable->setName( name ); - LLPermissions perm; - perm.init(gAgent.getID(), gAgent.getID(), LLUUID::null, LLUUID::null); - perm.initMasks(PERM_ALL, PERM_ALL, PERM_NONE, PERM_NONE, PERM_MOVE | PERM_TRANSFER); - wearable->setPermissions(perm); + LLPermissions perm; + perm.init(gAgent.getID(), gAgent.getID(), LLUUID::null, LLUUID::null); + perm.initMasks(PERM_ALL, PERM_ALL, PERM_NONE, PERM_NONE, PERM_MOVE | PERM_TRANSFER); + wearable->setPermissions(perm); - wearable->setDefinitionVersion(LLWearable::getCurrentDefinitionVersion()); + wearable->setDefinitionVersion(LLWearable::getCurrentDefinitionVersion()); - // Description and sale info have default values. - wearable->setParamsToDefaults(); - wearable->setTexturesToDefaults(); + // Description and sale info have default values. + wearable->setParamsToDefaults(); + wearable->setTexturesToDefaults(); - //mark all values (params & images) as saved - wearable->saveValues(); + //mark all values (params & images) as saved + wearable->saveValues(); - // Send to the dataserver - wearable->saveNewAsset(); + // Send to the dataserver + wearable->saveNewAsset(); - return wearable; + return wearable; } LLViewerWearable *LLWearableList::generateNewWearable() { - LLTransactionID tid; - tid.generate(); - LLAssetID new_asset_id = tid.makeAssetID(gAgent.getSecureSessionID()); + LLTransactionID tid; + tid.generate(); + LLAssetID new_asset_id = tid.makeAssetID(gAgent.getSecureSessionID()); - LLViewerWearable* wearable = new LLViewerWearable(tid); - mList[new_asset_id] = wearable; - return wearable; + LLViewerWearable* wearable = new LLViewerWearable(tid); + mList[new_asset_id] = wearable; + return wearable; } |