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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llassetstorage.h
  3.  * @brief definition of LLAssetStorage class which allows simple
  4.  * up/downloads of uuid,type asets
  5.  *
  6.  * $LicenseInfo:firstyear=2001&license=viewergpl$
  7.  * 
  8.  * Copyright (c) 2001-2010, Linden Research, Inc.
  9.  * 
  10.  * Second Life Viewer Source Code
  11.  * The source code in this file ("Source Code") is provided by Linden Lab
  12.  * to you under the terms of the GNU General Public License, version 2.0
  13.  * ("GPL"), unless you have obtained a separate licensing agreement
  14.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  15.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  16.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  17.  * 
  18.  * There are special exceptions to the terms and conditions of the GPL as
  19.  * it is applied to this Source Code. View the full text of the exception
  20.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  21.  * online at
  22.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  23.  * 
  24.  * By copying, modifying or distributing this software, you acknowledge
  25.  * that you have read and understood your obligations described above,
  26.  * and agree to abide by those obligations.
  27.  * 
  28.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  29.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  30.  * COMPLETENESS OR PERFORMANCE.
  31.  * $/LicenseInfo$
  32.  */
  33. #ifndef LL_LLASSETSTORAGE_H
  34. #define LL_LLASSETSTORAGE_H
  35. #include <string>
  36. #include "lluuid.h"
  37. #include "lltimer.h"
  38. #include "llnamevalue.h"
  39. #include "llhost.h"
  40. #include "stdenums.h"  // for EDragAndDropType
  41. #include "lltransfermanager.h" // For LLTSCode enum
  42. #include "llassettype.h"
  43. #include "llstring.h"
  44. #include "llextendedstatus.h"
  45. // Forward declarations
  46. class LLMessageSystem;
  47. class LLXferManager;
  48. class LLAssetStorage;
  49. class LLVFS;
  50. class LLSD;
  51. // anything that takes longer than this to download will abort.
  52. // HTTP Uploads also timeout if they take longer than this.
  53. const F32 LL_ASSET_STORAGE_TIMEOUT = 5 * 60.0f;  
  54. class LLAssetInfo
  55. {
  56. protected:
  57. std::string mDescription;
  58. std::string mName;
  59. public:
  60. LLUUID mUuid;
  61. LLTransactionID mTransactionID;
  62. LLUUID mCreatorID;
  63. LLAssetType::EType mType;
  64. LLAssetInfo( void );
  65. LLAssetInfo( const LLUUID& object_id, const LLUUID& creator_id,
  66.  LLAssetType::EType type, const char* name, const char* desc );
  67. LLAssetInfo( const LLNameValue& nv );
  68. const std::string& getName( void ) const { return mName; }
  69. const std::string& getDescription( void ) const { return mDescription; } 
  70. void setName( const std::string& name );
  71. void setDescription( const std::string& desc );
  72. // Assets (aka potential inventory items) can be applied to an
  73. // object in the world. We'll store that as a string name value
  74. // pair where the name encodes part of asset info, and the value
  75. // the rest.  LLAssetInfo objects will be responsible for parsing
  76. // the meaning out froman LLNameValue object. See the inventory
  77. // design docs for details.
  78. void setFromNameValue( const LLNameValue& nv );
  79. };
  80. class LLAssetRequest
  81. {
  82. public:
  83. LLAssetRequest(const LLUUID &uuid, const LLAssetType::EType at);
  84. virtual ~LLAssetRequest();
  85. LLUUID getUUID() const { return mUUID; }
  86. LLAssetType::EType getType() const { return mType; }
  87. void setUUID(const LLUUID& id) { mUUID = id; }
  88. void setType(LLAssetType::EType type) { mType = type; }
  89. void setTimeout (F64 timeout) { mTimeout = timeout; }
  90. protected:
  91. LLUUID mUUID;
  92. LLAssetType::EType mType;
  93. public:
  94. void (*mDownCallback)(LLVFS*, const LLUUID&, LLAssetType::EType, void *, S32, LLExtStat);
  95. void (*mUpCallback)(const LLUUID&, void *, S32, LLExtStat);
  96. void (*mInfoCallback)(LLAssetInfo *, void *, S32);
  97. void *mUserData;
  98. LLHost  mHost;
  99. BOOL mIsTemp;
  100. BOOL mIsLocal;
  101. BOOL mIsUserWaiting; // We don't want to try forever if a user is waiting for a result.
  102. F64 mTime; // Message system time
  103. F64 mTimeout; // Amount of time before timing out.
  104. BOOL    mIsPriority;
  105. BOOL mDataSentInFirstPacket;
  106. BOOL mDataIsInVFS;
  107. LLUUID mRequestingAgentID; // Only valid for uploads from an agent
  108. virtual LLSD getTerseDetails() const;
  109. virtual LLSD getFullDetails() const;
  110. };
  111. template <class T>
  112. struct ll_asset_request_equal : public std::equal_to<T>
  113. {
  114. bool operator()(const T& x, const T& y) const 
  115. return ( x->getType() == y->getType()
  116. && x->getUUID() == y->getUUID() );
  117. }
  118. };
  119. class LLInvItemRequest
  120. {
  121. public:
  122. LLInvItemRequest(const LLUUID &uuid, const LLAssetType::EType at);
  123. virtual ~LLInvItemRequest();
  124. LLUUID getUUID() const { return mUUID; }
  125. LLAssetType::EType getType() const { return mType; }
  126. void setUUID(const LLUUID& id) { mUUID = id; }
  127. void setType(LLAssetType::EType type) { mType = type; }
  128. protected:
  129. LLUUID mUUID;
  130. LLAssetType::EType mType;
  131. public:
  132. void (*mDownCallback)(LLVFS*, const LLUUID&, LLAssetType::EType, void *, S32, LLExtStat);
  133. void *mUserData;
  134. LLHost  mHost;
  135. BOOL mIsTemp;
  136. F64 mTime; // Message system time
  137. BOOL    mIsPriority;
  138. BOOL mDataSentInFirstPacket;
  139. BOOL mDataIsInVFS;
  140. };
  141. class LLEstateAssetRequest
  142. {
  143. public:
  144. LLEstateAssetRequest(const LLUUID &uuid, const LLAssetType::EType at, EstateAssetType et);
  145. virtual ~LLEstateAssetRequest();
  146. LLUUID getUUID() const { return mUUID; }
  147. LLAssetType::EType getAType() const { return mAType; }
  148. void setUUID(const LLUUID& id) { mUUID = id; }
  149. void setType(LLAssetType::EType type) { mAType = type; }
  150. protected:
  151. LLUUID mUUID;
  152. LLAssetType::EType mAType;
  153. EstateAssetType mEstateAssetType;
  154. public:
  155. void (*mDownCallback)(LLVFS*, const LLUUID&, LLAssetType::EType, void *, S32, LLExtStat);
  156. void *mUserData;
  157. LLHost  mHost;
  158. BOOL mIsTemp;
  159. F64 mTime; // Message system time
  160. BOOL    mIsPriority;
  161. BOOL mDataSentInFirstPacket;
  162. BOOL mDataIsInVFS;
  163. };
  164. // Map of known bad assets
  165. typedef std::map<LLUUID,U64,lluuid_less> toxic_asset_map_t;
  166. typedef void (*LLGetAssetCallback)(LLVFS *vfs, const LLUUID &asset_id,
  167.  LLAssetType::EType asset_type, void *user_data, S32 status, LLExtStat ext_status);
  168. class LLTempAssetStorage
  169. {
  170. public:
  171. virtual ~LLTempAssetStorage() =0;
  172. virtual void addTempAssetData(const LLUUID& asset_id,
  173.   const LLUUID& agent_id,
  174.   const std::string& host_name) = 0;
  175. };
  176. class LLAssetStorage : public LLTempAssetStorage
  177. {
  178. public:
  179. // VFS member is public because static child methods need it :(
  180. LLVFS *mVFS;
  181. typedef void (*LLStoreAssetCallback)(const LLUUID &asset_id, void *user_data, S32 status, LLExtStat ext_status);
  182. enum ERequestType
  183. {
  184. RT_INVALID = -1,
  185. RT_DOWNLOAD = 0,
  186. RT_UPLOAD = 1,
  187. RT_LOCALUPLOAD = 2,
  188. RT_COUNT = 3
  189. };
  190. protected:
  191. BOOL mShutDown;
  192. LLHost mUpstreamHost;
  193. LLMessageSystem *mMessageSys;
  194. LLXferManager *mXferManager;
  195. typedef std::list<LLAssetRequest*> request_list_t;
  196. request_list_t mPendingDownloads;
  197. request_list_t mPendingUploads;
  198. request_list_t mPendingLocalUploads;
  199. // Map of toxic assets - these caused problems when recently rezzed, so avoid them
  200. toxic_asset_map_t mToxicAssetMap; // Objects in this list are known to cause problems and are not loaded
  201. public:
  202. LLAssetStorage(LLMessageSystem *msg, LLXferManager *xfer,
  203.    LLVFS *vfs, const LLHost &upstream_host);
  204. LLAssetStorage(LLMessageSystem *msg, LLXferManager *xfer,
  205.    LLVFS *vfs);
  206. virtual ~LLAssetStorage();
  207. void setUpstream(const LLHost &upstream_host);
  208. virtual BOOL hasLocalAsset(const LLUUID &uuid, LLAssetType::EType type);
  209. // public interface methods
  210. // note that your callback may get called BEFORE the function returns
  211. virtual void getAssetData(const LLUUID uuid, LLAssetType::EType atype, LLGetAssetCallback cb, void *user_data, BOOL is_priority = FALSE);
  212. /*
  213.  * TransactionID version
  214.  * Viewer needs the store_local
  215.  */
  216. virtual void storeAssetData(
  217. const LLTransactionID& tid,
  218. LLAssetType::EType atype,
  219. LLStoreAssetCallback callback,
  220. void* user_data,
  221. bool temp_file = false,
  222. bool is_priority = false,
  223. bool store_local = false,
  224. bool user_waiting= false,
  225. F64 timeout=LL_ASSET_STORAGE_TIMEOUT);
  226. /*
  227.  * AssetID version
  228.  * Sim needs both store_local and requesting_agent_id.
  229.  */
  230. virtual void storeAssetData(
  231. const LLUUID& asset_id,
  232. LLAssetType::EType asset_type,
  233. LLStoreAssetCallback callback,
  234. void* user_data,
  235. bool temp_file = false,
  236. bool is_priority = false,
  237. bool store_local = false,
  238. const LLUUID& requesting_agent_id = LLUUID::null,
  239. bool user_waiting= false,
  240. F64 timeout=LL_ASSET_STORAGE_TIMEOUT);
  241. virtual void checkForTimeouts();
  242. void getEstateAsset(const LLHost &object_sim, const LLUUID &agent_id, const LLUUID &session_id,
  243. const LLUUID &asset_id, LLAssetType::EType atype, EstateAssetType etype,
  244.  LLGetAssetCallback callback, void *user_data, BOOL is_priority);
  245. void getInvItemAsset(const LLHost &object_sim,
  246.  const LLUUID &agent_id, const LLUUID &session_id,
  247.  const LLUUID &owner_id, const LLUUID &task_id, const LLUUID &item_id,
  248.  const LLUUID &asset_id, LLAssetType::EType atype,
  249.  LLGetAssetCallback cb, void *user_data, BOOL is_priority = FALSE); // Get a particular inventory item.
  250. // Check if an asset is in the toxic map.  If it is, the entry is updated
  251. BOOL isAssetToxic( const LLUUID& uuid );
  252. // Clean the toxic asset list, remove old entries
  253. void flushOldToxicAssets( BOOL force_it );
  254. // Add an item to the toxic asset map
  255. void markAssetToxic( const LLUUID& uuid );
  256. protected:
  257. virtual LLSD getPendingDetailsImpl(const request_list_t* requests,
  258.   LLAssetType::EType asset_type,
  259.   const std::string& detail_prefix) const;
  260. virtual LLSD getPendingRequestImpl(const request_list_t* requests,
  261. LLAssetType::EType asset_type,
  262. const LLUUID& asset_id) const;
  263. virtual bool deletePendingRequestImpl(request_list_t* requests,
  264. LLAssetType::EType asset_type,
  265. const LLUUID& asset_id);
  266. public:
  267. static const LLAssetRequest* findRequest(const request_list_t* requests,
  268. LLAssetType::EType asset_type,
  269. const LLUUID& asset_id);
  270. static LLAssetRequest* findRequest(request_list_t* requests,
  271. LLAssetType::EType asset_type,
  272. const LLUUID& asset_id);
  273. request_list_t* getRequestList(ERequestType rt);
  274. const request_list_t* getRequestList(ERequestType rt) const;
  275. static std::string getRequestName(ERequestType rt);
  276. S32 getNumPendingDownloads() const;
  277. S32 getNumPendingUploads() const;
  278. S32 getNumPendingLocalUploads();
  279. S32 getNumPending(ERequestType rt) const;
  280. virtual LLSD getPendingDetails(ERequestType rt,
  281.   LLAssetType::EType asset_type,
  282.   const std::string& detail_prefix) const;
  283. virtual LLSD getPendingRequest(ERequestType rt,
  284. LLAssetType::EType asset_type,
  285. const LLUUID& asset_id) const;
  286. virtual bool deletePendingRequest(ERequestType rt,
  287. LLAssetType::EType asset_type,
  288. const LLUUID& asset_id);
  289. // download process callbacks
  290. static void downloadCompleteCallback(
  291. S32 result,
  292. const LLUUID& file_id,
  293. LLAssetType::EType file_type,
  294. void* user_data, LLExtStat ext_status);
  295. static void downloadEstateAssetCompleteCallback(
  296. S32 result,
  297. const LLUUID& file_id,
  298. LLAssetType::EType file_type,
  299. void* user_data, LLExtStat ext_status);
  300. static void downloadInvItemCompleteCallback(
  301. S32 result,
  302. const LLUUID& file_id,
  303. LLAssetType::EType file_type,
  304. void* user_data, LLExtStat ext_status);
  305. // upload process callbacks
  306. static void uploadCompleteCallback(const LLUUID&, void *user_data, S32 result, LLExtStat ext_status);
  307. static void processUploadComplete(LLMessageSystem *msg, void **this_handle);
  308. // debugging
  309. static const char* getErrorString( S32 status );
  310. // deprecated file-based methods
  311. void getAssetData(const LLUUID uuid, LLAssetType::EType type, void (*callback)(const char*, const LLUUID&, void *, S32, LLExtStat), void *user_data, BOOL is_priority = FALSE);
  312. /*
  313.  * AssetID version.
  314.  */
  315. virtual void storeAssetData(
  316. const std::string& filename,
  317. const LLUUID& asset_id,
  318. LLAssetType::EType type,
  319. LLStoreAssetCallback callback,
  320. void* user_data,
  321. bool temp_file = false,
  322. bool is_priority = false,
  323. bool user_waiting = false,
  324. F64 timeout  = LL_ASSET_STORAGE_TIMEOUT);
  325. /*
  326.  * TransactionID version
  327.  */
  328. virtual void storeAssetData(
  329. const std::string& filename,
  330. const LLTransactionID &transaction_id,
  331. LLAssetType::EType type,
  332. LLStoreAssetCallback callback,
  333. void *user_data,
  334. bool temp_file = false,
  335. bool is_priority = false,
  336. bool user_waiting = false,
  337. F64 timeout  = LL_ASSET_STORAGE_TIMEOUT);
  338. static void legacyGetDataCallback(LLVFS *vfs, const LLUUID &uuid, LLAssetType::EType, void *user_data, S32 status, LLExtStat ext_status);
  339. static void legacyStoreDataCallback(const LLUUID &uuid, void *user_data, S32 status, LLExtStat ext_status);
  340. // Temp assets are stored on sim nodes, they have agent ID and location data associated with them.
  341. // This is a no-op for non-http asset systems
  342. virtual void addTempAssetData(const LLUUID& asset_id, const LLUUID& agent_id, const std::string& host_name);
  343. virtual BOOL hasTempAssetData(const LLUUID& texture_id) const;
  344. virtual std::string getTempAssetHostName(const LLUUID& texture_id) const;
  345. virtual LLUUID getTempAssetAgentID(const LLUUID& texture_id) const;
  346. virtual void removeTempAssetData(const LLUUID& asset_id);
  347. virtual void removeTempAssetDataByAgentID(const LLUUID& agent_id);
  348. // Pass LLUUID::null for all
  349. virtual void dumpTempAssetData(const LLUUID& avatar_id) const;
  350. virtual void clearTempAssetData();
  351. // add extra methods to handle metadata
  352. protected:
  353. void _cleanupRequests(BOOL all, S32 error);
  354. void _callUploadCallbacks(const LLUUID &uuid, const LLAssetType::EType asset_type, BOOL success, LLExtStat ext_status);
  355. virtual void _queueDataRequest(const LLUUID& uuid, LLAssetType::EType type,
  356.    void (*callback)(LLVFS *vfs, const LLUUID&, LLAssetType::EType, void *, S32, LLExtStat),
  357.    void *user_data, BOOL duplicate,
  358.    BOOL is_priority);
  359. private:
  360. void _init(LLMessageSystem *msg,
  361.    LLXferManager *xfer,
  362.    LLVFS *vfs,
  363.    const LLHost &upstream_host);
  364. protected:
  365. enum EMetricResult
  366. {
  367. // Static valued enums for #dw readability - please copy this
  368. // declaration to them on updates -- source in llassetstorage.h
  369. MR_INVALID = -1, // Makes no sense
  370. MR_OKAY = 0, // Success - no metric normally
  371. MR_ZERO_SIZE = 1, // Zero size asset
  372. MR_BAD_FUNCTION = 2, // Tried to use a virtual base (PROGRAMMER ERROR)
  373. MR_FILE_NONEXIST = 3, // Old format store call - source file does not exist
  374. MR_NO_FILENAME = 4, // Old format store call - source filename is NULL/0-length
  375. MR_NO_UPSTREAM = 5, // Upstream provider is missing
  376. MR_VFS_CORRUPTION = 6 // VFS is corrupt - too-large or mismatched stated/returned sizes
  377. };
  378. static class LLMetrics *metric_recipient;
  379. static void reportMetric( const LLUUID& asset_id, const LLAssetType::EType asset_type, const std::string& filename,
  380.   const LLUUID& agent_id, S32 asset_size, EMetricResult result,
  381.   const char* file, const S32 line, const std::string& message ); 
  382. public:
  383. static void setMetricRecipient( LLMetrics *recip )
  384. {
  385. metric_recipient = recip;
  386. }
  387. };
  388. ////////////////////////////////////////////////////////////////////////
  389. // Wrappers to replicate deprecated API
  390. ////////////////////////////////////////////////////////////////////////
  391. class LLLegacyAssetRequest
  392. {
  393. public:
  394. void (*mDownCallback)(const char *, const LLUUID&, void *, S32, LLExtStat);
  395. LLAssetStorage::LLStoreAssetCallback mUpCallback;
  396. void *mUserData;
  397. };
  398. extern LLAssetStorage *gAssetStorage;
  399. extern const LLUUID CATEGORIZE_LOST_AND_FOUND_ID;
  400. #endif