00001
00032 #ifndef LL_LLINVENTORYMODEL_H
00033 #define LL_LLINVENTORYMODEL_H
00034
00035 #include "llassettype.h"
00036 #include "lldarray.h"
00037 #include "lluuid.h"
00038 #include "llpermissionsflags.h"
00039 #include "llstring.h"
00040
00041 #include <map>
00042 #include <set>
00043 #include <string>
00044 #include <vector>
00045
00046
00047
00048
00049
00050
00051
00052
00053 class LLInventoryObserver
00054 {
00055 public:
00056
00057
00058
00059 enum
00060 {
00061 NONE = 0,
00062 LABEL = 1,
00063 INTERNAL = 2,
00064 ADD = 4,
00065 REMOVE = 8,
00066 STRUCTURE = 16,
00067 CALLING_CARD = 32,
00068 ALL = 0xffffffff
00069 };
00070 virtual ~LLInventoryObserver() {};
00071 virtual void changed(U32 mask) = 0;
00072 };
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085 class LLInventoryObject;
00086 class LLInventoryItem;
00087 class LLInventoryCategory;
00088 class LLViewerInventoryItem;
00089 class LLViewerInventoryCategory;
00090 class LLViewerInventoryItem;
00091 class LLViewerInventoryCategory;
00092 class LLMessageSystem;
00093 class LLInventoryCollectFunctor;
00094
00095 class LLInventoryModel
00096 {
00097 public:
00098 typedef enum e_has_children
00099 {
00100 CHILDREN_NO,
00101 CHILDREN_YES,
00102 CHILDREN_MAYBE
00103 }EHasChildren;
00104
00105
00106 typedef LLDynamicArray<LLPointer<LLViewerInventoryCategory> > cat_array_t;
00107 typedef LLDynamicArray<LLPointer<LLViewerInventoryItem> > item_array_t;
00108
00109
00110 LLInventoryModel();
00111 ~LLInventoryModel();
00112
00113
00114
00115
00116
00117
00118
00119 BOOL isObjectDescendentOf(const LLUUID& obj_id, const LLUUID& cat_id);
00120
00121
00122
00123
00124 LLInventoryObject* getObject(const LLUUID& id) const;
00125
00126
00127
00128
00129 LLViewerInventoryItem* getItem(const LLUUID& id) const;
00130
00131
00132
00133
00134 LLViewerInventoryCategory* getCategory(const LLUUID& id) const;
00135
00136
00137 S32 getItemCount() const;
00138 S32 getCategoryCount() const;
00139
00140
00141
00142
00143
00144
00145
00146 void getDirectDescendentsOf(const LLUUID& cat_id,
00147 cat_array_t*& categories,
00148 item_array_t*& items) const;
00149
00150
00151
00152
00153
00154
00155
00156 enum { EXCLUDE_TRASH = FALSE, INCLUDE_TRASH = TRUE };
00157 void collectDescendents(const LLUUID& id,
00158 cat_array_t& categories,
00159 item_array_t& items,
00160 BOOL include_trash);
00161
00162 void collectDescendentsIf(const LLUUID& id,
00163 cat_array_t& categories,
00164 item_array_t& items,
00165 BOOL include_trash,
00166 LLInventoryCollectFunctor& add);
00167
00168
00169
00170
00171 bool isInventoryUsable();
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187 U32 updateItem(const LLViewerInventoryItem* item);
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198 void updateCategory(const LLViewerInventoryCategory* cat);
00199
00200
00201
00202
00203 void moveObject(const LLUUID& object_id, const LLUUID& cat_id);
00204
00205
00206
00207
00208
00209 void deleteObject(const LLUUID& id);
00210
00211
00212
00213
00214
00215
00216
00217 void purgeDescendentsOf(const LLUUID& id);
00218
00219
00220
00221
00222
00223 void deleteFromServer(LLDynamicArray<LLUUID>& category_ids,
00224 LLDynamicArray<LLUUID>& item_ids);
00225
00226
00227
00228 void addObserver(LLInventoryObserver* observer);
00229 void removeObserver(LLInventoryObserver* observer);
00230
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241
00242
00243 LLUUID findCategoryUUIDForType(LLAssetType::EType preferred_type, bool create_folder = true);
00244
00245
00246
00247
00248 void notifyObservers();
00249
00250
00251
00252
00253
00254
00255
00256 void addChangedMask(U32 mask, const LLUUID& referent);
00257
00258 const std::set<LLUUID>& getChangedIDs() { return mChangedItemIDs; }
00259
00260
00261
00262
00263
00264
00265 void fetchDescendentsOf(const LLUUID& folder_id);
00266
00267
00268
00269
00270
00271 void cache(const LLUUID& parent_folder_id, const LLUUID& agent_id);
00272
00273
00274
00275 void appendPath(const LLUUID& id, LLString& path);
00276
00277
00278 static void registerCallbacks(LLMessageSystem* msg);
00279
00280
00281
00282
00283
00284
00285
00286 LLUUID createNewCategory(const LLUUID& parent_id,
00287 LLAssetType::EType preferred_type,
00288 const LLString& name);
00289
00290
00291
00292 typedef std::map<std::string, std::string> response_t;
00293 typedef std::vector<response_t> options_t;
00294 bool loadSkeleton(const options_t& options, const LLUUID& owner_id);
00295 bool loadMeat(const options_t& options, const LLUUID& owner_id);
00296
00297
00298
00299 void buildParentChildMap();
00300
00301
00302
00303
00304
00305
00306
00307 struct LLCategoryUpdate
00308 {
00309 LLCategoryUpdate() : mDescendentDelta(0) {}
00310 LLCategoryUpdate(const LLUUID& category_id, S32 delta) :
00311 mCategoryID(category_id),
00312 mDescendentDelta(delta) {}
00313 LLUUID mCategoryID;
00314 S32 mDescendentDelta;
00315 };
00316 typedef std::vector<LLCategoryUpdate> update_list_t;
00317
00318
00319
00320 struct LLInitializedS32
00321 {
00322 LLInitializedS32() : mValue(0) {}
00323 LLInitializedS32(S32 value) : mValue(value) {}
00324 S32 mValue;
00325 LLInitializedS32& operator++() { ++mValue; return *this; }
00326 LLInitializedS32& operator--() { --mValue; return *this; }
00327 };
00328 typedef std::map<LLUUID, LLInitializedS32> update_map_t;
00329
00330
00331
00332
00333 void accountForUpdate(const LLCategoryUpdate& update);
00334 void accountForUpdate(const update_list_t& updates);
00335 void accountForUpdate(const update_map_t& updates);
00336
00337
00338 EHasChildren categoryHasChildren(const LLUUID& cat_id) const;
00339
00340
00341
00342 bool isCategoryComplete(const LLUUID& cat_id) const;
00343
00344
00345
00346 static void startBackgroundFetch(const LLUUID& cat_id = LLUUID::null);
00347 static void stopBackgroundFetch();
00348 static BOOL backgroundFetchActive();
00349 static bool isEverythingFetched();
00350 static void backgroundFetch(void*);
00351
00352 protected:
00353
00354
00355
00356
00357
00358 void addCategory(LLViewerInventoryCategory* category);
00359 void addItem(LLViewerInventoryItem* item);
00360
00361
00362
00363 LLUUID findCatUUID(LLAssetType::EType preferred_type);
00364
00365
00366 void empty();
00367
00368
00369
00370
00371
00372
00373
00374
00375 static bool loadFromFile(
00376 const char* filename,
00377 cat_array_t& categories,
00378 item_array_t& items);
00379 static bool saveToFile(
00380 const char* filename,
00381 const cat_array_t& categories,
00382 const item_array_t& items);
00383
00384
00385
00386 static void processUpdateCreateInventoryItem(LLMessageSystem* msg, void**);
00387 static void processRemoveInventoryItem(LLMessageSystem* msg, void**);
00388 static void processUpdateInventoryFolder(LLMessageSystem* msg, void**);
00389 static void processRemoveInventoryFolder(LLMessageSystem* msg, void**);
00390
00391
00392
00393 static void processSaveAssetIntoInventory(LLMessageSystem* msg, void**);
00394 static void processBulkUpdateInventory(LLMessageSystem* msg, void**);
00395 static void processInventoryDescendents(LLMessageSystem* msg, void**);
00396 static void processMoveInventoryItem(LLMessageSystem* msg, void**);
00397 static void processFetchInventoryReply(LLMessageSystem* msg, void**);
00398
00399 bool messageUpdateCore(LLMessageSystem* msg, bool do_accounting);
00400
00401 protected:
00402
00403 U32 mModifyMask;
00404 typedef std::set<LLUUID> changed_items_t;
00405 changed_items_t mChangedItemIDs;
00406
00407
00408
00409
00410
00411
00412 typedef std::map<LLUUID, LLPointer<LLViewerInventoryCategory> > cat_map_t;
00413 typedef std::map<LLUUID, LLPointer<LLViewerInventoryItem> > item_map_t;
00414
00415 cat_map_t mCategoryMap;
00416 item_map_t mItemMap;
00417
00418
00419 mutable LLPointer<LLViewerInventoryItem> mLastItem;
00420
00421
00422
00423
00424 typedef std::map<LLUUID, cat_array_t*> parent_cat_map_t;
00425 typedef std::map<LLUUID, item_array_t*> parent_item_map_t;
00426 parent_cat_map_t mParentChildCategoryTree;
00427 parent_item_map_t mParentChildItemTree;
00428
00429 typedef std::set<LLInventoryObserver*> observer_list_t;
00430 observer_list_t mObservers;
00431
00432
00433 static BOOL sBackgroundFetchActive;
00434 static BOOL sTimelyFetchPending;
00435 static BOOL sAllFoldersFetched;
00436 static BOOL sFullFetchStarted;
00437 static S32 sNumFetchRetries;
00438 static LLFrameTimer sFetchTimer;
00439 static F32 sMinTimeBetweenFetches;
00440 static F32 sMaxTimeBetweenFetches;
00441
00442
00443 bool mIsAgentInvUsable;
00444
00445 public:
00446
00447 void dumpInventory();
00448 };
00449
00450
00451 extern LLInventoryModel gInventory;
00452
00453
00454
00455
00456
00457
00458
00459
00460
00461
00462
00463 class LLInventoryCollectFunctor
00464 {
00465 public:
00466 virtual ~LLInventoryCollectFunctor(){};
00467 virtual bool operator()(LLInventoryCategory* cat, LLInventoryItem* item) = 0;
00468 };
00469
00470
00471
00472
00473
00474
00475
00476 class LLViewerInventoryItem;
00477
00478 class LLAssetIDMatches : public LLInventoryCollectFunctor
00479 {
00480 public:
00481 LLAssetIDMatches(const LLUUID& asset_id) : mAssetID(asset_id) {}
00482 virtual ~LLAssetIDMatches() {}
00483 bool operator()(LLInventoryCategory* cat, LLInventoryItem* item);
00484
00485 protected:
00486 LLUUID mAssetID;
00487 };
00488
00489
00490
00491
00492
00493
00494
00495
00496
00497 class LLIsType : public LLInventoryCollectFunctor
00498 {
00499 public:
00500 LLIsType(LLAssetType::EType type) : mType(type) {}
00501 virtual ~LLIsType() {}
00502 virtual bool operator()(LLInventoryCategory* cat,
00503 LLInventoryItem* item);
00504 protected:
00505 LLAssetType::EType mType;
00506 };
00507
00508
00509
00510
00511
00512
00513
00514
00515
00516 class LLIsNotType : public LLInventoryCollectFunctor
00517 {
00518 public:
00519 LLIsNotType(LLAssetType::EType type) : mType(type) {}
00520 virtual ~LLIsNotType() {}
00521 virtual bool operator()(LLInventoryCategory* cat,
00522 LLInventoryItem* item);
00523 protected:
00524 LLAssetType::EType mType;
00525 };
00526
00527 class LLIsTypeWithPermissions : public LLInventoryCollectFunctor
00528 {
00529 public:
00530 LLIsTypeWithPermissions(LLAssetType::EType type, const PermissionBit perms, const LLUUID &agent_id, const LLUUID &group_id)
00531 : mType(type), mPerm(perms), mAgentID(agent_id), mGroupID(group_id) {}
00532 virtual ~LLIsTypeWithPermissions() {}
00533 virtual bool operator()(LLInventoryCategory* cat,
00534 LLInventoryItem* item);
00535 protected:
00536 LLAssetType::EType mType;
00537 PermissionBit mPerm;
00538 LLUUID mAgentID;
00539 LLUUID mGroupID;
00540 };
00541
00542
00543
00544
00545
00546
00547
00548
00549
00550
00551
00552
00553
00554
00555
00556
00557
00558
00559
00560
00561
00562
00563
00564
00565
00566
00567
00568
00569
00570
00571
00572 class LLBuddyCollector : public LLInventoryCollectFunctor
00573 {
00574 public:
00575 LLBuddyCollector() {}
00576 virtual ~LLBuddyCollector() {}
00577 virtual bool operator()(LLInventoryCategory* cat,
00578 LLInventoryItem* item);
00579 };
00580
00581
00582
00583
00584
00585
00586
00587
00588 class LLUniqueBuddyCollector : public LLInventoryCollectFunctor
00589 {
00590 public:
00591 LLUniqueBuddyCollector() {}
00592 virtual ~LLUniqueBuddyCollector() {}
00593 virtual bool operator()(LLInventoryCategory* cat,
00594 LLInventoryItem* item);
00595
00596 protected:
00597 std::set<LLUUID> mSeen;
00598 };
00599
00600
00601
00602
00603
00604
00605
00606 class LLParticularBuddyCollector : public LLInventoryCollectFunctor
00607 {
00608 public:
00609 LLParticularBuddyCollector(const LLUUID& id) : mBuddyID(id) {}
00610 virtual ~LLParticularBuddyCollector() {}
00611 virtual bool operator()(LLInventoryCategory* cat,
00612 LLInventoryItem* item);
00613 protected:
00614 LLUUID mBuddyID;
00615 };
00616
00617
00618
00619
00620
00621
00622
00623
00624 class LLNameCategoryCollector : public LLInventoryCollectFunctor
00625 {
00626 public:
00627 LLNameCategoryCollector(const char* name) : mName(name) {}
00628 virtual ~LLNameCategoryCollector() {}
00629 virtual bool operator()(LLInventoryCategory* cat,
00630 LLInventoryItem* item);
00631 protected:
00632 std::string mName;
00633 };
00634
00635
00636
00637
00638
00639
00640
00641
00642
00643
00644
00645
00646 class LLInventoryCompletionObserver : public LLInventoryObserver
00647 {
00648 public:
00649 LLInventoryCompletionObserver() {}
00650 virtual void changed(U32 mask);
00651
00652 void watchItem(const LLUUID& id);
00653
00654 protected:
00655 virtual void done() = 0;
00656
00657 typedef std::vector<LLUUID> item_ref_t;
00658 item_ref_t mComplete;
00659 item_ref_t mIncomplete;
00660 };
00661
00662
00663
00664
00665
00666
00667
00668
00669
00670
00671 class LLInventoryFetchObserver : public LLInventoryObserver
00672 {
00673 public:
00674 LLInventoryFetchObserver() {}
00675 virtual void changed(U32 mask);
00676
00677 typedef std::vector<LLUUID> item_ref_t;
00678
00679 bool isEverythingComplete() const;
00680 void fetchItems(const item_ref_t& ids);
00681 virtual void done() = 0;
00682
00683 protected:
00684 item_ref_t mComplete;
00685 item_ref_t mIncomplete;
00686 };
00687
00688
00689
00690
00691
00692
00693
00694
00695 class LLInventoryFetchDescendentsObserver : public LLInventoryObserver
00696 {
00697 public:
00698 LLInventoryFetchDescendentsObserver() {}
00699 virtual void changed(U32 mask);
00700
00701 typedef std::vector<LLUUID> folder_ref_t;
00702 void fetchDescendents(const folder_ref_t& ids);
00703 bool isEverythingComplete() const;
00704 virtual void done() = 0;
00705
00706 protected:
00707 bool isComplete(LLViewerInventoryCategory* cat);
00708 folder_ref_t mIncompleteFolders;
00709 folder_ref_t mCompleteFolders;
00710 };
00711
00712
00713
00714
00715
00716
00717
00718
00719
00720 class LLInventoryFetchComboObserver : public LLInventoryObserver
00721 {
00722 public:
00723 LLInventoryFetchComboObserver() : mDone(false) {}
00724 virtual void changed(U32 mask);
00725
00726 typedef std::vector<LLUUID> folder_ref_t;
00727 typedef std::vector<LLUUID> item_ref_t;
00728 void fetch(const folder_ref_t& folder_ids, const item_ref_t& item_ids);
00729
00730 virtual void done() = 0;
00731
00732 protected:
00733 bool mDone;
00734 folder_ref_t mCompleteFolders;
00735 folder_ref_t mIncompleteFolders;
00736 item_ref_t mCompleteItems;
00737 item_ref_t mIncompleteItems;
00738 };
00739
00740
00741
00742
00743
00744
00745
00746
00747
00748
00749 class LLInventoryExistenceObserver : public LLInventoryObserver
00750 {
00751 public:
00752 LLInventoryExistenceObserver() {}
00753 virtual void changed(U32 mask);
00754
00755 void watchItem(const LLUUID& id);
00756
00757 protected:
00758 virtual void done() = 0;
00759
00760 typedef std::vector<LLUUID> item_ref_t;
00761 item_ref_t mExist;
00762 item_ref_t mMIA;
00763 };
00764
00765
00766
00767
00768
00769
00770
00771
00772
00773
00774
00775 class LLInventoryAddedObserver : public LLInventoryObserver
00776 {
00777 public:
00778 LLInventoryAddedObserver() : mAdded() {}
00779 virtual void changed(U32 mask);
00780
00781 protected:
00782 virtual void done() = 0;
00783
00784 typedef std::vector<LLUUID> item_ref_t;
00785 item_ref_t mAdded;
00786 };
00787
00788
00789
00790
00791
00792
00793
00794
00795
00796
00797
00798 class LLInventoryTransactionObserver : public LLInventoryObserver
00799 {
00800 public:
00801 LLInventoryTransactionObserver(const LLTransactionID& transaction_id);
00802 virtual void changed(U32 mask);
00803
00804 protected:
00805 typedef std::vector<LLUUID> folder_ref_t;
00806 typedef std::vector<LLUUID> item_ref_t;
00807 virtual void done(const folder_ref_t& folders, const item_ref_t& items) = 0;
00808
00809 LLTransactionID mTransactionID;
00810 };
00811
00812
00813 #endif // LL_LLINVENTORYMODEL_H
00814