diff options
author | Ansariel <ansariel.hiller@phoenixviewer.com> | 2024-05-22 21:25:21 +0200 |
---|---|---|
committer | Andrey Lihatskiy <alihatskiy@productengine.com> | 2024-05-22 22:40:26 +0300 |
commit | e2e37cced861b98de8c1a7c9c0d3a50d2d90e433 (patch) | |
tree | 1bb897489ce524986f6196201c10ac0d8861aa5f /indra/newview/llinventorymodel.h | |
parent | 069ea06848f766466f1a281144c82a0f2bd79f3a (diff) |
Fix line endlings
Diffstat (limited to 'indra/newview/llinventorymodel.h')
-rw-r--r-- | indra/newview/llinventorymodel.h | 1442 |
1 files changed, 721 insertions, 721 deletions
diff --git a/indra/newview/llinventorymodel.h b/indra/newview/llinventorymodel.h index 0ab7dcb99b..1472b705e4 100644 --- a/indra/newview/llinventorymodel.h +++ b/indra/newview/llinventorymodel.h @@ -1,721 +1,721 @@ -/**
- * @file llinventorymodel.h
- * @brief LLInventoryModel class header file
- *
- * $LicenseInfo:firstyear=2002&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#ifndef LL_LLINVENTORYMODEL_H
-#define LL_LLINVENTORYMODEL_H
-
-#include <map>
-#include <set>
-#include <string>
-#include <vector>
-
-#include "llassettype.h"
-#include "llfoldertype.h"
-#include "llframetimer.h"
-#include "lluuid.h"
-#include "llpermissionsflags.h"
-#include "llviewerinventory.h"
-#include "llstring.h"
-#include "httpcommon.h"
-#include "httprequest.h"
-#include "httpoptions.h"
-#include "httpheaders.h"
-#include "httphandler.h"
-#include "lleventcoro.h"
-#include "llcoros.h"
-
-class LLInventoryObserver;
-class LLInventoryObject;
-class LLInventoryItem;
-class LLInventoryCategory;
-class LLMessageSystem;
-class LLInventoryCollectFunctor;
-
-///----------------------------------------------------------------------------
-/// LLInventoryValidationInfo
-///----------------------------------------------------------------------------
-class LLInventoryValidationInfo: public LLRefCount
-{
-public:
- LLInventoryValidationInfo();
- void toOstream(std::ostream& os) const;
- void asLLSD(LLSD& sd) const;
-
- bool mInitialized{false};
- S32 mWarningCount{0};
- std::map<std::string,U32> mWarnings;
-
- S32 mLoopCount{0}; // Presence of folders whose ancestors loop onto themselves
- S32 mOrphanedCount{0}; // Missing or orphaned items, links and folders
-
- S32 mFatalErrorCount{0};
- bool mFatalNoRootFolder{false};
- S32 mFatalSystemDuplicate{0};
- bool mFatalNoLibraryRootFolder{false};
- bool mFatalQADebugMode{false};
-
- std::set<LLFolderType::EType> mMissingRequiredSystemFolders;
- std::set<LLFolderType::EType> mDuplicateRequiredSystemFolders;
-};
-std::ostream& operator<<(std::ostream& s, const LLInventoryValidationInfo& v);
-
-///----------------------------------------------------------------------------
-// LLInventoryModel
-//
-// Represents a collection of inventory, and provides efficient ways to access
-// that information.
-// NOTE: This class could in theory be used for any place where you need
-// inventory, though it optimizes for time efficiency - not space efficiency,
-// probably making it inappropriate for use on tasks.
-///----------------------------------------------------------------------------
-class LLInventoryModel
-{
- LOG_CLASS(LLInventoryModel);
-
-public:
- enum EHasChildren
- {
- CHILDREN_NO,
- CHILDREN_YES,
- CHILDREN_MAYBE
- };
-
- typedef std::vector<LLPointer<LLViewerInventoryCategory> > cat_array_t;
- typedef std::vector<LLPointer<LLViewerInventoryItem> > item_array_t;
- typedef std::set<LLUUID> changed_items_t;
-
- // Rider: This is using the old responder patter. It should be refactored to
- // take advantage of coroutines.
-
- // HTTP handler for individual item requests (inventory or library).
- // Background item requests are derived from this in the background
- // inventory system. All folder requests are also located there
- // but have their own handler derived from HttpHandler.
- class FetchItemHttpHandler : public LLCore::HttpHandler
- {
- public:
- LOG_CLASS(FetchItemHttpHandler);
-
- FetchItemHttpHandler(const LLSD & request_sd);
- virtual ~FetchItemHttpHandler();
-
- protected:
- FetchItemHttpHandler(const FetchItemHttpHandler &); // Not defined
- void operator=(const FetchItemHttpHandler &); // Not defined
-
- public:
- virtual void onCompleted(LLCore::HttpHandle handle, LLCore::HttpResponse * response);
-
- private:
- void processData(LLSD & body, LLCore::HttpResponse * response);
- void processFailure(LLCore::HttpStatus status, LLCore::HttpResponse * response);
- void processFailure(const char * const reason, LLCore::HttpResponse * response);
-
- private:
- LLSD mRequestSD;
- };
-
-/********************************************************************************
- ** **
- ** INITIALIZATION/SETUP
- **/
-
- //--------------------------------------------------------------------
- // Constructors / Destructors
- //--------------------------------------------------------------------
-public:
- LLInventoryModel();
- ~LLInventoryModel();
- void cleanupInventory();
-protected:
- void empty(); // empty the entire contents
-
- //--------------------------------------------------------------------
- // Initialization
- //--------------------------------------------------------------------
-public:
- // The inventory model usage is sensitive to the initial construction of the model
- bool isInventoryUsable() const;
-private:
- bool mIsAgentInvUsable; // used to handle an invalid inventory state
-
- // One-time initialization of HTTP system.
- void initHttpRequest();
-
- //--------------------------------------------------------------------
- // Root Folders
- //--------------------------------------------------------------------
-public:
- // The following are set during login with data from the server
- void setRootFolderID(const LLUUID& id);
- void setLibraryOwnerID(const LLUUID& id);
- void setLibraryRootFolderID(const LLUUID& id);
-
- const LLUUID &getRootFolderID() const;
- const LLUUID &getLibraryOwnerID() const;
- const LLUUID &getLibraryRootFolderID() const;
-private:
- LLUUID mRootFolderID;
- LLUUID mLibraryRootFolderID;
- LLUUID mLibraryOwnerID;
-
- //--------------------------------------------------------------------
- // Structure
- //--------------------------------------------------------------------
-public:
- // Methods to load up inventory skeleton & meat. These are used
- // during authentication. Returns true if everything parsed.
- bool loadSkeleton(const LLSD& options, const LLUUID& owner_id);
- void buildParentChildMap(); // brute force method to rebuild the entire parent-child relations
- void createCommonSystemCategories();
-
- static std::string getInvCacheAddres(const LLUUID& owner_id);
-
- // Call on logout to save a terse representation.
- void cache(const LLUUID& parent_folder_id, const LLUUID& agent_id);
-private:
- // Information for tracking the actual inventory. We index this
- // information in a lot of different ways so we can access
- // the inventory using several different identifiers.
- // mInventory member data is the 'master' list of inventory, and
- // mCategoryMap and mItemMap store uuid->object mappings.
- typedef std::map<LLUUID, LLPointer<LLViewerInventoryCategory> > cat_map_t;
- typedef std::map<LLUUID, LLPointer<LLViewerInventoryItem> > item_map_t;
- cat_map_t mCategoryMap;
- item_map_t mItemMap;
- // This last set of indices is used to map parents to children.
- typedef std::map<LLUUID, cat_array_t*> parent_cat_map_t;
- typedef std::map<LLUUID, item_array_t*> parent_item_map_t;
- parent_cat_map_t mParentChildCategoryTree;
- parent_item_map_t mParentChildItemTree;
-
- // Track links to items and categories. We do not store item or
- // category pointers here, because broken links are also supported.
- typedef std::multimap<LLUUID, LLUUID> backlink_mmap_t;
- backlink_mmap_t mBacklinkMMap; // key = target_id: ID of item, values = link_ids: IDs of item or folder links referencing it.
- // For internal use only
- bool hasBacklinkInfo(const LLUUID& link_id, const LLUUID& target_id) const;
- void addBacklinkInfo(const LLUUID& link_id, const LLUUID& target_id);
- void removeBacklinkInfo(const LLUUID& link_id, const LLUUID& target_id);
-
- //--------------------------------------------------------------------
- // Login
- //--------------------------------------------------------------------
-public:
- static bool getIsFirstTimeInViewer2();
- static bool isSysFoldersReady() { return (sPendingSystemFolders == 0); }
-
-private:
- static bool sFirstTimeInViewer2;
- const static S32 sCurrentInvCacheVersion; // expected inventory cache version
-
- static S32 sPendingSystemFolders;
-
-/** Initialization/Setup
- ** **
- *******************************************************************************/
-
-/********************************************************************************
- ** **
- ** ACCESSORS
- **/
-
- //--------------------------------------------------------------------
- // Descendants
- //--------------------------------------------------------------------
-public:
- // Make sure we have the descendants in the structure. Returns true
- // if a fetch was performed.
- bool fetchDescendentsOf(const LLUUID& folder_id) const;
-
- // Return the direct descendants of the id provided.Set passed
- // in values to NULL if the call fails.
- // NOTE: The array provided points straight into the guts of
- // this object, and should only be used for read operations, since
- // modifications may invalidate the internal state of the inventory.
- void getDirectDescendentsOf(const LLUUID& cat_id,
- cat_array_t*& categories,
- item_array_t*& items) const;
- void getDirectDescendentsOf(const LLUUID& cat_id, cat_array_t& categories, item_array_t& items, LLInventoryCollectFunctor& f) const;
-
- typedef LLUUID digest_t; // To clarify the actual usage of this "UUID"
- // Compute a hash of direct descendant names (for detecting child name changes)
- digest_t hashDirectDescendentNames(const LLUUID& cat_id) const;
-
- // Starting with the object specified, add its descendants to the
- // array provided, but do not add the inventory object specified
- // by id. There is no guaranteed order.
- // NOTE: Neither array will be erased before adding objects to it.
- // Do not store a copy of the pointers collected - use them, and
- // collect them again later if you need to reference the same objects.
- enum {
- EXCLUDE_TRASH = false,
- INCLUDE_TRASH = true
- };
- // Simpler existence test if matches don't actually need to be collected.
- bool hasMatchingDirectDescendent(const LLUUID& cat_id,
- LLInventoryCollectFunctor& filter);
- void collectDescendents(const LLUUID& id,
- cat_array_t& categories,
- item_array_t& items,
- bool include_trash);
- void collectDescendentsIf(const LLUUID& id,
- cat_array_t& categories,
- item_array_t& items,
- bool include_trash,
- LLInventoryCollectFunctor& add);
-
- // Collect all items in inventory that are linked to item_id.
- // Assumes item_id is itself not a linked item.
- item_array_t collectLinksTo(const LLUUID& item_id);
-
- // Check if one object has a parent chain up to the category specified by UUID.
- bool isObjectDescendentOf(const LLUUID& obj_id, const LLUUID& cat_id) const;
-
- enum EAncestorResult{
- ANCESTOR_OK = 0,
- ANCESTOR_MISSING = 1,
- ANCESTOR_LOOP = 2,
- };
- // Follow parent chain to the top.
- EAncestorResult getObjectTopmostAncestor(const LLUUID& object_id, LLUUID& result) const;
-
- //--------------------------------------------------------------------
- // Find
- //--------------------------------------------------------------------
-public:
-
- // Checks if category exists ("My Inventory" only), if it does not, creates it
- void ensureCategoryForTypeExists(LLFolderType::EType preferred_type);
-
- const LLUUID findCategoryUUIDForTypeInRoot(
- LLFolderType::EType preferred_type,
- const LLUUID& root_id) const;
-
- // Returns the uuid of the category that specifies 'type' as what it
- // defaults to containing. The category is not necessarily only for that type.
- // NOTE: If create_folder is true, this will create a new inventory category
- // on the fly if one does not exist. *NOTE: if find_in_library is true it
- // will search in the user's library folder instead of "My Inventory"
- const LLUUID findCategoryUUIDForType(LLFolderType::EType preferred_type) const;
- // will search in the user's library folder instead of "My Inventory"
- const LLUUID findLibraryCategoryUUIDForType(LLFolderType::EType preferred_type) const;
- // Returns user specified category for uploads, returns default id if there are no
- // user specified one or it does not exist, creates default category if it is missing.
- const LLUUID findUserDefinedCategoryUUIDForType(LLFolderType::EType preferred_type) const;
-
- // Get whatever special folder this object is a child of, if any.
- const LLViewerInventoryCategory *getFirstNondefaultParent(const LLUUID& obj_id) const;
-
- // Get first descendant of the child object under the specified parent
- const LLViewerInventoryCategory *getFirstDescendantOf(const LLUUID& master_parent_id, const LLUUID& obj_id) const;
-
- // Get the object by id. Returns NULL if not found.
- // NOTE: Use the pointer returned for read operations - do
- // not modify the object values in place or you will break stuff.
- LLInventoryObject* getObject(const LLUUID& id) const;
-
- // Get the item by id. Returns NULL if not found.
- // NOTE: Use the pointer for read operations - use the
- // updateItem() method to actually modify values.
- LLViewerInventoryItem* getItem(const LLUUID& id) const;
-
- // Get the category by id. Returns NULL if not found.
- // NOTE: Use the pointer for read operations - use the
- // updateCategory() method to actually modify values.
- LLViewerInventoryCategory* getCategory(const LLUUID& id) const;
-
- // Get the inventoryID or item that this item points to, else just return object_id
- const LLUUID& getLinkedItemID(const LLUUID& object_id) const;
- LLViewerInventoryItem* getLinkedItem(const LLUUID& object_id) const;
-
- // Copy content of all folders of type "type" into folder "id" and delete/purge the empty folders
- // Note : This method has been designed for FT_OUTBOX (aka Merchant Outbox) but can be used for other categories
- void consolidateForType(const LLUUID& id, LLFolderType::EType type);
-
-private:
- mutable LLPointer<LLViewerInventoryItem> mLastItem; // cache recent lookups
-
- //--------------------------------------------------------------------
- // Count
- //--------------------------------------------------------------------
-public:
- // Return the number of items or categories
- S32 getItemCount() const;
- S32 getCategoryCount() const;
-
-/** Accessors
- ** **
- *******************************************************************************/
-
-/********************************************************************************
- ** **
- ** MUTATORS
- **/
-
-public:
- // Change an existing item with a matching item_id or add the item
- // to the current inventory. Returns the change mask generated by
- // the update. No notification will be sent to observers. This
- // method will only generate network traffic if the item had to be
- // reparented.
- // NOTE: In usage, you will want to perform cache accounting
- // operations in LLInventoryModel::accountForUpdate() or
- // LLViewerInventoryItem::updateServer() before calling this method.
- U32 updateItem(const LLViewerInventoryItem* item, U32 mask = 0);
-
- // Change an existing item with the matching id or add
- // the category. No notification will be sent to observers. This
- // method will only generate network traffic if the item had to be
- // reparented.
- // NOTE: In usage, you will want to perform cache accounting
- // operations in accountForUpdate() or LLViewerInventoryCategory::
- // updateServer() before calling this method.
- void updateCategory(const LLViewerInventoryCategory* cat, U32 mask = 0);
-
- // Move the specified object id to the specified category and
- // update the internal structures. No cache accounting,
- // observer notification, or server update is performed.
- void moveObject(const LLUUID& object_id, const LLUUID& cat_id);
-
- // Migrated from llinventoryfunctions
- void changeItemParent(LLViewerInventoryItem* item,
- const LLUUID& new_parent_id,
- bool restamp);
-
- // Migrated from llinventoryfunctions
- void changeCategoryParent(LLViewerInventoryCategory* cat,
- const LLUUID& new_parent_id,
- bool restamp);
-
- // Marks links from a "possibly" broken list for a rebuild
- // clears the list
- void rebuildBrockenLinks();
- bool hasPosiblyBrockenLinks() const { return mPossiblyBrockenLinks.size() > 0; }
-
- //--------------------------------------------------------------------
- // Delete
- //--------------------------------------------------------------------
-public:
-
- // Update model after an item is confirmed as removed from
- // server. Works for categories or items.
- void onObjectDeletedFromServer(const LLUUID& item_id,
- bool fix_broken_links = true,
- bool update_parent_version = true,
- bool do_notify_observers = true);
-
- // Update model after all descendants removed from server.
- void onDescendentsPurgedFromServer(const LLUUID& object_id, bool fix_broken_links = true);
-
- // Update model after an existing item gets updated on server.
- void onItemUpdated(const LLUUID& item_id, const LLSD& updates, bool update_parent_version);
-
- // Update model after an existing category gets updated on server.
- void onCategoryUpdated(const LLUUID& cat_id, const LLSD& updates);
-
- // Delete a particular inventory object by ID. Will purge one
- // object from the internal data structures, maintaining a
- // consistent internal state. No cache accounting, observer
- // notification, or server update is performed.
- void deleteObject(const LLUUID& id, bool fix_broken_links = true, bool do_notify_observers = true);
- /// move Item item_id to Trash
- void removeItem(const LLUUID& item_id);
- /// move Category category_id to Trash
- void removeCategory(const LLUUID& category_id);
- /// removeItem() or removeCategory(), whichever is appropriate
- void removeObject(const LLUUID& object_id);
-
- // "TrashIsFull" when trash exceeds maximum capacity
- void checkTrashOverflow();
-
-protected:
- void rebuildLinkItems(LLInventoryModel::item_array_t& items);
-
- //--------------------------------------------------------------------
- // Reorder
- //--------------------------------------------------------------------
-public:
- // Changes items order by insertion of the item identified by src_item_id
- // before (or after) the item identified by dest_item_id. Both items must exist in items array.
- // Sorting is stored after method is finished. Only src_item_id is moved before (or after) dest_item_id.
- // The parameter "insert_before" controls on which side of dest_item_id src_item_id gets reinserted.
- static void updateItemsOrder(LLInventoryModel::item_array_t& items,
- const LLUUID& src_item_id,
- const LLUUID& dest_item_id,
- bool insert_before = true);
- // Gets an iterator on an item vector knowing only the item UUID.
- // Returns end() of the vector if not found.
- static LLInventoryModel::item_array_t::iterator findItemIterByUUID(LLInventoryModel::item_array_t& items, const LLUUID& id);
-
-
- // Rearranges Landmarks inside Favorites folder.
- // Moves source landmark before target one.
- void rearrangeFavoriteLandmarks(const LLUUID& source_item_id, const LLUUID& target_item_id);
- //void saveItemsOrder(const LLInventoryModel::item_array_t& items);
-
- //--------------------------------------------------------------------
- // Creation
- //--------------------------------------------------------------------
-public:
- // Returns the UUID of the new category. If you want to use the default
- // name based on type, pass in a NULL to the 'name' parameter.
- void createNewCategory(const LLUUID& parent_id,
- LLFolderType::EType preferred_type,
- const std::string& name,
- inventory_func_type callback = NULL,
- const LLUUID& thumbnail_id = LLUUID::null);
-protected:
- // Internal methods that add inventory and make sure that all of
- // the internal data structures are consistent. These methods
- // should be passed pointers of newly created objects, and the
- // instance will take over the memory management from there.
- void addCategory(LLViewerInventoryCategory* category);
- void addItem(LLViewerInventoryItem* item);
-
- void createNewCategoryCoro(std::string url, LLSD postData, inventory_func_type callback);
-
-/** Mutators
- ** **
- *******************************************************************************/
-
-/********************************************************************************
- ** **
- ** CATEGORY ACCOUNTING
- **/
-
-public:
- // Represents the number of items added or removed from a category.
- struct LLCategoryUpdate
- {
- LLCategoryUpdate() : mDescendentDelta(0), mChangeVersion(true) {}
- LLCategoryUpdate(const LLUUID& category_id, S32 delta, bool change_version = true) :
- mCategoryID(category_id),
- mDescendentDelta(delta),
- mChangeVersion(change_version) {}
- LLUUID mCategoryID;
- S32 mDescendentDelta;
- bool mChangeVersion;
- };
- typedef std::vector<LLCategoryUpdate> update_list_t;
-
- // This exists to make it easier to account for deltas in a map.
- struct LLInitializedS32
- {
- LLInitializedS32() : mValue(0) {}
- LLInitializedS32(S32 value) : mValue(value) {}
- S32 mValue;
- LLInitializedS32& operator++() { ++mValue; return *this; }
- LLInitializedS32& operator--() { --mValue; return *this; }
- };
- typedef std::map<LLUUID, LLInitializedS32> update_map_t;
-
- // Call when there are category updates. Call them *before* the
- // actual update so the method can do descendent accounting correctly.
- void accountForUpdate(const LLCategoryUpdate& update) const;
- void accountForUpdate(const update_list_t& updates) const;
- void accountForUpdate(const update_map_t& updates) const;
-
- // Return (yes/no/maybe) child status of category children.
- EHasChildren categoryHasChildren(const LLUUID& cat_id) const;
-
- // Returns true if category version is known and theoretical
- // descendents == actual descendents.
- bool isCategoryComplete(const LLUUID& cat_id) const;
-
-/** Category Accounting
- ** **
- *******************************************************************************/
-
-/********************************************************************************
- ** **
- ** NOTIFICATIONS
- **/
-
-public:
- // Called by the idle loop. Only updates if new state is detected. Call
- // notifyObservers() manually to update regardless of whether state change
- // has been indicated.
- void idleNotifyObservers();
-
- // Call to explicitly update everyone on a new state.
- void notifyObservers();
-
- // Allows outsiders to tell the inventory if something has
- // been changed 'under the hood', but outside the control of the
- // inventory. The next notify will include that notification.
- void addChangedMask(U32 mask, const LLUUID& referent);
-
- const changed_items_t& getChangedIDs() const { return mChangedItemIDs; }
- const changed_items_t& getAddedIDs() const { return mAddedItemIDs; }
-protected:
- // Updates all linked items pointing to this id.
- void addChangedMaskForLinks(const LLUUID& object_id, U32 mask);
-private:
- // Flag set when notifyObservers is being called, to look for bugs
- // where it's called recursively.
- bool mIsNotifyObservers;
- // Variables used to track what has changed since the last notify.
- U32 mModifyMask;
- changed_items_t mChangedItemIDs;
- changed_items_t mAddedItemIDs;
- // Fallback when notifyObservers is in progress
- U32 mModifyMaskBacklog;
- changed_items_t mChangedItemIDsBacklog;
- changed_items_t mAddedItemIDsBacklog;
- typedef std::map<LLUUID , changed_items_t> broken_links_t;
- broken_links_t mPossiblyBrockenLinks; // there can be multiple links per item
- changed_items_t mLinksRebuildList;
- boost::signals2::connection mBulkFecthCallbackSlot;
-
-
- //--------------------------------------------------------------------
- // Observers
- //--------------------------------------------------------------------
-public:
- // If the observer is destroyed, be sure to remove it.
- void addObserver(LLInventoryObserver* observer);
- void removeObserver(LLInventoryObserver* observer);
- bool containsObserver(LLInventoryObserver* observer) const;
-private:
- typedef std::set<LLInventoryObserver*> observer_list_t;
- observer_list_t mObservers;
-
-/** Notifications
- ** **
- *******************************************************************************/
-
-
-/********************************************************************************
- ** **
- ** HTTP Transport
- **/
-public:
- // Invoke handler completion method (onCompleted) for all
- // requests that are ready.
- void handleResponses(bool foreground);
-
- // Request an inventory HTTP operation to either the
- // foreground or background processor. These are actually
- // the same service queue but the background requests are
- // seviced more slowly effectively de-prioritizing new
- // requests.
- LLCore::HttpHandle requestPost(bool foreground,
- const std::string & url,
- const LLSD & body,
- const LLCore::HttpHandler::ptr_t &handler,
- const char * const message);
-
-private:
- // Usual plumbing for LLCore:: HTTP operations.
- LLCore::HttpRequest * mHttpRequestFG;
- LLCore::HttpRequest * mHttpRequestBG;
- LLCore::HttpOptions::ptr_t mHttpOptions;
- LLCore::HttpHeaders::ptr_t mHttpHeaders;
- LLCore::HttpRequest::policy_t mHttpPolicyClass;
-
-/** HTTP Transport
- ** **
- *******************************************************************************/
-
-
-/********************************************************************************
- ** **
- ** MISCELLANEOUS
- **/
-
- //--------------------------------------------------------------------
- // Callbacks
- //--------------------------------------------------------------------
-public:
- // Trigger a notification and empty the folder type (FT_TRASH or FT_LOST_AND_FOUND) if confirmed
- void emptyFolderType(const std::string notification, LLFolderType::EType folder_type);
- bool callbackEmptyFolderType(const LLSD& notification, const LLSD& response, LLFolderType::EType preferred_type);
- static void registerCallbacks(LLMessageSystem* msg);
-
- //--------------------------------------------------------------------
- // File I/O
- //--------------------------------------------------------------------
-protected:
- static bool loadFromFile(const std::string& filename,
- cat_array_t& categories,
- item_array_t& items,
- changed_items_t& cats_to_update,
- bool& is_cache_obsolete);
- static bool saveToFile(const std::string& filename,
- const cat_array_t& categories,
- const item_array_t& items);
-
- //--------------------------------------------------------------------
- // Message handling functionality
- //--------------------------------------------------------------------
-public:
- static void processUpdateCreateInventoryItem(LLMessageSystem* msg, void**);
- static void removeInventoryItem(LLUUID agent_id, LLMessageSystem* msg, const char* msg_label);
- static void processRemoveInventoryItem(LLMessageSystem* msg, void**);
- static void removeInventoryFolder(LLUUID agent_id, LLMessageSystem* msg);
- static void processRemoveInventoryFolder(LLMessageSystem* msg, void**);
- static void processRemoveInventoryObjects(LLMessageSystem* msg, void**);
- static void processSaveAssetIntoInventory(LLMessageSystem* msg, void**);
- static void processBulkUpdateInventory(LLMessageSystem* msg, void**);
- static void processMoveInventoryItem(LLMessageSystem* msg, void**);
-protected:
- bool messageUpdateCore(LLMessageSystem* msg, bool do_accounting, U32 mask = 0x0);
-
- //--------------------------------------------------------------------
- // Locks
- //--------------------------------------------------------------------
-public:
- void lockDirectDescendentArrays(const LLUUID& cat_id,
- cat_array_t*& categories,
- item_array_t*& items);
- void unlockDirectDescendentArrays(const LLUUID& cat_id);
-protected:
- cat_array_t* getUnlockedCatArray(const LLUUID& id);
- item_array_t* getUnlockedItemArray(const LLUUID& id);
-private:
- std::map<LLUUID, bool> mCategoryLock;
- std::map<LLUUID, bool> mItemLock;
-
- //--------------------------------------------------------------------
- // Debugging
- //--------------------------------------------------------------------
-public:
- void dumpInventory() const;
- LLPointer<LLInventoryValidationInfo> validate() const;
- LLPointer<LLInventoryValidationInfo> mValidationInfo;
- std::string getFullPath(const LLInventoryObject *obj) const;
-
-/** Miscellaneous
- ** **
- *******************************************************************************/
-};
-
-// a special inventory model for the agent
-extern LLInventoryModel gInventory;
-
-#endif // LL_LLINVENTORYMODEL_H
-
+/** + * @file llinventorymodel.h + * @brief LLInventoryModel class header file + * + * $LicenseInfo:firstyear=2002&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2010, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA + * $/LicenseInfo$ + */ + +#ifndef LL_LLINVENTORYMODEL_H +#define LL_LLINVENTORYMODEL_H + +#include <map> +#include <set> +#include <string> +#include <vector> + +#include "llassettype.h" +#include "llfoldertype.h" +#include "llframetimer.h" +#include "lluuid.h" +#include "llpermissionsflags.h" +#include "llviewerinventory.h" +#include "llstring.h" +#include "httpcommon.h" +#include "httprequest.h" +#include "httpoptions.h" +#include "httpheaders.h" +#include "httphandler.h" +#include "lleventcoro.h" +#include "llcoros.h" + +class LLInventoryObserver; +class LLInventoryObject; +class LLInventoryItem; +class LLInventoryCategory; +class LLMessageSystem; +class LLInventoryCollectFunctor; + +///---------------------------------------------------------------------------- +/// LLInventoryValidationInfo +///---------------------------------------------------------------------------- +class LLInventoryValidationInfo: public LLRefCount +{ +public: + LLInventoryValidationInfo(); + void toOstream(std::ostream& os) const; + void asLLSD(LLSD& sd) const; + + bool mInitialized{false}; + S32 mWarningCount{0}; + std::map<std::string,U32> mWarnings; + + S32 mLoopCount{0}; // Presence of folders whose ancestors loop onto themselves + S32 mOrphanedCount{0}; // Missing or orphaned items, links and folders + + S32 mFatalErrorCount{0}; + bool mFatalNoRootFolder{false}; + S32 mFatalSystemDuplicate{0}; + bool mFatalNoLibraryRootFolder{false}; + bool mFatalQADebugMode{false}; + + std::set<LLFolderType::EType> mMissingRequiredSystemFolders; + std::set<LLFolderType::EType> mDuplicateRequiredSystemFolders; +}; +std::ostream& operator<<(std::ostream& s, const LLInventoryValidationInfo& v); + +///---------------------------------------------------------------------------- +// LLInventoryModel +// +// Represents a collection of inventory, and provides efficient ways to access +// that information. +// NOTE: This class could in theory be used for any place where you need +// inventory, though it optimizes for time efficiency - not space efficiency, +// probably making it inappropriate for use on tasks. +///---------------------------------------------------------------------------- +class LLInventoryModel +{ + LOG_CLASS(LLInventoryModel); + +public: + enum EHasChildren + { + CHILDREN_NO, + CHILDREN_YES, + CHILDREN_MAYBE + }; + + typedef std::vector<LLPointer<LLViewerInventoryCategory> > cat_array_t; + typedef std::vector<LLPointer<LLViewerInventoryItem> > item_array_t; + typedef std::set<LLUUID> changed_items_t; + + // Rider: This is using the old responder patter. It should be refactored to + // take advantage of coroutines. + + // HTTP handler for individual item requests (inventory or library). + // Background item requests are derived from this in the background + // inventory system. All folder requests are also located there + // but have their own handler derived from HttpHandler. + class FetchItemHttpHandler : public LLCore::HttpHandler + { + public: + LOG_CLASS(FetchItemHttpHandler); + + FetchItemHttpHandler(const LLSD & request_sd); + virtual ~FetchItemHttpHandler(); + + protected: + FetchItemHttpHandler(const FetchItemHttpHandler &); // Not defined + void operator=(const FetchItemHttpHandler &); // Not defined + + public: + virtual void onCompleted(LLCore::HttpHandle handle, LLCore::HttpResponse * response); + + private: + void processData(LLSD & body, LLCore::HttpResponse * response); + void processFailure(LLCore::HttpStatus status, LLCore::HttpResponse * response); + void processFailure(const char * const reason, LLCore::HttpResponse * response); + + private: + LLSD mRequestSD; + }; + +/******************************************************************************** + ** ** + ** INITIALIZATION/SETUP + **/ + + //-------------------------------------------------------------------- + // Constructors / Destructors + //-------------------------------------------------------------------- +public: + LLInventoryModel(); + ~LLInventoryModel(); + void cleanupInventory(); +protected: + void empty(); // empty the entire contents + + //-------------------------------------------------------------------- + // Initialization + //-------------------------------------------------------------------- +public: + // The inventory model usage is sensitive to the initial construction of the model + bool isInventoryUsable() const; +private: + bool mIsAgentInvUsable; // used to handle an invalid inventory state + + // One-time initialization of HTTP system. + void initHttpRequest(); + + //-------------------------------------------------------------------- + // Root Folders + //-------------------------------------------------------------------- +public: + // The following are set during login with data from the server + void setRootFolderID(const LLUUID& id); + void setLibraryOwnerID(const LLUUID& id); + void setLibraryRootFolderID(const LLUUID& id); + + const LLUUID &getRootFolderID() const; + const LLUUID &getLibraryOwnerID() const; + const LLUUID &getLibraryRootFolderID() const; +private: + LLUUID mRootFolderID; + LLUUID mLibraryRootFolderID; + LLUUID mLibraryOwnerID; + + //-------------------------------------------------------------------- + // Structure + //-------------------------------------------------------------------- +public: + // Methods to load up inventory skeleton & meat. These are used + // during authentication. Returns true if everything parsed. + bool loadSkeleton(const LLSD& options, const LLUUID& owner_id); + void buildParentChildMap(); // brute force method to rebuild the entire parent-child relations + void createCommonSystemCategories(); + + static std::string getInvCacheAddres(const LLUUID& owner_id); + + // Call on logout to save a terse representation. + void cache(const LLUUID& parent_folder_id, const LLUUID& agent_id); +private: + // Information for tracking the actual inventory. We index this + // information in a lot of different ways so we can access + // the inventory using several different identifiers. + // mInventory member data is the 'master' list of inventory, and + // mCategoryMap and mItemMap store uuid->object mappings. + typedef std::map<LLUUID, LLPointer<LLViewerInventoryCategory> > cat_map_t; + typedef std::map<LLUUID, LLPointer<LLViewerInventoryItem> > item_map_t; + cat_map_t mCategoryMap; + item_map_t mItemMap; + // This last set of indices is used to map parents to children. + typedef std::map<LLUUID, cat_array_t*> parent_cat_map_t; + typedef std::map<LLUUID, item_array_t*> parent_item_map_t; + parent_cat_map_t mParentChildCategoryTree; + parent_item_map_t mParentChildItemTree; + + // Track links to items and categories. We do not store item or + // category pointers here, because broken links are also supported. + typedef std::multimap<LLUUID, LLUUID> backlink_mmap_t; + backlink_mmap_t mBacklinkMMap; // key = target_id: ID of item, values = link_ids: IDs of item or folder links referencing it. + // For internal use only + bool hasBacklinkInfo(const LLUUID& link_id, const LLUUID& target_id) const; + void addBacklinkInfo(const LLUUID& link_id, const LLUUID& target_id); + void removeBacklinkInfo(const LLUUID& link_id, const LLUUID& target_id); + + //-------------------------------------------------------------------- + // Login + //-------------------------------------------------------------------- +public: + static bool getIsFirstTimeInViewer2(); + static bool isSysFoldersReady() { return (sPendingSystemFolders == 0); } + +private: + static bool sFirstTimeInViewer2; + const static S32 sCurrentInvCacheVersion; // expected inventory cache version + + static S32 sPendingSystemFolders; + +/** Initialization/Setup + ** ** + *******************************************************************************/ + +/******************************************************************************** + ** ** + ** ACCESSORS + **/ + + //-------------------------------------------------------------------- + // Descendants + //-------------------------------------------------------------------- +public: + // Make sure we have the descendants in the structure. Returns true + // if a fetch was performed. + bool fetchDescendentsOf(const LLUUID& folder_id) const; + + // Return the direct descendants of the id provided.Set passed + // in values to NULL if the call fails. + // NOTE: The array provided points straight into the guts of + // this object, and should only be used for read operations, since + // modifications may invalidate the internal state of the inventory. + void getDirectDescendentsOf(const LLUUID& cat_id, + cat_array_t*& categories, + item_array_t*& items) const; + void getDirectDescendentsOf(const LLUUID& cat_id, cat_array_t& categories, item_array_t& items, LLInventoryCollectFunctor& f) const; + + typedef LLUUID digest_t; // To clarify the actual usage of this "UUID" + // Compute a hash of direct descendant names (for detecting child name changes) + digest_t hashDirectDescendentNames(const LLUUID& cat_id) const; + + // Starting with the object specified, add its descendants to the + // array provided, but do not add the inventory object specified + // by id. There is no guaranteed order. + // NOTE: Neither array will be erased before adding objects to it. + // Do not store a copy of the pointers collected - use them, and + // collect them again later if you need to reference the same objects. + enum { + EXCLUDE_TRASH = false, + INCLUDE_TRASH = true + }; + // Simpler existence test if matches don't actually need to be collected. + bool hasMatchingDirectDescendent(const LLUUID& cat_id, + LLInventoryCollectFunctor& filter); + void collectDescendents(const LLUUID& id, + cat_array_t& categories, + item_array_t& items, + bool include_trash); + void collectDescendentsIf(const LLUUID& id, + cat_array_t& categories, + item_array_t& items, + bool include_trash, + LLInventoryCollectFunctor& add); + + // Collect all items in inventory that are linked to item_id. + // Assumes item_id is itself not a linked item. + item_array_t collectLinksTo(const LLUUID& item_id); + + // Check if one object has a parent chain up to the category specified by UUID. + bool isObjectDescendentOf(const LLUUID& obj_id, const LLUUID& cat_id) const; + + enum EAncestorResult{ + ANCESTOR_OK = 0, + ANCESTOR_MISSING = 1, + ANCESTOR_LOOP = 2, + }; + // Follow parent chain to the top. + EAncestorResult getObjectTopmostAncestor(const LLUUID& object_id, LLUUID& result) const; + + //-------------------------------------------------------------------- + // Find + //-------------------------------------------------------------------- +public: + + // Checks if category exists ("My Inventory" only), if it does not, creates it + void ensureCategoryForTypeExists(LLFolderType::EType preferred_type); + + const LLUUID findCategoryUUIDForTypeInRoot( + LLFolderType::EType preferred_type, + const LLUUID& root_id) const; + + // Returns the uuid of the category that specifies 'type' as what it + // defaults to containing. The category is not necessarily only for that type. + // NOTE: If create_folder is true, this will create a new inventory category + // on the fly if one does not exist. *NOTE: if find_in_library is true it + // will search in the user's library folder instead of "My Inventory" + const LLUUID findCategoryUUIDForType(LLFolderType::EType preferred_type) const; + // will search in the user's library folder instead of "My Inventory" + const LLUUID findLibraryCategoryUUIDForType(LLFolderType::EType preferred_type) const; + // Returns user specified category for uploads, returns default id if there are no + // user specified one or it does not exist, creates default category if it is missing. + const LLUUID findUserDefinedCategoryUUIDForType(LLFolderType::EType preferred_type) const; + + // Get whatever special folder this object is a child of, if any. + const LLViewerInventoryCategory *getFirstNondefaultParent(const LLUUID& obj_id) const; + + // Get first descendant of the child object under the specified parent + const LLViewerInventoryCategory *getFirstDescendantOf(const LLUUID& master_parent_id, const LLUUID& obj_id) const; + + // Get the object by id. Returns NULL if not found. + // NOTE: Use the pointer returned for read operations - do + // not modify the object values in place or you will break stuff. + LLInventoryObject* getObject(const LLUUID& id) const; + + // Get the item by id. Returns NULL if not found. + // NOTE: Use the pointer for read operations - use the + // updateItem() method to actually modify values. + LLViewerInventoryItem* getItem(const LLUUID& id) const; + + // Get the category by id. Returns NULL if not found. + // NOTE: Use the pointer for read operations - use the + // updateCategory() method to actually modify values. + LLViewerInventoryCategory* getCategory(const LLUUID& id) const; + + // Get the inventoryID or item that this item points to, else just return object_id + const LLUUID& getLinkedItemID(const LLUUID& object_id) const; + LLViewerInventoryItem* getLinkedItem(const LLUUID& object_id) const; + + // Copy content of all folders of type "type" into folder "id" and delete/purge the empty folders + // Note : This method has been designed for FT_OUTBOX (aka Merchant Outbox) but can be used for other categories + void consolidateForType(const LLUUID& id, LLFolderType::EType type); + +private: + mutable LLPointer<LLViewerInventoryItem> mLastItem; // cache recent lookups + + //-------------------------------------------------------------------- + // Count + //-------------------------------------------------------------------- +public: + // Return the number of items or categories + S32 getItemCount() const; + S32 getCategoryCount() const; + +/** Accessors + ** ** + *******************************************************************************/ + +/******************************************************************************** + ** ** + ** MUTATORS + **/ + +public: + // Change an existing item with a matching item_id or add the item + // to the current inventory. Returns the change mask generated by + // the update. No notification will be sent to observers. This + // method will only generate network traffic if the item had to be + // reparented. + // NOTE: In usage, you will want to perform cache accounting + // operations in LLInventoryModel::accountForUpdate() or + // LLViewerInventoryItem::updateServer() before calling this method. + U32 updateItem(const LLViewerInventoryItem* item, U32 mask = 0); + + // Change an existing item with the matching id or add + // the category. No notification will be sent to observers. This + // method will only generate network traffic if the item had to be + // reparented. + // NOTE: In usage, you will want to perform cache accounting + // operations in accountForUpdate() or LLViewerInventoryCategory:: + // updateServer() before calling this method. + void updateCategory(const LLViewerInventoryCategory* cat, U32 mask = 0); + + // Move the specified object id to the specified category and + // update the internal structures. No cache accounting, + // observer notification, or server update is performed. + void moveObject(const LLUUID& object_id, const LLUUID& cat_id); + + // Migrated from llinventoryfunctions + void changeItemParent(LLViewerInventoryItem* item, + const LLUUID& new_parent_id, + bool restamp); + + // Migrated from llinventoryfunctions + void changeCategoryParent(LLViewerInventoryCategory* cat, + const LLUUID& new_parent_id, + bool restamp); + + // Marks links from a "possibly" broken list for a rebuild + // clears the list + void rebuildBrockenLinks(); + bool hasPosiblyBrockenLinks() const { return mPossiblyBrockenLinks.size() > 0; } + + //-------------------------------------------------------------------- + // Delete + //-------------------------------------------------------------------- +public: + + // Update model after an item is confirmed as removed from + // server. Works for categories or items. + void onObjectDeletedFromServer(const LLUUID& item_id, + bool fix_broken_links = true, + bool update_parent_version = true, + bool do_notify_observers = true); + + // Update model after all descendants removed from server. + void onDescendentsPurgedFromServer(const LLUUID& object_id, bool fix_broken_links = true); + + // Update model after an existing item gets updated on server. + void onItemUpdated(const LLUUID& item_id, const LLSD& updates, bool update_parent_version); + + // Update model after an existing category gets updated on server. + void onCategoryUpdated(const LLUUID& cat_id, const LLSD& updates); + + // Delete a particular inventory object by ID. Will purge one + // object from the internal data structures, maintaining a + // consistent internal state. No cache accounting, observer + // notification, or server update is performed. + void deleteObject(const LLUUID& id, bool fix_broken_links = true, bool do_notify_observers = true); + /// move Item item_id to Trash + void removeItem(const LLUUID& item_id); + /// move Category category_id to Trash + void removeCategory(const LLUUID& category_id); + /// removeItem() or removeCategory(), whichever is appropriate + void removeObject(const LLUUID& object_id); + + // "TrashIsFull" when trash exceeds maximum capacity + void checkTrashOverflow(); + +protected: + void rebuildLinkItems(LLInventoryModel::item_array_t& items); + + //-------------------------------------------------------------------- + // Reorder + //-------------------------------------------------------------------- +public: + // Changes items order by insertion of the item identified by src_item_id + // before (or after) the item identified by dest_item_id. Both items must exist in items array. + // Sorting is stored after method is finished. Only src_item_id is moved before (or after) dest_item_id. + // The parameter "insert_before" controls on which side of dest_item_id src_item_id gets reinserted. + static void updateItemsOrder(LLInventoryModel::item_array_t& items, + const LLUUID& src_item_id, + const LLUUID& dest_item_id, + bool insert_before = true); + // Gets an iterator on an item vector knowing only the item UUID. + // Returns end() of the vector if not found. + static LLInventoryModel::item_array_t::iterator findItemIterByUUID(LLInventoryModel::item_array_t& items, const LLUUID& id); + + + // Rearranges Landmarks inside Favorites folder. + // Moves source landmark before target one. + void rearrangeFavoriteLandmarks(const LLUUID& source_item_id, const LLUUID& target_item_id); + //void saveItemsOrder(const LLInventoryModel::item_array_t& items); + + //-------------------------------------------------------------------- + // Creation + //-------------------------------------------------------------------- +public: + // Returns the UUID of the new category. If you want to use the default + // name based on type, pass in a NULL to the 'name' parameter. + void createNewCategory(const LLUUID& parent_id, + LLFolderType::EType preferred_type, + const std::string& name, + inventory_func_type callback = NULL, + const LLUUID& thumbnail_id = LLUUID::null); +protected: + // Internal methods that add inventory and make sure that all of + // the internal data structures are consistent. These methods + // should be passed pointers of newly created objects, and the + // instance will take over the memory management from there. + void addCategory(LLViewerInventoryCategory* category); + void addItem(LLViewerInventoryItem* item); + + void createNewCategoryCoro(std::string url, LLSD postData, inventory_func_type callback); + +/** Mutators + ** ** + *******************************************************************************/ + +/******************************************************************************** + ** ** + ** CATEGORY ACCOUNTING + **/ + +public: + // Represents the number of items added or removed from a category. + struct LLCategoryUpdate + { + LLCategoryUpdate() : mDescendentDelta(0), mChangeVersion(true) {} + LLCategoryUpdate(const LLUUID& category_id, S32 delta, bool change_version = true) : + mCategoryID(category_id), + mDescendentDelta(delta), + mChangeVersion(change_version) {} + LLUUID mCategoryID; + S32 mDescendentDelta; + bool mChangeVersion; + }; + typedef std::vector<LLCategoryUpdate> update_list_t; + + // This exists to make it easier to account for deltas in a map. + struct LLInitializedS32 + { + LLInitializedS32() : mValue(0) {} + LLInitializedS32(S32 value) : mValue(value) {} + S32 mValue; + LLInitializedS32& operator++() { ++mValue; return *this; } + LLInitializedS32& operator--() { --mValue; return *this; } + }; + typedef std::map<LLUUID, LLInitializedS32> update_map_t; + + // Call when there are category updates. Call them *before* the + // actual update so the method can do descendent accounting correctly. + void accountForUpdate(const LLCategoryUpdate& update) const; + void accountForUpdate(const update_list_t& updates) const; + void accountForUpdate(const update_map_t& updates) const; + + // Return (yes/no/maybe) child status of category children. + EHasChildren categoryHasChildren(const LLUUID& cat_id) const; + + // Returns true if category version is known and theoretical + // descendents == actual descendents. + bool isCategoryComplete(const LLUUID& cat_id) const; + +/** Category Accounting + ** ** + *******************************************************************************/ + +/******************************************************************************** + ** ** + ** NOTIFICATIONS + **/ + +public: + // Called by the idle loop. Only updates if new state is detected. Call + // notifyObservers() manually to update regardless of whether state change + // has been indicated. + void idleNotifyObservers(); + + // Call to explicitly update everyone on a new state. + void notifyObservers(); + + // Allows outsiders to tell the inventory if something has + // been changed 'under the hood', but outside the control of the + // inventory. The next notify will include that notification. + void addChangedMask(U32 mask, const LLUUID& referent); + + const changed_items_t& getChangedIDs() const { return mChangedItemIDs; } + const changed_items_t& getAddedIDs() const { return mAddedItemIDs; } +protected: + // Updates all linked items pointing to this id. + void addChangedMaskForLinks(const LLUUID& object_id, U32 mask); +private: + // Flag set when notifyObservers is being called, to look for bugs + // where it's called recursively. + bool mIsNotifyObservers; + // Variables used to track what has changed since the last notify. + U32 mModifyMask; + changed_items_t mChangedItemIDs; + changed_items_t mAddedItemIDs; + // Fallback when notifyObservers is in progress + U32 mModifyMaskBacklog; + changed_items_t mChangedItemIDsBacklog; + changed_items_t mAddedItemIDsBacklog; + typedef std::map<LLUUID , changed_items_t> broken_links_t; + broken_links_t mPossiblyBrockenLinks; // there can be multiple links per item + changed_items_t mLinksRebuildList; + boost::signals2::connection mBulkFecthCallbackSlot; + + + //-------------------------------------------------------------------- + // Observers + //-------------------------------------------------------------------- +public: + // If the observer is destroyed, be sure to remove it. + void addObserver(LLInventoryObserver* observer); + void removeObserver(LLInventoryObserver* observer); + bool containsObserver(LLInventoryObserver* observer) const; +private: + typedef std::set<LLInventoryObserver*> observer_list_t; + observer_list_t mObservers; + +/** Notifications + ** ** + *******************************************************************************/ + + +/******************************************************************************** + ** ** + ** HTTP Transport + **/ +public: + // Invoke handler completion method (onCompleted) for all + // requests that are ready. + void handleResponses(bool foreground); + + // Request an inventory HTTP operation to either the + // foreground or background processor. These are actually + // the same service queue but the background requests are + // seviced more slowly effectively de-prioritizing new + // requests. + LLCore::HttpHandle requestPost(bool foreground, + const std::string & url, + const LLSD & body, + const LLCore::HttpHandler::ptr_t &handler, + const char * const message); + +private: + // Usual plumbing for LLCore:: HTTP operations. + LLCore::HttpRequest * mHttpRequestFG; + LLCore::HttpRequest * mHttpRequestBG; + LLCore::HttpOptions::ptr_t mHttpOptions; + LLCore::HttpHeaders::ptr_t mHttpHeaders; + LLCore::HttpRequest::policy_t mHttpPolicyClass; + +/** HTTP Transport + ** ** + *******************************************************************************/ + + +/******************************************************************************** + ** ** + ** MISCELLANEOUS + **/ + + //-------------------------------------------------------------------- + // Callbacks + //-------------------------------------------------------------------- +public: + // Trigger a notification and empty the folder type (FT_TRASH or FT_LOST_AND_FOUND) if confirmed + void emptyFolderType(const std::string notification, LLFolderType::EType folder_type); + bool callbackEmptyFolderType(const LLSD& notification, const LLSD& response, LLFolderType::EType preferred_type); + static void registerCallbacks(LLMessageSystem* msg); + + //-------------------------------------------------------------------- + // File I/O + //-------------------------------------------------------------------- +protected: + static bool loadFromFile(const std::string& filename, + cat_array_t& categories, + item_array_t& items, + changed_items_t& cats_to_update, + bool& is_cache_obsolete); + static bool saveToFile(const std::string& filename, + const cat_array_t& categories, + const item_array_t& items); + + //-------------------------------------------------------------------- + // Message handling functionality + //-------------------------------------------------------------------- +public: + static void processUpdateCreateInventoryItem(LLMessageSystem* msg, void**); + static void removeInventoryItem(LLUUID agent_id, LLMessageSystem* msg, const char* msg_label); + static void processRemoveInventoryItem(LLMessageSystem* msg, void**); + static void removeInventoryFolder(LLUUID agent_id, LLMessageSystem* msg); + static void processRemoveInventoryFolder(LLMessageSystem* msg, void**); + static void processRemoveInventoryObjects(LLMessageSystem* msg, void**); + static void processSaveAssetIntoInventory(LLMessageSystem* msg, void**); + static void processBulkUpdateInventory(LLMessageSystem* msg, void**); + static void processMoveInventoryItem(LLMessageSystem* msg, void**); +protected: + bool messageUpdateCore(LLMessageSystem* msg, bool do_accounting, U32 mask = 0x0); + + //-------------------------------------------------------------------- + // Locks + //-------------------------------------------------------------------- +public: + void lockDirectDescendentArrays(const LLUUID& cat_id, + cat_array_t*& categories, + item_array_t*& items); + void unlockDirectDescendentArrays(const LLUUID& cat_id); +protected: + cat_array_t* getUnlockedCatArray(const LLUUID& id); + item_array_t* getUnlockedItemArray(const LLUUID& id); +private: + std::map<LLUUID, bool> mCategoryLock; + std::map<LLUUID, bool> mItemLock; + + //-------------------------------------------------------------------- + // Debugging + //-------------------------------------------------------------------- +public: + void dumpInventory() const; + LLPointer<LLInventoryValidationInfo> validate() const; + LLPointer<LLInventoryValidationInfo> mValidationInfo; + std::string getFullPath(const LLInventoryObject *obj) const; + +/** Miscellaneous + ** ** + *******************************************************************************/ +}; + +// a special inventory model for the agent +extern LLInventoryModel gInventory; + +#endif // LL_LLINVENTORYMODEL_H + |