summaryrefslogtreecommitdiff
path: root/indra/newview/llviewerinventory.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'indra/newview/llviewerinventory.cpp')
-rw-r--r--indra/newview/llviewerinventory.cpp164
1 files changed, 94 insertions, 70 deletions
diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp
index 5bdcbc79bd..9856cb2b7f 100644
--- a/indra/newview/llviewerinventory.cpp
+++ b/indra/newview/llviewerinventory.cpp
@@ -85,7 +85,8 @@ public:
{
std::vector<LLUUID> items_to_open;
items_to_open.push_back(inventory_id);
- open_inventory_offer(items_to_open, "");
+ //inventory_handler is just a stub, because we don't know from who this offer
+ open_inventory_offer(items_to_open, "inventory_handler");
return true;
}
@@ -509,11 +510,13 @@ bool LLViewerInventoryCategory::fetchDescendents()
// This comes from LLInventoryFilter from llfolderview.h
U32 sort_order = gSavedSettings.getU32("InventorySortOrder") & 0x1;
- // *NOTE
- // Temporary workaround for bug EXT-2879, see ticket for details.
- // Commented gAgent.getRegion()->getCapability in order to use the old system.
- std::string url;//= gAgent.getRegion()->getCapability("WebFetchInventoryDescendents");
-
+ // *NOTE: For bug EXT-2879, originally commented out
+ // gAgent.getRegion()->getCapability in order to use the old
+ // message-based system. This has been uncommented now that
+ // AIS folks are aware of the issue and have a fix in process.
+ // see ticket for details.
+
+ std::string url = gAgent.getRegion()->getCapability("WebFetchInventoryDescendents");
if (!url.empty()) //Capability found. Build up LLSD and use it.
{
LLInventoryModel::startBackgroundFetch(mUUID);
@@ -1092,72 +1095,22 @@ void menu_create_inventory_item(LLFolderView* folder, LLFolderBridge *bridge, co
LLInventoryType::IT_GESTURE,
PERM_ALL);
}
- else if ("shirt" == type_name)
- {
- const LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLFolderType::FT_CLOTHING);
- LLFolderBridge::createWearable(parent_id, WT_SHIRT);
- }
- else if ("pants" == type_name)
- {
- const LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLFolderType::FT_CLOTHING);
- LLFolderBridge::createWearable(parent_id, WT_PANTS);
- }
- else if ("shoes" == type_name)
- {
- const LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLFolderType::FT_CLOTHING);
- LLFolderBridge::createWearable(parent_id, WT_SHOES);
- }
- else if ("socks" == type_name)
- {
- const LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLFolderType::FT_CLOTHING);
- LLFolderBridge::createWearable(parent_id, WT_SOCKS);
- }
- else if ("jacket" == type_name)
- {
- const LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLFolderType::FT_CLOTHING);
- LLFolderBridge::createWearable(parent_id, WT_JACKET);
- }
- else if ("skirt" == type_name)
- {
- const LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLFolderType::FT_CLOTHING);
- LLFolderBridge::createWearable(parent_id, WT_SKIRT);
- }
- else if ("gloves" == type_name)
- {
- const LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLFolderType::FT_CLOTHING);
- LLFolderBridge::createWearable(parent_id, WT_GLOVES);
- }
- else if ("undershirt" == type_name)
- {
- const LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLFolderType::FT_CLOTHING);
- LLFolderBridge::createWearable(parent_id, WT_UNDERSHIRT);
- }
- else if ("underpants" == type_name)
- {
- const LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLFolderType::FT_CLOTHING);
- LLFolderBridge::createWearable(parent_id, WT_UNDERPANTS);
- }
- else if ("shape" == type_name)
- {
- const LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLFolderType::FT_BODYPART);
- LLFolderBridge::createWearable(parent_id, WT_SHAPE);
- }
- else if ("skin" == type_name)
- {
- const LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLFolderType::FT_BODYPART);
- LLFolderBridge::createWearable(parent_id, WT_SKIN);
- }
- else if ("hair" == type_name)
- {
- const LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLFolderType::FT_BODYPART);
- LLFolderBridge::createWearable(parent_id, WT_HAIR);
- }
- else if ("eyes" == type_name)
+ else
{
- const LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLFolderType::FT_BODYPART);
- LLFolderBridge::createWearable(parent_id, WT_EYES);
+ // Use for all clothing and body parts. Adding new wearable types requires updating LLWearableDictionary.
+ EWearableType wearable_type = LLWearableDictionary::typeNameToType(type_name);
+ if (wearable_type >= WT_SHAPE && wearable_type < WT_COUNT)
+ {
+ LLAssetType::EType asset_type = LLWearableDictionary::getAssetType(wearable_type);
+ LLFolderType::EType folder_type = LLFolderType::assetTypeToFolderType(asset_type);
+ const LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(folder_type);
+ LLFolderBridge::createWearable(parent_id, wearable_type);
+ }
+ else
+ {
+ llwarns << "Can't create unrecognized type " << type_name << llendl;
+ }
}
-
folder->setNeedsAutoRename(TRUE);
}
@@ -1435,3 +1388,74 @@ void LLViewerInventoryItem::onCallingCardNameLookup(const LLUUID& id, const std:
gInventory.notifyObservers();
}
+class LLRegenerateLinkCollector : public LLInventoryCollectFunctor
+{
+public:
+ LLRegenerateLinkCollector(const LLViewerInventoryItem *target_item) : mTargetItem(target_item) {}
+ virtual ~LLRegenerateLinkCollector() {}
+ virtual bool operator()(LLInventoryCategory* cat,
+ LLInventoryItem* item)
+ {
+ if (item)
+ {
+ if ((item->getName() == mTargetItem->getName()) &&
+ (item->getInventoryType() == mTargetItem->getInventoryType()) &&
+ (!item->getIsLinkType()))
+ {
+ return true;
+ }
+ }
+ return false;
+ }
+protected:
+ const LLViewerInventoryItem* mTargetItem;
+};
+
+LLUUID find_possible_item_for_regeneration(const LLViewerInventoryItem *target_item)
+{
+ LLViewerInventoryCategory::cat_array_t cats;
+ LLViewerInventoryItem::item_array_t items;
+
+ LLRegenerateLinkCollector candidate_matches(target_item);
+ gInventory.collectDescendentsIf(gInventory.getRootFolderID(),
+ cats,
+ items,
+ LLInventoryModel::EXCLUDE_TRASH,
+ candidate_matches);
+ for (LLViewerInventoryItem::item_array_t::const_iterator item_iter = items.begin();
+ item_iter != items.end();
+ ++item_iter)
+ {
+ const LLViewerInventoryItem *item = (*item_iter);
+ if (true) return item->getUUID();
+ }
+ return LLUUID::null;
+}
+
+// This currently dosen't work, because the sim does not allow us
+// to change an item's assetID.
+BOOL LLViewerInventoryItem::regenerateLink()
+{
+ const LLUUID target_item_id = find_possible_item_for_regeneration(this);
+ if (target_item_id.isNull())
+ return FALSE;
+ LLViewerInventoryCategory::cat_array_t cats;
+ LLViewerInventoryItem::item_array_t items;
+ LLAssetIDMatches asset_id_matches(getAssetUUID());
+ gInventory.collectDescendentsIf(gInventory.getRootFolderID(),
+ cats,
+ items,
+ LLInventoryModel::EXCLUDE_TRASH,
+ asset_id_matches);
+ for (LLViewerInventoryItem::item_array_t::iterator item_iter = items.begin();
+ item_iter != items.end();
+ item_iter++)
+ {
+ LLViewerInventoryItem *item = (*item_iter);
+ item->setAssetUUID(target_item_id);
+ item->updateServer(FALSE);
+ gInventory.addChangedMask(LLInventoryObserver::REBUILD, item->getUUID());
+ }
+ gInventory.notifyObservers();
+ return TRUE;
+}