summaryrefslogtreecommitdiff
path: root/indra/newview/llassetuploadresponders.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'indra/newview/llassetuploadresponders.cpp')
-rw-r--r--indra/newview/llassetuploadresponders.cpp318
1 files changed, 217 insertions, 101 deletions
diff --git a/indra/newview/llassetuploadresponders.cpp b/indra/newview/llassetuploadresponders.cpp
index cb03379b23..c14d234890 100644
--- a/indra/newview/llassetuploadresponders.cpp
+++ b/indra/newview/llassetuploadresponders.cpp
@@ -39,9 +39,9 @@
#include "llcompilequeue.h"
#include "llfloaterbuycurrency.h"
#include "llfilepicker.h"
-#include "llnotify.h"
-#include "llinventorymodel.h"
-#include "llfloaterinventory.h"
+#include "llinventoryobserver.h"
+#include "llinventorypanel.h"
+#include "llfloaterimportcollada.h"
#include "llpermissionsflags.h"
#include "llpreviewnotecard.h"
#include "llpreviewscript.h"
@@ -56,12 +56,14 @@
#include "llviewermenufile.h"
#include "llviewerwindow.h"
#include "lltexlayer.h"
+#include "lltrans.h"
// library includes
#include "lldir.h"
#include "lleconomy.h"
#include "llfloaterreg.h"
#include "llfocusmgr.h"
+#include "llnotificationsutil.h"
#include "llscrolllistctrl.h"
#include "llsdserialize.h"
#include "llsdutil.h"
@@ -90,14 +92,9 @@ void on_new_single_inventory_upload_complete(
LLSD args;
args["AMOUNT"] = llformat("%d", upload_price);
- LLNotifications::instance().add("UploadPayment", args);
+ LLNotificationsUtil::add("UploadPayment", args);
}
- // Actually add the upload to viewer inventory
- llinfos << "Adding " << server_response["new_inventory_item"].asUUID()
- << " " << server_response["new_asset"].asUUID()
- << " to inventory." << llendl;
-
if( item_folder_id.notNull() )
{
U32 everyone_perms = PERM_NONE;
@@ -155,24 +152,15 @@ void on_new_single_inventory_upload_complete(
// Show the preview panel for textures and sounds to let
// user know that the image (or snapshot) arrived intact.
- LLFloaterInventory* view = LLFloaterInventory::getActiveInventory();
- if ( view )
+ LLInventoryPanel* panel = LLInventoryPanel::getActiveInventoryPanel();
+ if ( panel )
{
LLFocusableElement* focus = gFocusMgr.getKeyboardFocus();
- view->getPanel()->setSelection(
+ panel->setSelection(
server_response["new_inventory_item"].asUUID(),
TAKE_FOCUS_NO);
- if(
- (LLAssetType::AT_TEXTURE == asset_type ||
- LLAssetType::AT_SOUND == asset_type) &&
- (LLFilePicker::instance().getFileCount() <=
- FILE_COUNT_DISPLAY_THRESHOLD) )
- {
- view->getPanel()->openSelected();
- }
-
// restore keyboard focus
gFocusMgr.setKeyboardFocus(focus);
}
@@ -235,14 +223,14 @@ void LLAssetUploadResponder::error(U32 statusNum, const std::string& reason)
args["FILE"] = (mFileName.empty() ? mVFileID.asString() : mFileName);
args["REASON"] = "Error in upload request. Please visit "
"http://secondlife.com/support for help fixing this problem.";
- LLNotifications::instance().add("CannotUploadReason", args);
+ LLNotificationsUtil::add("CannotUploadReason", args);
break;
case 500:
default:
args["FILE"] = (mFileName.empty() ? mVFileID.asString() : mFileName);
args["REASON"] = "The server is experiencing unexpected "
"difficulties.";
- LLNotifications::instance().add("CannotUploadReason", args);
+ LLNotificationsUtil::add("CannotUploadReason", args);
break;
}
LLUploadDialog::modalUploadFinished();
@@ -254,6 +242,7 @@ void LLAssetUploadResponder::result(const LLSD& content)
lldebugs << "LLAssetUploadResponder::result from capabilities" << llendl;
std::string state = content["state"];
+
if (state == "upload")
{
uploadUpload(content);
@@ -297,14 +286,17 @@ void LLAssetUploadResponder::uploadFailure(const LLSD& content)
// deal with L$ errors
if (reason == "insufficient funds")
{
- LLFloaterBuyCurrency::buyCurrency("Uploading costs", LLGlobalEconomy::Singleton::getInstance()->getPriceUpload());
+ S32 price = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload();
+ LLStringUtil::format_map_t args;
+ args["AMOUNT"] = llformat("%d", price);
+ LLFloaterBuyCurrency::buyCurrency(LLTrans::getString("uploading_costs", args), price);
}
else
{
LLSD args;
args["FILE"] = (mFileName.empty() ? mVFileID.asString() : mFileName);
args["REASON"] = content["message"].asString();
- LLNotifications::instance().add("CannotUploadReason", args);
+ LLNotificationsUtil::add("CannotUploadReason", args);
}
}
@@ -328,6 +320,22 @@ LLNewAgentInventoryResponder::LLNewAgentInventoryResponder(
{
}
+// virtual
+void LLNewAgentInventoryResponder::error(U32 statusNum, const std::string& reason)
+{
+ LLAssetUploadResponder::error(statusNum, reason);
+ LLImportColladaAssetCache::getInstance()->assetUploaded(mVFileID, LLUUID(), FALSE);
+}
+
+
+//virtual
+void LLNewAgentInventoryResponder::uploadFailure(const LLSD& content)
+{
+ LLAssetUploadResponder::uploadFailure(content);
+
+ LLImportColladaAssetCache::getInstance()->assetUploaded(mVFileID, content["new_asset"], FALSE);
+}
+
//virtual
void LLNewAgentInventoryResponder::uploadComplete(const LLSD& content)
{
@@ -404,7 +412,7 @@ void LLNewAgentInventoryResponder::uploadComplete(const LLSD& content)
asset_name,
asset_name,
0,
- LLAssetType::AT_NONE,
+ LLFolderType::FT_NONE,
LLInventoryType::IT_NONE,
next_owner_perms,
group_perms,
@@ -414,6 +422,8 @@ void LLNewAgentInventoryResponder::uploadComplete(const LLSD& content)
LLGlobalEconomy::Singleton::getInstance()->getPriceUpload(),
userdata);
}
+
+ LLImportColladaAssetCache::getInstance()->assetUploaded(mVFileID, content["new_asset"], TRUE);
}
LLSendTexLayerResponder::LLSendTexLayerResponder(const LLSD& post_data,
@@ -444,7 +454,7 @@ void LLSendTexLayerResponder::uploadComplete(const LLSD& content)
std::string result = content["state"];
LLUUID new_id = content["new_asset"];
- llinfos << "LLSendTexLayerResponder::result from capabilities: " << result << llendl;
+ llinfos << "result: " << result << "new_id:" << new_id << llendl;
if (result == "complete"
&& mBakedUploadData != NULL)
{ // Invoke
@@ -458,6 +468,14 @@ void LLSendTexLayerResponder::uploadComplete(const LLSD& content)
}
}
+void LLSendTexLayerResponder::error(U32 statusNum, const std::string& reason)
+{
+ llinfos << "status: " << statusNum << " reason: " << reason << llendl;
+
+ // Invoke the original callback with an error result
+ LLTexLayerSetBuffer::onTextureUploadComplete(LLUUID(), (void*) mBakedUploadData, -1, LL_EXSTAT_NONE);
+ mBakedUploadData = NULL; // deleted in onTextureUploadComplete()
+}
LLUpdateAgentInventoryResponder::LLUpdateAgentInventoryResponder(
const LLSD& post_data,
@@ -544,10 +562,10 @@ void LLUpdateAgentInventoryResponder::uploadComplete(const LLSD& content)
{
// If this gesture is active, then we need to update the in-memory
// active map with the new pointer.
- if (LLGestureManager::instance().isGestureActive(item_id))
+ if (LLGestureMgr::instance().isGestureActive(item_id))
{
LLUUID asset_id = new_item->getAssetUUID();
- LLGestureManager::instance().replaceGesture(item_id, asset_id);
+ LLGestureMgr::instance().replaceGesture(item_id, asset_id);
gInventory.notifyObservers();
}
@@ -664,18 +682,32 @@ class LLNewAgentInventoryVariablePriceResponder::Impl
public:
Impl(
const LLUUID& vfile_id,
+ LLAssetType::EType asset_type,
const LLSD& inventory_data) :
mVFileID(vfile_id),
- mInventoryData(inventory_data)
+ mAssetType(asset_type),
+ mInventoryData(inventory_data),
+ mFileName("")
{
+ if (!gVFS->getExists(vfile_id, asset_type))
+ {
+ llwarns
+ << "LLAssetUploadResponder called with nonexistant "
+ << "vfile_id " << vfile_id << llendl;
+ mVFileID.setNull();
+ mAssetType = LLAssetType::AT_NONE;
+ }
}
Impl(
const std::string& file_name,
+ LLAssetType::EType asset_type,
const LLSD& inventory_data) :
mFileName(file_name),
+ mAssetType(asset_type),
mInventoryData(inventory_data)
{
+ mVFileID.setNull();
}
std::string getFilenameOrIDString() const
@@ -695,8 +727,7 @@ public:
LLAssetType::EType getAssetType() const
{
- return LLAssetType::lookup(
- mInventoryData["asset_type"].asString());
+ return mAssetType;
}
LLInventoryType::EType getInventoryType() const
@@ -732,26 +763,107 @@ public:
args["REASON"] = reason;
- LLNotifications::instance().add("CannotUploadReason", args);
+ LLNotificationsUtil::add("CannotUploadReason", args);
LLUploadDialog::modalUploadFinished();
}
- void onApplicationLevelError(const std::string& error_identifier)
+ void onApplicationLevelError(const LLSD& error)
{
- // TODO*: Pull these user visible strings from an xml file
- // to be localized
+ static const std::string _IDENTIFIER = "identifier";
+
static const std::string _INSUFFICIENT_FUNDS =
"NewAgentInventory_InsufficientLindenDollarBalance";
+ static const std::string _MISSING_REQUIRED_PARAMETER =
+ "NewAgentInventory_MissingRequiredParamater";
+ static const std::string _INVALID_REQUEST_BODY =
+ "NewAgentInventory_InvalidRequestBody";
+ static const std::string _RESOURCE_COST_DIFFERS =
+ "NewAgentInventory_ResourceCostDiffers";
+ static const std::string _MISSING_PARAMETER = "missing_parameter";
+ static const std::string _INVALID_PARAMETER = "invalid_parameter";
+ static const std::string _MISSING_RESOURCE = "missing_resource";
+ static const std::string _INVALID_RESOURCE = "invalid_resource";
+ // TODO* Add the other error_identifiers
+
+ std::string error_identifier = error[_IDENTIFIER].asString();
+
+ // TODO*: Pull these user visible strings from an xml file
+ // to be localized
if ( _INSUFFICIENT_FUNDS == error_identifier )
{
displayCannotUploadReason("You do not have a sufficient L$ balance to complete this upload.");
}
+ else if ( _MISSING_REQUIRED_PARAMETER == error_identifier )
+ {
+ // Missing parameters
+ if (error.has(_MISSING_PARAMETER) )
+ {
+ std::string message =
+ "Upload request was missing required parameter '[P]'";
+ LLStringUtil::replaceString(
+ message,
+ "[P]",
+ error[_MISSING_PARAMETER].asString());
+
+ displayCannotUploadReason(message);
+ }
+ else
+ {
+ std::string message =
+ "Upload request was missing a required parameter";
+ displayCannotUploadReason(message);
+ }
+ }
+ else if ( _INVALID_REQUEST_BODY == error_identifier )
+ {
+ // Invalid request body, check to see if
+ // a particular parameter was invalid
+ if ( error.has(_INVALID_PARAMETER) )
+ {
+ std::string message = "Upload parameter '[P]' is invalid.";
+ LLStringUtil::replaceString(
+ message,
+ "[P]",
+ error[_INVALID_PARAMETER].asString());
+
+ // See if the server also responds with what resource
+ // is missing.
+ if ( error.has(_MISSING_RESOURCE) )
+ {
+ message += "\nMissing resource '[R]'.";
+
+ LLStringUtil::replaceString(
+ message,
+ "[R]",
+ error[_MISSING_RESOURCE].asString());
+ }
+ else if ( error.has(_INVALID_RESOURCE) )
+ {
+ message += "\nInvalid resource '[R]'.";
+
+ LLStringUtil::replaceString(
+ message,
+ "[R]",
+ error[_INVALID_RESOURCE].asString());
+ }
+
+ displayCannotUploadReason(message);
+ }
+ else
+ {
+ std::string message = "Upload request was malformed";
+ displayCannotUploadReason(message);
+ }
+ }
+ else if ( _RESOURCE_COST_DIFFERS == error_identifier )
+ {
+ displayCannotUploadReason("The resource cost associated with this upload is not consistent with the server.");
+ }
else
{
displayCannotUploadReason("Unknown Error");
-
}
}
@@ -761,14 +873,18 @@ public:
"The server is experiencing unexpected difficulties.");
}
- void onTransportError(const std::string& error_identifier)
+ void onTransportError(const LLSD& error)
{
- // TODO*: Pull these user visible strings from an xml file
- // to be localized
+ static const std::string _IDENTIFIER = "identifier";
static const std::string _SERVER_ERROR_AFTER_CHARGE =
"NewAgentInventory_ServerErrorAfterCharge";
+ std::string error_identifier = error[_IDENTIFIER].asString();
+
+ // TODO*: Pull the user visible strings from an xml file
+ // to be localized
+
if ( _SERVER_ERROR_AFTER_CHARGE == error_identifier )
{
displayCannotUploadReason(
@@ -779,7 +895,6 @@ public:
displayCannotUploadReason(
"The server is experiencing unexpected difficulties.");
}
-
}
bool uploadConfirmationCallback(
@@ -790,7 +905,7 @@ public:
S32 option;
std::string confirmation_url;
- option = LLNotification::getSelectedOption(
+ option = LLNotificationsUtil::getSelectedOption(
notification,
response);
@@ -798,17 +913,11 @@ public:
notification["payload"]["confirmation_url"].asString();
// Yay! We are confirming or cancelling our upload
- LLSD body;
-
- body["confirm_upload"] = false;
-
switch(option)
{
case 0:
{
- body["confirm_upload"] = true;
- body["expected_upload_price"] =
- notification["payload"]["expected_upload_price"];
+ confirmUpload(confirmation_url, responder);
}
break;
case 1:
@@ -816,15 +925,37 @@ public:
break;
}
- LLHTTPClient::post(confirmation_url, body, responder);
-
return false;
}
-
+
+ void confirmUpload(
+ const std::string& confirmation_url,
+ boost::intrusive_ptr<LLNewAgentInventoryVariablePriceResponder> responder)
+ {
+ if ( getFilename().empty() )
+ {
+ // we have no filename, use virtual file ID instead
+ LLHTTPClient::postFile(
+ confirmation_url,
+ getVFileID(),
+ getAssetType(),
+ responder);
+ }
+ else
+ {
+ LLHTTPClient::postFile(
+ confirmation_url,
+ getFilename(),
+ responder);
+ }
+ }
+
+
private:
std::string mFileName;
LLSD mInventoryData;
+ LLAssetType::EType mAssetType;
LLUUID mVFileID;
};
@@ -833,19 +964,23 @@ private:
///////////////////////////////////////////////
LLNewAgentInventoryVariablePriceResponder::LLNewAgentInventoryVariablePriceResponder(
const LLUUID& vfile_id,
+ LLAssetType::EType asset_type,
const LLSD& inventory_info)
{
mImpl = new Impl(
vfile_id,
+ asset_type,
inventory_info);
}
LLNewAgentInventoryVariablePriceResponder::LLNewAgentInventoryVariablePriceResponder(
const std::string& file_name,
+ LLAssetType::EType asset_type,
const LLSD& inventory_info)
{
mImpl = new Impl(
file_name,
+ asset_type,
inventory_info);
}
@@ -859,15 +994,15 @@ void LLNewAgentInventoryVariablePriceResponder::errorWithContent(
const std::string& reason,
const LLSD& content)
{
- llinfos << "LLNewAgentInventoryVariablePrice::error " << statusNum
- << " reason: " << reason << llendl;
+ lldebugs
+ << "LLNewAgentInventoryVariablePrice::error " << statusNum
+ << " reason: " << reason << llendl;
if ( content.has("error") )
{
static const std::string _ERROR = "error";
- static const std::string _IDENTIFIER = "identifier";
- mImpl->onTransportError(content[_ERROR][_IDENTIFIER].asString());
+ mImpl->onTransportError(content[_ERROR]);
}
else
{
@@ -880,52 +1015,26 @@ void LLNewAgentInventoryVariablePriceResponder::result(const LLSD& content)
// Parse out application level errors and the appropriate
// responses for them
static const std::string _ERROR = "error";
- static const std::string _IDENTIFIER = "identifier";
static const std::string _STATE = "state";
static const std::string _COMPLETE = "complete";
- static const std::string _COST_ANALYSIS = "cost_analysis";
- static const std::string _NEEDS_CONFIRMATION = "needs_confirmation";
- static const std::string _CANCEL = "cancel";
+ static const std::string _CONFIRM_UPLOAD = "confirm_upload";
- static const std::string _RESOURCE_COST = "resource_cost";
static const std::string _UPLOAD_PRICE = "upload_price";
-
- static const std::string _ANALYZER = "analyzer";
+ static const std::string _RESOURCE_COST = "resource_cost";
static const std::string _RSVP = "rsvp";
// Check for application level errors
if ( content.has(_ERROR) )
{
- onApplicationLevelError(content[_ERROR][_IDENTIFIER].asString());
+ onApplicationLevelError(content[_ERROR]);
return;
}
std::string state = content[_STATE];
LLAssetType::EType asset_type = mImpl->getAssetType();
- if ( _COST_ANALYSIS == state )
- {
- std::string analyzer_url = content[_ANALYZER];
-
- if ( mImpl->getFilename().empty() )
- {
- // we have no filename, use virtual file ID instead
- LLHTTPClient::postFile(
- analyzer_url,
- mImpl->getVFileID(),
- asset_type,
- this);
- }
- else
- {
- LLHTTPClient::postFile(
- analyzer_url,
- mImpl->getFilename(),
- this);
- }
- }
- else if ( _COMPLETE == state )
+ if ( _COMPLETE == state )
{
// rename file in VFS with new asset id
if (mImpl->getFilename().empty())
@@ -947,22 +1056,18 @@ void LLNewAgentInventoryVariablePriceResponder::result(const LLSD& content)
mImpl->getItemName(),
mImpl->getItemDescription(),
content,
- content["upload_price"].asInteger());
+ content[_UPLOAD_PRICE].asInteger());
// TODO* Add bulk (serial) uploading or add
// a super class of this that does so
}
- else if ( _NEEDS_CONFIRMATION == state )
+ else if ( _CONFIRM_UPLOAD == state )
{
showConfirmationDialog(
content[_UPLOAD_PRICE].asInteger(),
content[_RESOURCE_COST].asInteger(),
content[_RSVP].asString());
}
- else if ( _CANCEL == state )
- {
- // cancelled, do nothing
- }
else
{
onApplicationLevelError("");
@@ -970,9 +1075,9 @@ void LLNewAgentInventoryVariablePriceResponder::result(const LLSD& content)
}
void LLNewAgentInventoryVariablePriceResponder::onApplicationLevelError(
- const std::string& error_identifier)
+ const LLSD& error)
{
- mImpl->onApplicationLevelError(error_identifier);
+ mImpl->onApplicationLevelError(error);
}
void LLNewAgentInventoryVariablePriceResponder::showConfirmationDialog(
@@ -980,15 +1085,27 @@ void LLNewAgentInventoryVariablePriceResponder::showConfirmationDialog(
S32 resource_cost,
const std::string& confirmation_url)
{
- if ( 0 == upload_price )
+ if ( 0 == upload_price )
{
// don't show confirmation dialog for free uploads, I mean,
// they're free!
- LLSD body;
- body["confirm_upload"] = true;
- body["expected_upload_price"] = upload_price;
- LLHTTPClient::post(confirmation_url, body, this);
+ // The creating of a new instrusive_ptr(this)
+ // creates a new boost::intrusive_ptr
+ // which is a copy of this. This code is required because
+ // 'this' is always of type Class* and not the intrusive_ptr,
+ // and thus, a reference to 'this' is not registered
+ // by using just plain 'this'.
+
+ // Since LLNewAgentInventoryVariablePriceResponder is a
+ // reference counted class, it is possible (since the
+ // reference to a plain 'this' would be missed here) that,
+ // when using plain ol' 'this', that this object
+ // would be deleted before the callback is triggered
+ // and cause sadness.
+ mImpl->confirmUpload(
+ confirmation_url,
+ boost::intrusive_ptr<LLNewAgentInventoryVariablePriceResponder>(this));
}
else
{
@@ -998,7 +1115,6 @@ void LLNewAgentInventoryVariablePriceResponder::showConfirmationDialog(
substitutions["PRICE"] = upload_price;
payload["confirmation_url"] = confirmation_url;
- payload["expected_upload_price"] = upload_price;
// The creating of a new instrusive_ptr(this)
// creates a new boost::intrusive_ptr
@@ -1013,7 +1129,7 @@ void LLNewAgentInventoryVariablePriceResponder::showConfirmationDialog(
// when using plain ol' 'this', that this object
// would be deleted before the callback is triggered
// and cause sadness.
- LLNotifications::instance().add(
+ LLNotificationsUtil::add(
"UploadCostConfirmation",
substitutions,
payload,