diff options
Diffstat (limited to 'indra/newview')
| -rw-r--r-- | indra/newview/llcallfloater.cpp | 3 | ||||
| -rw-r--r-- | indra/newview/llinventorybridge.cpp | 77 | ||||
| -rw-r--r-- | indra/newview/llinventorybridge.h | 2 | ||||
| -rw-r--r-- | indra/newview/llinventoryfilter.cpp | 84 | ||||
| -rw-r--r-- | indra/newview/llinventoryfilter.h | 4 | ||||
| -rw-r--r-- | indra/newview/llinventorymodelbackgroundfetch.cpp | 283 | ||||
| -rw-r--r-- | indra/newview/llinventorymodelbackgroundfetch.h | 16 | ||||
| -rw-r--r-- | indra/newview/llinventorypanel.h | 2 | ||||
| -rw-r--r-- | indra/newview/llpanelimcontrolpanel.cpp | 2 | ||||
| -rw-r--r-- | indra/newview/llparticipantlist.cpp | 12 | ||||
| -rw-r--r-- | indra/newview/llparticipantlist.h | 4 | ||||
| -rw-r--r-- | indra/newview/llplacesinventorybridge.cpp | 4 | ||||
| -rw-r--r-- | indra/newview/llspeakers.cpp | 14 | ||||
| -rw-r--r-- | indra/newview/llspeakers.h | 7 | ||||
| -rw-r--r-- | indra/newview/skins/default/xui/en/floater_test_textbox.xml | 17 | ||||
| -rw-r--r-- | indra/newview/skins/default/xui/en/panel_main_inventory.xml | 1 | 
16 files changed, 394 insertions, 138 deletions
| diff --git a/indra/newview/llcallfloater.cpp b/indra/newview/llcallfloater.cpp index e3217668c5..f2375bfa4f 100644 --- a/indra/newview/llcallfloater.cpp +++ b/indra/newview/llcallfloater.cpp @@ -188,7 +188,7 @@ void LLCallFloater::draw()  	// Need to resort the participant list if it's in sort by recent speaker order.  	if (mParticipants) -		mParticipants->updateRecentSpeakersOrder(); +		mParticipants->update();  	LLFloater::draw();  } @@ -333,6 +333,7 @@ void LLCallFloater::refreshParticipantList()  	if (!non_avatar_caller)  	{ +		llassert(mParticipants == NULL); // check for possible memory leak  		mParticipants = new LLParticipantList(mSpeakerManager, mAvatarList, true, mVoiceType != VC_GROUP_CHAT && mVoiceType != VC_AD_HOC_CHAT, false);  		mParticipants->setValidateSpeakerCallback(boost::bind(&LLCallFloater::validateSpeaker, this, _1));  		const U32 speaker_sort_order = gSavedSettings.getU32("SpeakerParticipantDefaultOrder"); diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index c0065a94e6..869cb735d5 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -148,7 +148,7 @@ LLInvFVBridge::LLInvFVBridge(LLInventoryPanel* inventory,  	mInvType(LLInventoryType::IT_NONE),  	mIsLink(FALSE)  { -	mInventoryPanel = inventory->getHandle(); +	mInventoryPanel = inventory->getInventoryPanelHandle();  	const LLInventoryObject* obj = getInventoryObject();  	mIsLink = obj && obj->getIsLinkType();  } @@ -798,7 +798,7 @@ LLInventoryObject* LLInvFVBridge::getInventoryObject() const  LLInventoryModel* LLInvFVBridge::getInventoryModel() const  { -	LLInventoryPanel* panel = dynamic_cast<LLInventoryPanel*>(mInventoryPanel.get()); +	LLInventoryPanel* panel = mInventoryPanel.get();  	return panel ? panel->getModel() : NULL;  } @@ -1324,8 +1324,7 @@ void LLItemBridge::selectItem()  	LLViewerInventoryItem* item = static_cast<LLViewerInventoryItem*>(getItem());  	if(item && !item->isFinished())  	{ -		item->fetchFromServer(); -		//LLInventoryModelBackgroundFetch::instance().start(item->getUUID(), false); +		LLInventoryModelBackgroundFetch::instance().start(item->getUUID(), false);  	}  } @@ -1738,7 +1737,7 @@ BOOL LLFolderBridge::isItemRemovable() const  		return FALSE;  	} -	LLInventoryPanel* panel = dynamic_cast<LLInventoryPanel*>(mInventoryPanel.get()); +	LLInventoryPanel* panel = mInventoryPanel.get();  	LLFolderViewFolder* folderp = dynamic_cast<LLFolderViewFolder*>(panel ? panel->getRootFolder()->getItemByID(mUUID) : NULL);  	if (folderp)  	{ @@ -3290,7 +3289,7 @@ void LLFolderBridge::createNewCategory(void* user_data)  {  	LLFolderBridge* bridge = (LLFolderBridge*)user_data;  	if(!bridge) return; -	LLInventoryPanel* panel = dynamic_cast<LLInventoryPanel*>(bridge->mInventoryPanel.get()); +	LLInventoryPanel* panel = bridge->mInventoryPanel.get();  	if (!panel) return;  	LLInventoryModel* model = panel->getModel();  	if(!model) return; @@ -3470,7 +3469,7 @@ void LLFolderBridge::dropToFavorites(LLInventoryItem* inv_item)  	// use callback to rearrange favorite landmarks after adding  	// to have new one placed before target (on which it was dropped). See EXT-4312.  	LLPointer<AddFavoriteLandmarkCallback> cb = new AddFavoriteLandmarkCallback(); -	LLInventoryPanel* panel = dynamic_cast<LLInventoryPanel*>(mInventoryPanel.get()); +	LLInventoryPanel* panel = mInventoryPanel.get();  	LLFolderViewItem* drag_over_item = panel ? panel->getRootFolder()->getDraggingOverItem() : NULL;  	if (drag_over_item && drag_over_item->getListener())  	{ @@ -3520,6 +3519,12 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,  	if (!isAgentInventory()) return FALSE; // cannot drag into library  	if (!isAgentAvatarValid()) return FALSE; +	LLInventoryPanel* destination_panel = mInventoryPanel.get(); +	if (!destination_panel) return false; + +	LLInventoryFilter* filter = destination_panel->getFilter(); +	if (!filter) return false; +  	const LLUUID ¤t_outfit_id = model->findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT, false);  	const LLUUID &favorites_id = model->findCategoryUUIDForType(LLFolderType::FT_FAVORITE, false);  	const LLUUID &landmarks_id = model->findCategoryUUIDForType(LLFolderType::FT_LANDMARK, false); @@ -3628,6 +3633,21 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,  			}  		} +		LLInventoryPanel* active_panel = LLInventoryPanel::getActiveInventoryPanel(FALSE); + +		// Check whether the item being dragged from active inventory panel +		// passes the filter of the destination panel. +		if (accept && active_panel) +		{ +			LLFolderView* active_folder_viev = active_panel->getRootFolder(); +			if (!active_folder_viev) return false; + +			LLFolderViewItem* fv_item = active_folder_viev->getItemByID(inv_item->getUUID()); +			if (!fv_item) return false; + +			accept = filter->check(fv_item); +		} +  		if (accept && drop)  		{  			if (inv_item->getType() == LLAssetType::AT_GESTURE @@ -3637,14 +3657,9 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,  			}  			// If an item is being dragged between windows, unselect everything in the active window   			// so that we don't follow the selection to its new location (which is very annoying). -			LLInventoryPanel *active_panel = LLInventoryPanel::getActiveInventoryPanel(FALSE); -			if (active_panel) +			if (active_panel && (destination_panel != active_panel))  			{ -				LLInventoryPanel* panel = dynamic_cast<LLInventoryPanel*>(mInventoryPanel.get()); -				if (active_panel && (panel != active_panel)) -				{ -					active_panel->unSelectAll(); -				} +				active_panel->unSelectAll();  			}  			//-------------------------------------------------------------------------------- @@ -3655,8 +3670,7 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,  			// (only reorder the item in Favorites folder)  			if ((mUUID == inv_item->getParentUUID()) && move_is_into_favorites)  			{ -				LLInventoryPanel* panel = dynamic_cast<LLInventoryPanel*>(mInventoryPanel.get()); -				LLFolderViewItem* itemp = panel ? panel->getRootFolder()->getDraggingOverItem() : NULL; +				LLFolderViewItem* itemp = destination_panel->getRootFolder()->getDraggingOverItem();  				if (itemp)  				{  					LLUUID srcItemId = inv_item->getUUID(); @@ -3760,6 +3774,13 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,  			accept = FALSE;  		} +		// Check whether the item being dragged from in world +		// passes the filter of the destination panel. +		if (accept) +		{ +			accept = filter->check(inv_item); +		} +  		if (accept && drop)  		{  			LLMoveInv* move_inv = new LLMoveInv; @@ -3797,6 +3818,13 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,  			accept = !(move_is_into_current_outfit || move_is_into_outfit);  		} +		// Check whether the item being dragged from notecard +		// passes the filter of the destination panel. +		if (accept) +		{ +			accept = filter->check(inv_item); +		} +  		if (accept && drop)  		{  			copy_inventory_from_notecard(mUUID,  // Drop to the chosen destination folder @@ -3828,6 +3856,21 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,  				accept = can_move_to_landmarks(inv_item);  			} +			LLInventoryPanel* active_panel = LLInventoryPanel::getActiveInventoryPanel(FALSE); + +			// Check whether the item being dragged from the library +			// passes the filter of the destination panel. +			if (accept && active_panel) +			{ +				LLFolderView* active_folder_viev = active_panel->getRootFolder(); +				if (!active_folder_viev) return false; + +				LLFolderViewItem* fv_item = active_folder_viev->getItemByID(inv_item->getUUID()); +				if (!fv_item) return false; + +				accept = filter->check(fv_item); +			} +  			if (accept && drop)  			{  				// FAVORITES folder @@ -4184,7 +4227,7 @@ LLCallingCardBridge::~LLCallingCardBridge()  void LLCallingCardBridge::refreshFolderViewItem()  { -	LLInventoryPanel* panel = dynamic_cast<LLInventoryPanel*>(mInventoryPanel.get()); +	LLInventoryPanel* panel = mInventoryPanel.get();  	LLFolderViewItem* itemp = panel ? panel->getRootFolder()->getItemByID(mUUID) : NULL;  	if (itemp)  	{ diff --git a/indra/newview/llinventorybridge.h b/indra/newview/llinventorybridge.h index 871657a58a..3bcd71557c 100644 --- a/indra/newview/llinventorybridge.h +++ b/indra/newview/llinventorybridge.h @@ -161,7 +161,7 @@ protected:  									 BOOL restamp);  	void removeBatchNoCheck(LLDynamicArray<LLFolderViewEventListener*>& batch);  protected: -	LLHandle<LLPanel> mInventoryPanel; +	LLHandle<LLInventoryPanel> mInventoryPanel;  	LLFolderView* mRoot;  	const LLUUID mUUID;	// item id  	LLInventoryType::EType mInvType; diff --git a/indra/newview/llinventoryfilter.cpp b/indra/newview/llinventoryfilter.cpp index d54bce4619..796251cae5 100644 --- a/indra/newview/llinventoryfilter.cpp +++ b/indra/newview/llinventoryfilter.cpp @@ -108,6 +108,19 @@ BOOL LLInventoryFilter::check(const LLFolderViewItem* item)  	return passed;  } +bool LLInventoryFilter::check(const LLInventoryItem* item) +{ +	mSubStringMatchOffset = mFilterSubString.size() ? item->getName().find(mFilterSubString) : std::string::npos; + +	const bool passed_filtertype = checkAgainstFilterType(item); +	const bool passed_permissions = checkAgainstPermissions(item); +	const bool passed = (passed_filtertype && +						 passed_permissions && +						 (mFilterSubString.size() == 0 || mSubStringMatchOffset != std::string::npos)); + +	return passed; +} +  bool LLInventoryFilter::checkFolder(const LLFolderViewFolder* folder)  {  	// we're showing all folders, overriding filter @@ -227,6 +240,66 @@ BOOL LLInventoryFilter::checkAgainstFilterType(const LLFolderViewItem* item) con  	return TRUE;  } +bool LLInventoryFilter::checkAgainstFilterType(const LLInventoryItem* item) const +{ +	LLInventoryType::EType object_type = item->getInventoryType(); +	const LLUUID object_id = item->getUUID(); + +	const U32 filterTypes = mFilterOps.mFilterTypes; + +	//////////////////////////////////////////////////////////////////////////////// +	// FILTERTYPE_OBJECT +	// Pass if this item's type is of the correct filter type +	if (filterTypes & FILTERTYPE_OBJECT) +	{ +		// If it has no type, pass it, unless it's a link. +		if (object_type == LLInventoryType::IT_NONE) +		{ +			if (item && item->getIsLinkType()) +			{ +				return false; +			} +		} +		else if ((1LL << object_type & mFilterOps.mFilterObjectTypes) == U64(0)) +		{ +			return false; +		} +	} + +	//////////////////////////////////////////////////////////////////////////////// +	// FILTERTYPE_UUID +	// Pass if this item is the target UUID or if it links to the target UUID +	if (filterTypes & FILTERTYPE_UUID) +	{ +		if (!item) return false; + +		if (item->getLinkedUUID() != mFilterOps.mFilterUUID) +			return false; +	} + +	//////////////////////////////////////////////////////////////////////////////// +	// FILTERTYPE_DATE +	// Pass if this item is within the date range. +	if (filterTypes & FILTERTYPE_DATE) +	{ +		const U16 HOURS_TO_SECONDS = 3600; +		time_t earliest = time_corrected() - mFilterOps.mHoursAgo * HOURS_TO_SECONDS; +		if (mFilterOps.mMinDate > time_min() && mFilterOps.mMinDate < earliest) +		{ +			earliest = mFilterOps.mMinDate; +		} +		else if (!mFilterOps.mHoursAgo) +		{ +			earliest = 0; +		} +		if (item->getCreationDate() < earliest || +			item->getCreationDate() > mFilterOps.mMaxDate) +			return false; +	} + +	return true; +} +  BOOL LLInventoryFilter::checkAgainstPermissions(const LLFolderViewItem* item) const  {  	const LLFolderViewEventListener* listener = item->getListener(); @@ -244,6 +317,17 @@ BOOL LLInventoryFilter::checkAgainstPermissions(const LLFolderViewItem* item) co  	return (perm & mFilterOps.mPermissions) == mFilterOps.mPermissions;  } +bool LLInventoryFilter::checkAgainstPermissions(const LLInventoryItem* item) const +{ +	if (!item) return false; + +	LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item); +	PermissionMask perm = new_item->getPermissionMask(); +	new_item = NULL; + +	return (perm & mFilterOps.mPermissions) == mFilterOps.mPermissions; +} +  BOOL LLInventoryFilter::checkAgainstFilterLinks(const LLFolderViewItem* item) const  {  	const LLFolderViewEventListener* listener = item->getListener(); diff --git a/indra/newview/llinventoryfilter.h b/indra/newview/llinventoryfilter.h index bba24ac652..343306ae8e 100644 --- a/indra/newview/llinventoryfilter.h +++ b/indra/newview/llinventoryfilter.h @@ -32,6 +32,7 @@  class LLFolderViewItem;  class LLFolderViewFolder; +class LLInventoryItem;  class LLInventoryFilter  { @@ -115,9 +116,12 @@ public:  	// + Execution And Results  	// +-------------------------------------------------------------------+  	BOOL 				check(const LLFolderViewItem* item); +	bool				check(const LLInventoryItem* item);  	bool				checkFolder(const LLFolderViewFolder* folder);  	BOOL 				checkAgainstFilterType(const LLFolderViewItem* item) const; +	bool 				checkAgainstFilterType(const LLInventoryItem* item) const;  	BOOL 				checkAgainstPermissions(const LLFolderViewItem* item) const; +	bool 				checkAgainstPermissions(const LLInventoryItem* item) const;  	BOOL 				checkAgainstFilterLinks(const LLFolderViewItem* item) const;  	std::string::size_type getStringMatchOffset() const; diff --git a/indra/newview/llinventorymodelbackgroundfetch.cpp b/indra/newview/llinventorymodelbackgroundfetch.cpp index 91fdd67806..cb140cf15c 100644 --- a/indra/newview/llinventorymodelbackgroundfetch.cpp +++ b/indra/newview/llinventorymodelbackgroundfetch.cpp @@ -50,7 +50,7 @@ LLInventoryModelBackgroundFetch::LLInventoryModelBackgroundFetch() :  	mMinTimeBetweenFetches(0.3f),  	mMaxTimeBetweenFetches(10.f),  	mTimelyFetchPending(FALSE), -	mBulkFetchCount(0) +	mFetchCount(0)  {  } @@ -60,7 +60,7 @@ LLInventoryModelBackgroundFetch::~LLInventoryModelBackgroundFetch()  bool LLInventoryModelBackgroundFetch::isBulkFetchProcessingComplete() const  { -	return mFetchQueue.empty() && mBulkFetchCount<=0; +	return mFetchQueue.empty() && mFetchCount<=0;  }  bool LLInventoryModelBackgroundFetch::libraryFetchStarted() const @@ -103,14 +103,15 @@ BOOL LLInventoryModelBackgroundFetch::backgroundFetchActive() const  	return mBackgroundFetchActive;  } -void LLInventoryModelBackgroundFetch::start(const LLUUID& cat_id, BOOL recursive) +void LLInventoryModelBackgroundFetch::start(const LLUUID& id, BOOL recursive)  { -	if (!mAllFoldersFetched || cat_id.notNull()) -	{ -		LL_DEBUGS("InventoryFetch") << "Start fetching category: " << cat_id << ", recursive: " << recursive << LL_ENDL; +	LLViewerInventoryCategory* cat = gInventory.getCategory(id); +	if (cat || (id.isNull() && !mAllFoldersFetched)) +	{	// it's a folder, do a bulk fetch +		LL_DEBUGS("InventoryFetch") << "Start fetching category: " << id << ", recursive: " << recursive << LL_ENDL;  		mBackgroundFetchActive = TRUE; -		if (cat_id.isNull()) +		if (id.isNull())  		{  			if (!mRecursiveInventoryFetchStarted)  			{ @@ -128,21 +129,31 @@ void LLInventoryModelBackgroundFetch::start(const LLUUID& cat_id, BOOL recursive  		else  		{  			// Specific folder requests go to front of queue. -			if (mFetchQueue.empty() || mFetchQueue.front().mCatUUID != cat_id) +			if (mFetchQueue.empty() || mFetchQueue.front().mUUID != id)  			{ -				mFetchQueue.push_front(FetchQueueInfo(cat_id, recursive)); +				mFetchQueue.push_front(FetchQueueInfo(id, recursive));  				gIdleCallbacks.addFunction(&LLInventoryModelBackgroundFetch::backgroundFetchCB, NULL);  			} -			if (cat_id == gInventory.getLibraryRootFolderID()) +			if (id == gInventory.getLibraryRootFolderID())  			{  				mRecursiveLibraryFetchStarted |= recursive;  			} -			if (cat_id == gInventory.getRootFolderID()) +			if (id == gInventory.getRootFolderID())  			{  				mRecursiveInventoryFetchStarted |= recursive;  			}  		}  	} +	else if (LLViewerInventoryItem* itemp = gInventory.getItem(id)) +	{ +		if (!itemp->mIsComplete && (mFetchQueue.empty() || mFetchQueue.front().mUUID != id)) +		{ +			mBackgroundFetchActive = TRUE; + +			mFetchQueue.push_front(FetchQueueInfo(id, false, false)); +			gIdleCallbacks.addFunction(&LLInventoryModelBackgroundFetch::backgroundFetchCB, NULL); +		} +	}  }  void LLInventoryModelBackgroundFetch::findLostItems() @@ -158,7 +169,7 @@ void LLInventoryModelBackgroundFetch::stopBackgroundFetch()  	{  		mBackgroundFetchActive = FALSE;  		gIdleCallbacks.deleteFunction(&LLInventoryModelBackgroundFetch::backgroundFetchCB, NULL); -		mBulkFetchCount=0; +		mFetchCount=0;  		mMinTimeBetweenFetches=0.0f;  	}  } @@ -183,10 +194,9 @@ void LLInventoryModelBackgroundFetch::backgroundFetch()  	if (mBackgroundFetchActive && gAgent.getRegion())  	{  		// If we'll be using the capability, we'll be sending batches and the background thing isn't as important. -		std::string url = gAgent.getRegion()->getCapability("FetchInventoryDescendents2");    -		if (gSavedSettings.getBOOL("UseHTTPInventory") && !url.empty())  +		if (gSavedSettings.getBOOL("UseHTTPInventory"))   		{ -			bulkFetch(url); +			bulkFetch();  			return;  		} @@ -230,7 +240,7 @@ void LLInventoryModelBackgroundFetch::backgroundFetch()  			}  			const FetchQueueInfo info = mFetchQueue.front(); -			LLViewerInventoryCategory* cat = gInventory.getCategory(info.mCatUUID); +			LLViewerInventoryCategory* cat = gInventory.getCategory(info.mUUID);  			// Category has been deleted, remove from queue.  			if (!cat) @@ -258,7 +268,7 @@ void LLInventoryModelBackgroundFetch::backgroundFetch()  				}  			}  			// Do I have all my children? -			else if (gInventory.isCategoryComplete(info.mCatUUID)) +			else if (gInventory.isCategoryComplete(info.mUUID))  			{  				// Finished with this category, remove from queue.  				mFetchQueue.pop_front(); @@ -313,15 +323,35 @@ void LLInventoryModelBackgroundFetch::backgroundFetch()  	}  } -void LLInventoryModelBackgroundFetch::incrBulkFetch(S16 fetching)  +void LLInventoryModelBackgroundFetch::incrFetchCount(S16 fetching)   {   -	mBulkFetchCount += fetching;  -	if (mBulkFetchCount < 0) +	mFetchCount += fetching;  +	if (mFetchCount < 0)  	{ -		mBulkFetchCount = 0;  +		mFetchCount = 0;   	}  } +class LLInventoryModelFetchItemResponder : public LLInventoryModel::fetchInventoryResponder +{ +public: +	LLInventoryModelFetchItemResponder(const LLSD& request_sd) : LLInventoryModel::fetchInventoryResponder(request_sd) {}; +	void result(const LLSD& content);			 +	void error(U32 status, const std::string& reason); +}; + +void LLInventoryModelFetchItemResponder::result( const LLSD& content ) +{ +	LLInventoryModel::fetchInventoryResponder::result(content); +	LLInventoryModelBackgroundFetch::instance().incrFetchCount(-1); +} + +void LLInventoryModelFetchItemResponder::error( U32 status, const std::string& reason ) +{ +	LLInventoryModel::fetchInventoryResponder::error(status, reason); +	LLInventoryModelBackgroundFetch::instance().incrFetchCount(-1); +} +  class LLInventoryModelFetchDescendentsResponder: public LLHTTPClient::Responder  { @@ -458,7 +488,7 @@ void LLInventoryModelFetchDescendentsResponder::result(const LLSD& content)  		}  	} -	fetcher->incrBulkFetch(-1); +	fetcher->incrFetchCount(-1);  	if (fetcher->isBulkFetchProcessingComplete())  	{ @@ -477,7 +507,7 @@ void LLInventoryModelFetchDescendentsResponder::error(U32 status, const std::str  	llinfos << "LLInventoryModelFetchDescendentsResponder::error "  		<< status << ": " << reason << llendl; -	fetcher->incrBulkFetch(-1); +	fetcher->incrFetchCount(-1);  	if (status==499) // timed out  	{ @@ -508,12 +538,14 @@ BOOL LLInventoryModelFetchDescendentsResponder::getIsRecursive(const LLUUID& cat  // Bundle up a bunch of requests to send all at once.  // static    -void LLInventoryModelBackgroundFetch::bulkFetch(std::string url) +void LLInventoryModelBackgroundFetch::bulkFetch()  {  	//Background fetch is called from gIdleCallbacks in a loop until background fetch is stopped.  	//If there are items in mFetchQueue, we want to check the time since the last bulkFetch was   	//sent.  If it exceeds our retry time, go ahead and fire off another batch.    	//Stopbackgroundfetch will be run from the Responder instead of here.   +	LLViewerRegion* region = gAgent.getRegion(); +	if (!region) return;  	S16 max_concurrent_fetches=8;  	F32 new_min_time = 0.5f;			//HACK!  Clean this up when old code goes away entirely. @@ -523,12 +555,13 @@ void LLInventoryModelBackgroundFetch::bulkFetch(std::string url)  	}  	if (gDisconnected || -		(mBulkFetchCount > max_concurrent_fetches) || +		(mFetchCount > max_concurrent_fetches) ||  		(mFetchTimer.getElapsedTimeF32() < mMinTimeBetweenFetches))  	{  		return; // just bail if we are disconnected  	}	 +	U32 item_count=0;  	U32 folder_count=0;  	U32 max_batch_size=5; @@ -536,83 +569,159 @@ void LLInventoryModelBackgroundFetch::bulkFetch(std::string url)  	uuid_vec_t recursive_cats; -	LLSD body; -	LLSD body_lib; +	LLSD folder_request_body; +	LLSD folder_request_body_lib; +	LLSD item_request_body; +	LLSD item_request_body_lib; -	while (!(mFetchQueue.empty()) && (folder_count < max_batch_size)) +	while (!(mFetchQueue.empty()) && ((item_count + folder_count) < max_batch_size))  	{  		const FetchQueueInfo& fetch_info = mFetchQueue.front(); -		const LLUUID &cat_id = fetch_info.mCatUUID; -        if (cat_id.isNull()) //DEV-17797 -        { -			LLSD folder_sd; -			folder_sd["folder_id"]		= LLUUID::null.asString(); -			folder_sd["owner_id"]		= gAgent.getID(); -			folder_sd["sort_order"]		= (LLSD::Integer)sort_order; -			folder_sd["fetch_folders"]	= (LLSD::Boolean)FALSE; -			folder_sd["fetch_items"]	= (LLSD::Boolean)TRUE; -			body["folders"].append(folder_sd); -            folder_count++; -        } -        else -        { -		    const LLViewerInventoryCategory* cat = gInventory.getCategory(cat_id); +		if (fetch_info.mIsCategory) +		{ + +			const LLUUID &cat_id = fetch_info.mUUID; +			if (cat_id.isNull()) //DEV-17797 +			{ +				LLSD folder_sd; +				folder_sd["folder_id"]		= LLUUID::null.asString(); +				folder_sd["owner_id"]		= gAgent.getID(); +				folder_sd["sort_order"]		= (LLSD::Integer)sort_order; +				folder_sd["fetch_folders"]	= (LLSD::Boolean)FALSE; +				folder_sd["fetch_items"]	= (LLSD::Boolean)TRUE; +				folder_request_body["folders"].append(folder_sd); +				folder_count++; +			} +			else +			{ +				const LLViewerInventoryCategory* cat = gInventory.getCategory(cat_id); -		    if (cat) -		    { -			    if (LLViewerInventoryCategory::VERSION_UNKNOWN == cat->getVersion()) -			    { -				    LLSD folder_sd; -				    folder_sd["folder_id"]		= cat->getUUID(); -				    folder_sd["owner_id"]		= cat->getOwnerID(); -				    folder_sd["sort_order"]		= (LLSD::Integer)sort_order; -				    folder_sd["fetch_folders"]	= TRUE; //(LLSD::Boolean)sFullFetchStarted; -				    folder_sd["fetch_items"]	= (LLSD::Boolean)TRUE; -				     -				    if (ALEXANDRIA_LINDEN_ID == cat->getOwnerID()) -					    body_lib["folders"].append(folder_sd); -				    else -					    body["folders"].append(folder_sd); -				    folder_count++; -			    } -				// May already have this folder, but append child folders to list. -			    if (fetch_info.mRecursive) -			    {	 -					LLInventoryModel::cat_array_t* categories; -					LLInventoryModel::item_array_t* items; -					gInventory.getDirectDescendentsOf(cat->getUUID(), categories, items); -					for (LLInventoryModel::cat_array_t::const_iterator it = categories->begin(); -						 it != categories->end(); -						 ++it) +				if (cat) +				{ +					if (LLViewerInventoryCategory::VERSION_UNKNOWN == cat->getVersion())  					{ -						mFetchQueue.push_back(FetchQueueInfo((*it)->getUUID(), fetch_info.mRecursive)); -				    } -			    } -		    } -        } -		if (fetch_info.mRecursive) -			recursive_cats.push_back(cat_id); +						LLSD folder_sd; +						folder_sd["folder_id"]		= cat->getUUID(); +						folder_sd["owner_id"]		= cat->getOwnerID(); +						folder_sd["sort_order"]		= (LLSD::Integer)sort_order; +						folder_sd["fetch_folders"]	= TRUE; //(LLSD::Boolean)sFullFetchStarted; +						folder_sd["fetch_items"]	= (LLSD::Boolean)TRUE; +				     +						if (ALEXANDRIA_LINDEN_ID == cat->getOwnerID()) +							folder_request_body_lib["folders"].append(folder_sd); +						else +							folder_request_body["folders"].append(folder_sd); +						folder_count++; +					} +					// May already have this folder, but append child folders to list. +					if (fetch_info.mRecursive) +					{	 +						LLInventoryModel::cat_array_t* categories; +						LLInventoryModel::item_array_t* items; +						gInventory.getDirectDescendentsOf(cat->getUUID(), categories, items); +						for (LLInventoryModel::cat_array_t::const_iterator it = categories->begin(); +							 it != categories->end(); +							 ++it) +						{ +							mFetchQueue.push_back(FetchQueueInfo((*it)->getUUID(), fetch_info.mRecursive)); +						} +					} +				} +			} +			if (fetch_info.mRecursive) +				recursive_cats.push_back(cat_id); +		} +		else +		{ +			LLViewerInventoryItem* itemp = gInventory.getItem(fetch_info.mUUID); +			if (itemp) +			{ +				LLSD item_sd; +				item_sd["owner_id"] = itemp->getPermissions().getOwner(); +				item_sd["item_id"] = itemp->getUUID(); +				if (itemp->getPermissions().getOwner() == gAgent.getID()) +				{ +					item_request_body.append(item_sd); +				} +				else +				{ +					item_request_body_lib.append(item_sd); +				} +				//itemp->fetchFromServer(); +				item_count++; +			} +		}  		mFetchQueue.pop_front();  	} -	if (folder_count > 0) +	if (item_count + folder_count > 0)  	{ -		mBulkFetchCount++; -		if (body["folders"].size()) +		if (folder_count)  		{ -			LLInventoryModelFetchDescendentsResponder *fetcher = new LLInventoryModelFetchDescendentsResponder(body, recursive_cats); -			LLHTTPClient::post(url, body, fetcher, 300.0); +			std::string url = region->getCapability("FetchInventoryDescendents2");    +			mFetchCount++; +			if (folder_request_body["folders"].size()) +			{ +				LLInventoryModelFetchDescendentsResponder *fetcher = new LLInventoryModelFetchDescendentsResponder(folder_request_body, recursive_cats); +				LLHTTPClient::post(url, folder_request_body, fetcher, 300.0); +			} +			if (folder_request_body_lib["folders"].size()) +			{ +				std::string url_lib = gAgent.getRegion()->getCapability("FetchLibDescendents2"); + +				LLInventoryModelFetchDescendentsResponder *fetcher = new LLInventoryModelFetchDescendentsResponder(folder_request_body_lib, recursive_cats); +				LLHTTPClient::post(url_lib, folder_request_body_lib, fetcher, 300.0); +			}  		} -		if (body_lib["folders"].size()) +		if (item_count)  		{ -			std::string url_lib = gAgent.getRegion()->getCapability("FetchLibDescendents2"); -			 -			LLInventoryModelFetchDescendentsResponder *fetcher = new LLInventoryModelFetchDescendentsResponder(body_lib, recursive_cats); -			LLHTTPClient::post(url_lib, body_lib, fetcher, 300.0); +			std::string url; + +			if (item_request_body.size()) +			{ +				mFetchCount++; +				url = region->getCapability("FetchInventory2"); +				if (!url.empty()) +				{ +					LLSD body; +					body["agent_id"]	= gAgent.getID(); +					body["items"] = item_request_body; + +					LLHTTPClient::post(url, body, new LLInventoryModelFetchItemResponder(body)); +				} +				//else +				//{ +				//	LLMessageSystem* msg = gMessageSystem; +				//	msg->newMessage("FetchInventory"); +				//	msg->nextBlock("AgentData"); +				//	msg->addUUID("AgentID", gAgent.getID()); +				//	msg->addUUID("SessionID", gAgent.getSessionID()); +				//	msg->nextBlock("InventoryData"); +				//	msg->addUUID("OwnerID", mPermissions.getOwner()); +				//	msg->addUUID("ItemID", mUUID); +				//	gAgent.sendReliableMessage(); +				//} +			} + +			if (item_request_body_lib.size()) +			{ +				mFetchCount++; + +				url = region->getCapability("FetchLib2"); +				if (!url.empty()) +				{ +					LLSD body; +					body["agent_id"]	= gAgent.getID(); +					body["items"] = item_request_body_lib; + +					LLHTTPClient::post(url, body, new LLInventoryModelFetchItemResponder(body)); +				} +			}  		}  		mFetchTimer.reset();  	} +  	else if (isBulkFetchProcessingComplete())  	{  		setAllFoldersFetched(); @@ -624,7 +733,7 @@ bool LLInventoryModelBackgroundFetch::fetchQueueContainsNoDescendentsOf(const LL  	for (fetch_queue_t::const_iterator it = mFetchQueue.begin();  		 it != mFetchQueue.end(); ++it)  	{ -		const LLUUID& fetch_id = (*it).mCatUUID; +		const LLUUID& fetch_id = (*it).mUUID;  		if (gInventory.isObjectDescendentOf(fetch_id, cat_id))  			return false;  	} diff --git a/indra/newview/llinventorymodelbackgroundfetch.h b/indra/newview/llinventorymodelbackgroundfetch.h index c35c785ceb..0745407a8c 100644 --- a/indra/newview/llinventorymodelbackgroundfetch.h +++ b/indra/newview/llinventorymodelbackgroundfetch.h @@ -60,10 +60,10 @@ public:  	bool inventoryFetchInProgress() const;      void findLostItems();	 +	void incrFetchCount(S16 fetching);  protected: -	void incrBulkFetch(S16 fetching);  	bool isBulkFetchProcessingComplete() const; -	void bulkFetch(std::string url); +	void bulkFetch();  	void backgroundFetch();  	static void backgroundFetchCB(void*); // background fetch idle function @@ -77,7 +77,7 @@ private:  	BOOL mAllFoldersFetched;  	BOOL mBackgroundFetchActive; -	S16 mBulkFetchCount; +	S16 mFetchCount;  	BOOL mTimelyFetchPending;  	S32 mNumFetchRetries; @@ -87,11 +87,11 @@ private:  	struct FetchQueueInfo  	{ -		FetchQueueInfo(const LLUUID& id, BOOL recursive) : -			mCatUUID(id), mRecursive(recursive) -		{ -		} -		LLUUID mCatUUID; +		FetchQueueInfo(const LLUUID& id, BOOL recursive, bool is_category = true) : +			mUUID(id), mRecursive(recursive), mIsCategory(is_category) +		{} +		LLUUID mUUID; +		bool mIsCategory;  		BOOL mRecursive;  	};  	typedef std::deque<FetchQueueInfo> fetch_queue_t; diff --git a/indra/newview/llinventorypanel.h b/indra/newview/llinventorypanel.h index 8279163762..7d805f6862 100644 --- a/indra/newview/llinventorypanel.h +++ b/indra/newview/llinventorypanel.h @@ -160,6 +160,8 @@ public:  	void onSelectionChange(const std::deque<LLFolderViewItem*> &items, BOOL user_action); +	LLHandle<LLInventoryPanel> getInventoryPanelHandle() const { return getDerivedHandle<LLInventoryPanel>(); } +  	// Callbacks  	void doToSelected(const LLSD& userdata);  	void doCreate(const LLSD& userdata); diff --git a/indra/newview/llpanelimcontrolpanel.cpp b/indra/newview/llpanelimcontrolpanel.cpp index 0295ad151f..eda0749cdb 100644 --- a/indra/newview/llpanelimcontrolpanel.cpp +++ b/indra/newview/llpanelimcontrolpanel.cpp @@ -374,7 +374,7 @@ void LLPanelGroupControlPanel::draw()  {  	// Need to resort the participant list if it's in sort by recent speaker order.  	if (mParticipantList) -		mParticipantList->updateRecentSpeakersOrder(); +		mParticipantList->update();  	LLPanelChatControlPanel::draw();  } diff --git a/indra/newview/llparticipantlist.cpp b/indra/newview/llparticipantlist.cpp index 5c95e805ce..975a6c67d8 100644 --- a/indra/newview/llparticipantlist.cpp +++ b/indra/newview/llparticipantlist.cpp @@ -390,7 +390,10 @@ void LLParticipantList::onAvatarListRefreshed(LLUICtrl* ctrl, const LLSD& param)  		{  			const LLPointer<LLSpeaker>& speakerp = *it; -			update_speaker_indicator(list, speakerp->mID, speakerp->mModeratorMutedVoice); +			if (speakerp->mStatus == LLSpeaker::STATUS_TEXT_ONLY) +			{ +				update_speaker_indicator(list, speakerp->mID, speakerp->mModeratorMutedVoice); +			}  		}  	}  } @@ -466,12 +469,12 @@ void LLParticipantList::setValidateSpeakerCallback(validate_speaker_callback_t c  	mValidateSpeakerCallback = cb;  } -void LLParticipantList::updateRecentSpeakersOrder() +void LLParticipantList::update()  { +	mSpeakerMgr->update(true); +  	if (E_SORT_BY_RECENT_SPEAKERS == getSortOrder() && !isHovered())  	{ -		// Need to update speakers to sort list correctly -		mSpeakerMgr->update(true);  		// Resort avatar list  		sort();  	} @@ -760,6 +763,7 @@ void LLParticipantList::LLParticipantListMenu::toggleMute(const LLSD& userdata,  	LLPointer<LLSpeaker> speakerp = mParent.mSpeakerMgr->findSpeaker(speaker_id);  	if (speakerp.isNull())  	{ +		LL_WARNS("Speakers") << "Speaker " << speaker_id << " not found" << llendl;  		return;  	}  	LLAvatarListItem* item = dynamic_cast<LLAvatarListItem*>(mParent.mAvatarList->getItemByValue(speaker_id)); diff --git a/indra/newview/llparticipantlist.h b/indra/newview/llparticipantlist.h index a001d29b67..53966c15fe 100644 --- a/indra/newview/llparticipantlist.h +++ b/indra/newview/llparticipantlist.h @@ -72,9 +72,9 @@ public:  	const EParticipantSortOrder getSortOrder() const;  	/** -	 * Refreshes the participant list if it's in sort by recent speaker order. +	 * Refreshes the participant list.  	 */ -	void updateRecentSpeakersOrder(); +	void update();  	/**  	 * Set a callback to be called before adding a speaker. Invalid speakers will not be added. diff --git a/indra/newview/llplacesinventorybridge.cpp b/indra/newview/llplacesinventorybridge.cpp index 225ac6e224..fe4cc0f55f 100644 --- a/indra/newview/llplacesinventorybridge.cpp +++ b/indra/newview/llplacesinventorybridge.cpp @@ -89,7 +89,7 @@ void LLPlacesFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags)  		std::vector<std::string> items;  		std::vector<std::string> disabled_items; -		LLInventoryPanel* inv_panel = dynamic_cast<LLInventoryPanel*>(mInventoryPanel.get()); +		LLInventoryPanel* inv_panel = mInventoryPanel.get();  		bool is_open = false;  		if (inv_panel)  		{ @@ -137,7 +137,7 @@ void LLPlacesFolderBridge::performAction(LLInventoryModel* model, std::string ac  LLFolderViewFolder* LLPlacesFolderBridge::getFolder()  {  	LLFolderViewFolder* folder = NULL; -	LLInventoryPanel* inv_panel = dynamic_cast<LLInventoryPanel*>(mInventoryPanel.get()); +	LLInventoryPanel* inv_panel = mInventoryPanel.get();  	if (inv_panel)  	{  		folder = dynamic_cast<LLFolderViewFolder*>(inv_panel->getRootFolder()->getItemByID(mUUID)); diff --git a/indra/newview/llspeakers.cpp b/indra/newview/llspeakers.cpp index c588bd8fb4..07d2f1ad6f 100644 --- a/indra/newview/llspeakers.cpp +++ b/indra/newview/llspeakers.cpp @@ -272,6 +272,7 @@ LLPointer<LLSpeaker> LLSpeakerMgr::setSpeaker(const LLUUID& id, const std::strin  		speakerp->mStatus = status;  		mSpeakers.insert(std::make_pair(speakerp->mID, speakerp));  		mSpeakersSorted.push_back(speakerp); +		LL_DEBUGS("Speakers") << "Added speaker " << id << llendl;  		fireEvent(new LLSpeakerListChangeEvent(this, speakerp->mID), "add");  	}  	else @@ -290,6 +291,10 @@ LLPointer<LLSpeaker> LLSpeakerMgr::setSpeaker(const LLUUID& id, const std::strin  				speakerp->lookupName();  			}  		} +		else +		{ +			LL_WARNS("Speakers") << "Speaker " << id << " not found" << llendl; +		}  	}  	mSpeakerDelayRemover->unsetActionTimer(speakerp->mID); @@ -354,6 +359,7 @@ void LLSpeakerMgr::update(BOOL resort_ok)  			if (moderator_muted_voice != speakerp->mModeratorMutedVoice)  			{  				speakerp->mModeratorMutedVoice = moderator_muted_voice; +				LL_DEBUGS("Speakers") << (speakerp->mModeratorMutedVoice? "Muted" : "Umuted") << " speaker " << speaker_id<< llendl;  				speakerp->fireEvent(new LLSpeakerVoiceModerationEvent(speakerp));  			} @@ -484,6 +490,7 @@ bool LLSpeakerMgr::removeSpeaker(const LLUUID& speaker_id)  		}  	} +	LL_DEBUGS("Speakers") << "Removed speaker " << speaker_id << llendl;  	fireEvent(new LLSpeakerListChangeEvent(this, speaker_id), "remove");  	update(TRUE); @@ -595,7 +602,10 @@ void LLIMSpeakerMgr::setSpeakers(const LLSD& speakers)  					speaker_it->second["mutes"]["text"];  				// Fire event only if moderator changed  				if ( is_moderator != speakerp->mIsModerator ) +				{ +					LL_DEBUGS("Speakers") << "Speaker " << agent_id << (is_moderator ? "is now" : "no longer is") << " a moderator" << llendl;  					fireEvent(new LLSpeakerUpdateModeratorEvent(speakerp), "update_moderator"); +				}  			}  		}  	} @@ -665,7 +675,10 @@ void LLIMSpeakerMgr::updateSpeakers(const LLSD& update)  					speakerp->mIsModerator = agent_info["is_moderator"];  					// Fire event only if moderator changed  					if ( is_moderator != speakerp->mIsModerator ) +					{ +						LL_DEBUGS("Speakers") << "Speaker " << agent_id << (is_moderator ? "is now" : "no longer is") << " a moderator" << llendl;  						fireEvent(new LLSpeakerUpdateModeratorEvent(speakerp), "update_moderator"); +					}  				}  				if (agent_info.has("mutes")) @@ -857,6 +870,7 @@ void LLActiveSpeakerMgr::updateSpeakerList()  	// always populate from active voice channel  	if (LLVoiceChannel::getCurrentVoiceChannel() != mVoiceChannel) //MA: seems this is always false  	{ +		LL_DEBUGS("Speakers") << "Removed all speakers" << llendl;  		fireEvent(new LLSpeakerListChangeEvent(this, LLUUID::null), "clear");  		mSpeakers.clear();  		mSpeakersSorted.clear(); diff --git a/indra/newview/llspeakers.h b/indra/newview/llspeakers.h index 35f2ee7056..b9358cf37c 100644 --- a/indra/newview/llspeakers.h +++ b/indra/newview/llspeakers.h @@ -208,6 +208,8 @@ private:  class LLSpeakerMgr : public LLOldEvents::LLObservable  { +	LOG_CLASS(LLSpeakerMgr); +  public:  	LLSpeakerMgr(LLVoiceChannel* channelp);  	virtual ~LLSpeakerMgr(); @@ -271,6 +273,8 @@ protected:  class LLIMSpeakerMgr : public LLSpeakerMgr  { +	LOG_CLASS(LLIMSpeakerMgr); +  public:  	LLIMSpeakerMgr(LLVoiceChannel* channel); @@ -320,6 +324,8 @@ protected:  class LLActiveSpeakerMgr : public LLSpeakerMgr, public LLSingleton<LLActiveSpeakerMgr>  { +	LOG_CLASS(LLActiveSpeakerMgr); +  public:  	LLActiveSpeakerMgr();  protected: @@ -328,6 +334,7 @@ protected:  class LLLocalSpeakerMgr : public LLSpeakerMgr, public LLSingleton<LLLocalSpeakerMgr>  { +	LOG_CLASS(LLLocalSpeakerMgr);  public:  	LLLocalSpeakerMgr();  	~LLLocalSpeakerMgr (); diff --git a/indra/newview/skins/default/xui/en/floater_test_textbox.xml b/indra/newview/skins/default/xui/en/floater_test_textbox.xml index 3d1bc0edae..1d31fbd6dc 100644 --- a/indra/newview/skins/default/xui/en/floater_test_textbox.xml +++ b/indra/newview/skins/default/xui/en/floater_test_textbox.xml @@ -8,18 +8,7 @@   help_topic="floater_test_textbox"   translate="false"   width="800"> -    <text -     type="string" -     length="1" -     height="90" -     layout="topleft" -     left="10" -     valign="bottom" -     clip="true" -     top_pad="30" -     width="300"> -___</text> -  <!--<text + <text      clip_partial="true"      top_pad="10"      left="10" @@ -150,7 +139,7 @@ ___</text>      The 华文细黑 brown fox ヒラキjumped over the lazy dog.    </text> ---><!-- next column --><!-- +<!-- next column -->    <text_editor   height="50"   follows="top|left|bottom" @@ -247,5 +236,5 @@ with  multiple lines  and too many lines  to actually fit -  </text>--> +  </text>  </floater> diff --git a/indra/newview/skins/default/xui/en/panel_main_inventory.xml b/indra/newview/skins/default/xui/en/panel_main_inventory.xml index d6d8b2a83e..1c882bb099 100644 --- a/indra/newview/skins/default/xui/en/panel_main_inventory.xml +++ b/indra/newview/skins/default/xui/en/panel_main_inventory.xml @@ -80,7 +80,6 @@       top="16"       width="288" />      <recent_inventory_panel -     accepts_drag_and_drop="false"       bg_opaque_color="DkGray2"       bg_alpha_color="DkGray2"       background_visible="true" | 
