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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file lltransfersourcefile.cpp
  3.  * @brief Transfer system for sending a file.
  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 "lltransfersourcefile.h"
  34. #include "llerror.h"
  35. #include "message.h"
  36. #include "lldatapacker.h"
  37. #include "lldir.h"
  38. LLTransferSourceFile::LLTransferSourceFile(const LLUUID &request_id, const F32 priority) :
  39. LLTransferSource(LLTST_FILE, request_id, priority),
  40. mFP(NULL)
  41. {
  42. }
  43. LLTransferSourceFile::~LLTransferSourceFile()
  44. {
  45. if (mFP)
  46. {
  47. llerrs << "Destructor called without the completion callback being called!" << llendl;
  48. }
  49. }
  50. void LLTransferSourceFile::initTransfer()
  51. {
  52. std::string filename = mParams.getFilename();
  53. std::string delimiter = gDirUtilp->getDirDelimiter();
  54. if((filename == ".")
  55.    || (filename == "..")
  56.    || (filename.find(delimiter[0]) != std::string::npos))
  57. {
  58. llwarns << "Attempting to transfer file " << filename << " with path delimiter, aborting!" << llendl;
  59. sendTransferStatus(LLTS_ERROR);
  60. return;
  61. }
  62. // Look for the file.
  63. mFP = LLFile::fopen(mParams.getFilename(), "rb"); /* Flawfinder: ignore */
  64. if (!mFP)
  65. {
  66. sendTransferStatus(LLTS_ERROR);
  67. return;
  68. }
  69. // Get the size of the file using the hack from
  70. fseek(mFP,0,SEEK_END);
  71. mSize = ftell(mFP);
  72. fseek(mFP,0,SEEK_SET);
  73. sendTransferStatus(LLTS_OK);
  74. }
  75. F32 LLTransferSourceFile::updatePriority()
  76. {
  77. return 0.f;
  78. }
  79. LLTSCode LLTransferSourceFile::dataCallback(const S32 packet_id,
  80. const S32 max_bytes,
  81. U8 **data_handle,
  82. S32 &returned_bytes,
  83. BOOL &delete_returned)
  84. {
  85. //llinfos << "LLTransferSourceFile::dataCallback" << llendl;
  86. if (!mFP)
  87. {
  88. llerrs << "Data callback without file set!" << llendl;
  89. return LLTS_ERROR;
  90. }
  91. if (packet_id != mLastPacketID + 1)
  92. {
  93. llerrs << "Can't handle out of order file transfer yet!" << llendl;
  94. }
  95. // Grab up until the max number of bytes from the file.
  96. delete_returned = TRUE;
  97. U8 *tmpp = new U8[max_bytes];
  98. *data_handle = tmpp;
  99. returned_bytes = (S32)fread(tmpp, 1, max_bytes, mFP);
  100. if (!returned_bytes)
  101. {
  102. delete[] tmpp;
  103. *data_handle = NULL;
  104. returned_bytes = 0;
  105. delete_returned = FALSE;
  106. return LLTS_DONE;
  107. }
  108. return LLTS_OK;
  109. }
  110. void LLTransferSourceFile::completionCallback(const LLTSCode status)
  111. {
  112. // No matter what happens, all we want to do is close the file pointer if
  113. // we've got it open.
  114. if (mFP)
  115. {
  116. fclose(mFP);
  117. mFP = NULL;
  118. }
  119. // Delete the file iff the filename begins with "TEMP"
  120. if (mParams.getDeleteOnCompletion() && mParams.getFilename().substr(0, 4) == "TEMP")
  121. {
  122. LLFile::remove(mParams.getFilename());
  123. }
  124. }
  125. void LLTransferSourceFile::packParams(LLDataPacker& dp) const
  126. {
  127. //llinfos << "LLTransferSourceFile::packParams" << llendl;
  128. mParams.packParams(dp);
  129. }
  130. BOOL LLTransferSourceFile::unpackParams(LLDataPacker &dp)
  131. {
  132. //llinfos << "LLTransferSourceFile::unpackParams" << llendl;
  133. return mParams.unpackParams(dp);
  134. }
  135. LLTransferSourceParamsFile::LLTransferSourceParamsFile() :
  136. LLTransferSourceParams(LLTST_FILE),
  137. mDeleteOnCompletion(FALSE)
  138. {
  139. }
  140. void LLTransferSourceParamsFile::packParams(LLDataPacker &dp) const
  141. {
  142. dp.packString(mFilename, "Filename");
  143. dp.packU8((U8)mDeleteOnCompletion, "Delete");
  144. }
  145. BOOL LLTransferSourceParamsFile::unpackParams(LLDataPacker &dp)
  146. {
  147. dp.unpackString(mFilename, "Filename");
  148. U8 delete_flag;
  149. dp.unpackU8(delete_flag, "Delete");
  150. mDeleteOnCompletion = delete_flag;
  151. llinfos << "Unpacked filename: " << mFilename << llendl;
  152. return TRUE;
  153. }