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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file lltransfersourceasset.cpp
  3.  * @brief Transfer system for sending an asset.
  4.  *
  5.  * $LicenseInfo:firstyear=2006&license=viewergpl$
  6.  * 
  7.  * Copyright (c) 2006-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 "lltransfersourceasset.h"
  34. #include "llerror.h"
  35. #include "message.h"
  36. #include "lldatapacker.h"
  37. #include "lldir.h"
  38. #include "llvfile.h"
  39. LLTransferSourceAsset::LLTransferSourceAsset(const LLUUID &request_id, const F32 priority) :
  40. LLTransferSource(LLTST_ASSET, request_id, priority),
  41. mGotResponse(FALSE),
  42. mCurPos(0)
  43. {
  44. }
  45. LLTransferSourceAsset::~LLTransferSourceAsset()
  46. {
  47. }
  48. void LLTransferSourceAsset::initTransfer()
  49. {
  50. if (gAssetStorage)
  51. {
  52. // *HACK: asset transfers will only be coming from the viewer
  53. // to the simulator. This is subset of assets we allow to be
  54. // simply pulled straight from the asset system.
  55. LLUUID* tidp;
  56. if(is_asset_fetch_by_id_allowed(mParams.getAssetType()))
  57. {
  58. tidp = new LLUUID(getID());
  59. gAssetStorage->getAssetData(
  60. mParams.getAssetID(),
  61. mParams.getAssetType(),
  62. LLTransferSourceAsset::responderCallback,
  63. tidp,
  64. FALSE);
  65. }
  66. else
  67. {
  68. llwarns << "Attempted to request blocked asset "
  69. << mParams.getAssetID() << ":"
  70. << LLAssetType::lookupHumanReadable(mParams.getAssetType())
  71. << llendl;
  72. sendTransferStatus(LLTS_ERROR);
  73. }
  74. }
  75. else
  76. {
  77. llwarns << "Attempted to request asset " << mParams.getAssetID()
  78. << ":" << LLAssetType::lookupHumanReadable(mParams.getAssetType())
  79. << " without an asset system!" << llendl;
  80. sendTransferStatus(LLTS_ERROR);
  81. }
  82. }
  83. F32 LLTransferSourceAsset::updatePriority()
  84. {
  85. return 0.f;
  86. }
  87. LLTSCode LLTransferSourceAsset::dataCallback(const S32 packet_id,
  88. const S32 max_bytes,
  89. U8 **data_handle,
  90. S32 &returned_bytes,
  91. BOOL &delete_returned)
  92. {
  93. //llinfos << "LLTransferSourceAsset::dataCallback" << llendl;
  94. if (!mGotResponse)
  95. {
  96. return LLTS_SKIP;
  97. }
  98. LLVFile vf(gAssetStorage->mVFS, mParams.getAssetID(), mParams.getAssetType(), LLVFile::READ);
  99. if (!vf.getSize())
  100. {
  101. // Something bad happened with the asset request!
  102. return LLTS_ERROR;
  103. }
  104. if (packet_id != mLastPacketID + 1)
  105. {
  106. llerrs << "Can't handle out of order file transfer yet!" << llendl;
  107. }
  108. // grab a buffer from the right place in the file
  109. if (!vf.seek(mCurPos, 0))
  110. {
  111. llwarns << "LLTransferSourceAsset Can't seek to " << mCurPos << " length " << vf.getSize() << llendl;
  112. llwarns << "While sending " << mParams.getAssetID() << llendl;
  113. return LLTS_ERROR;
  114. }
  115. delete_returned = TRUE;
  116. U8 *tmpp = new U8[max_bytes];
  117. *data_handle = tmpp;
  118. if (!vf.read(tmpp, max_bytes)) /* Flawfinder: Ignore */
  119. {
  120. // Crap, read failure, need to deal with it.
  121. delete[] tmpp;
  122. *data_handle = NULL;
  123. returned_bytes = 0;
  124. delete_returned = FALSE;
  125. return LLTS_ERROR;
  126. }
  127. returned_bytes = vf.getLastBytesRead();
  128. mCurPos += returned_bytes;
  129. if (vf.eof())
  130. {
  131. if (!returned_bytes)
  132. {
  133. delete[] tmpp;
  134. *data_handle = NULL;
  135. returned_bytes = 0;
  136. delete_returned = FALSE;
  137. }
  138. return LLTS_DONE;
  139. }
  140. return LLTS_OK;
  141. }
  142. void LLTransferSourceAsset::completionCallback(const LLTSCode status)
  143. {
  144. // No matter what happens, all we want to do is close the vfile if
  145. // we've got it open.
  146. }
  147. void LLTransferSourceAsset::packParams(LLDataPacker& dp) const
  148. {
  149. //llinfos << "LLTransferSourceAsset::packParams" << llendl;
  150. mParams.packParams(dp);
  151. }
  152. BOOL LLTransferSourceAsset::unpackParams(LLDataPacker &dp)
  153. {
  154. //llinfos << "LLTransferSourceAsset::unpackParams" << llendl;
  155. return mParams.unpackParams(dp);
  156. }
  157. void LLTransferSourceAsset::responderCallback(LLVFS *vfs, const LLUUID& uuid, LLAssetType::EType type,
  158.   void *user_data, S32 result, LLExtStat ext_status )
  159. {
  160. LLUUID *tidp = ((LLUUID*) user_data);
  161. LLUUID transfer_id = *(tidp);
  162. delete tidp;
  163. tidp = NULL;
  164. LLTransferSourceAsset *tsap = (LLTransferSourceAsset *) gTransferManager.findTransferSource(transfer_id);
  165. if (!tsap)
  166. {
  167. llinfos << "Aborting transfer " << transfer_id << " callback, transfer source went away" << llendl;
  168. return;
  169. }
  170. if (result)
  171. {
  172. llinfos << "AssetStorage: Error " << gAssetStorage->getErrorString(result) << " downloading uuid " << uuid << llendl;
  173. }
  174. LLTSCode status;
  175. tsap->mGotResponse = TRUE;
  176. if (LL_ERR_NOERR == result)
  177. {
  178. // Everything's OK.
  179. LLVFile vf(gAssetStorage->mVFS, uuid, type, LLVFile::READ);
  180. tsap->mSize = vf.getSize();
  181. status = LLTS_OK;
  182. }
  183. else
  184. {
  185. // Uh oh, something bad happened when we tried to get this asset!
  186. switch (result)
  187. {
  188. case LL_ERR_ASSET_REQUEST_NOT_IN_DATABASE:
  189. status = LLTS_UNKNOWN_SOURCE;
  190. break;
  191. default:
  192. status = LLTS_ERROR;
  193. }
  194. }
  195. tsap->sendTransferStatus(status);
  196. }
  197. LLTransferSourceParamsAsset::LLTransferSourceParamsAsset()
  198. : LLTransferSourceParams(LLTST_ASSET),
  199.   mAssetType(LLAssetType::AT_NONE)
  200. {
  201. }
  202. void LLTransferSourceParamsAsset::setAsset(const LLUUID &asset_id, const LLAssetType::EType asset_type)
  203. {
  204. mAssetID = asset_id;
  205. mAssetType = asset_type;
  206. }
  207. void LLTransferSourceParamsAsset::packParams(LLDataPacker &dp) const
  208. {
  209. dp.packUUID(mAssetID, "AssetID");
  210. dp.packS32(mAssetType, "AssetType");
  211. }
  212. BOOL LLTransferSourceParamsAsset::unpackParams(LLDataPacker &dp)
  213. {
  214. S32 tmp_at;
  215. dp.unpackUUID(mAssetID, "AssetID");
  216. dp.unpackS32(tmp_at, "AssetType");
  217. mAssetType = (LLAssetType::EType)tmp_at;
  218. return TRUE;
  219. }
  220. /**
  221.  * Helper functions
  222.  */
  223. bool is_asset_fetch_by_id_allowed(LLAssetType::EType type)
  224. {
  225. // *FIX: Make this list smaller.
  226. bool rv = false;
  227. switch(type)
  228. {
  229. case LLAssetType::AT_SOUND:
  230. case LLAssetType::AT_LANDMARK:
  231. case LLAssetType::AT_CLOTHING:
  232. case LLAssetType::AT_BODYPART:
  233. case LLAssetType::AT_ANIMATION:
  234. case LLAssetType::AT_GESTURE:
  235. rv = true;
  236. break;
  237. default:
  238. break;
  239. }
  240. return rv;
  241. }
  242. bool is_asset_id_knowable(LLAssetType::EType type)
  243. {
  244. // *FIX: Make this list smaller.
  245. bool rv = false;
  246. switch(type)
  247. {
  248. case LLAssetType::AT_TEXTURE:
  249. case LLAssetType::AT_SOUND:
  250. case LLAssetType::AT_LANDMARK:
  251. case LLAssetType::AT_CLOTHING:
  252. case LLAssetType::AT_NOTECARD:
  253. case LLAssetType::AT_BODYPART:
  254. case LLAssetType::AT_ANIMATION:
  255. case LLAssetType::AT_GESTURE:
  256. case LLAssetType::AT_LINK:
  257. case LLAssetType::AT_LINK_FOLDER:
  258. rv = true;
  259. break;
  260. default:
  261. break;
  262. }
  263. return rv;
  264. }