summaryrefslogtreecommitdiff
path: root/indra/newview/llassetuploadresponders.cpp
diff options
context:
space:
mode:
authorJames Cook <james@lindenlab.com>2007-01-02 08:33:20 +0000
committerJames Cook <james@lindenlab.com>2007-01-02 08:33:20 +0000
commit420b91db29485df39fd6e724e782c449158811cb (patch)
treeb471a94563af914d3ed3edd3e856d21cb1b69945 /indra/newview/llassetuploadresponders.cpp
Print done when done.
Diffstat (limited to 'indra/newview/llassetuploadresponders.cpp')
-rw-r--r--indra/newview/llassetuploadresponders.cpp197
1 files changed, 197 insertions, 0 deletions
diff --git a/indra/newview/llassetuploadresponders.cpp b/indra/newview/llassetuploadresponders.cpp
new file mode 100644
index 0000000000..cb96be2401
--- /dev/null
+++ b/indra/newview/llassetuploadresponders.cpp
@@ -0,0 +1,197 @@
+/**
+ * @file llmapresponders.h
+ * @brief Processes responses received for asset upload requests.
+ *
+ * Copyright (c) 2006-$CurrentYear$, Linden Research, Inc.
+ * $License$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llassetuploadresponders.h"
+
+#include "llagent.h"
+#include "llfloaterbuycurrency.h"
+#include "lleconomy.h"
+#include "llfilepicker.h"
+#include "llfocusmgr.h"
+#include "llnotify.h"
+#include "llinventorymodel.h"
+#include "llinventoryview.h"
+#include "llpermissionsflags.h"
+#include "lluploaddialog.h"
+#include "llviewermenu.h" // FIXME -- for upload_new_resource()
+#include "llviewerwindow.h"
+#include "viewer.h"
+
+LLNewAgentInventoryResponder::LLNewAgentInventoryResponder(const LLUUID& uuid,
+ const LLSD &post_data)
+ : LLHTTPClient::Responder()
+{
+ mUUID = uuid;
+ mPostData = post_data;
+}
+
+// virtual
+void LLNewAgentInventoryResponder::error(U32 statusNum, const std::string& reason)
+{
+ llinfos << "LLNewAgentInventoryResponder::error " << statusNum << llendl;
+ LLStringBase<char>::format_map_t args;
+ switch(statusNum)
+ {
+ case 400:
+ args["[FILE]"] = mPostData["inventory_type"].asString();
+ args["[REASON]"] = "invalid parameters in upload request";
+ gViewerWindow->alertXml("CannotUploadReason", args);
+ break;
+ case 402:
+ //(result["message"].asString() == "insufficient funds")
+ LLFloaterBuyCurrency::buyCurrency("Uploading costs", gGlobalEconomy->getPriceUpload());
+ break;
+ case 500:
+ default:
+ args["[FILE]"] = mPostData["inventory_type"].asString();
+ args["[REASON]"] = "the server is experiencing unexpected difficulties";
+ gViewerWindow->alertXml("CannotUploadReason", args);
+ break;
+ }
+ LLUploadDialog::modalUploadFinished();
+}
+
+//virtual
+void LLNewAgentInventoryResponder::result(const LLSD& result)
+{
+ lldebugs << "LLNewAgentInventoryResponder::result from capabilities" << llendl;
+
+ if (!result["success"])
+ {
+ LLStringBase<char>::format_map_t args;
+ args["[FILE]"] = mPostData["inventory_type"].asString();
+ args["[REASON]"] = "the server is experiencing unexpected difficulties";
+ gViewerWindow->alertXml("CannotUploadReason", args);
+ return;
+ }
+
+ std::string uploader = result["uploader"];
+ LLAssetType::EType asset_type = LLAssetType::lookup(mPostData["asset_type"].asString().c_str());
+ LLInventoryType::EType inventory_type = LLInventoryType::lookup(mPostData["inventory_type"].asString().c_str());
+ // request succeeded
+ if (!uploader.empty())
+ {
+ LLHTTPClient::postFile(uploader, mUUID, asset_type, this);
+ }
+ // upload succeeded
+ else
+ {
+ // rename the file in the VFS to the actual asset id
+ gVFS->renameFile(mUUID, asset_type, result["new_asset"].asUUID(), asset_type);
+
+ // TODO: only request for textures, sound, and animation uploads
+ // Update money and ownership credit information
+ // since it probably changed on the server
+ if (mPostData["asset_type"].asString() == "texture" ||
+ mPostData["asset_type"].asString() == "sound" ||
+ mPostData["asset_type"].asString() == "animatn")
+ {
+ gMessageSystem->newMessageFast(_PREHASH_MoneyBalanceRequest);
+ gMessageSystem->nextBlockFast(_PREHASH_AgentData);
+ gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
+ gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+ gMessageSystem->nextBlockFast(_PREHASH_MoneyData);
+ gMessageSystem->addUUIDFast(_PREHASH_TransactionID, LLUUID::null );
+ gAgent.sendReliableMessage();
+
+ LLString::format_map_t args;
+ args["[AMOUNT]"] = llformat("%d",gGlobalEconomy->getPriceUpload());
+ LLNotifyBox::showXml("UploadPayment", args);
+ }
+ // Actually add the upload to viewer inventory
+ llinfos << "Adding " << result["new_inventory_item"].asUUID() << " "
+ << result["new_asset"].asUUID() << " to inventory." << llendl;
+ if(mPostData["folder_id"].asUUID().notNull())
+ {
+ LLPermissions perm;
+ U32 next_owner_perm;
+ perm.init(gAgent.getID(), gAgent.getID(), LLUUID::null, LLUUID::null);
+ if (mPostData["inventory_type"].asString() == "snapshot")
+ {
+ next_owner_perm = PERM_ALL;
+ }
+ else
+ {
+ next_owner_perm = PERM_MOVE | PERM_TRANSFER;
+ }
+ perm.initMasks(PERM_ALL, PERM_ALL, PERM_NONE, PERM_NONE, next_owner_perm);
+ S32 creation_date_now = time_corrected();
+ LLPointer<LLViewerInventoryItem> item
+ = new LLViewerInventoryItem(result["new_inventory_item"].asUUID(),
+ mPostData["folder_id"].asUUID(),
+ perm,
+ result["new_asset"].asUUID(),
+ asset_type,
+ inventory_type,
+ mPostData["name"].asString(),
+ mPostData["description"].asString(),
+ LLSaleInfo::DEFAULT,
+ LLInventoryItem::II_FLAGS_NONE,
+ creation_date_now);
+ gInventory.updateItem(item);
+ gInventory.notifyObservers();
+
+ // Show the preview panel for textures and sounds to let
+ // user know that the image (or snapshot) arrived intact.
+ LLInventoryView* view = LLInventoryView::getActiveInventory();
+ if(view)
+ {
+ LLUICtrl* focus_ctrl = gFocusMgr.getKeyboardFocus();
+ LLFocusMgr::FocusLostCallback callback = gFocusMgr.getFocusCallback();
+
+ view->getPanel()->setSelection(result["new_inventory_item"].asUUID(), TAKE_FOCUS_NO);
+ if((LLAssetType::AT_TEXTURE == asset_type)
+ || (LLAssetType::AT_SOUND == asset_type))
+ {
+ view->getPanel()->openSelected();
+ }
+ //LLInventoryView::dumpSelectionInformation((void*)view);
+ // restore keyboard focus
+ gFocusMgr.setKeyboardFocus(focus_ctrl, callback);
+ }
+ }
+ else
+ {
+ llwarns << "Can't find a folder to put it in" << llendl;
+ }
+
+ // remove the "Uploading..." message
+ LLUploadDialog::modalUploadFinished();
+
+ // *FIX: This is a pretty big hack. What this does is check the
+ // file picker if there are any more pending uploads. If so,
+ // upload that file.
+ const char* next_file = LLFilePicker::instance().getNextFile();
+ if(next_file)
+ {
+ const char* name = LLFilePicker::instance().getDirname();
+
+ LLString asset_name = name;
+ LLString::replaceNonstandardASCII( asset_name, '?' );
+ LLString::replaceChar(asset_name, '|', '?');
+ LLString::stripNonprintable(asset_name);
+ LLString::trim(asset_name);
+
+ char* asset_name_str = (char*)asset_name.c_str();
+ char* end_p = strrchr(asset_name_str, '.'); // strip extension if exists
+ if( !end_p )
+ {
+ end_p = asset_name_str + strlen( asset_name_str );
+ }
+
+ S32 len = llmin( (S32) (DB_INV_ITEM_NAME_STR_LEN), (S32) (end_p - asset_name_str) );
+
+ asset_name = asset_name.substr( 0, len );
+
+ upload_new_resource(next_file, asset_name, asset_name,
+ 0, LLAssetType::AT_NONE, LLInventoryType::IT_NONE);
+ }
+ }
+}