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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llxfer_mem.cpp
  3.  * @brief implementation of LLXfer_Mem class for a single xfer
  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 "llxfer_mem.h"
  34. #include "lluuid.h"
  35. #include "llerror.h"
  36. #include "llmath.h"
  37. ///////////////////////////////////////////////////////////
  38. LLXfer_Mem::LLXfer_Mem ()
  39. : LLXfer(-1)
  40. {
  41. init();
  42. }
  43. ///////////////////////////////////////////////////////////
  44. LLXfer_Mem::~LLXfer_Mem ()
  45. {
  46. cleanup();
  47. }
  48. ///////////////////////////////////////////////////////////
  49. void LLXfer_Mem::init ()
  50. {
  51. mRemoteFilename.clear();
  52. mRemotePath = LL_PATH_NONE;
  53. mDeleteRemoteOnCompletion = FALSE;
  54. }
  55. ///////////////////////////////////////////////////////////
  56. void LLXfer_Mem::cleanup ()
  57. {
  58. LLXfer::cleanup();
  59. }
  60. ///////////////////////////////////////////////////////////
  61. void LLXfer_Mem::setXferSize (S32 xfer_size)
  62. {
  63. mXferSize = xfer_size;
  64. delete[] mBuffer;
  65. mBuffer = new char[xfer_size];
  66. mBufferLength = 0;
  67. mBufferStartOffset = 0;
  68. mBufferContainsEOF = TRUE;
  69. // cout << "starting transfer of size: " << xfer_size << endl;
  70. }
  71. ///////////////////////////////////////////////////////////
  72. U64 LLXfer_Mem::registerXfer(U64 xfer_id, const void *datap, const S32 length)
  73. {
  74. mID = xfer_id;
  75. if (datap)
  76. {
  77. setXferSize(length);
  78. if (mBuffer)
  79. {
  80. memcpy(mBuffer,datap,length); /* Flawfinder : ignore */
  81. mBufferLength = length;
  82. }
  83. else
  84. {
  85. xfer_id = 0;
  86. }
  87. }
  88. mStatus = e_LL_XFER_REGISTERED;
  89. return (xfer_id);
  90. }
  91. S32 LLXfer_Mem::startSend (U64 xfer_id, const LLHost &remote_host)
  92. {
  93. S32 retval = LL_ERR_NOERR;  // presume success
  94. if (mXferSize <= 0)
  95. {
  96. return LL_ERR_FILE_EMPTY;
  97. }
  98.     mRemoteHost = remote_host;
  99. mID = xfer_id;
  100.     mPacketNum = -1;
  101. // cout << "Sending file: " << getFileName() << endl;
  102. mStatus = e_LL_XFER_PENDING;
  103. return (retval);
  104. }
  105. ///////////////////////////////////////////////////////////
  106. S32 LLXfer_Mem::processEOF()
  107. {
  108. S32 retval = 0;
  109. mStatus = e_LL_XFER_COMPLETE;
  110. llinfos << "xfer complete: " << getFileName() << llendl;
  111. if (mCallback)
  112. {
  113. mCallback((void *)mBuffer,mBufferLength,mCallbackDataHandle,mCallbackResult,LL_EXSTAT_NONE);
  114. }
  115. return(retval);
  116. }
  117. ///////////////////////////////////////////////////////////
  118. S32 LLXfer_Mem::initializeRequest(U64 xfer_id,
  119.   const std::string& remote_filename,
  120.   ELLPath remote_path,
  121.   const LLHost& remote_host,
  122.   BOOL delete_remote_on_completion,
  123.   void (*callback)(void*,S32,void**,S32,LLExtStat),
  124.   void** user_data)
  125. {
  126.   S32 retval = 0;  // presume success
  127. mRemoteHost = remote_host;
  128. // create a temp filename string using a GUID
  129. mID = xfer_id;
  130. mCallback = callback;
  131. mCallbackDataHandle = user_data;
  132. mCallbackResult = LL_ERR_NOERR;
  133. mRemoteFilename = remote_filename;
  134. mRemotePath = remote_path;
  135. mDeleteRemoteOnCompletion = delete_remote_on_completion;
  136. llinfos << "Requesting file: " << remote_filename << llendl;
  137. delete [] mBuffer;
  138. mBuffer = NULL;
  139. mBufferLength = 0;
  140. mPacketNum = 0;
  141.   mStatus = e_LL_XFER_PENDING;
  142. return retval;
  143. }
  144. //////////////////////////////////////////////////////////
  145. S32 LLXfer_Mem::startDownload()
  146. {
  147.   S32 retval = 0;  // presume success
  148. gMessageSystem->newMessageFast(_PREHASH_RequestXfer);
  149. gMessageSystem->nextBlockFast(_PREHASH_XferID);
  150. gMessageSystem->addU64Fast(_PREHASH_ID, mID);
  151. gMessageSystem->addStringFast(_PREHASH_Filename, mRemoteFilename);
  152. gMessageSystem->addU8("FilePath", (U8) mRemotePath);
  153. gMessageSystem->addBOOL("DeleteOnCompletion", mDeleteRemoteOnCompletion);
  154. gMessageSystem->addBOOL("UseBigPackets", BOOL(mChunkSize == LL_XFER_LARGE_PAYLOAD));
  155. gMessageSystem->addUUIDFast(_PREHASH_VFileID, LLUUID::null);
  156. gMessageSystem->addS16Fast(_PREHASH_VFileType, -1);
  157. gMessageSystem->sendReliable(mRemoteHost);
  158. mStatus = e_LL_XFER_IN_PROGRESS;
  159. return (retval);
  160. }
  161. //////////////////////////////////////////////////////////
  162. U32 LLXfer_Mem::getXferTypeTag()
  163. {
  164. return LLXfer::XFER_MEM;
  165. }