Initial checkin for uploading via coroutine.

master
Rider Linden 2015-06-30 17:11:10 -07:00
parent 08ef748cba
commit ddb63e7fb7
9 changed files with 513 additions and 243 deletions

View File

@ -1394,6 +1394,7 @@ BOOL LLStringUtilBase<T>::containsNonprintable(const string_type& string)
return rv;
}
// *TODO: reimplement in terms of algorithm
//static
template<class T>
void LLStringUtilBase<T>::stripNonprintable(string_type& string)
@ -1427,6 +1428,7 @@ void LLStringUtilBase<T>::stripNonprintable(string_type& string)
delete []c_string;
}
// *TODO: reimplement in terms of algorithm
template<class T>
std::basic_string<T> LLStringUtilBase<T>::quote(const string_type& str,
const string_type& triggers,

View File

@ -603,6 +603,7 @@ set(viewer_SOURCE_FILES
llviewerassetstats.cpp
llviewerassetstorage.cpp
llviewerassettype.cpp
llviewerassetupload.cpp
llviewerattachmenu.cpp
llvieweraudio.cpp
llviewercamera.cpp
@ -1197,6 +1198,7 @@ set(viewer_HEADER_FILES
llviewerassetstats.h
llviewerassetstorage.h
llviewerassettype.h
llviewerassetupload.h
llviewerattachmenu.h
llvieweraudio.h
llviewercamera.h

View File

@ -25,8 +25,8 @@
* $/LicenseInfo$
*/
#ifndef LL_UPLOAD_MANAGER_H
#define LL_UPLOAD_MANAGER_H
#ifndef LL_COPROCEDURE_MANAGER_H
#define LL_COPROCEDURE_MANAGER_H
#include "lleventcoro.h"
#include "llcoros.h"
@ -38,6 +38,7 @@ class LLCoprocedureManager : public LLSingleton < LLCoprocedureManager >
public:
typedef boost::function<void(LLCoros::self &, LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t &, const LLUUID &id)> CoProcedure_t;
LLCoprocedureManager();
virtual ~LLCoprocedureManager();
/// Places the coprocedure on the queue for processing.
@ -78,9 +79,6 @@ public:
return countPending() + countActive();
}
protected:
LLCoprocedureManager();
private:
struct QueuedCoproc
{

View File

@ -992,10 +992,20 @@ void LLFloaterBvhPreview::onBtnOK(void* userdata)
{
std::string name = floaterp->getChild<LLUICtrl>("name_form")->getValue().asString();
std::string desc = floaterp->getChild<LLUICtrl>("description_form")->getValue().asString();
LLAssetStorage::LLStoreAssetCallback callback = NULL;
S32 expected_upload_cost = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload();
void *userdata = NULL;
upload_new_resource(floaterp->mTransactionID, // tid
#if 1
NewResourceUploadInfo::ptr_t assetUpdloadInfo(new NewResourceUploadInfo(name, desc, 0,
LLFolderType::FT_NONE, LLInventoryType::IT_ANIMATION,
LLFloaterPerms::getNextOwnerPerms("Uploads"), LLFloaterPerms::getGroupPerms("Uploads"), LLFloaterPerms::getEveryonePerms("Uploads"),
name, expected_upload_cost));
upload_new_resource(floaterp->mTransactionID, LLAssetType::AT_ANIMATION,
assetUpdloadInfo);
#else
LLAssetStorage::LLStoreAssetCallback callback = NULL;
void *userdata = NULL;
upload_new_resource(floaterp->mTransactionID, // tid
LLAssetType::AT_ANIMATION,
name,
desc,
@ -1005,7 +1015,7 @@ void LLFloaterBvhPreview::onBtnOK(void* userdata)
LLFloaterPerms::getNextOwnerPerms("Uploads"), LLFloaterPerms::getGroupPerms("Uploads"), LLFloaterPerms::getEveryonePerms("Uploads"),
name,
callback, expected_upload_cost, userdata);
#endif
}
else
{

View File

@ -1004,9 +1004,22 @@ void LLSnapshotLivePreview::saveTexture()
LLAgentUI::buildLocationString(pos_string, LLAgentUI::LOCATION_FORMAT_FULL);
std::string who_took_it;
LLAgentUI::buildFullname(who_took_it);
LLAssetStorage::LLStoreAssetCallback callback = NULL;
S32 expected_upload_cost = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload();
void *userdata = NULL;
#if 1
std::string name = "Snapshot: " + pos_string;
std::string desc = "Taken by " + who_took_it + " at " + pos_string;
NewResourceUploadInfo::ptr_t assetUploadInfo(new NewResourceUploadInfo(name, desc, 0,
LLFolderType::FT_SNAPSHOT_CATEGORY, LLInventoryType::IT_SNAPSHOT,
PERM_ALL, LLFloaterPerms::getGroupPerms("Uploads"), LLFloaterPerms::getEveryonePerms("Uploads"),
name, expected_upload_cost));
upload_new_resource(tid, LLAssetType::AT_TEXTURE, assetUploadInfo);
#else
LLAssetStorage::LLStoreAssetCallback callback = NULL;
void *userdata = NULL;
upload_new_resource(tid, // tid
LLAssetType::AT_TEXTURE,
"Snapshot : " + pos_string,
@ -1019,6 +1032,7 @@ void LLSnapshotLivePreview::saveTexture()
LLFloaterPerms::getEveryonePerms("Uploads"),
"Snapshot : " + pos_string,
callback, expected_upload_cost, userdata);
#endif
gViewerWindow->playSnapshotAnimAndSound();
}
else

View File

@ -0,0 +1,138 @@
/**
* @file llviewerassetupload.cpp
* @author optional
* @brief brief description of the file
*
* $LicenseInfo:firstyear=2011&license=viewerlgpl$
* Second Life Viewer Source Code
* Copyright (C) 2011, Linden Research, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License only.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
#include "llviewerprecompiledheaders.h"
#include "linden_common.h"
#include "llviewerassetupload.h"
#include "llviewertexturelist.h"
#include "llimage.h"
#include "lltrans.h"
#include "lluuid.h"
#include "llvorbisencode.h"
#include "lluploaddialog.h"
#include "lleconomy.h"
//=========================================================================
/*static*/
void LLViewerAssetUpload::AssetInventoryUploadCoproc(LLCoros::self &self, LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t &httpAdapter, const LLUUID &id,
std::string url, NewResourceUploadInfo::ptr_t uploadInfo)
{
LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest);
uploadInfo->prepareUpload();
uploadInfo->logPreparedUpload();
std::string uploadMessage = "Uploading...\n\n";
uploadMessage.append(uploadInfo->getDisplayName());
LLUploadDialog::modalUploadDialog(uploadMessage);
LLSD body = uploadInfo->generatePostBody();
LLSD result = httpAdapter->postAndYield(self, httpRequest, url, body);
LLSD httpResults = result[LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS];
LLCore::HttpStatus status = LLCoreHttpUtil::HttpCoroutineAdapter::getStatusFromLLSD(httpResults);
if (!status)
{
}
std::string uploader = result["uploader"].asString();
result = httpAdapter->postFileAndYield(self, httpRequest, uploader, uploadInfo->getAssetId(), uploadInfo->getAssetType());
if (!status)
{
}
S32 expected_upload_cost = 0;
// Update L$ and ownership credit information
// since it probably changed on the server
if (uploadInfo->getAssetType() == LLAssetType::AT_TEXTURE ||
uploadInfo->getAssetType() == LLAssetType::AT_SOUND ||
uploadInfo->getAssetType() == LLAssetType::AT_ANIMATION ||
uploadInfo->getAssetType() == LLAssetType::AT_MESH)
{
expected_upload_cost =
LLGlobalEconomy::Singleton::getInstance()->getPriceUpload();
}
on_new_single_inventory_upload_complete(
uploadInfo->getAssetType(),
uploadInfo->getInventoryType(),
uploadInfo->getAssetTypeString(), // note the paramert calls for inv_type string...
uploadInfo->getFolderId(),
uploadInfo->getName(),
uploadInfo->getDescription(),
result,
expected_upload_cost);
#if 0
LLSD initalBody = generate_new_resource_upload_capability_body();
LLSD result = httpAdapter->postAndYield(self, httpRequest, url, initalBody);
LLSD httpResults = result[LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS];
LLCore::HttpStatus status = LLCoreHttpUtil::HttpCoroutineAdapter::getStatusFromLLSD(httpResults);
if (!status)
{
}
std::string state = result["state"].asString();
if (state == "upload")
{
// Upload the file...
result = httpAdapter->postFileAndYield(self, httpRequest, url, initalBody);
httpResults = result[LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS];
status = LLCoreHttpUtil::HttpCoroutineAdapter::getStatusFromLLSD(httpResults);
state = result["state"].asString();
}
if (state == "complete")
{
// done with the upload.
}
else
{
// an error occurred
}
#endif
}
//=========================================================================

View File

@ -0,0 +1,50 @@
/**
* @file llviewerassetupload.h
* @author optional
* @brief brief description of the file
*
* $LicenseInfo:firstyear=2011&license=viewerlgpl$
* Second Life Viewer Source Code
* Copyright (C) 2011, Linden Research, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License only.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
#ifndef LL_VIEWER_ASSET_UPLOAD_H
#define LL_VIEWER_ASSET_UPLOAD_H
#include "llfoldertype.h"
#include "llassettype.h"
#include "llinventorytype.h"
#include "lleventcoro.h"
#include "llcoros.h"
#include "llcorehttputil.h"
#include "llviewermenufile.h"
class LLViewerAssetUpload
{
public:
static void AssetInventoryUploadCoproc(LLCoros::self &self, LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t &httpAdapter, const LLUUID &id,
std::string url, NewResourceUploadInfo::ptr_t uploadInfo);
};
#endif // !VIEWER_ASSET_UPLOAD_H

View File

@ -62,6 +62,8 @@
#include "lluploaddialog.h"
#include "lltrans.h"
#include "llfloaterbuycurrency.h"
#include "llcoproceduremanager.h"
#include "llviewerassetupload.h"
// linden libraries
#include "llassetuploadresponders.h"
@ -621,6 +623,7 @@ void handle_compress_image(void*)
}
}
LLUUID upload_new_resource(
const std::string& src_filename,
std::string name,
@ -704,123 +707,6 @@ LLUUID upload_new_resource(
return LLUUID();
}
}
else if(exten == "tmp")
{
// This is a generic .lin resource file
asset_type = LLAssetType::AT_OBJECT;
LLFILE* in = LLFile::fopen(src_filename, "rb"); /* Flawfinder: ignore */
if (in)
{
// read in the file header
char buf[16384]; /* Flawfinder: ignore */
size_t readbytes;
S32 version;
if (fscanf(in, "LindenResource\nversion %d\n", &version))
{
if (2 == version)
{
// *NOTE: This buffer size is hard coded into scanf() below.
char label[MAX_STRING]; /* Flawfinder: ignore */
char value[MAX_STRING]; /* Flawfinder: ignore */
S32 tokens_read;
while (fgets(buf, 1024, in))
{
label[0] = '\0';
value[0] = '\0';
tokens_read = sscanf( /* Flawfinder: ignore */
buf,
"%254s %254s\n",
label, value);
LL_INFOS() << "got: " << label << " = " << value
<< LL_ENDL;
if (EOF == tokens_read)
{
fclose(in);
error_message = llformat("corrupt resource file: %s", src_filename.c_str());
args["FILE"] = src_filename;
upload_error(error_message, "CorruptResourceFile", filename, args);
return LLUUID();
}
if (2 == tokens_read)
{
if (! strcmp("type", label))
{
asset_type = (LLAssetType::EType)(atoi(value));
}
}
else
{
if (! strcmp("_DATA_", label))
{
// below is the data section
break;
}
}
// other values are currently discarded
}
}
else
{
fclose(in);
error_message = llformat("unknown linden resource file version in file: %s", src_filename.c_str());
args["FILE"] = src_filename;
upload_error(error_message, "UnknownResourceFileVersion", filename, args);
return LLUUID();
}
}
else
{
// this is an original binary formatted .lin file
// start over at the beginning of the file
fseek(in, 0, SEEK_SET);
const S32 MAX_ASSET_DESCRIPTION_LENGTH = 256;
const S32 MAX_ASSET_NAME_LENGTH = 64;
S32 header_size = 34 + MAX_ASSET_DESCRIPTION_LENGTH + MAX_ASSET_NAME_LENGTH;
S16 type_num;
// read in and throw out most of the header except for the type
if (fread(buf, header_size, 1, in) != 1)
{
LL_WARNS() << "Short read" << LL_ENDL;
}
memcpy(&type_num, buf + 16, sizeof(S16)); /* Flawfinder: ignore */
asset_type = (LLAssetType::EType)type_num;
}
// copy the file's data segment into another file for uploading
LLFILE* out = LLFile::fopen(filename, "wb"); /* Flawfinder: ignore */
if (out)
{
while((readbytes = fread(buf, 1, 16384, in))) /* Flawfinder: ignore */
{
if (fwrite(buf, 1, readbytes, out) != readbytes)
{
LL_WARNS() << "Short write" << LL_ENDL;
}
}
fclose(out);
}
else
{
fclose(in);
error_message = llformat( "Unable to create output file: %s", filename.c_str());
args["FILE"] = filename;
upload_error(error_message, "UnableToCreateOutputFile", filename, args);
return LLUUID();
}
fclose(in);
}
else
{
LL_INFOS() << "Couldn't open .lin file " << src_filename << LL_ENDL;
}
}
else if (exten == "bvh")
{
error_message = llformat("We do not currently support bulk upload of animation files\n");
@ -876,6 +762,17 @@ LLUUID upload_new_resource(
{
t_disp_name = src_filename;
}
#if 1
NewResourceUploadInfo::ptr_t uploadInfo(new NewResourceUploadInfo(
name, desc, compression_info,
destination_folder_type, inv_type,
next_owner_perms, group_perms, everyone_perms,
display_name, expected_upload_cost));
upload_new_resource(tid, asset_type, uploadInfo,
callback, userdata);
#else
upload_new_resource(
tid,
asset_type,
@ -891,6 +788,7 @@ LLUUID upload_new_resource(
callback,
expected_upload_cost,
userdata);
#endif
}
else
{
@ -1035,6 +933,7 @@ void upload_done_callback(
}
}
#if 0
static LLAssetID upload_new_resource_prep(
const LLTransactionID& tid,
LLAssetType::EType asset_type,
@ -1056,7 +955,9 @@ static LLAssetID upload_new_resource_prep(
return uuid;
}
#endif
#if 0
LLSD generate_new_resource_upload_capability_body(
LLAssetType::EType asset_type,
const std::string& name,
@ -1084,140 +985,81 @@ LLSD generate_new_resource_upload_capability_body(
return body;
}
#endif
void upload_new_resource(
const LLTransactionID &tid,
LLAssetType::EType asset_type,
std::string name,
std::string desc,
S32 compression_info,
LLFolderType::EType destination_folder_type,
LLInventoryType::EType inv_type,
U32 next_owner_perms,
U32 group_perms,
U32 everyone_perms,
const std::string& display_name,
LLAssetStorage::LLStoreAssetCallback callback,
S32 expected_upload_cost,
void *userdata)
const LLTransactionID &tid,
LLAssetType::EType assetType,
NewResourceUploadInfo::ptr_t &uploadInfo,
LLAssetStorage::LLStoreAssetCallback callback,
void *userdata)
{
if(gDisconnected)
{
return ;
}
LLAssetID uuid =
upload_new_resource_prep(
tid,
asset_type,
inv_type,
name,
display_name,
desc);
if( LLAssetType::AT_SOUND == asset_type )
{
add(LLStatViewer::UPLOAD_SOUND, 1);
}
else
if( LLAssetType::AT_TEXTURE == asset_type )
{
add(LLStatViewer::UPLOAD_TEXTURE, 1);
}
else
if( LLAssetType::AT_ANIMATION == asset_type)
{
add(LLStatViewer::ANIMATION_UPLOADS, 1);
}
if(LLInventoryType::IT_NONE == inv_type)
{
inv_type = LLInventoryType::defaultForAssetType(asset_type);
}
LLStringUtil::stripNonprintable(name);
LLStringUtil::stripNonprintable(desc);
if(name.empty())
{
name = "(No Name)";
}
if(desc.empty())
{
desc = "(No Description)";
}
// At this point, we're ready for the upload.
std::string upload_message = "Uploading...\n\n";
upload_message.append(display_name);
LLUploadDialog::modalUploadDialog(upload_message);
uploadInfo->setAssetType(assetType);
uploadInfo->setTransactionId(tid);
LL_INFOS() << "*** Uploading: " << LL_ENDL;
LL_INFOS() << "Type: " << LLAssetType::lookup(asset_type) << LL_ENDL;
LL_INFOS() << "UUID: " << uuid << LL_ENDL;
LL_INFOS() << "Name: " << name << LL_ENDL;
LL_INFOS() << "Desc: " << desc << LL_ENDL;
LL_INFOS() << "Expected Upload Cost: " << expected_upload_cost << LL_ENDL;
LL_DEBUGS() << "Folder: " << gInventory.findCategoryUUIDForType((destination_folder_type == LLFolderType::FT_NONE) ? LLFolderType::assetTypeToFolderType(asset_type) : destination_folder_type) << LL_ENDL;
LL_DEBUGS() << "Asset Type: " << LLAssetType::lookup(asset_type) << LL_ENDL;
std::string url = gAgent.getRegion()->getCapability(
"NewFileAgentInventory");
std::string url = gAgent.getRegion()->getCapability("NewFileAgentInventory");
if ( !url.empty() )
{
LL_INFOS() << "New Agent Inventory via capability" << LL_ENDL;
LLCoprocedureManager::CoProcedure_t proc = boost::bind(&LLViewerAssetUpload::AssetInventoryUploadCoproc, _1, _2, _3, url, uploadInfo);
LLSD body;
body = generate_new_resource_upload_capability_body(
asset_type,
name,
desc,
destination_folder_type,
inv_type,
next_owner_perms,
group_perms,
everyone_perms);
LLHTTPClient::post(
url,
body,
new LLNewAgentInventoryResponder(
body,
uuid,
asset_type));
LLCoprocedureManager::getInstance()->enqueueCoprocedure("LLViewerAssetUpload::AssetInventoryUploadCoproc", proc);
// LL_INFOS() << "New Agent Inventory via capability" << LL_ENDL;
// uploadInfo->prepareUpload();
// uploadInfo->logPreparedUpload();
//
// LLSD body = uploadInfo->generatePostBody();
//
// LLHTTPClient::post(
// url,
// body,
// new LLNewAgentInventoryResponder(
// body,
// uploadInfo->getAssetId(),
// assetType));
}
else
{
uploadInfo->prepareUpload();
uploadInfo->logPreparedUpload();
LL_INFOS() << "NewAgentInventory capability not found, new agent inventory via asset system." << LL_ENDL;
// check for adequate funds
// TODO: do this check on the sim
if (LLAssetType::AT_SOUND == asset_type ||
LLAssetType::AT_TEXTURE == asset_type ||
LLAssetType::AT_ANIMATION == asset_type)
if (LLAssetType::AT_SOUND == assetType ||
LLAssetType::AT_TEXTURE == assetType ||
LLAssetType::AT_ANIMATION == assetType)
{
S32 balance = gStatusBar->getBalance();
if (balance < expected_upload_cost)
if (balance < uploadInfo->getExpectedUploadCost())
{
// insufficient funds, bail on this upload
LLStringUtil::format_map_t args;
args["NAME"] = name;
args["AMOUNT"] = llformat("%d", expected_upload_cost);
LLBuyCurrencyHTML::openCurrencyFloater( LLTrans::getString("UploadingCosts", args), expected_upload_cost );
args["NAME"] = uploadInfo->getName();
args["AMOUNT"] = llformat("%d", uploadInfo->getExpectedUploadCost());
LLBuyCurrencyHTML::openCurrencyFloater(LLTrans::getString("UploadingCosts", args), uploadInfo->getExpectedUploadCost());
return;
}
}
LLResourceData* data = new LLResourceData;
data->mAssetInfo.mTransactionID = tid;
data->mAssetInfo.mUuid = uuid;
data->mAssetInfo.mType = asset_type;
data->mAssetInfo.mUuid = uploadInfo->getAssetId();
data->mAssetInfo.mType = assetType;
data->mAssetInfo.mCreatorID = gAgentID;
data->mInventoryType = inv_type;
data->mNextOwnerPerm = next_owner_perms;
data->mExpectedUploadCost = expected_upload_cost;
data->mInventoryType = uploadInfo->getInventoryType();
data->mNextOwnerPerm = uploadInfo->getNextOwnerPerms();
data->mExpectedUploadCost = uploadInfo->getExpectedUploadCost();
data->mUserData = userdata;
data->mAssetInfo.setName(name);
data->mAssetInfo.setDescription(desc);
data->mPreferredLocation = destination_folder_type;
data->mAssetInfo.setName(uploadInfo->getName());
data->mAssetInfo.setDescription(uploadInfo->getDescription());
data->mPreferredLocation = uploadInfo->getDestinationFolderType();
LLAssetStorage::LLStoreAssetCallback asset_callback = &upload_done_callback;
if (callback)
@ -1233,6 +1075,7 @@ void upload_new_resource(
}
}
#if 0
LLAssetID generate_asset_id_for_new_upload(const LLTransactionID& tid)
{
if ( gDisconnected )
@ -1292,6 +1135,7 @@ void assign_defaults_and_show_upload_message(
upload_message.append(display_name);
LLUploadDialog::modalUploadDialog(upload_message);
}
#endif
void init_menu_file()
@ -1315,3 +1159,107 @@ void init_menu_file()
// "File.SaveTexture" moved to llpanelmaininventory so that it can be properly handled.
}
LLAssetID NewResourceUploadInfo::prepareUpload()
{
LLAssetID uuid = generateNewAssetId();
incrementUploadStats();
assignDefaults();
return uuid;
}
std::string NewResourceUploadInfo::getAssetTypeString() const
{
return LLAssetType::lookup(mAssetType);
}
std::string NewResourceUploadInfo::getInventoryTypeString() const
{
return LLInventoryType::lookup(mInventoryType);
}
LLSD NewResourceUploadInfo::generatePostBody()
{
LLSD body;
body["folder_id"] = mFolderId;
body["asset_type"] = getAssetTypeString();
body["inventory_type"] = getInventoryTypeString();
body["name"] = mName;
body["description"] = mDescription;
body["next_owner_mask"] = LLSD::Integer(mNextOwnerPerms);
body["group_mask"] = LLSD::Integer(mGroupPerms);
body["everyone_mask"] = LLSD::Integer(mEveryonePerms);
return body;
}
void NewResourceUploadInfo::logPreparedUpload()
{
LL_INFOS() << "*** Uploading: " << std::endl <<
"Type: " << LLAssetType::lookup(mAssetType) << std::endl <<
"UUID: " << mAssetId.asString() << std::endl <<
"Name: " << mName << std::endl <<
"Desc: " << mDescription << std::endl <<
"Expected Upload Cost: " << mExpectedUploadCost << std::endl <<
"Folder: " << mFolderId << std::endl <<
"Asset Type: " << LLAssetType::lookup(mAssetType) << LL_ENDL;
}
LLAssetID NewResourceUploadInfo::generateNewAssetId()
{
if (gDisconnected)
{
LLAssetID rv;
rv.setNull();
return rv;
}
mAssetId = mTransactionId.makeAssetID(gAgent.getSecureSessionID());
return mAssetId;
}
void NewResourceUploadInfo::incrementUploadStats() const
{
if (LLAssetType::AT_SOUND == mAssetType)
{
add(LLStatViewer::UPLOAD_SOUND, 1);
}
else if (LLAssetType::AT_TEXTURE == mAssetType)
{
add(LLStatViewer::UPLOAD_TEXTURE, 1);
}
else if (LLAssetType::AT_ANIMATION == mAssetType)
{
add(LLStatViewer::ANIMATION_UPLOADS, 1);
}
}
void NewResourceUploadInfo::assignDefaults()
{
if (LLInventoryType::IT_NONE == mInventoryType)
{
mInventoryType = LLInventoryType::defaultForAssetType(mAssetType);
}
LLStringUtil::stripNonprintable(mName);
LLStringUtil::stripNonprintable(mDescription);
if (mName.empty())
{
mName = "(No Name)";
}
if (mDescription.empty())
{
mDescription = "(No Description)";
}
mFolderId = gInventory.findCategoryUUIDForType(
(mDestinationFolderType == LLFolderType::FT_NONE) ?
(LLFolderType::EType)mAssetType : mDestinationFolderType);
}

View File

@ -39,20 +39,126 @@ class LLTransactionID;
void init_menu_file();
#if 1
class NewResourceUploadInfo
{
public:
typedef boost::shared_ptr<NewResourceUploadInfo> ptr_t;
NewResourceUploadInfo(std::string name,
std::string description,
S32 compressionInfo,
LLFolderType::EType destinationType,
LLInventoryType::EType inventoryType,
U32 nextOWnerPerms,
U32 groupPerms,
U32 everyonePerms,
std::string displayName,
S32 expectedCost) :
mName(name),
mDescription(description),
mDisplayName(displayName),
mCompressionInfo(compressionInfo),
mNextOwnerPerms(nextOWnerPerms),
mGroupPerms(mGroupPerms),
mEveryonePerms(mEveryonePerms),
mExpectedUploadCost(expectedCost),
mInventoryType(inventoryType),
mDestinationFolderType(destinationType)
{ }
virtual ~NewResourceUploadInfo()
{ }
virtual LLAssetID prepareUpload();
virtual LLSD generatePostBody();
virtual void logPreparedUpload();
void setAssetType(LLAssetType::EType assetType) { mAssetType = assetType; }
LLAssetType::EType getAssetType() const { return mAssetType; }
std::string getAssetTypeString() const;
void setTransactionId(LLTransactionID transactionId) { mTransactionId = transactionId; }
LLTransactionID getTransactionId() const { return mTransactionId; }
LLUUID getFolderId() const { return mFolderId; }
LLAssetID getAssetId() const { return mAssetId; }
std::string getName() const { return mName; };
std::string getDescription() const { return mDescription; };
std::string getDisplayName() const { return mDisplayName; };
S32 getCompressionInfo() const { return mCompressionInfo; };
U32 getNextOwnerPerms() const { return mNextOwnerPerms; };
U32 getGroupPerms() const { return mGroupPerms; };
U32 getEveryonePerms() const { return mEveryonePerms; };
S32 getExpectedUploadCost() const { return mExpectedUploadCost; };
LLInventoryType::EType getInventoryType() const { return mInventoryType; };
std::string getInventoryTypeString() const;
LLFolderType::EType getDestinationFolderType() const { return mDestinationFolderType; };
protected:
LLAssetID generateNewAssetId();
void incrementUploadStats() const;
virtual void assignDefaults();
private:
LLAssetType::EType mAssetType;
std::string mName;
std::string mDescription;
std::string mDisplayName;
S32 mCompressionInfo;
U32 mNextOwnerPerms;
U32 mGroupPerms;
U32 mEveryonePerms;
S32 mExpectedUploadCost;
LLUUID mFolderId;
LLInventoryType::EType mInventoryType;
LLFolderType::EType mDestinationFolderType;
LLAssetID mAssetId;
LLTransactionID mTransactionId;
};
LLUUID upload_new_resource(
const std::string& src_filename,
std::string name,
std::string desc,
S32 compression_info,
LLFolderType::EType destination_folder_type,
LLInventoryType::EType inv_type,
U32 next_owner_perms,
U32 group_perms,
U32 everyone_perms,
const std::string& display_name,
LLAssetStorage::LLStoreAssetCallback callback,
S32 expected_upload_cost,
void *userdata);
const std::string& src_filename,
std::string name,
std::string desc,
S32 compression_info,
LLFolderType::EType destination_folder_type,
LLInventoryType::EType inv_type,
U32 next_owner_perms,
U32 group_perms,
U32 everyone_perms,
const std::string& display_name,
LLAssetStorage::LLStoreAssetCallback callback,
S32 expected_upload_cost,
void *userdata);
void upload_new_resource(
const LLTransactionID &tid,
LLAssetType::EType type,
NewResourceUploadInfo::ptr_t &uploadInfo,
LLAssetStorage::LLStoreAssetCallback callback = NULL,
void *userdata = NULL);
#else
LLUUID upload_new_resource(
const std::string& src_filename,
std::string name,
std::string desc,
S32 compression_info,
LLFolderType::EType destination_folder_type,
LLInventoryType::EType inv_type,
U32 next_owner_perms,
U32 group_perms,
U32 everyone_perms,
const std::string& display_name,
LLAssetStorage::LLStoreAssetCallback callback,
S32 expected_upload_cost,
void *userdata);
void upload_new_resource(
const LLTransactionID &tid,
@ -70,9 +176,9 @@ void upload_new_resource(
S32 expected_upload_cost,
void *userdata);
LLAssetID generate_asset_id_for_new_upload(const LLTransactionID& tid);
void increase_new_upload_stats(LLAssetType::EType asset_type);
#endif
void assign_defaults_and_show_upload_message(
LLAssetType::EType asset_type,
LLInventoryType::EType& inventory_type,
@ -80,6 +186,7 @@ void assign_defaults_and_show_upload_message(
const std::string& display_name,
std::string& description);
#if 0
LLSD generate_new_resource_upload_capability_body(
LLAssetType::EType asset_type,
const std::string& name,
@ -89,6 +196,7 @@ LLSD generate_new_resource_upload_capability_body(
U32 next_owner_perms,
U32 group_perms,
U32 everyone_perms);
#endif
void on_new_single_inventory_upload_complete(
LLAssetType::EType asset_type,