From b08742d0b3e0000430b8ae772c7c4d25cfe084fa Mon Sep 17 00:00:00 2001
From: Dave Houlton <euclid@lindenlab.com>
Date: Thu, 28 Apr 2022 11:53:43 -0600
Subject: [PATCH] Add a (broken) material upload handler fxn

---
 indra/llcommon/llassettype.cpp        |  3 +-
 indra/llcommon/llassettype.h          |  4 ++-
 indra/llinventory/llfoldertype.h      |  4 +++
 indra/llinventory/llinventorytype.cpp |  1 +
 indra/llinventory/llinventorytype.h   |  3 +-
 indra/llui/llui.h                     |  3 +-
 indra/newview/llpanelface.cpp         | 52 ++++++++++++++++++++++++---
 indra/newview/llviewerassettype.cpp   |  1 +
 8 files changed, 63 insertions(+), 8 deletions(-)

diff --git a/indra/llcommon/llassettype.cpp b/indra/llcommon/llassettype.cpp
index e6cc06e8d01..7bf3c6553e5 100644
--- a/indra/llcommon/llassettype.cpp
+++ b/indra/llcommon/llassettype.cpp
@@ -96,7 +96,8 @@ LLAssetDictionary::LLAssetDictionary()
 	addEntry(LLAssetType::AT_WIDGET,            new AssetEntry("WIDGET",            "widget",   "widget",           false,      false,      false));
 	addEntry(LLAssetType::AT_PERSON,            new AssetEntry("PERSON",            "person",   "person",           false,      false,      false));
 	addEntry(LLAssetType::AT_SETTINGS,          new AssetEntry("SETTINGS",          "settings", "settings blob",    true,       true,       true));
-	addEntry(LLAssetType::AT_UNKNOWN,           new AssetEntry("UNKNOWN",           "invalid",  NULL,               false,      false,      false));
+    addEntry(LLAssetType::AT_MATERIAL,          new AssetEntry("MATERIAL",          "material", "material",         true,       false,      true));
+    addEntry(LLAssetType::AT_UNKNOWN,           new AssetEntry("UNKNOWN",           "invalid",  NULL,               false,      false,      false));
     addEntry(LLAssetType::AT_NONE,              new AssetEntry("NONE",              "-1",		NULL,		  		FALSE,		FALSE,		FALSE));
 
 };
diff --git a/indra/llcommon/llassettype.h b/indra/llcommon/llassettype.h
index 652c548d59a..10279578630 100644
--- a/indra/llcommon/llassettype.h
+++ b/indra/llcommon/llassettype.h
@@ -127,8 +127,10 @@ class LL_COMMON_API LLAssetType
         AT_RESERVED_6 = 55,
 
         AT_SETTINGS = 56,   // Collection of settings
+
+        AT_MATERIAL = 57,
             
-		AT_COUNT = 57,
+		AT_COUNT = 58,
 
 			// +*********************************************************+
 			// |  TO ADD AN ELEMENT TO THIS ENUM:                        |
diff --git a/indra/llinventory/llfoldertype.h b/indra/llinventory/llfoldertype.h
index 1f174520dae..19f4d61b5b7 100644
--- a/indra/llinventory/llfoldertype.h
+++ b/indra/llinventory/llfoldertype.h
@@ -93,9 +93,13 @@ class LL_COMMON_API LLFolderType
 
         FT_SETTINGS = 56,
 
+        FT_MATERIAL = 57,
+
 		FT_COUNT,
 
 		FT_NONE = -1
+
+        // When adding, see note at bottom of LLAssetType::Etype
 	};
 
 	static EType 				lookup(const std::string& type_name);
diff --git a/indra/llinventory/llinventorytype.cpp b/indra/llinventory/llinventorytype.cpp
index 853ed655f52..71223d65b98 100644
--- a/indra/llinventory/llinventorytype.cpp
+++ b/indra/llinventory/llinventorytype.cpp
@@ -154,6 +154,7 @@ DEFAULT_ASSET_FOR_INV_TYPE[LLAssetType::AT_COUNT] =
     LLInventoryType::IT_NONE,			// 54   AT_RESERVED_5
 
     LLInventoryType::IT_SETTINGS,       // 55   AT_SETTINGS
+    LLInventoryType::IT_MATERIAL,       // 56   AT_MATERIAL
 };
 
 // static
diff --git a/indra/llinventory/llinventorytype.h b/indra/llinventory/llinventorytype.h
index b6e7fb047f8..e1aac054f6f 100644
--- a/indra/llinventory/llinventorytype.h
+++ b/indra/llinventory/llinventorytype.h
@@ -65,7 +65,8 @@ class LLInventoryType
 		IT_WIDGET = 23,
 		IT_PERSON = 24,
         IT_SETTINGS = 25,
-		IT_COUNT = 26,
+        IT_MATERIAL = 26,
+		IT_COUNT = 27,
 
 		IT_UNKNOWN = 255,
 		IT_NONE = -1
diff --git a/indra/llui/llui.h b/indra/llui/llui.h
index 30dbd7248f4..f46e993f8e0 100644
--- a/indra/llui/llui.h
+++ b/indra/llui/llui.h
@@ -76,7 +76,8 @@ enum EDragAndDropType
 	DAD_WIDGET          = 16,
 	DAD_PERSON          = 17,
     DAD_SETTINGS        = 18,
-	DAD_COUNT           = 19,   // number of types in this enum
+    DAD_MATERIAL        = 19,
+	DAD_COUNT           = 20,   // number of types in this enum
 };
 
 // Reasons for drags to be denied.
diff --git a/indra/newview/llpanelface.cpp b/indra/newview/llpanelface.cpp
index c34010ce433..34a546f4581 100644
--- a/indra/newview/llpanelface.cpp
+++ b/indra/newview/llpanelface.cpp
@@ -2542,14 +2542,58 @@ void LLPanelFace::onAlignTexture(void* userdata)
     self->alignTestureLayer();
 }
 
+#include "llagent.h"
+#include "llfilesystem.h"
+#include "llfloaterperms.h"
+#include "llviewerassetupload.h"
+#include "llviewermenufile.h"
+#include "llsd.h"
+#pragma warning (disable: 4189)
 void LLPanelFace::onSaveMaterial(void* userdata)
 {
+    // DRTVWR-559, Q&D material picker - save to inventory goes here
+    LL_DEBUGS("Material") << "saving material to inventory" << LL_ENDL;
+
     LLPanelFace* self = (LLPanelFace*)userdata;
+
+    std::string name = "New Material";
+
+    LLSD* mat_llsd = new LLSD("Surely you jest...");
+    // TBD populate mat_llsd with material data
+    self->onCloseTexturePicker(*mat_llsd);   // certainly wrong, but something like this?
+
+    // gen a new uuid for this asset
+    LLTransactionID tid;
+    tid.generate();
+    LLAssetID new_asset_id = tid.makeAssetID(gAgent.getSecureSessionID());
+
+    LLFileSystem fmt_file(new_asset_id, LLAssetType::AT_MATERIAL, LLFileSystem::WRITE);
+    fmt_file.write(mat_llsd->asBinary().data(), mat_llsd->size());
+
+    S32 expected_upload_cost = 0;// LLAgentBenefitsMgr::current().getTextureUploadCost();
     
-    // DRTVWR-559, Q&D material picker - save to inventory goes here
-    auto bound = self->getBoundingRect();
-    self->setUseBoundingRect(self->getUseBoundingRect());
-    //self->saveMaterialToInventory();
+    std::string res_name = name;
+    std::string res_desc = "Saved Material";
+    LLFolderType::EType folder_type = LLFolderType::FT_MATERIAL;
+    LLInventoryType::EType inv_type = LLInventoryType::IT_MATERIAL;
+
+    auto upload_info = new LLResourceUploadInfo( 
+        tid, 
+        LLAssetType::AT_MATERIAL,
+        res_name, 
+        res_desc, 
+        0,
+        folder_type,
+        inv_type,
+        PERM_ALL, 
+        LLFloaterPerms::getGroupPerms("Uploads"), 
+        LLFloaterPerms::getEveryonePerms("Uploads"),
+        expected_upload_cost, 
+        false);
+
+    LLResourceUploadInfo::ptr_t p_upload_info(upload_info);
+        
+    upload_new_resource(p_upload_info);
 }
 
 
diff --git a/indra/newview/llviewerassettype.cpp b/indra/newview/llviewerassettype.cpp
index 4804ef6ddcb..481086f7602 100644
--- a/indra/newview/llviewerassettype.cpp
+++ b/indra/newview/llviewerassettype.cpp
@@ -88,6 +88,7 @@ LLViewerAssetDictionary::LLViewerAssetDictionary()
 
 	addEntry(LLViewerAssetType::AT_NONE, 				new ViewerAssetEntry(DAD_NONE));
     addEntry(LLViewerAssetType::AT_SETTINGS,            new ViewerAssetEntry(DAD_SETTINGS));
+    addEntry(LLViewerAssetType::AT_MATERIAL,            new ViewerAssetEntry(DAD_MATERIAL));
 };
 
 EDragAndDropType LLViewerAssetType::lookupDragAndDropType(EType asset_type)
-- 
GitLab