diff options
-rwxr-xr-x | indra/newview/lltooldraganddrop.cpp | 19 | ||||
-rwxr-xr-x | indra/newview/llviewerobject.cpp | 16 | ||||
-rwxr-xr-x | indra/newview/llviewerobject.h | 5 |
3 files changed, 25 insertions, 15 deletions
diff --git a/indra/newview/lltooldraganddrop.cpp b/indra/newview/lltooldraganddrop.cpp index 5c9aedcf8f..ff71028a9b 100755 --- a/indra/newview/lltooldraganddrop.cpp +++ b/indra/newview/lltooldraganddrop.cpp @@ -1013,13 +1013,10 @@ BOOL LLToolDragAndDrop::handleDropTextureProtections(LLViewerObject* hit_obj, // causing a dirty inventory) and we can do an update, stall the user // while fetching the inventory. // - // Note: fetch only if inventory is both dirty and not present since previously checked faces - // could have requested new fetch for same item (removed inventory and marked as dirty=false). - // Objects without listeners (dirty==true and inventory!=NULL. In this specific case - before - // first fetch) shouldn't be updated either since we won't receive any changes. - if (hit_obj->isInventoryDirty() && hit_obj->getInventoryRoot() == NULL) + // Fetch if inventory is dirty and listener is present (otherwise we will not receive update) + if (hit_obj->isInventoryDirty() && hit_obj->hasInventoryListeners()) { - hit_obj->fetchInventoryFromServer(); + hit_obj->requestInventory(); LLSD args; args["ERROR_MESSAGE"] = "Unable to add texture.\nPlease wait a few seconds and try again."; LLNotificationsUtil::add("ErrorMessage", args); @@ -1099,10 +1096,12 @@ BOOL LLToolDragAndDrop::handleDropTextureProtections(LLViewerObject* hit_obj, { hit_obj->updateInventory(new_item, TASK_INVENTORY_ITEM_KEY, true); } - // Force the object to update its refetch its inventory so it has this texture. - hit_obj->fetchInventoryFromServer(); - // TODO: Check to see if adding the item was successful; if not, then - // we should return false here. + // Force the object to update and refetch its inventory so it has this texture. + hit_obj->dirtyInventory(); + hit_obj->requestInventory(); + // TODO: Check to see if adding the item was successful; if not, then + // we should return false here. This will requre a separate listener + // since without listener, we have no way to receive update } return TRUE; } diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index 05d116704e..c4d3829ee9 100755 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -2840,6 +2840,11 @@ void LLViewerObject::clearInventoryListeners() mInventoryCallbacks.clear(); } +bool LLViewerObject::hasInventoryListeners() +{ + return !mInventoryCallbacks.empty(); +} + void LLViewerObject::requestInventory() { if(mInventoryDirty && mInventory && !mInventoryCallbacks.empty()) @@ -2847,15 +2852,20 @@ void LLViewerObject::requestInventory() mInventory->clear(); // will deref and delete entries delete mInventory; mInventory = NULL; - mInventoryDirty = FALSE; //since we are going to request it now } + if(mInventory) { + // inventory is either up to date or doesn't has a listener + // if it is dirty, leave it this way in case we gain a listener doInventoryCallback(); } - // throw away duplicate requests else { + // since we are going to request it now + mInventoryDirty = FALSE; + + // Note: throws away duplicate requests fetchInventoryFromServer(); } } @@ -2865,8 +2875,6 @@ void LLViewerObject::fetchInventoryFromServer() if (!mInventoryPending) { delete mInventory; - mInventory = NULL; - mInventoryDirty = FALSE; LLMessageSystem* msg = gMessageSystem; msg->newMessageFast(_PREHASH_RequestTaskInventory); msg->nextBlockFast(_PREHASH_AgentData); diff --git a/indra/newview/llviewerobject.h b/indra/newview/llviewerobject.h index db2749f413..65d6f8225f 100755 --- a/indra/newview/llviewerobject.h +++ b/indra/newview/llviewerobject.h @@ -436,8 +436,8 @@ public: void removeInventoryListener(LLVOInventoryListener* listener); BOOL isInventoryPending() { return mInventoryPending; } void clearInventoryListeners(); + bool hasInventoryListeners(); void requestInventory(); - void fetchInventoryFromServer(); static void processTaskInv(LLMessageSystem* msg, void** user_data); void removeInventory(const LLUUID& item_id); @@ -593,6 +593,9 @@ private: static void initObjectDataMap(); + // forms task inventory request if none are pending + void fetchInventoryFromServer(); + public: // // Viewer-side only types - use the LL_PCODE_APP mask. |