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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llxfermanager.h
  3.  * @brief definition of LLXferManager class for a keeping track of
  4.  * multiple xfers
  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_LLXFERMANAGER_H
  34. #define LL_LLXFERMANAGER_H
  35. /**
  36.  * this manager keeps both a send list and a receive list; anything with a 
  37.  * LLXferManager can send and receive files via messages
  38.  */
  39. //Forward declaration to avoid circular dependencies
  40. class LLXfer;
  41. class LLVFS;
  42. #include "llxfer.h"
  43. #include "message.h"
  44. #include "llassetstorage.h"
  45. #include "lldir.h"
  46. #include "lllinkedqueue.h"
  47. #include "llthrottle.h"
  48. class LLHostStatus
  49. {
  50.  public:
  51. LLHost mHost;
  52. S32    mNumActive;
  53. S32    mNumPending;
  54. LLHostStatus() {mNumActive = 0; mNumPending = 0;};
  55. virtual ~LLHostStatus(){};
  56. };
  57. // Class stores ack information, to be put on list so we can throttle xfer rate.
  58. class LLXferAckInfo
  59. {
  60. public:
  61. LLXferAckInfo(U32 dummy = 0)
  62. {
  63. mID = 0;
  64. mPacketNum = -1;
  65. }
  66. U64 mID;
  67. S32 mPacketNum;
  68. LLHost mRemoteHost;
  69. };
  70. class LLXferManager
  71. {
  72.  private:
  73. LLVFS *mVFS;
  74.  protected:
  75. S32    mMaxOutgoingXfersPerCircuit;
  76. S32    mMaxIncomingXfers;
  77. BOOL mUseAckThrottling; // Use ack throttling to cap file xfer bandwidth
  78. LLLinkedQueue<LLXferAckInfo> mXferAckQueue;
  79. LLThrottle mAckThrottle;
  80.  public:
  81. // This enumeration is useful in the requestFile() to specify if
  82. // an xfer must happen asap.
  83. enum
  84. {
  85. LOW_PRIORITY = FALSE,
  86. HIGH_PRIORITY = TRUE,
  87. };
  88. LLXfer *mSendList;
  89. LLXfer *mReceiveList;
  90. typedef std::list<LLHostStatus*> status_list_t;
  91. status_list_t mOutgoingHosts;
  92.  private:
  93.  protected:
  94. // implementation methods
  95. virtual void startPendingDownloads();
  96. virtual void addToList(LLXfer* xferp, LLXfer*& head, BOOL is_priority);
  97. std::multiset<std::string> mExpectedTransfers; // files that are authorized to transfer out
  98. std::multiset<std::string> mExpectedRequests;  // files that are authorized to be downloaded on top of
  99.  public:
  100. LLXferManager(LLVFS *vfs);
  101. virtual ~LLXferManager();
  102. virtual void init(LLVFS *vfs);
  103. virtual void cleanup();
  104. void setUseAckThrottling(const BOOL use);
  105. void setAckThrottleBPS(const F32 bps);
  106. // list management routines
  107. virtual LLXfer *findXfer(U64 id, LLXfer *list_head);
  108. virtual void removeXfer (LLXfer *delp, LLXfer **list_head);
  109. virtual U32 numActiveListEntries(LLXfer *list_head);
  110. virtual S32 numActiveXfers(const LLHost &host);
  111. virtual S32 numPendingXfers(const LLHost &host);
  112. virtual void changeNumActiveXfers(const LLHost &host, S32 delta);
  113. virtual void setMaxOutgoingXfersPerCircuit (S32 max_num);
  114. virtual void setMaxIncomingXfers(S32 max_num);
  115. virtual void updateHostStatus();
  116. virtual void printHostStatus();
  117. // general utility routines
  118. virtual void registerCallbacks(LLMessageSystem *mesgsys);
  119. virtual U64 getNextID ();
  120. virtual S32 encodePacketNum(S32 packet_num, BOOL is_eof);
  121. virtual S32 decodePacketNum(S32 packet_num);
  122. virtual BOOL isLastPacket(S32 packet_num);
  123. virtual U64 registerXfer(const void *datap, const S32 length);
  124. // file requesting routines
  125. // .. to file
  126. virtual void requestFile(const std::string& local_filename,
  127.  const std::string& remote_filename,
  128.  ELLPath remote_path,
  129.  const LLHost& remote_host,
  130.    BOOL delete_remote_on_completion,
  131.  void (*callback)(void**,S32,LLExtStat), void** user_data,
  132.  BOOL is_priority = FALSE,
  133.  BOOL use_big_packets = FALSE);
  134. // .. to memory
  135. virtual void requestFile(const std::string& remote_filename, 
  136.  ELLPath remote_path,
  137.  const LLHost &remote_host,
  138.    BOOL delete_remote_on_completion,
  139.  void (*callback)(void*, S32, void**, S32, LLExtStat),
  140.  void** user_data,
  141.  BOOL is_priority = FALSE);
  142. // vfile requesting
  143. // .. to vfile
  144. virtual void requestVFile(const LLUUID &local_id, const LLUUID& remote_id,
  145.   LLAssetType::EType type, LLVFS* vfs,
  146.   const LLHost& remote_host,
  147.   void (*callback)(void**,S32,LLExtStat), void** user_data,
  148.   BOOL is_priority = FALSE);
  149. /**
  150. When arbitrary files are requested to be transfered (by giving a dir of LL_PATH_NONE)
  151.    they must be "expected", but having something pre-authorize them. This pair of functions
  152.    maintains a pre-authorized list. The first function adds something to the list, the second
  153.    checks if is authorized, removing it if so.  In this way, a file is only authorized for
  154.    a single use.
  155. */
  156. virtual void expectFileForTransfer(const std::string& filename);
  157. virtual bool validateFileForTransfer(const std::string& filename);
  158. /**
  159. Same idea, but for the viewer about to call InitiateDownload to track what it requested.
  160. */
  161. virtual void expectFileForRequest(const std::string& filename);
  162. virtual bool validateFileForRequest(const std::string& filename);
  163. /*
  164. // xfer request (may be memory or file)
  165. // .. to file
  166. virtual void requestXfer(const char *local_filename, U64 xfer_id, 
  167.  BOOL delete_remote_on_completion,
  168.  const LLHost &remote_host, void (*callback)(void **,S32),void **user_data);
  169. // .. to memory
  170. virtual void requestXfer(U64 xfer_id, 
  171.  const LLHost &remote_host, 
  172.  BOOL delete_remote_on_completion,
  173.  void (*callback)(void *, S32, void **, S32),void **user_data);
  174. */
  175. virtual void processReceiveData (LLMessageSystem *mesgsys, void **user_data);
  176. virtual void sendConfirmPacket (LLMessageSystem *mesgsys, U64 id, S32 packetnum, const LLHost &remote_host);
  177. // file sending routines
  178. virtual void processFileRequest (LLMessageSystem *mesgsys, void **user_data);
  179. virtual void processConfirmation (LLMessageSystem *mesgsys, void **user_data);
  180. virtual void retransmitUnackedPackets ();
  181. // error handling
  182. virtual void processAbort (LLMessageSystem *mesgsys, void **user_data);
  183. };
  184. extern LLXferManager* gXferManager;
  185. // initialization and garbage collection
  186. void start_xfer_manager(LLVFS *vfs);
  187. void cleanup_xfer_manager();
  188. // message system callbacks
  189. void process_confirm_packet (LLMessageSystem *mesgsys, void **user_data);
  190. void process_request_xfer (LLMessageSystem *mesgsys, void **user_data);
  191. void continue_file_receive(LLMessageSystem *mesgsys, void **user_data);
  192. void process_abort_xfer (LLMessageSystem *mesgsys, void **user_data);
  193. #endif