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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llinventorytype.cpp
  3.  * @brief Inventory item type, more specific than an asset type.
  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. #include "linden_common.h"
  33. #include "llinventorytype.h"
  34. #include "lldictionary.h"
  35. #include "llmemory.h"
  36. #include "llsingleton.h"
  37. static const std::string empty_string;
  38. ///----------------------------------------------------------------------------
  39. /// Class LLInventoryType
  40. ///----------------------------------------------------------------------------
  41. struct InventoryEntry : public LLDictionaryEntry
  42. {
  43. InventoryEntry(const std::string &name, // unlike asset type names, not limited to 8 characters; need not match asset type names
  44.    const std::string &human_name, // for decoding to human readable form; put any and as many printable characters you want in each one.
  45.    int num_asset_types = 0, ...)
  46. :
  47. LLDictionaryEntry(name),
  48. mHumanName(human_name)
  49. {
  50. va_list argp;
  51. va_start(argp, num_asset_types);
  52. // Read in local textures
  53. for (U8 i=0; i < num_asset_types; i++)
  54. {
  55. LLAssetType::EType t = (LLAssetType::EType)va_arg(argp,int);
  56. mAssetTypes.push_back(t);
  57. }
  58. }
  59. const std::string mHumanName;
  60. typedef std::vector<LLAssetType::EType> asset_vec_t;
  61. asset_vec_t mAssetTypes;
  62. };
  63. class LLInventoryDictionary : public LLSingleton<LLInventoryDictionary>,
  64.   public LLDictionary<LLInventoryType::EType, InventoryEntry>
  65. {
  66. public:
  67. LLInventoryDictionary();
  68. };
  69. LLInventoryDictionary::LLInventoryDictionary()
  70. {
  71. addEntry(LLInventoryType::IT_TEXTURE,             new InventoryEntry("texture",   "texture",       1, LLAssetType::AT_TEXTURE));
  72. addEntry(LLInventoryType::IT_SOUND,               new InventoryEntry("sound",     "sound",         1, LLAssetType::AT_SOUND));
  73. addEntry(LLInventoryType::IT_CALLINGCARD,         new InventoryEntry("callcard",  "calling card",  1, LLAssetType::AT_CALLINGCARD));
  74. addEntry(LLInventoryType::IT_LANDMARK,            new InventoryEntry("landmark",  "landmark",      1, LLAssetType::AT_LANDMARK));
  75. addEntry(LLInventoryType::IT_OBJECT,              new InventoryEntry("object",    "object",        1, LLAssetType::AT_OBJECT));
  76. addEntry(LLInventoryType::IT_NOTECARD,            new InventoryEntry("notecard",  "note card",     1, LLAssetType::AT_NOTECARD));
  77. addEntry(LLInventoryType::IT_CATEGORY,            new InventoryEntry("category",  "folder"         ));
  78. addEntry(LLInventoryType::IT_ROOT_CATEGORY,       new InventoryEntry("root",      "root"           ));
  79. addEntry(LLInventoryType::IT_LSL,                 new InventoryEntry("script",    "script",        2, LLAssetType::AT_LSL_TEXT, LLAssetType::AT_LSL_BYTECODE));
  80. addEntry(LLInventoryType::IT_SNAPSHOT,            new InventoryEntry("snapshot",  "snapshot",      1, LLAssetType::AT_TEXTURE));
  81. addEntry(LLInventoryType::IT_ATTACHMENT,          new InventoryEntry("attach",    "attachment",    1, LLAssetType::AT_OBJECT));
  82. addEntry(LLInventoryType::IT_WEARABLE,            new InventoryEntry("wearable",  "wearable",      2, LLAssetType::AT_CLOTHING, LLAssetType::AT_BODYPART));
  83. addEntry(LLInventoryType::IT_ANIMATION,           new InventoryEntry("animation", "animation",     1, LLAssetType::AT_ANIMATION));  
  84. addEntry(LLInventoryType::IT_GESTURE,             new InventoryEntry("gesture",   "gesture",       1, LLAssetType::AT_GESTURE)); 
  85. }
  86. // Maps asset types to the default inventory type for that kind of asset.
  87. // Thus, "Lost and Found" is a "Category"
  88. static const LLInventoryType::EType
  89. DEFAULT_ASSET_FOR_INV_TYPE[LLAssetType::AT_COUNT] =
  90. {
  91. LLInventoryType::IT_TEXTURE, // AT_TEXTURE
  92. LLInventoryType::IT_SOUND, // AT_SOUND
  93. LLInventoryType::IT_CALLINGCARD, // AT_CALLINGCARD
  94. LLInventoryType::IT_LANDMARK, // AT_LANDMARK
  95. LLInventoryType::IT_LSL, // AT_SCRIPT
  96. LLInventoryType::IT_WEARABLE, // AT_CLOTHING
  97. LLInventoryType::IT_OBJECT, // AT_OBJECT
  98. LLInventoryType::IT_NOTECARD, // AT_NOTECARD
  99. LLInventoryType::IT_CATEGORY, // AT_CATEGORY
  100. LLInventoryType::IT_NONE, // (null entry)
  101. LLInventoryType::IT_LSL, // AT_LSL_TEXT
  102. LLInventoryType::IT_LSL, // AT_LSL_BYTECODE
  103. LLInventoryType::IT_TEXTURE, // AT_TEXTURE_TGA
  104. LLInventoryType::IT_WEARABLE, // AT_BODYPART
  105. LLInventoryType::IT_CATEGORY, // AT_TRASH
  106. LLInventoryType::IT_CATEGORY, // AT_SNAPSHOT_CATEGORY
  107. LLInventoryType::IT_CATEGORY, // AT_LOST_AND_FOUND
  108. LLInventoryType::IT_SOUND, // AT_SOUND_WAV
  109. LLInventoryType::IT_NONE, // AT_IMAGE_TGA
  110. LLInventoryType::IT_NONE, // AT_IMAGE_JPEG
  111. LLInventoryType::IT_ANIMATION, // AT_ANIMATION
  112. LLInventoryType::IT_GESTURE, // AT_GESTURE
  113. LLInventoryType::IT_NONE, // AT_SIMSTATE
  114. LLInventoryType::IT_NONE, // AT_LINK
  115. LLInventoryType::IT_NONE, // AT_LINK_FOLDER
  116. };
  117. // static
  118. const std::string &LLInventoryType::lookup(EType type)
  119. {
  120. const InventoryEntry *entry = LLInventoryDictionary::getInstance()->lookup(type);
  121. if (!entry) return empty_string;
  122. return entry->mName;
  123. }
  124. // static
  125. LLInventoryType::EType LLInventoryType::lookup(const std::string& name)
  126. {
  127. return LLInventoryDictionary::getInstance()->lookup(name);
  128. }
  129. // XUI:translate
  130. // translation from a type to a human readable form.
  131. // static
  132. const std::string &LLInventoryType::lookupHumanReadable(EType type)
  133. {
  134. const InventoryEntry *entry = LLInventoryDictionary::getInstance()->lookup(type);
  135. if (!entry) return empty_string;
  136. return entry->mHumanName;
  137. }
  138. // return the default inventory for the given asset type.
  139. // static
  140. LLInventoryType::EType LLInventoryType::defaultForAssetType(LLAssetType::EType asset_type)
  141. {
  142. if((asset_type >= 0) && (asset_type < LLAssetType::AT_COUNT))
  143. {
  144. return DEFAULT_ASSET_FOR_INV_TYPE[S32(asset_type)];
  145. }
  146. else
  147. {
  148. return IT_NONE;
  149. }
  150. }
  151. // add any types that we don't want the user to be able to change permissions on.
  152. // static
  153. bool LLInventoryType::cannotRestrictPermissions(LLInventoryType::EType type)
  154. {
  155. switch(type)
  156. {
  157. case IT_CALLINGCARD:
  158. case IT_LANDMARK:
  159. return true;
  160. default:
  161. return false;
  162. }
  163. }
  164. bool inventory_and_asset_types_match(LLInventoryType::EType inventory_type,
  165.  LLAssetType::EType asset_type)
  166. {
  167. const InventoryEntry *entry = LLInventoryDictionary::getInstance()->lookup(inventory_type);
  168. if (!entry) return false;
  169. for (InventoryEntry::asset_vec_t::const_iterator iter = entry->mAssetTypes.begin();
  170.  iter != entry->mAssetTypes.end();
  171.  iter++)
  172. {
  173. const LLAssetType::EType type = (*iter);
  174. if(type == asset_type)
  175. {
  176. return true;
  177. }
  178. }
  179. return false;
  180. }