lltransfertargetfile.cpp

Go to the documentation of this file.
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 // virtual
00059 bool LLTransferTargetFile::unpackParams(LLDataPacker& dp)
00060 {
00061         // we can safely ignore this call
00062         return true;
00063 }
00064 
00065 void LLTransferTargetFile::applyParams(const LLTransferTargetParams &params)
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         //llinfos << "LLTransferTargetFile::dataCallback" << llendl;
00079         //llinfos << "Packet: " << packet_id << llendl;
00080 
00081         if (!mFP)
00082         {
00083                 mFP = LLFile::fopen(mParams.mFilename.c_str(), "wb");           /* Flawfinder: ignore */                
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         // Still need to gracefully handle error conditions.
00114         switch (status)
00115         {
00116         case LLTS_DONE:
00117                 break;
00118         case LLTS_ABORT:
00119         case LLTS_ERROR:
00120                 // We're aborting this transfer, we don't want to keep this file.
00121                 llwarns << "Aborting file transfer for " << mParams.mFilename << llendl;
00122                 if (mFP)
00123                 {
00124                         // Only need to remove file if we successfully opened it.
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 }

Generated on Thu Jul 1 06:09:23 2010 for Second Life Viewer by  doxygen 1.4.7