diff options
| author | Rider Linden <rider@lindenlab.com> | 2015-06-30 17:11:10 -0700 | 
|---|---|---|
| committer | Rider Linden <rider@lindenlab.com> | 2015-06-30 17:11:10 -0700 | 
| commit | ddb63e7fb70eefea200fbb385efe86e50e5c1e12 (patch) | |
| tree | bcb9e9cd8bd7094f2d4ec0f098735fd2935bb6b3 /indra | |
| parent | 08ef748cba55d5d950b224710c8592e94fcce5c7 (diff) | |
Initial checkin for uploading via coroutine.
Diffstat (limited to 'indra')
| -rwxr-xr-x | indra/llcommon/llstring.h | 2 | ||||
| -rwxr-xr-x | indra/newview/CMakeLists.txt | 2 | ||||
| -rw-r--r-- | indra/newview/llcoproceduremanager.h | 8 | ||||
| -rwxr-xr-x | indra/newview/llfloaterbvhpreview.cpp | 18 | ||||
| -rw-r--r-- | indra/newview/llsnapshotlivepreview.cpp | 18 | ||||
| -rw-r--r-- | indra/newview/llviewerassetupload.cpp | 138 | ||||
| -rw-r--r-- | indra/newview/llviewerassetupload.h | 50 | ||||
| -rwxr-xr-x | indra/newview/llviewermenufile.cpp | 386 | ||||
| -rwxr-xr-x | indra/newview/llviewermenufile.h | 136 | 
9 files changed, 514 insertions, 244 deletions
| diff --git a/indra/llcommon/llstring.h b/indra/llcommon/llstring.h index 0177f48bf5..393f6d7a8c 100755 --- a/indra/llcommon/llstring.h +++ b/indra/llcommon/llstring.h @@ -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, diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 9b3324700a..e2ee32d1e7 100755 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -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 diff --git a/indra/newview/llcoproceduremanager.h b/indra/newview/llcoproceduremanager.h index e84eba2db9..4e971d42e3 100644 --- a/indra/newview/llcoproceduremanager.h +++ b/indra/newview/llcoproceduremanager.h @@ -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      { diff --git a/indra/newview/llfloaterbvhpreview.cpp b/indra/newview/llfloaterbvhpreview.cpp index 669ffa7c59..edc1421588 100755 --- a/indra/newview/llfloaterbvhpreview.cpp +++ b/indra/newview/llfloaterbvhpreview.cpp @@ -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  			{ diff --git a/indra/newview/llsnapshotlivepreview.cpp b/indra/newview/llsnapshotlivepreview.cpp index 0ae8a338e0..bbf560f3fa 100644 --- a/indra/newview/llsnapshotlivepreview.cpp +++ b/indra/newview/llsnapshotlivepreview.cpp @@ -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 diff --git a/indra/newview/llviewerassetupload.cpp b/indra/newview/llviewerassetupload.cpp new file mode 100644 index 0000000000..3f21cf2b7e --- /dev/null +++ b/indra/newview/llviewerassetupload.cpp @@ -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 +} + +//========================================================================= diff --git a/indra/newview/llviewerassetupload.h b/indra/newview/llviewerassetupload.h new file mode 100644 index 0000000000..c80a7617e1 --- /dev/null +++ b/indra/newview/llviewerassetupload.h @@ -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 diff --git a/indra/newview/llviewermenufile.cpp b/indra/newview/llviewermenufile.cpp index f8e50ba463..7bcf241d5e 100755 --- a/indra/newview/llviewermenufile.cpp +++ b/indra/newview/llviewermenufile.cpp @@ -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; - -		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::CoProcedure_t proc = boost::bind(&LLViewerAssetUpload::AssetInventoryUploadCoproc, _1, _2, _3, url, uploadInfo); + +        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); + +} + diff --git a/indra/newview/llviewermenufile.h b/indra/newview/llviewermenufile.h index 3034d00b22..76704e8edd 100755 --- a/indra/newview/llviewermenufile.h +++ b/indra/newview/llviewermenufile.h @@ -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, | 
