diff --git a/.hgpatchinfo/Appearance-MixedViewers.dep b/.hgpatchinfo/Appearance-MixedViewers.dep new file mode 100644 index 0000000000000000000000000000000000000000..4c5ae37c8bbbb8852db3f8b81409402c0f059ded --- /dev/null +++ b/.hgpatchinfo/Appearance-MixedViewers.dep @@ -0,0 +1 @@ +c5730f8d056e8f7a9f0a7416787ed9cb9bc77fc8 \ No newline at end of file diff --git a/.hgpatchinfo/Appearance-MixedViewers.desc b/.hgpatchinfo/Appearance-MixedViewers.desc new file mode 100644 index 0000000000000000000000000000000000000000..be6e017a7dbff0af6c85c6bb1399b240968e09f3 --- /dev/null +++ b/.hgpatchinfo/Appearance-MixedViewers.desc @@ -0,0 +1,4 @@ +[Appearance/MixedViewers] +- fixed : "Worn items in Viewer 2 and Viewer 1.x aren't synchronized" (http://jira.secondlife.com/browse/VWR-17594) + -> current fix compares *only* the wearables in COF with the wearables specified by AgentWearablesUpdate +- fixed : minor memory leak in LLInitialWearablesFetch::processWearablesMessage() diff --git a/indra/newview/llagentwearablesfetch.cpp b/indra/newview/llagentwearablesfetch.cpp index 1edc96e1652200861bc4e909d2888b19d2a3cd9b..2bc18e0857fe847a7da0d649c897f3b1cd086116 100644 --- a/indra/newview/llagentwearablesfetch.cpp +++ b/indra/newview/llagentwearablesfetch.cpp @@ -119,8 +119,42 @@ void LLInitialWearablesFetch::processContents() gInventory.collectDescendentsIf(mComplete.front(), cat_array, wearable_array, LLInventoryModel::EXCLUDE_TRASH, is_wearable); +// [SL:KB] - Patch: Appearance-MixedViewers | Checked: 2010-05-18 (Catznip-2.1.2a) | Modified: Catznip-2.0.0h + // NOTE: don't use the current COF contents if 'wearable_array' is empty (ie first logon with 2.0 or some other problem) + bool fUpdateFromCOF = !wearable_array.empty(); + if (fUpdateFromCOF) + { + LLAppearanceMgr::wearables_by_type_t items_by_type(LLWearableType::WT_COUNT); + LLAppearanceMgr::sortItemsByActualDescription(wearable_array); + LLAppearanceMgr::divvyWearablesByType(wearable_array, items_by_type); + + // Compare the COF wearables against the initial wearables + for (initial_wearable_data_vec_t::const_iterator itWearableData = mAgentInitialWearables.begin(); + (itWearableData != mAgentInitialWearables.end()) && (fUpdateFromCOF); ++itWearableData) + { + const LLUUID& idItem = itWearableData->mItemID; bool fFound = false; + + // TODO-Catznip: [SL-2.1.0] Bit of a hack until LL supports changing the descriptions of links + for (S32 idxItem = 0, cntItem = items_by_type[itWearableData->mType].size(); idxItem < cntItem; idxItem++) + { + const LLViewerInventoryItem* pCOFItem = items_by_type[itWearableData->mType].get(idxItem); + if (idItem == pCOFItem->getLinkedUUID()) + { + fFound = true; + break; + } + } + if (!fFound) + fUpdateFromCOF = false; + } + } +// [/SL:KB] + LLAppearanceMgr::instance().setAttachmentInvLinkEnable(true); - if (wearable_array.count() > 0) +// if (wearable_array.count() > 0) +// [SL:KB] - Patch: Appearance-MixedViewers | Checked: 2010-04-28 (Catznip-2.1.2a) | Modified: Catznip-2.0.0e + if (fUpdateFromCOF) +// [/SL:KB] { gAgentWearables.notifyLoadingStarted(); LLAppearanceMgr::instance().updateAppearanceFromCOF(); @@ -147,7 +181,7 @@ public: virtual void done() { gInventory.removeObserver(this); - +/* // Link to all fetched items in COF. LLPointer<LLInventoryCallback> link_waiter = new LLUpdateAppearanceOnDestroy; for (uuid_vec_t::iterator it = mIDs.begin(); @@ -170,7 +204,33 @@ public: LLAssetType::AT_LINK, link_waiter); } +*/ +// [SL:KB] - Patch: Appearance-MixedViewers | Checked: 2010-08-14 (Catznip-2.1.2a) | Added: Catznip-2.1.1d + doOnIdleOneTime(boost::bind(&LLFetchAndLinkObserver::doneIdle, this)); +// [/SL:KB] + } + +// [SL:KB] - Patch: Appearance-MixedViewers | Checked: 2010-04-02 (Catznip-2.1.2a) | Added: Catznip-2.0.0a + void doneIdle() + { + // NOTE: the code above makes the assumption that COF is empty which won't be the case the way it's used now + LLInventoryModel::item_array_t initial_items; + for (uuid_vec_t::iterator itItem = mIDs.begin(); itItem != mIDs.end(); ++itItem) + { + LLViewerInventoryItem* pItem = gInventory.getItem(*itItem); + if (!pItem) + { + llwarns << "fetch failed!" << llendl; + continue; + } + initial_items.push_back(pItem); + } + + LLAppearanceMgr::instance().updateAppearanceFromInitialWearables(initial_items); + + delete this; } +// [/SL:KB] }; void LLInitialWearablesFetch::processWearablesMessage() @@ -182,7 +242,11 @@ void LLInitialWearablesFetch::processWearablesMessage() for (U8 i = 0; i < mAgentInitialWearables.size(); ++i) { // Populate the current outfit folder with links to the wearables passed in the message - InitialWearableData *wearable_data = new InitialWearableData(mAgentInitialWearables[i]); // This will be deleted in the callback. +// InitialWearableData *wearable_data = new InitialWearableData(mAgentInitialWearables[i]); // This will be deleted in the callback. +// [SL:KB] - Patch: Appearance-MixedViewers | Checked: 2010-05-02 (Catznip-2.1.2a) | Added: Catznip-2.0.0f + // Fixes minor leak: since COF is used onInitialWearableAssetArrived() will never get called and "wearable_data" leaks + InitialWearableData* wearable_data = &mAgentInitialWearables[i]; +// [/SL:KB] if (wearable_data->mAssetID.notNull()) { @@ -192,7 +256,7 @@ void LLInitialWearablesFetch::processWearablesMessage() { llinfos << "Invalid wearable, type " << wearable_data->mType << " itemID " << wearable_data->mItemID << " assetID " << wearable_data->mAssetID << llendl; - delete wearable_data; +// delete wearable_data; } } diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index 7159d89d21d09b201e214794a6e4d9928977e5f2..467c8550c3d4a0e814015f2ce3fa4b4cae68d96c 100644 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -1773,6 +1773,21 @@ void LLAppearanceMgr::updateAppearanceFromCOF(bool update_base_outfit_ordering) } } +// [SL:KB] - Patch: Appearance-MixedViewers | Checked: 2010-04-02 (Catznip-2.1.2a) | Added: Catznip-2.0.0a +void LLAppearanceMgr::updateAppearanceFromInitialWearables(LLInventoryModel::item_array_t& initial_items) +{ + const LLUUID& idCOF = getCOF(); + + // Remove current COF contents + purgeCategory(idCOF, false); + gInventory.notifyObservers(); + + // Create links to new COF contents + LLPointer<LLInventoryCallback> link_waiter = new LLUpdateAppearanceOnDestroy; + linkAll(idCOF, initial_items, link_waiter); +} +// [/SL:KB] + void LLAppearanceMgr::getDescendentsOfAssetType(const LLUUID& category, LLInventoryModel::item_array_t& items, LLAssetType::EType type, diff --git a/indra/newview/llappearancemgr.h b/indra/newview/llappearancemgr.h index c65d9dc9eeda8448d3c3042fb336a14d2d095fa4..99e7c56de7a30d58b075639accea5a9bb84e30b4 100644 --- a/indra/newview/llappearancemgr.h +++ b/indra/newview/llappearancemgr.h @@ -51,6 +51,9 @@ public: typedef std::vector<LLInventoryModel::item_array_t> wearables_by_type_t; void updateAppearanceFromCOF(bool update_base_outfit_ordering = false); +// [SL:KB] - Patch: Appearance-MixedViewers | Checked: 2010-04-02 (Catznip-2.1.2a) | Added: Catznip-2.0.0a + void updateAppearanceFromInitialWearables(LLInventoryModel::item_array_t& initial_items); +// [/SL:KB] bool needToSaveCOF(); void updateCOF(const LLUUID& category, bool append = false); void wearInventoryCategory(LLInventoryCategory* category, bool copy, bool append);