--HG--
branch : product-engine
meow-7.2.2
Yuri Chebotarev 2010-06-07 12:57:17 +03:00
commit c356aeedfb
4 changed files with 61 additions and 24 deletions

View File

@ -324,6 +324,19 @@ private:
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.
class LLFindWorn : public LLInventoryCollectFunctor
{

View File

@ -62,13 +62,9 @@
#include "llsdutil.h"
#include <deque>
// 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
// notification to wait for before giving up.
static const U32 MAX_NUM_NOTIFICATIONS_TO_PROCESS = 127;
const U32 LLInventoryFetchItemsObserver::MAX_NUM_ATTEMPTS_TO_PROCESS = 10;
const F32 LLInventoryFetchItemsObserver::FETCH_TIMER_EXPIRY = 10.0f;
LLInventoryObserver::LLInventoryObserver()
{
@ -149,7 +145,7 @@ void LLInventoryCompletionObserver::watchItem(const LLUUID& id)
LLInventoryFetchItemsObserver::LLInventoryFetchItemsObserver(const LLUUID& item_id) :
LLInventoryFetchObserver(item_id),
mNumTries(MAX_NUM_NOTIFICATIONS_TO_PROCESS)
mNumTries(MAX_NUM_ATTEMPTS_TO_PROCESS)
{
mIDs.clear();
mIDs.push_back(item_id);
@ -158,35 +154,47 @@ LLInventoryFetchItemsObserver::LLInventoryFetchItemsObserver(const LLUUID& item_
LLInventoryFetchItemsObserver::LLInventoryFetchItemsObserver(const uuid_vec_t& item_ids) :
LLInventoryFetchObserver(item_ids),
mNumTries(MAX_NUM_NOTIFICATIONS_TO_PROCESS)
mNumTries(MAX_NUM_ATTEMPTS_TO_PROCESS)
{
}
void LLInventoryFetchItemsObserver::changed(U32 mask)
{
BOOL any_items_missing = FALSE;
// scan through the incomplete items and move or erase them as
// appropriate.
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(); )
{
const LLUUID& item_id = (*it);
LLViewerInventoryItem* item = gInventory.getItem(item_id);
if (!item)
{
any_items_missing = TRUE;
if (mNumTries > 0)
if (timeout_expired)
{
// Keep trying.
++it;
// Just concede that this item hasn't arrived in reasonable time and continue on.
LL_WARNS("InventoryFetch") << "Fetcher timed out when fetching inventory item UUID: " << item_id << LL_ENDL;
it = mIncomplete.erase(it);
}
else
{
// Just concede that this item hasn't arrived in reasonable time and continue on.
llwarns << "Fetcher timed out when fetching inventory item assetID:" << item_id << llendl;
it = mIncomplete.erase(it);
// Keep trying.
++it;
}
continue;
}
@ -198,14 +206,10 @@ void LLInventoryFetchItemsObserver::changed(U32 mask)
}
++it;
}
if (any_items_missing)
{
mNumTries--;
}
if (mIncomplete.empty())
{
mNumTries = MAX_NUM_NOTIFICATIONS_TO_PROCESS;
mNumTries = MAX_NUM_ATTEMPTS_TO_PROCESS;
done();
}
}
@ -315,6 +319,10 @@ void LLInventoryFetchItemsObserver::startFetch()
item_entry["item_id"] = (*it);
items_llsd.append(item_entry);
}
mFetchingPeriod.resetWithExpiry(FETCH_TIMER_EXPIRY);
mNumTries = MAX_NUM_ATTEMPTS_TO_PROCESS;
fetch_items_from_llsd(items_llsd);
}

View File

@ -110,6 +110,22 @@ public:
/*virtual*/ void changed(U32 mask);
private:
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;
};
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

View File

@ -280,7 +280,7 @@ BOOL LLPanelOutfitEdit::postBuild()
childSetAction(REVERT_BTN, boost::bind(&LLAppearanceMgr::wearBaseOutfit, LLAppearanceMgr::getInstance()));
mWearableListMaskCollector = new LLFindNonLinksByMask(ALL_ITEMS_MASK);
mWearableListTypeCollector = new LLFindWearablesOfType(LLWearableType::WT_NONE);
mWearableListTypeCollector = new LLFindActualWearablesOfType(LLWearableType::WT_NONE);
mWearableItemsPanel = getChild<LLPanel>("filtered_wearables_panel");
mWearableItemsList = getChild<LLInventoryItemsList>("filtered_wearables_list");