summaryrefslogtreecommitdiff
path: root/indra/newview/llinventoryobserver.h
diff options
context:
space:
mode:
Diffstat (limited to 'indra/newview/llinventoryobserver.h')
-rw-r--r--indra/newview/llinventoryobserver.h263
1 files changed, 165 insertions, 98 deletions
diff --git a/indra/newview/llinventoryobserver.h b/indra/newview/llinventoryobserver.h
index e1c8bd3faf..d535250970 100644
--- a/indra/newview/llinventoryobserver.h
+++ b/indra/newview/llinventoryobserver.h
@@ -34,6 +34,7 @@
#define LL_LLINVENTORYOBSERVERS_H
#include "lluuid.h"
+#include "llmd5.h"
#include <string>
#include <vector>
@@ -42,10 +43,9 @@ class LLViewerInventoryCategory;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Class LLInventoryObserver
//
-// This class is designed to be a simple abstract base class which can
-// relay messages when the inventory changes.
+// A simple abstract base class that can relay messages when the inventory
+// changes.
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
class LLInventoryObserver
{
public:
@@ -54,17 +54,17 @@ public:
// chaged() to see if the observer is interested in the change.
enum
{
- NONE = 0,
- LABEL = 1, // name changed
- INTERNAL = 2, // internal change (e.g. asset uuid different)
- ADD = 4, // something added
- REMOVE = 8, // something deleted
- STRUCTURE = 16, // structural change (eg item or folder moved)
- CALLING_CARD = 32, // (eg online, grant status, cancel)
- GESTURE = 64,
- REBUILD = 128, // item UI changed (eg item type different)
- SORT = 256, // folder needs to be resorted.
- ALL = 0xffffffff
+ NONE = 0,
+ LABEL = 1, // Name changed
+ INTERNAL = 2, // Internal change (e.g. asset uuid different)
+ ADD = 4, // Something added
+ REMOVE = 8, // Something deleted
+ STRUCTURE = 16, // Structural change (e.g. item or folder moved)
+ CALLING_CARD = 32, // Calling card change (e.g. online, grant status, cancel)
+ GESTURE = 64,
+ REBUILD = 128, // Item UI changed (e.g. item type different)
+ SORT = 256, // Folder needs to be resorted.
+ ALL = 0xffffffff
};
LLInventoryObserver();
virtual ~LLInventoryObserver();
@@ -73,146 +73,151 @@ public:
};
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Class LLInventoryCompletionObserver
+// Class LLInventoryFetchObserver
//
-// Class which can be used as a base class for doing something when
-// when all observed items are locally complete. This class implements
-// the changed() method of LLInventoryObserver and declares a new
-// method named done() which is called when all watched items have
-// complete information in the inventory model.
+// Abstract class to handle fetching items, folders, etc.
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-class LLInventoryCompletionObserver : public LLInventoryObserver
+class LLInventoryFetchObserver : public LLInventoryObserver
{
public:
- LLInventoryCompletionObserver() {}
- virtual void changed(U32 mask);
+ LLInventoryFetchObserver(const LLUUID& id = LLUUID::null); // single item
+ LLInventoryFetchObserver(const uuid_vec_t& ids); // multiple items
+ void setFetchID(const LLUUID& id);
+ void setFetchIDs(const uuid_vec_t& ids);
- void watchItem(const LLUUID& id);
+ BOOL isFinished() const;
+ virtual void startFetch() = 0;
+ virtual void changed(U32 mask) = 0;
+ virtual void done() {};
protected:
- virtual void done() = 0;
-
uuid_vec_t mComplete;
uuid_vec_t mIncomplete;
+ uuid_vec_t mIDs;
};
-
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Class LLInventoryFetchObserver
+// Class LLInventoryFetchItemsObserver
//
-// This class is much like the LLInventoryCompletionObserver, except
-// that it handles all the the fetching necessary. Override the done()
-// method to do the thing you want.
+// Fetches inventory items, calls done() when all inventory has arrived.
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-class LLInventoryFetchObserver : public LLInventoryObserver
+class LLInventoryFetchItemsObserver : public LLInventoryFetchObserver
{
public:
- LLInventoryFetchObserver(bool retry_if_missing = false): mRetryIfMissing(retry_if_missing) {}
- virtual void changed(U32 mask);
-
- typedef uuid_vec_t item_ref_t;
-
- bool isEverythingComplete() const;
- void fetchItems(const item_ref_t& ids);
- virtual void done() {};
-
-protected:
- bool mRetryIfMissing;
- item_ref_t mComplete;
- item_ref_t mIncomplete;
+ LLInventoryFetchItemsObserver(const LLUUID& item_id = LLUUID::null);
+ LLInventoryFetchItemsObserver(const uuid_vec_t& item_ids);
+
+ /*virtual*/ void startFetch();
+ /*virtual*/ void changed(U32 mask);
+private:
+ LLTimer mFetchingPeriod;
+
+ /**
+ * Period of waiting a notification when requested items get added into inventory.
+ */
+ static const F32 FETCH_TIMER_EXPIRY;
};
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Class LLInventoryFetchDescendentsObserver
//
-// This class is much like the LLInventoryCompletionObserver, except
-// that it handles fetching based on category. Override the done()
-// method to do the thing you want.
+// Fetches children of a category/folder, calls done() when all
+// inventory has arrived.
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-class LLInventoryFetchDescendentsObserver : public LLInventoryObserver
+class LLInventoryFetchDescendentsObserver : public LLInventoryFetchObserver
{
public:
- LLInventoryFetchDescendentsObserver() {}
- virtual void changed(U32 mask);
-
- void fetchDescendents(const uuid_vec_t& ids);
- bool isEverythingComplete() const;
- virtual void done() = 0;
+ LLInventoryFetchDescendentsObserver(const LLUUID& cat_id = LLUUID::null);
+ LLInventoryFetchDescendentsObserver(const uuid_vec_t& cat_ids);
+ /*virtual*/ void startFetch();
+ /*virtual*/ void changed(U32 mask);
protected:
- bool isComplete(LLViewerInventoryCategory* cat);
- uuid_vec_t mIncompleteFolders;
- uuid_vec_t mCompleteFolders;
+ BOOL isCategoryComplete(const LLViewerInventoryCategory* cat) const;
};
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Class LLInventoryFetchComboObserver
//
-// This class does an appropriate combination of fetch descendents and
-// item fetches based on completion of categories and items. Much like
-// the fetch and fetch descendents, this will call done() when everything
-// has arrived.
+// Does an appropriate combination of fetch descendents and
+// item fetches based on completion of categories and items. This is optimized
+// to not fetch item_ids that are descendents of any of the folder_ids.
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
class LLInventoryFetchComboObserver : public LLInventoryObserver
{
public:
- LLInventoryFetchComboObserver() : mDone(false) {}
- virtual void changed(U32 mask);
-
- void fetch(const uuid_vec_t& folder_ids, const uuid_vec_t& item_ids);
+ LLInventoryFetchComboObserver(const uuid_vec_t& folder_ids,
+ const uuid_vec_t& item_ids);
+ ~LLInventoryFetchComboObserver();
+ /*virtual*/ void changed(U32 mask);
+ void startFetch();
virtual void done() = 0;
-
protected:
- bool mDone;
- uuid_vec_t mCompleteFolders;
- uuid_vec_t mIncompleteFolders;
- uuid_vec_t mCompleteItems;
- uuid_vec_t mIncompleteItems;
+ LLInventoryFetchItemsObserver *mFetchItems;
+ LLInventoryFetchDescendentsObserver *mFetchDescendents;
};
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Class LLInventoryExistenceObserver
//
-// This class is used as a base class for doing somethign when all the
-// observed item ids exist in the inventory somewhere. You can derive
-// a class from this class and implement the done() method to do
-// something useful.
+// Used as a base class for doing something when all the
+// observed item ids exist in the inventory somewhere.
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
class LLInventoryExistenceObserver : public LLInventoryObserver
{
public:
LLInventoryExistenceObserver() {}
- virtual void changed(U32 mask);
+ /*virtual*/ void changed(U32 mask);
void watchItem(const LLUUID& id);
-
protected:
virtual void done() = 0;
-
- typedef uuid_vec_t item_ref_t;
- item_ref_t mExist;
- item_ref_t mMIA;
+ uuid_vec_t mExist;
+ uuid_vec_t mMIA;
};
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Class LLInventoryAddedObserver
+// Class LLInventoryMovedObserver
//
-// This class is used as a base class for doing something when
-// a new item arrives in inventory.
-// It does not watch for a certain UUID, rather it acts when anything is added
+// This class is used as a base class for doing something when all the
+// item for observed asset ids were added into the inventory.
// Derive a class from this class and implement the done() method to do
// something useful.
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+class LLInventoryAddItemByAssetObserver : public LLInventoryObserver
+{
+public:
+ LLInventoryAddItemByAssetObserver() : mIsDirty(false) {}
+ virtual void changed(U32 mask);
+
+ void watchAsset(const LLUUID& asset_id);
+ bool isAssetWatched(const LLUUID& asset_id);
+
+protected:
+ virtual void onAssetAdded(const LLUUID& asset_id) {}
+ virtual void done() = 0;
+
+ typedef std::vector<LLUUID> item_ref_t;
+ item_ref_t mAddedItems;
+ item_ref_t mWatchedAssets;
+
+private:
+ bool mIsDirty;
+};
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Class LLInventoryAddedObserver
+//
+// Base class for doing something when a new item arrives in inventory.
+// It does not watch for a certain UUID, rather it acts when anything is added
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
class LLInventoryAddedObserver : public LLInventoryObserver
{
public:
LLInventoryAddedObserver() : mAdded() {}
- virtual void changed(U32 mask);
+ /*virtual*/ void changed(U32 mask);
protected:
virtual void done() = 0;
@@ -223,18 +228,15 @@ protected:
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Class LLInventoryTransactionObserver
//
-// Class which can be used as a base class for doing something when an
-// inventory transaction completes.
-//
-// *NOTE: This class is not quite complete. Avoid using unless you fix up it's
-// functionality gaps.
+// Base class for doing something when an inventory transaction completes.
+// NOTE: This class is not quite complete. Avoid using unless you fix up its
+// functionality gaps.
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
class LLInventoryTransactionObserver : public LLInventoryObserver
{
public:
LLInventoryTransactionObserver(const LLTransactionID& transaction_id);
- virtual void changed(U32 mask);
+ /*virtual*/ void changed(U32 mask);
protected:
virtual void done(const uuid_vec_t& folders, const uuid_vec_t& items) = 0;
@@ -242,6 +244,71 @@ protected:
LLTransactionID mTransactionID;
};
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Class LLInventoryCompletionObserver
+//
+// Base class for doing something when when all observed items are locally
+// complete. Implements the changed() method of LLInventoryObserver
+// and declares a new method named done() which is called when all watched items
+// have complete information in the inventory model.
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+class LLInventoryCompletionObserver : public LLInventoryObserver
+{
+public:
+ LLInventoryCompletionObserver() {}
+ /*virtual*/ void changed(U32 mask);
+
+ void watchItem(const LLUUID& id);
-#endif // LL_LLINVENTORYOBSERVERS_H
+protected:
+ virtual void done() = 0;
+
+ uuid_vec_t mComplete;
+ uuid_vec_t mIncomplete;
+};
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Class LLInventoryCategoriesObserver
+//
+// This class is used for monitoring a list of inventory categories
+// and firing a callback when there are changes in any of them.
+// Categories are identified by their UUIDs.
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+class LLInventoryCategoriesObserver : public LLInventoryObserver
+{
+public:
+ typedef boost::function<void()> callback_t;
+ LLInventoryCategoriesObserver() {};
+ virtual void changed(U32 mask);
+
+ /**
+ * Add cat_id to the list of observed categories with a
+ * callback fired on category being changed.
+ *
+ * @return "true" if category was added, "false" if it could
+ * not be found.
+ */
+ bool addCategory(const LLUUID& cat_id, callback_t cb);
+ void removeCategory(const LLUUID& cat_id);
+
+protected:
+ struct LLCategoryData
+ {
+ LLCategoryData(const LLUUID& cat_id, callback_t cb, S32 version, S32 num_descendents);
+
+ callback_t mCallback;
+ S32 mVersion;
+ S32 mDescendentsCount;
+ LLMD5 mItemNameHash;
+ bool mIsNameHashInitialized;
+ LLUUID mCatID;
+ };
+
+ typedef std::map<LLUUID, LLCategoryData> category_map_t;
+ typedef category_map_t::value_type category_map_value_t;
+
+ category_map_t mCategoryMap;
+};
+
+#endif // LL_LLINVENTORYOBSERVERS_H