llinventory.h
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:13k
源码类别:

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llinventory.h
  3.  * @brief LLInventoryItem and LLInventoryCategory class declaration.
  4.  *
  5.  * $LicenseInfo:firstyear=2001&license=viewergpl$
  6.  * 
  7.  * Copyright (c) 2001-2010, Linden Research, Inc.
  8.  * 
  9.  * Second Life Viewer Source Code
  10.  * The source code in this file ("Source Code") is provided by Linden Lab
  11.  * to you under the terms of the GNU General Public License, version 2.0
  12.  * ("GPL"), unless you have obtained a separate licensing agreement
  13.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  14.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  15.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  16.  * 
  17.  * There are special exceptions to the terms and conditions of the GPL as
  18.  * it is applied to this Source Code. View the full text of the exception
  19.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  20.  * online at
  21.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  22.  * 
  23.  * By copying, modifying or distributing this software, you acknowledge
  24.  * that you have read and understood your obligations described above,
  25.  * and agree to abide by those obligations.
  26.  * 
  27.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  28.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  29.  * COMPLETENESS OR PERFORMANCE.
  30.  * $/LicenseInfo$
  31.  */
  32. #ifndef LL_LLINVENTORY_H
  33. #define LL_LLINVENTORY_H
  34. #include <functional>
  35. #include "lldarray.h"
  36. #include "llfoldertype.h"
  37. #include "llinventorytype.h"
  38. #include "llmemtype.h"
  39. #include "llpermissions.h"
  40. #include "llrefcount.h"
  41. #include "llsaleinfo.h"
  42. #include "llsd.h"
  43. #include "lluuid.h"
  44. // consts for Key field in the task inventory update message
  45. extern const U8 TASK_INVENTORY_ITEM_KEY;
  46. extern const U8 TASK_INVENTORY_ASSET_KEY;
  47. // anonymous enumeration to specify a max inventory buffer size for
  48. // use in packBinaryBucket()
  49. enum
  50. {
  51. MAX_INVENTORY_BUFFER_SIZE = 1024
  52. };
  53. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  54. // Class LLInventoryObject
  55. //
  56. // This is the base class for inventory objects that handles the
  57. // common code between items and categories. The 'mParentUUID' member
  58. // means the parent category since all inventory objects except each
  59. // user's root category are in some category. Each user's root
  60. // category will have mParentUUID==LLUUID::null.
  61. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  62. class LLMessageSystem;
  63. class LLInventoryObject : public LLRefCount
  64. {
  65. protected:
  66. LLUUID mUUID;
  67. LLUUID mParentUUID;
  68. LLAssetType::EType mType;
  69. std::string mName;
  70. protected:
  71. virtual ~LLInventoryObject( void );
  72. public:
  73. MEM_TYPE_NEW(LLMemType::MTYPE_INVENTORY);
  74. LLInventoryObject(const LLUUID& uuid, const LLUUID& parent_uuid,
  75.   LLAssetType::EType type, const std::string& name);
  76. LLInventoryObject();
  77. void copyObject(const LLInventoryObject* other); // LLRefCount requires custom copy
  78. // accessors
  79. virtual const LLUUID& getUUID() const;
  80. const LLUUID& getParentUUID() const;
  81. virtual const LLUUID& getLinkedUUID() const; // get the inventoryID that this item points to, else this item's inventoryID
  82. virtual const std::string& getName() const;
  83. virtual LLAssetType::EType getType() const;
  84. LLAssetType::EType getActualType() const; // bypasses indirection for linked items
  85. BOOL getIsLinkType() const;
  86. // mutators - will not call updateServer();
  87. void setUUID(const LLUUID& new_uuid);
  88. virtual void rename(const std::string& new_name);
  89. void setParent(const LLUUID& new_parent);
  90. void setType(LLAssetType::EType type);
  91. // file support - implemented here so that a minimal information
  92. // set can be transmitted between simulator and viewer.
  93. //  virtual BOOL importFile(LLFILE* fp);
  94. virtual BOOL exportFile(LLFILE* fp, BOOL include_asset_key = TRUE) const;
  95. virtual BOOL importLegacyStream(std::istream& input_stream);
  96. virtual BOOL exportLegacyStream(std::ostream& output_stream, BOOL include_asset_key = TRUE) const;
  97. // virtual methods
  98. virtual void removeFromServer();
  99. virtual void updateParentOnServer(BOOL) const;
  100. virtual void updateServer(BOOL) const;
  101. };
  102. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  103. // Class LLInventoryItem
  104. //
  105. // An inventory item represents something that the current user has in
  106. // their inventory.
  107. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  108. class LLInventoryItem : public LLInventoryObject
  109. {
  110. public:
  111. typedef LLDynamicArray<LLPointer<LLInventoryItem> > item_array_t;
  112. protected:
  113. LLPermissions mPermissions;
  114. LLUUID mAssetUUID;
  115. std::string mDescription;
  116. LLSaleInfo mSaleInfo;
  117. LLInventoryType::EType mInventoryType;
  118. U32 mFlags;
  119. time_t mCreationDate; // seconds from 1/1/1970, UTC
  120. public:
  121. /**
  122.  * Anonymous enumeration for specifying the inventory item flags.
  123.  */
  124. enum
  125. {
  126. // The shared flags at the top are shared among all inventory
  127. // types. After that section, all values of flags are type
  128. // dependent.  The shared flags will start at 2^30 and work
  129. // down while item type specific flags will start at 2^0 and
  130. // work up.
  131. II_FLAGS_NONE = 0,
  132. //
  133. // Shared flags
  134. //
  135. //
  136. // This value means that the asset has only one reference in
  137. // the system. If the inventory item is deleted, or the asset
  138. // id updated, then we can remove the old reference.
  139. II_FLAGS_SHARED_SINGLE_REFERENCE = 0x40000000,
  140. //
  141. // Landmark flags
  142. //
  143. II_FLAGS_LANDMARK_VISITED = 1,
  144. //
  145. // Object flags
  146. //
  147. // flag to indicate that object permissions should have next
  148. // owner perm be more restrictive on rez. We bump this into
  149. // the second byte of the flags since the low byte is used to
  150. // track attachment points.
  151. II_FLAGS_OBJECT_SLAM_PERM = 0x100,
  152. // flag to indicate that the object sale information has been changed.
  153. II_FLAGS_OBJECT_SLAM_SALE = 0x1000,
  154. // These flags specify which permissions masks to overwrite
  155. // upon rez.  Normally, if no permissions slam (above) or
  156. // overwrite flags are set, the asset's permissions are
  157. // used and the inventory's permissions are ignored.  If
  158. // any of these flags are set, the inventory's permissions
  159. // take precedence.
  160. II_FLAGS_OBJECT_PERM_OVERWRITE_BASE = 0x010000,
  161. II_FLAGS_OBJECT_PERM_OVERWRITE_OWNER = 0x020000,
  162. II_FLAGS_OBJECT_PERM_OVERWRITE_GROUP = 0x040000,
  163. II_FLAGS_OBJECT_PERM_OVERWRITE_EVERYONE = 0x080000,
  164. II_FLAGS_OBJECT_PERM_OVERWRITE_NEXT_OWNER = 0x100000,
  165.   // flag to indicate whether an object that is returned is composed 
  166. // of muiltiple items or not.
  167. II_FLAGS_OBJECT_HAS_MULTIPLE_ITEMS = 0x200000,
  168. //
  169. // wearables use the low order byte of flags to store the
  170. // EWearableType enumeration found in newview/llwearable.h
  171. //
  172. II_FLAGS_WEARABLES_MASK = 0xff,
  173. // these bits need to be cleared whenever the asset_id is updated
  174. // on a pre-existing inventory item (DEV-28098 and DEV-30997)
  175. II_FLAGS_PERM_OVERWRITE_MASK  =   II_FLAGS_OBJECT_SLAM_PERM 
  176. | II_FLAGS_OBJECT_SLAM_SALE 
  177. | II_FLAGS_OBJECT_PERM_OVERWRITE_BASE
  178. | II_FLAGS_OBJECT_PERM_OVERWRITE_OWNER
  179. | II_FLAGS_OBJECT_PERM_OVERWRITE_GROUP
  180. | II_FLAGS_OBJECT_PERM_OVERWRITE_EVERYONE
  181. | II_FLAGS_OBJECT_PERM_OVERWRITE_NEXT_OWNER,
  182. };
  183. protected:
  184. ~LLInventoryItem(); // ref counted
  185. public:
  186. MEM_TYPE_NEW(LLMemType::MTYPE_INVENTORY);
  187. LLInventoryItem(const LLUUID& uuid,
  188. const LLUUID& parent_uuid,
  189. const LLPermissions& permissions,
  190. const LLUUID& asset_uuid,
  191. LLAssetType::EType type,
  192. LLInventoryType::EType inv_type,
  193. const std::string& name, 
  194. const std::string& desc,
  195. const LLSaleInfo& sale_info,
  196. U32 flags,
  197. S32 creation_date_utc);
  198. LLInventoryItem();
  199. // Create a copy of an inventory item from a pointer to another item
  200. // Note: Because InventoryItems are ref counted, reference copy (a = b)
  201. // is prohibited
  202. LLInventoryItem(const LLInventoryItem* other);
  203. virtual void copyItem(const LLInventoryItem* other); // LLRefCount requires custom copy
  204. void generateUUID() { mUUID.generate(); }
  205. // accessors
  206. virtual const LLUUID& getLinkedUUID() const;
  207. virtual const LLPermissions& getPermissions() const;
  208. virtual const LLUUID& getCreatorUUID() const;
  209. virtual const LLUUID& getAssetUUID() const;
  210. virtual const std::string& getDescription() const;
  211. virtual const LLSaleInfo& getSaleInfo() const;
  212. virtual LLInventoryType::EType getInventoryType() const;
  213. virtual U32 getFlags() const;
  214. virtual time_t getCreationDate() const;
  215. virtual U32 getCRC32() const; // really more of a checksum.
  216. // mutators - will not call updateServer(), and will never fail
  217. // (though it may correct to sane values)
  218. void setAssetUUID(const LLUUID& asset_id);
  219. void setDescription(const std::string& new_desc);
  220. void setSaleInfo(const LLSaleInfo& sale_info);
  221. void setPermissions(const LLPermissions& perm);
  222. void setInventoryType(LLInventoryType::EType inv_type);
  223. void setFlags(U32 flags);
  224. void setCreationDate(time_t creation_date_utc);
  225. // Check for changes in permissions masks and sale info
  226. // and set the corresponding bits in mFlags
  227. void accumulatePermissionSlamBits(const LLInventoryItem& old_item);
  228. // This is currently only used in the Viewer to handle calling cards
  229. // where the creator is actually used to store the target.
  230. void setCreator(const LLUUID& creator) { mPermissions.setCreator(creator); }
  231. // Put this inventory item onto the current outgoing mesage. It
  232. // assumes you have already called nextBlock().
  233. virtual void packMessage(LLMessageSystem* msg) const;
  234. // unpack returns TRUE if the inventory item came through the
  235. // network ok. It uses a simple crc check which is defeatable, but
  236. // we want to detect network mangling somehow.
  237. virtual BOOL unpackMessage(LLMessageSystem* msg, const char* block, S32 block_num = 0);
  238. // file support
  239. virtual BOOL importFile(LLFILE* fp);
  240. virtual BOOL exportFile(LLFILE* fp, BOOL include_asset_key = TRUE) const;
  241. virtual BOOL importLegacyStream(std::istream& input_stream);
  242. virtual BOOL exportLegacyStream(std::ostream& output_stream, BOOL include_asset_key = TRUE) const;
  243. // helper functions
  244. // pack all information needed to reconstruct this item into the given binary bucket.
  245. // perm_override is optional
  246. S32 packBinaryBucket(U8* bin_bucket, LLPermissions* perm_override = NULL) const;
  247. void unpackBinaryBucket(U8* bin_bucket, S32 bin_bucket_size);
  248. LLSD asLLSD() const;
  249. void asLLSD( LLSD& sd ) const;
  250. bool fromLLSD(const LLSD& sd);
  251. };
  252. BOOL item_dictionary_sort(LLInventoryItem* a,LLInventoryItem* b);
  253. BOOL item_date_sort(LLInventoryItem* a, LLInventoryItem* b);
  254. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  255. // Class LLInventoryCategory
  256. //
  257. // An instance of this class represents a category of inventory
  258. // items. Users come with a set of default categories, and can create
  259. // new ones as needed.
  260. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  261. class LLInventoryCategory : public LLInventoryObject
  262. {
  263. public:
  264. typedef LLDynamicArray<LLPointer<LLInventoryCategory> > cat_array_t;
  265. protected:
  266. ~LLInventoryCategory();
  267. public:
  268. MEM_TYPE_NEW(LLMemType::MTYPE_INVENTORY);
  269. LLInventoryCategory(const LLUUID& uuid, const LLUUID& parent_uuid,
  270. LLFolderType::EType preferred_type,
  271. const std::string& name);
  272. LLInventoryCategory();
  273. LLInventoryCategory(const LLInventoryCategory* other);
  274. void copyCategory(const LLInventoryCategory* other); // LLRefCount requires custom copy
  275. // accessors and mutators
  276. LLFolderType::EType getPreferredType() const;
  277. void setPreferredType(LLFolderType::EType type);
  278. // For messaging system support
  279. virtual void packMessage(LLMessageSystem* msg) const;
  280. virtual void unpackMessage(LLMessageSystem* msg, const char* block, S32 block_num = 0);
  281. LLSD asLLSD() const;
  282. bool fromLLSD(const LLSD& sd);
  283. // file support
  284. virtual BOOL importFile(LLFILE* fp);
  285. virtual BOOL exportFile(LLFILE* fp, BOOL include_asset_key = TRUE) const;
  286. virtual BOOL importLegacyStream(std::istream& input_stream);
  287. virtual BOOL exportLegacyStream(std::ostream& output_stream, BOOL include_asset_key = TRUE) const;
  288. protected:
  289. // May be the type that this category was "meant" to hold (although it may hold any type).
  290. LLFolderType::EType mPreferredType;
  291. };
  292. //-----------------------------------------------------------------------------
  293. // Useful bits
  294. //-----------------------------------------------------------------------------
  295. typedef std::list<LLPointer<LLInventoryObject> > InventoryObjectList;
  296. // These functions convert between structured data and an inventory
  297. // item, appropriate for serialization.
  298. LLSD ll_create_sd_from_inventory_item(LLPointer<LLInventoryItem> item);
  299. //LLPointer<LLInventoryItem> ll_create_item_from_sd(const LLSD& sd_item);
  300. LLSD ll_create_sd_from_inventory_category(LLPointer<LLInventoryCategory> cat);
  301. LLPointer<LLInventoryCategory> ll_create_category_from_sd(const LLSD& sd_cat);
  302. #endif // LL_LLINVENTORY_H