diff options
author | Ansariel <ansariel.hiller@phoenixviewer.com> | 2024-05-22 19:04:52 +0200 |
---|---|---|
committer | Ansariel <ansariel.hiller@phoenixviewer.com> | 2024-05-22 19:04:52 +0200 |
commit | 1b67dd855c41f5a0cda7ec2a68d98071986ca703 (patch) | |
tree | ab243607f74f78200787bba5b9b88f07ef1b966f /indra/newview/llwearablelist.cpp | |
parent | 6d6eabca44d08d5b97bfe3e941d2b9687c2246ea (diff) | |
parent | e1623bb276f83a43ce7a197e388720c05bdefe61 (diff) |
Merge remote-tracking branch 'origin/main' into DRTVWR-600-maint-A
# Conflicts:
# autobuild.xml
# indra/cmake/CMakeLists.txt
# indra/cmake/GoogleMock.cmake
# indra/llaudio/llaudioengine_fmodstudio.cpp
# indra/llaudio/llaudioengine_fmodstudio.h
# indra/llaudio/lllistener_fmodstudio.cpp
# indra/llaudio/lllistener_fmodstudio.h
# indra/llaudio/llstreamingaudio_fmodstudio.cpp
# indra/llaudio/llstreamingaudio_fmodstudio.h
# indra/llcharacter/llmultigesture.cpp
# indra/llcharacter/llmultigesture.h
# indra/llimage/llimage.cpp
# indra/llimage/llimagepng.cpp
# indra/llimage/llimageworker.cpp
# indra/llimage/tests/llimageworker_test.cpp
# indra/llmessage/tests/llmockhttpclient.h
# indra/llprimitive/llgltfmaterial.h
# indra/llrender/llfontfreetype.cpp
# indra/llui/llcombobox.cpp
# indra/llui/llfolderview.cpp
# indra/llui/llfolderviewmodel.h
# indra/llui/lllineeditor.cpp
# indra/llui/lllineeditor.h
# indra/llui/lltextbase.cpp
# indra/llui/lltextbase.h
# indra/llui/lltexteditor.cpp
# indra/llui/lltextvalidate.cpp
# indra/llui/lltextvalidate.h
# indra/llui/lluictrl.h
# indra/llui/llview.cpp
# indra/llwindow/llwindowmacosx.cpp
# indra/newview/app_settings/settings.xml
# indra/newview/llappearancemgr.cpp
# indra/newview/llappearancemgr.h
# indra/newview/llavatarpropertiesprocessor.cpp
# indra/newview/llavatarpropertiesprocessor.h
# indra/newview/llbreadcrumbview.cpp
# indra/newview/llbreadcrumbview.h
# indra/newview/llbreastmotion.cpp
# indra/newview/llbreastmotion.h
# indra/newview/llconversationmodel.h
# indra/newview/lldensityctrl.cpp
# indra/newview/lldensityctrl.h
# indra/newview/llface.inl
# indra/newview/llfloatereditsky.cpp
# indra/newview/llfloatereditwater.cpp
# indra/newview/llfloateremojipicker.h
# indra/newview/llfloaterimsessiontab.cpp
# indra/newview/llfloaterprofiletexture.cpp
# indra/newview/llfloaterprofiletexture.h
# indra/newview/llgesturemgr.cpp
# indra/newview/llgesturemgr.h
# indra/newview/llimpanel.cpp
# indra/newview/llimpanel.h
# indra/newview/llinventorybridge.cpp
# indra/newview/llinventorybridge.h
# indra/newview/llinventoryclipboard.cpp
# indra/newview/llinventoryclipboard.h
# indra/newview/llinventoryfunctions.cpp
# indra/newview/llinventoryfunctions.h
# indra/newview/llinventorygallery.cpp
# indra/newview/lllistbrowser.cpp
# indra/newview/lllistbrowser.h
# indra/newview/llpanelobjectinventory.cpp
# indra/newview/llpanelprofile.cpp
# indra/newview/llpanelprofile.h
# indra/newview/llpreviewgesture.cpp
# indra/newview/llsavedsettingsglue.cpp
# indra/newview/llsavedsettingsglue.h
# indra/newview/lltooldraganddrop.cpp
# indra/newview/llurllineeditorctrl.cpp
# indra/newview/llvectorperfoptions.cpp
# indra/newview/llvectorperfoptions.h
# indra/newview/llviewerparceloverlay.cpp
# indra/newview/llviewertexlayer.cpp
# indra/newview/llviewertexturelist.cpp
# indra/newview/macmain.h
# indra/test/test.cpp
Diffstat (limited to 'indra/newview/llwearablelist.cpp')
-rw-r--r-- | indra/newview/llwearablelist.cpp | 556 |
1 files changed, 278 insertions, 278 deletions
diff --git a/indra/newview/llwearablelist.cpp b/indra/newview/llwearablelist.cpp index 20ff0146c7..0922768a23 100644 --- a/indra/newview/llwearablelist.cpp +++ b/indra/newview/llwearablelist.cpp @@ -1,278 +1,278 @@ -/** - * @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$ - */ - -#include "llviewerprecompiledheaders.h" - -#include "llwearablelist.h" - -#include "message.h" -#include "llassetstorage.h" -#include "llagent.h" -#include "llvoavatar.h" -#include "llviewerstats.h" -#include "llnotificationsutil.h" -#include "llinventorymodel.h" -#include "lltrans.h" - -// 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; -}; - -//////////////////////////////////////////////////////////////////////////// -// LLWearableList - -LLWearableList::~LLWearableList() -{ - cleanup(); -} - -void LLWearableList::cleanup() -{ - 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); - } -} - -// 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; -} - - -LLViewerWearable* LLWearableList::createCopy(const LLViewerWearable* old_wearable, const std::string& new_name) -{ - LL_DEBUGS() << "LLWearableList::createCopy()" << LL_ENDL; - - LLViewerWearable *wearable = generateNewWearable(); - wearable->copyDataFrom(old_wearable); - - 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); - - // Send to the dataserver - wearable->saveNewAsset(); - - return wearable; -} - -LLViewerWearable* LLWearableList::createNewWearable( LLWearableType::EType type, LLAvatarAppearance *avatarp ) -{ - LL_DEBUGS() << "LLWearableList::createNewWearable()" << LL_ENDL; - - 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 ); - - 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()); - - // Description and sale info have default values. - wearable->setParamsToDefaults(); - wearable->setTexturesToDefaults(); - - //mark all values (params & images) as saved - wearable->saveValues(); - - // Send to the dataserver - wearable->saveNewAsset(); - - - return wearable; -} - -LLViewerWearable *LLWearableList::generateNewWearable() -{ - LLTransactionID tid; - tid.generate(); - LLAssetID new_asset_id = tid.makeAssetID(gAgent.getSecureSessionID()); - - LLViewerWearable* wearable = new LLViewerWearable(tid); - mList[new_asset_id] = wearable; - return wearable; -} +/**
+ * @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$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llwearablelist.h"
+
+#include "message.h"
+#include "llassetstorage.h"
+#include "llagent.h"
+#include "llvoavatar.h"
+#include "llviewerstats.h"
+#include "llnotificationsutil.h"
+#include "llinventorymodel.h"
+#include "lltrans.h"
+
+// 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;
+};
+
+////////////////////////////////////////////////////////////////////////////
+// LLWearableList
+
+LLWearableList::~LLWearableList()
+{
+ cleanup();
+}
+
+void LLWearableList::cleanup()
+{
+ 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);
+ }
+}
+
+// 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;
+}
+
+
+LLViewerWearable* LLWearableList::createCopy(const LLViewerWearable* old_wearable, const std::string& new_name)
+{
+ LL_DEBUGS() << "LLWearableList::createCopy()" << LL_ENDL;
+
+ LLViewerWearable *wearable = generateNewWearable();
+ wearable->copyDataFrom(old_wearable);
+
+ 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);
+
+ // Send to the dataserver
+ wearable->saveNewAsset();
+
+ return wearable;
+}
+
+LLViewerWearable* LLWearableList::createNewWearable( LLWearableType::EType type, LLAvatarAppearance *avatarp )
+{
+ LL_DEBUGS() << "LLWearableList::createNewWearable()" << LL_ENDL;
+
+ 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 );
+
+ 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());
+
+ // Description and sale info have default values.
+ wearable->setParamsToDefaults();
+ wearable->setTexturesToDefaults();
+
+ //mark all values (params & images) as saved
+ wearable->saveValues();
+
+ // Send to the dataserver
+ wearable->saveNewAsset();
+
+
+ return wearable;
+}
+
+LLViewerWearable *LLWearableList::generateNewWearable()
+{
+ LLTransactionID tid;
+ tid.generate();
+ LLAssetID new_asset_id = tid.makeAssetID(gAgent.getSecureSessionID());
+
+ LLViewerWearable* wearable = new LLViewerWearable(tid);
+ mList[new_asset_id] = wearable;
+ return wearable;
+}
|