Files
SingularityViewer/indra/llmessage/lltransfersourceasset.cpp
Shyotl f9937d7f8a V2 llmessage merge, incl. llcommon requisites.
Excluded llareslistener, as that appears to only be present for unit-testing
Excluded new SSL methods because, well, they don't work right reliably in v2 for me
2011-02-25 19:30:59 -06:00

260 lines
6.4 KiB
C++

/**
* @file lltransfersourceasset.cpp
* @brief Transfer system for sending an asset.
*
* $LicenseInfo:firstyear=2006&license=viewergpl$
*
* Copyright (c) 2006-2009, Linden Research, Inc.
*
* Second Life Viewer Source Code
* The source code in this file ("Source Code") is provided by Linden Lab
* to you under the terms of the GNU General Public License, version 2.0
* ("GPL"), unless you have obtained a separate licensing agreement
* ("Other License"), formally executed by you and Linden Lab. Terms of
* the GPL can be found in doc/GPL-license.txt in this distribution, or
* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
*
* There are special exceptions to the terms and conditions of the GPL as
* it is applied to this Source Code. View the full text of the exception
* in the file doc/FLOSS-exception.txt in this software distribution, or
* online at
* http://secondlifegrid.net/programs/open_source/licensing/flossexception
*
* By copying, modifying or distributing this software, you acknowledge
* that you have read and understood your obligations described above,
* and agree to abide by those obligations.
*
* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
*/
#include "linden_common.h"
#include "lltransfersourceasset.h"
#include "llerror.h"
#include "message.h"
#include "lldatapacker.h"
#include "lldir.h"
#include "llvfile.h"
LLTransferSourceAsset::LLTransferSourceAsset(const LLUUID &request_id, const F32 priority) :
LLTransferSource(LLTST_ASSET, request_id, priority),
mGotResponse(FALSE),
mCurPos(0)
{
}
LLTransferSourceAsset::~LLTransferSourceAsset()
{
}
void LLTransferSourceAsset::initTransfer()
{
if (gAssetStorage)
{
// *HACK: asset transfers will only be coming from the viewer
// to the simulator. This is subset of assets we allow to be
// simply pulled straight from the asset system.
LLUUID* tidp;
if(LLAssetType::lookupIsAssetFetchByIDAllowed(mParams.getAssetType()))
{
tidp = new LLUUID(getID());
gAssetStorage->getAssetData(
mParams.getAssetID(),
mParams.getAssetType(),
LLTransferSourceAsset::responderCallback,
tidp,
FALSE);
}
else
{
llwarns << "Attempted to request blocked asset "
<< mParams.getAssetID() << ":"
<< LLAssetType::lookupHumanReadable(mParams.getAssetType())
<< llendl;
sendTransferStatus(LLTS_ERROR);
}
}
else
{
llwarns << "Attempted to request asset " << mParams.getAssetID()
<< ":" << LLAssetType::lookupHumanReadable(mParams.getAssetType())
<< " without an asset system!" << llendl;
sendTransferStatus(LLTS_ERROR);
}
}
F32 LLTransferSourceAsset::updatePriority()
{
return 0.f;
}
LLTSCode LLTransferSourceAsset::dataCallback(const S32 packet_id,
const S32 max_bytes,
U8 **data_handle,
S32 &returned_bytes,
BOOL &delete_returned)
{
//llinfos << "LLTransferSourceAsset::dataCallback" << llendl;
if (!mGotResponse)
{
return LLTS_SKIP;
}
LLVFile vf(gAssetStorage->mVFS, mParams.getAssetID(), mParams.getAssetType(), LLVFile::READ);
if (!vf.getSize())
{
// Something bad happened with the asset request!
return LLTS_ERROR;
}
if (packet_id != mLastPacketID + 1)
{
llerrs << "Can't handle out of order file transfer yet!" << llendl;
}
// grab a buffer from the right place in the file
if (!vf.seek(mCurPos, 0))
{
llwarns << "LLTransferSourceAsset Can't seek to " << mCurPos << " length " << vf.getSize() << llendl;
llwarns << "While sending " << mParams.getAssetID() << llendl;
return LLTS_ERROR;
}
delete_returned = TRUE;
U8 *tmpp = new U8[max_bytes];
*data_handle = tmpp;
if (!vf.read(tmpp, max_bytes)) /* Flawfinder: Ignore */
{
// Crap, read failure, need to deal with it.
delete[] tmpp;
*data_handle = NULL;
returned_bytes = 0;
delete_returned = FALSE;
return LLTS_ERROR;
}
returned_bytes = vf.getLastBytesRead();
mCurPos += returned_bytes;
if (vf.eof())
{
if (!returned_bytes)
{
delete[] tmpp;
*data_handle = NULL;
returned_bytes = 0;
delete_returned = FALSE;
}
return LLTS_DONE;
}
return LLTS_OK;
}
void LLTransferSourceAsset::completionCallback(const LLTSCode status)
{
// No matter what happens, all we want to do is close the vfile if
// we've got it open.
}
void LLTransferSourceAsset::packParams(LLDataPacker& dp) const
{
//llinfos << "LLTransferSourceAsset::packParams" << llendl;
mParams.packParams(dp);
}
BOOL LLTransferSourceAsset::unpackParams(LLDataPacker &dp)
{
//llinfos << "LLTransferSourceAsset::unpackParams" << llendl;
return mParams.unpackParams(dp);
}
void LLTransferSourceAsset::responderCallback(LLVFS *vfs, const LLUUID& uuid, LLAssetType::EType type,
void *user_data, S32 result, LLExtStat ext_status )
{
LLUUID *tidp = ((LLUUID*) user_data);
LLUUID transfer_id = *(tidp);
delete tidp;
tidp = NULL;
LLTransferSourceAsset *tsap = (LLTransferSourceAsset *) gTransferManager.findTransferSource(transfer_id);
if (!tsap)
{
llinfos << "Aborting transfer " << transfer_id << " callback, transfer source went away" << llendl;
return;
}
if (result)
{
llinfos << "AssetStorage: Error " << gAssetStorage->getErrorString(result) << " downloading uuid " << uuid << llendl;
}
LLTSCode status;
tsap->mGotResponse = TRUE;
if (LL_ERR_NOERR == result)
{
// Everything's OK.
LLVFile vf(gAssetStorage->mVFS, uuid, type, LLVFile::READ);
tsap->mSize = vf.getSize();
status = LLTS_OK;
}
else
{
// Uh oh, something bad happened when we tried to get this asset!
switch (result)
{
case LL_ERR_ASSET_REQUEST_NOT_IN_DATABASE:
status = LLTS_UNKNOWN_SOURCE;
break;
default:
status = LLTS_ERROR;
}
}
tsap->sendTransferStatus(status);
}
LLTransferSourceParamsAsset::LLTransferSourceParamsAsset()
: LLTransferSourceParams(LLTST_ASSET),
mAssetType(LLAssetType::AT_NONE)
{
}
void LLTransferSourceParamsAsset::setAsset(const LLUUID &asset_id, const LLAssetType::EType asset_type)
{
mAssetID = asset_id;
mAssetType = asset_type;
}
void LLTransferSourceParamsAsset::packParams(LLDataPacker &dp) const
{
dp.packUUID(mAssetID, "AssetID");
dp.packS32(mAssetType, "AssetType");
}
BOOL LLTransferSourceParamsAsset::unpackParams(LLDataPacker &dp)
{
S32 tmp_at;
dp.unpackUUID(mAssetID, "AssetID");
dp.unpackS32(tmp_at, "AssetType");
mAssetType = (LLAssetType::EType)tmp_at;
return TRUE;
}