00001
00032 #include "linden_common.h"
00033
00034 #include "lltransfertargetfile.h"
00035 #include "llerror.h"
00036
00037
00038
00039
00040 LLTransferTargetFile::LLTransferTargetFile(
00041 const LLUUID& uuid,
00042 LLTransferSourceType src_type) :
00043 LLTransferTarget(LLTTT_FILE, uuid, src_type),
00044 mFP(NULL)
00045 {
00046 }
00047
00048 LLTransferTargetFile::~LLTransferTargetFile()
00049 {
00050 if (mFP)
00051 {
00052 llerrs << "LLTransferTargetFile::~LLTransferTargetFile - Should have been cleaned up in completion callback" << llendl;
00053 fclose(mFP);
00054 mFP = NULL;
00055 }
00056 }
00057
00058
00059 bool LLTransferTargetFile::unpackParams(LLDataPacker& dp)
00060 {
00061
00062 return true;
00063 }
00064
00065 void LLTransferTargetFile::applyParams(const LLTransferTargetParams ¶ms)
00066 {
00067 if (params.getType() != mType)
00068 {
00069 llwarns << "Target parameter type doesn't match!" << llendl;
00070 return;
00071 }
00072
00073 mParams = (LLTransferTargetParamsFile &)params;
00074 }
00075
00076 LLTSCode LLTransferTargetFile::dataCallback(const S32 packet_id, U8 *in_datap, const S32 in_size)
00077 {
00078
00079
00080
00081 if (!mFP)
00082 {
00083 mFP = LLFile::fopen(mParams.mFilename.c_str(), "wb");
00084
00085 if (!mFP)
00086 {
00087 llwarns << "Failure opening " << mParams.mFilename << " for write by LLTransferTargetFile" << llendl;
00088 return LLTS_ERROR;
00089 }
00090 }
00091 if (!in_size)
00092 {
00093 return LLTS_OK;
00094 }
00095
00096 S32 count = (S32)fwrite(in_datap, 1, in_size, mFP);
00097 if (count != in_size)
00098 {
00099 llwarns << "Failure in LLTransferTargetFile::dataCallback!" << llendl;
00100 return LLTS_ERROR;
00101 }
00102 return LLTS_OK;
00103 }
00104
00105 void LLTransferTargetFile::completionCallback(const LLTSCode status)
00106 {
00107 llinfos << "LLTransferTargetFile::completionCallback" << llendl;
00108 if (mFP)
00109 {
00110 fclose(mFP);
00111 }
00112
00113
00114 switch (status)
00115 {
00116 case LLTS_DONE:
00117 break;
00118 case LLTS_ABORT:
00119 case LLTS_ERROR:
00120
00121 llwarns << "Aborting file transfer for " << mParams.mFilename << llendl;
00122 if (mFP)
00123 {
00124
00125 LLFile::remove(mParams.mFilename.c_str());
00126 }
00127 default:
00128 break;
00129 }
00130
00131 mFP = NULL;
00132 if (mParams.mCompleteCallback)
00133 {
00134 mParams.mCompleteCallback(status, mParams.mUserData);
00135 }
00136 }