Skip to content
Snippets Groups Projects
Commit c356aeed authored by Yuri Chebotarev's avatar Yuri Chebotarev
Browse files

merge

--HG--
branch : product-engine
parents 6bbe5555 ebf703a1
No related branches found
No related tags found
No related merge requests found
...@@ -324,6 +324,19 @@ class LLFindWearablesOfType : public LLInventoryCollectFunctor ...@@ -324,6 +324,19 @@ class LLFindWearablesOfType : public LLInventoryCollectFunctor
LLWearableType::EType mWearableType; LLWearableType::EType mWearableType;
}; };
/** Filter out wearables-links */
class LLFindActualWearablesOfType : public LLFindWearablesOfType
{
public:
LLFindActualWearablesOfType(LLWearableType::EType type) : LLFindWearablesOfType(type) {}
virtual ~LLFindActualWearablesOfType() {}
virtual bool operator()(LLInventoryCategory* cat, LLInventoryItem* item)
{
if (item && item->getIsLinkType()) return false;
return LLFindWearablesOfType::operator()(cat, item);
}
};
// Find worn items. // Find worn items.
class LLFindWorn : public LLInventoryCollectFunctor class LLFindWorn : public LLInventoryCollectFunctor
{ {
......
...@@ -62,13 +62,9 @@ ...@@ -62,13 +62,9 @@
#include "llsdutil.h" #include "llsdutil.h"
#include <deque> #include <deque>
// If the viewer gets a notification, your observer assumes const U32 LLInventoryFetchItemsObserver::MAX_NUM_ATTEMPTS_TO_PROCESS = 10;
// that that notification is for itself and then tries to process const F32 LLInventoryFetchItemsObserver::FETCH_TIMER_EXPIRY = 10.0f;
// the results. The notification could be for something else (e.g.
// you're fetching an item and a notification gets triggered because
// you renamed some other item). This counter is to specify how many
// notification to wait for before giving up.
static const U32 MAX_NUM_NOTIFICATIONS_TO_PROCESS = 127;
LLInventoryObserver::LLInventoryObserver() LLInventoryObserver::LLInventoryObserver()
{ {
...@@ -149,7 +145,7 @@ void LLInventoryCompletionObserver::watchItem(const LLUUID& id) ...@@ -149,7 +145,7 @@ void LLInventoryCompletionObserver::watchItem(const LLUUID& id)
LLInventoryFetchItemsObserver::LLInventoryFetchItemsObserver(const LLUUID& item_id) : LLInventoryFetchItemsObserver::LLInventoryFetchItemsObserver(const LLUUID& item_id) :
LLInventoryFetchObserver(item_id), LLInventoryFetchObserver(item_id),
mNumTries(MAX_NUM_NOTIFICATIONS_TO_PROCESS) mNumTries(MAX_NUM_ATTEMPTS_TO_PROCESS)
{ {
mIDs.clear(); mIDs.clear();
mIDs.push_back(item_id); mIDs.push_back(item_id);
...@@ -158,35 +154,47 @@ LLInventoryFetchItemsObserver::LLInventoryFetchItemsObserver(const LLUUID& item_ ...@@ -158,35 +154,47 @@ LLInventoryFetchItemsObserver::LLInventoryFetchItemsObserver(const LLUUID& item_
LLInventoryFetchItemsObserver::LLInventoryFetchItemsObserver(const uuid_vec_t& item_ids) : LLInventoryFetchItemsObserver::LLInventoryFetchItemsObserver(const uuid_vec_t& item_ids) :
LLInventoryFetchObserver(item_ids), LLInventoryFetchObserver(item_ids),
mNumTries(MAX_NUM_NOTIFICATIONS_TO_PROCESS) mNumTries(MAX_NUM_ATTEMPTS_TO_PROCESS)
{ {
} }
void LLInventoryFetchItemsObserver::changed(U32 mask) void LLInventoryFetchItemsObserver::changed(U32 mask)
{ {
BOOL any_items_missing = FALSE;
// scan through the incomplete items and move or erase them as // scan through the incomplete items and move or erase them as
// appropriate. // appropriate.
if (!mIncomplete.empty()) if (!mIncomplete.empty())
{ {
// if period of an attempt expired...
if (mFetchingPeriod.hasExpired())
{
// ...reset timer and reduce count of attempts
mFetchingPeriod.reset();
mFetchingPeriod.setTimerExpirySec(FETCH_TIMER_EXPIRY);
--mNumTries;
LL_INFOS("InventoryFetch") << "LLInventoryFetchItemsObserver: " << this << ", attempt(s) left: " << (S32)mNumTries << LL_ENDL;
}
// do we still have any attempts?
bool timeout_expired = mNumTries <= 0;
for (uuid_vec_t::iterator it = mIncomplete.begin(); it < mIncomplete.end(); ) for (uuid_vec_t::iterator it = mIncomplete.begin(); it < mIncomplete.end(); )
{ {
const LLUUID& item_id = (*it); const LLUUID& item_id = (*it);
LLViewerInventoryItem* item = gInventory.getItem(item_id); LLViewerInventoryItem* item = gInventory.getItem(item_id);
if (!item) if (!item)
{ {
any_items_missing = TRUE; if (timeout_expired)
if (mNumTries > 0)
{ {
// Keep trying. // Just concede that this item hasn't arrived in reasonable time and continue on.
++it; LL_WARNS("InventoryFetch") << "Fetcher timed out when fetching inventory item UUID: " << item_id << LL_ENDL;
it = mIncomplete.erase(it);
} }
else else
{ {
// Just concede that this item hasn't arrived in reasonable time and continue on. // Keep trying.
llwarns << "Fetcher timed out when fetching inventory item assetID:" << item_id << llendl; ++it;
it = mIncomplete.erase(it);
} }
continue; continue;
} }
...@@ -198,14 +206,10 @@ void LLInventoryFetchItemsObserver::changed(U32 mask) ...@@ -198,14 +206,10 @@ void LLInventoryFetchItemsObserver::changed(U32 mask)
} }
++it; ++it;
} }
if (any_items_missing)
{
mNumTries--;
}
if (mIncomplete.empty()) if (mIncomplete.empty())
{ {
mNumTries = MAX_NUM_NOTIFICATIONS_TO_PROCESS; mNumTries = MAX_NUM_ATTEMPTS_TO_PROCESS;
done(); done();
} }
} }
...@@ -315,6 +319,10 @@ void LLInventoryFetchItemsObserver::startFetch() ...@@ -315,6 +319,10 @@ void LLInventoryFetchItemsObserver::startFetch()
item_entry["item_id"] = (*it); item_entry["item_id"] = (*it);
items_llsd.append(item_entry); items_llsd.append(item_entry);
} }
mFetchingPeriod.resetWithExpiry(FETCH_TIMER_EXPIRY);
mNumTries = MAX_NUM_ATTEMPTS_TO_PROCESS;
fetch_items_from_llsd(items_llsd); fetch_items_from_llsd(items_llsd);
} }
......
...@@ -110,6 +110,22 @@ class LLInventoryFetchItemsObserver : public LLInventoryFetchObserver ...@@ -110,6 +110,22 @@ class LLInventoryFetchItemsObserver : public LLInventoryFetchObserver
/*virtual*/ void changed(U32 mask); /*virtual*/ void changed(U32 mask);
private: private:
S8 mNumTries; // Number of times changed() was called without success S8 mNumTries; // Number of times changed() was called without success
LLFrameTimer mFetchingPeriod;
/**
* If the viewer gets a notification, your observer assumes
* that that notification is for itself and then tries to process
* the results. The notification could be for something else (e.g.
* you're fetching an item and a notification gets triggered because
* you renamed some other item). This counter is to specify how many
* periods of time to wait for before giving up.
*/
static const U32 MAX_NUM_ATTEMPTS_TO_PROCESS;
/**
* Period of waiting a notification when requested items get added into inventory.
*/
static const F32 FETCH_TIMER_EXPIRY;
}; };
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
......
...@@ -280,7 +280,7 @@ BOOL LLPanelOutfitEdit::postBuild() ...@@ -280,7 +280,7 @@ BOOL LLPanelOutfitEdit::postBuild()
childSetAction(REVERT_BTN, boost::bind(&LLAppearanceMgr::wearBaseOutfit, LLAppearanceMgr::getInstance())); childSetAction(REVERT_BTN, boost::bind(&LLAppearanceMgr::wearBaseOutfit, LLAppearanceMgr::getInstance()));
mWearableListMaskCollector = new LLFindNonLinksByMask(ALL_ITEMS_MASK); mWearableListMaskCollector = new LLFindNonLinksByMask(ALL_ITEMS_MASK);
mWearableListTypeCollector = new LLFindWearablesOfType(LLWearableType::WT_NONE); mWearableListTypeCollector = new LLFindActualWearablesOfType(LLWearableType::WT_NONE);
mWearableItemsPanel = getChild<LLPanel>("filtered_wearables_panel"); mWearableItemsPanel = getChild<LLPanel>("filtered_wearables_panel");
mWearableItemsList = getChild<LLInventoryItemsList>("filtered_wearables_list"); mWearableItemsList = getChild<LLInventoryItemsList>("filtered_wearables_list");
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment