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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file lltransfermanager.h
  3.  * @brief Improved transfer mechanism for moving data through the
  4.  * message system.
  5.  *
  6.  * $LicenseInfo:firstyear=2006&license=viewergpl$
  7.  * 
  8.  * Copyright (c) 2006-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_LLTRANSFERMANAGER_H
  34. #define LL_LLTRANSFERMANAGER_H
  35. #include <map>
  36. #include <list>
  37. #include "llhost.h"
  38. #include "lluuid.h"
  39. #include "llthrottle.h"
  40. #include "llpriqueuemap.h"
  41. #include "llassettype.h"
  42. //
  43. // Definition of the manager class for the new LLXfer replacement.
  44. // Provides prioritized, bandwidth-throttled transport of arbitrary
  45. // binary data between host/circuit combos
  46. //
  47. typedef enum e_transfer_channel_type
  48. {
  49. LLTCT_UNKNOWN = 0,
  50. LLTCT_MISC,
  51. LLTCT_ASSET,
  52. LLTCT_NUM_TYPES
  53. } LLTransferChannelType;
  54. typedef enum e_transfer_source_type
  55. {
  56. LLTST_UNKNOWN = 0,
  57. LLTST_FILE,
  58. LLTST_ASSET,
  59. LLTST_SIM_INV_ITEM, // Simulator specific, may not be handled
  60. LLTST_SIM_ESTATE, // Simulator specific, may not be handled
  61. LLTST_NUM_TYPES
  62. } LLTransferSourceType;
  63. typedef enum e_transfer_target_type
  64. {
  65. LLTTT_UNKNOWN = 0,
  66. LLTTT_FILE,
  67. LLTTT_VFILE,
  68. LLTTT_NUM_TYPES
  69. } LLTransferTargetType;
  70. // Errors are negative, expected values are positive.
  71. typedef enum e_status_codes
  72. {
  73. LLTS_OK = 0,
  74. LLTS_DONE = 1,
  75. LLTS_SKIP = 2,
  76. LLTS_ABORT = 3,
  77. LLTS_ERROR = -1,
  78. LLTS_UNKNOWN_SOURCE = -2, // Equivalent of a 404
  79. LLTS_INSUFFICIENT_PERMISSIONS = -3 // Not enough permissions
  80. } LLTSCode;
  81. // Types of requests for estate wide information
  82. typedef enum e_estate_type
  83. {
  84. ET_Covenant = 0,
  85. ET_NONE = -1
  86. } EstateAssetType;
  87. class LLMessageSystem;
  88. class LLDataPacker;
  89. class LLTransferConnection;
  90. class LLTransferSourceChannel;
  91. class LLTransferTargetChannel;
  92. class LLTransferSourceParams;
  93. class LLTransferTargetParams;
  94. class LLTransferSource;
  95. class LLTransferTarget;
  96. class LLTransferManager
  97. {
  98. public:
  99. LLTransferManager();
  100. virtual ~LLTransferManager();
  101. void init();
  102. void cleanup();
  103. void updateTransfers(); // Called per frame to push packets out on the various different channels.
  104. void cleanupConnection(const LLHost &host);
  105. LLTransferSourceChannel *getSourceChannel(const LLHost &host, const LLTransferChannelType stype);
  106. LLTransferTargetChannel *getTargetChannel(const LLHost &host, const LLTransferChannelType stype);
  107. LLTransferSource *findTransferSource(const LLUUID &transfer_id);
  108. BOOL isValid() const { return mValid; }
  109. static void processTransferRequest(LLMessageSystem *mesgsys, void **);
  110. static void processTransferInfo(LLMessageSystem *mesgsys, void **);
  111. static void processTransferPacket(LLMessageSystem *mesgsys, void **);
  112. static void processTransferAbort(LLMessageSystem *mesgsys, void **);
  113. static void reliablePacketCallback(void **, S32 result);
  114. S32 getTransferBitsIn(const LLTransferChannelType tctype) const { return mTransferBitsIn[tctype]; }
  115. S32 getTransferBitsOut(const LLTransferChannelType tctype) const { return mTransferBitsOut[tctype]; }
  116. void resetTransferBitsIn(const LLTransferChannelType tctype) { mTransferBitsIn[tctype] = 0; }
  117. void resetTransferBitsOut(const LLTransferChannelType tctype) { mTransferBitsOut[tctype] = 0; }
  118. void addTransferBitsIn(const LLTransferChannelType tctype, const S32 bits) { mTransferBitsIn[tctype] += bits; }
  119. void addTransferBitsOut(const LLTransferChannelType tctype, const S32 bits) { mTransferBitsOut[tctype] += bits; }
  120. protected:
  121. LLTransferConnection *getTransferConnection(const LLHost &host);
  122. BOOL removeTransferConnection(const LLHost &host);
  123. protected:
  124. // Convenient typedefs
  125. typedef std::map<LLHost, LLTransferConnection *> host_tc_map;
  126. BOOL mValid;
  127. LLHost mHost;
  128. S32 mTransferBitsIn[LLTTT_NUM_TYPES];
  129. S32 mTransferBitsOut[LLTTT_NUM_TYPES];
  130. // We keep a map between each host and LLTransferConnection.
  131. host_tc_map mTransferConnections;
  132. };
  133. //
  134. // Keeps tracks of all channels to/from a particular host.
  135. //
  136. class LLTransferConnection
  137. {
  138. public:
  139. LLTransferConnection(const LLHost &host);
  140. virtual ~LLTransferConnection();
  141. void updateTransfers();
  142. LLTransferSourceChannel *getSourceChannel(const LLTransferChannelType type);
  143. LLTransferTargetChannel *getTargetChannel(const LLTransferChannelType type);
  144. // Convenient typedefs
  145. typedef std::list<LLTransferSourceChannel *>::iterator tsc_iter;
  146. typedef std::list<LLTransferTargetChannel *>::iterator ttc_iter;
  147. friend class LLTransferManager;
  148. protected:
  149. LLHost mHost;
  150. std::list<LLTransferSourceChannel *> mTransferSourceChannels;
  151. std::list<LLTransferTargetChannel *> mTransferTargetChannels;
  152. };
  153. //
  154. // A channel which is pushing data out.
  155. //
  156. class LLTransferSourceChannel
  157. {
  158. public:
  159. LLTransferSourceChannel(const LLTransferChannelType channel_type,
  160. const LLHost &host);
  161. virtual ~LLTransferSourceChannel();
  162. void updateTransfers();
  163. void updatePriority(LLTransferSource *tsp, const F32 priority);
  164. void addTransferSource(LLTransferSource *sourcep);
  165. LLTransferSource *findTransferSource(const LLUUID &transfer_id);
  166. BOOL deleteTransfer(LLTransferSource *tsp);
  167. void setThrottleID(const S32 throttle_id) { mThrottleID = throttle_id; }
  168. LLTransferChannelType getChannelType() const { return mChannelType; }
  169. LLHost getHost() const { return mHost; }
  170. protected:
  171. typedef std::list<LLTransferSource *>::iterator ts_iter;
  172. LLTransferChannelType mChannelType;
  173. LLHost mHost;
  174. LLPriQueueMap<LLTransferSource*> mTransferSources;
  175. // The throttle that this source channel should use
  176. S32 mThrottleID;
  177. };
  178. //
  179. // A channel receiving data from a source.
  180. //
  181. class LLTransferTargetChannel
  182. {
  183. public:
  184. LLTransferTargetChannel(const LLTransferChannelType channel_type, const LLHost &host);
  185. virtual ~LLTransferTargetChannel();
  186. void requestTransfer(const LLTransferSourceParams &source_params,
  187.  const LLTransferTargetParams &target_params,
  188.  const F32 priority);
  189. LLTransferTarget *findTransferTarget(const LLUUID &transfer_id);
  190. BOOL deleteTransfer(LLTransferTarget *ttp);
  191. LLTransferChannelType getChannelType() const { return mChannelType; }
  192. LLHost getHost() const { return mHost; }
  193. protected:
  194. void sendTransferRequest(LLTransferTarget *targetp,
  195.  const LLTransferSourceParams &params,
  196.  const F32 priority);
  197. void addTransferTarget(LLTransferTarget *targetp);
  198. friend class LLTransferTarget;
  199. friend class LLTransferManager;
  200. protected:
  201. typedef std::list<LLTransferTarget *>::iterator tt_iter;
  202. LLTransferChannelType mChannelType;
  203. LLHost mHost;
  204. std::list<LLTransferTarget *> mTransferTargets;
  205. };
  206. class LLTransferSourceParams
  207. {
  208. public:
  209. LLTransferSourceParams(const LLTransferSourceType type) : mType(type) { }
  210. virtual ~LLTransferSourceParams();
  211. virtual void packParams(LLDataPacker &dp) const = 0;
  212. virtual BOOL unpackParams(LLDataPacker &dp) = 0;
  213. LLTransferSourceType getType() const { return mType; }
  214. protected:
  215. LLTransferSourceType mType;
  216. };
  217. //
  218. // LLTransferSource is an interface, all transfer sources should be derived from it.
  219. //
  220. typedef LLTransferSource *(*LLTransferSourceCreateFunc)(const LLUUID &id, const F32 priority);
  221. class LLTransferSource
  222. {
  223. public:
  224. LLUUID getID() { return mID; }
  225. friend class LLTransferManager;
  226. friend class LLTransferSourceChannel;
  227. protected:
  228. LLTransferSource(const LLTransferSourceType source_type,
  229.  const LLUUID &request_id,
  230.  const F32 priority);
  231. virtual ~LLTransferSource();
  232. void sendTransferStatus(LLTSCode status); // When you've figured out your transfer status, do this
  233. virtual void initTransfer() = 0;
  234. virtual F32 updatePriority() = 0;
  235. virtual LLTSCode dataCallback(const S32 packet_id,
  236.  const S32 max_bytes,
  237.  U8 **datap,
  238.  S32 &returned_bytes,
  239.  BOOL &delete_returned) = 0;
  240. // The completionCallback is GUARANTEED to be called before the destructor.
  241. virtual void completionCallback(const LLTSCode status) = 0;
  242. virtual void packParams(LLDataPacker& dp) const = 0;
  243. virtual BOOL unpackParams(LLDataPacker& dp) = 0;
  244. virtual S32 getNextPacketID() { return mLastPacketID + 1; }
  245. virtual void setLastPacketID(const S32 packet_id) { mLastPacketID = packet_id; }
  246. // For now, no self-induced priority changes
  247. F32 getPriority() { return mPriority; }
  248. void setPriority(const F32 pri) { mPriority = pri; }
  249. virtual void abortTransfer(); // DON'T USE THIS ONE, used internally by LLTransferManager
  250. static LLTransferSource *createSource(const LLTransferSourceType stype,
  251.   const LLUUID &request_id,
  252.   const F32 priority);
  253. static void registerSourceType(const LLTransferSourceType stype, LLTransferSourceCreateFunc);
  254. static void sSetPriority(LLTransferSource *&tsp, const F32 priority);
  255. static F32 sGetPriority(LLTransferSource *&tsp);
  256. protected:
  257. typedef std::map<LLTransferSourceType, LLTransferSourceCreateFunc> stype_scfunc_map;
  258. static stype_scfunc_map sSourceCreateMap;
  259. LLTransferSourceType mType;
  260. LLUUID mID;
  261. LLTransferSourceChannel *mChannelp;
  262. F32 mPriority;
  263. S32 mSize;
  264. S32 mLastPacketID;
  265. };
  266. class LLTransferTargetParams
  267. {
  268. public:
  269. LLTransferTargetParams(const LLTransferTargetType type) : mType(type) {}
  270. LLTransferTargetType getType() const { return mType; }
  271. protected:
  272. LLTransferTargetType mType;
  273. };
  274. class LLTransferPacket
  275. {
  276. // Used for storing a packet that's being delivered later because it's out of order.
  277. // ONLY should be accessed by the following two classes, for now.
  278. friend class LLTransferTarget;
  279. friend class LLTransferManager;
  280. protected:
  281. LLTransferPacket(const S32 packet_id, const LLTSCode status, const U8 *datap, const S32 size);
  282. virtual ~LLTransferPacket();
  283. protected:
  284. S32 mPacketID;
  285. LLTSCode mStatus;
  286. U8 *mDatap;
  287. S32 mSize;
  288. };
  289. class LLTransferTarget
  290. {
  291. public:
  292. LLTransferTarget(
  293. LLTransferTargetType target_type,
  294. const LLUUID& transfer_id,
  295. LLTransferSourceType source_type);
  296. virtual ~LLTransferTarget();
  297. // Accessors
  298. LLUUID getID() const { return mID; }
  299. LLTransferTargetType getType() const { return mType; }
  300. LLTransferTargetChannel *getChannel() const { return mChannelp; }
  301. LLTransferSourceType getSourceType() const { return mSourceType; }
  302. // Static functionality
  303. static LLTransferTarget* createTarget(
  304. LLTransferTargetType target_type,
  305. const LLUUID& request_id,
  306. LLTransferSourceType source_type);
  307. // friends
  308. friend class LLTransferManager;
  309. friend class LLTransferTargetChannel;
  310. protected:
  311. // Implementation
  312. virtual bool unpackParams(LLDataPacker& dp) = 0;
  313. virtual void applyParams(const LLTransferTargetParams &params) = 0;
  314. virtual LLTSCode dataCallback(const S32 packet_id, U8 *in_datap, const S32 in_size) = 0;
  315. // The completionCallback is GUARANTEED to be called before the destructor, so all handling
  316. // of errors/aborts should be done here.
  317. virtual void completionCallback(const LLTSCode status) = 0;
  318. void abortTransfer();
  319. virtual S32 getNextPacketID() { return mLastPacketID + 1; }
  320. virtual void setLastPacketID(const S32 packet_id) { mLastPacketID = packet_id; }
  321. void setSize(const S32 size) { mSize = size; }
  322. void setGotInfo(const BOOL got_info) { mGotInfo = got_info; }
  323. BOOL gotInfo() const { return mGotInfo; }
  324. bool addDelayedPacket(
  325. const S32 packet_id,
  326. const LLTSCode status,
  327. U8* datap,
  328. const S32 size);
  329. protected:
  330. typedef std::map<S32, LLTransferPacket *> transfer_packet_map;
  331. typedef std::map<S32, LLTransferPacket *>::iterator tpm_iter;
  332. LLTransferTargetType mType;
  333. LLTransferSourceType mSourceType;
  334. LLUUID mID;
  335. LLTransferTargetChannel *mChannelp;
  336. BOOL mGotInfo;
  337. S32 mSize;
  338. S32 mLastPacketID;
  339. transfer_packet_map mDelayedPacketMap; // Packets that are waiting because of missing/out of order issues
  340. };
  341. // Hack, here so it's publicly available even though LLTransferSourceInvItem is only available on the simulator
  342. class LLTransferSourceParamsInvItem: public LLTransferSourceParams
  343. {
  344. public:
  345. LLTransferSourceParamsInvItem();
  346. virtual ~LLTransferSourceParamsInvItem() {}
  347. /*virtual*/ void packParams(LLDataPacker &dp) const;
  348. /*virtual*/ BOOL unpackParams(LLDataPacker &dp);
  349. void setAgentSession(const LLUUID &agent_id, const LLUUID &session_id);
  350. void setInvItem(const LLUUID &owner_id, const LLUUID &task_id, const LLUUID &item_id);
  351. void setAsset(const LLUUID &asset_id, const LLAssetType::EType at);
  352. LLUUID getAgentID() const { return mAgentID; }
  353. LLUUID getSessionID() const { return mSessionID; }
  354. LLUUID getOwnerID() const { return mOwnerID; }
  355. LLUUID getTaskID() const { return mTaskID; }
  356. LLUUID getItemID() const { return mItemID; }
  357. LLUUID getAssetID() const { return mAssetID; }
  358. LLAssetType::EType getAssetType() const { return mAssetType; }
  359. protected:
  360. LLUUID mAgentID;
  361. LLUUID mSessionID;
  362. LLUUID mOwnerID;
  363. LLUUID mTaskID;
  364. LLUUID mItemID;
  365. LLUUID mAssetID;
  366. LLAssetType::EType mAssetType;
  367. };
  368. // Hack, here so it's publicly available even though LLTransferSourceEstate is only available on the simulator
  369. class LLTransferSourceParamsEstate: public LLTransferSourceParams
  370. {
  371. public:
  372. LLTransferSourceParamsEstate();
  373. virtual ~LLTransferSourceParamsEstate() {}
  374. /*virtual*/ void packParams(LLDataPacker &dp) const;
  375. /*virtual*/ BOOL unpackParams(LLDataPacker &dp);
  376. void setAgentSession(const LLUUID &agent_id, const LLUUID &session_id);
  377. void setEstateAssetType(const EstateAssetType etype);
  378. void setAsset(const LLUUID &asset_id, const LLAssetType::EType at);
  379. LLUUID getAgentID() const { return mAgentID; }
  380. LLUUID getSessionID() const { return mSessionID; }
  381. EstateAssetType getEstateAssetType() const { return mEstateAssetType; }
  382. LLUUID getAssetID() const { return mAssetID; }
  383. LLAssetType::EType getAssetType() const { return mAssetType; }
  384. protected:
  385. LLUUID mAgentID;
  386. LLUUID mSessionID;
  387. EstateAssetType mEstateAssetType;
  388. // these are set on the sim based on estateinfotype
  389. LLUUID mAssetID;
  390. LLAssetType::EType mAssetType;
  391. };
  392. extern LLTransferManager gTransferManager;
  393. #endif//LL_LLTRANSFERMANAGER_H