From 79b891a688c0ebd329118a7ebc1a527c72d8f83f Mon Sep 17 00:00:00 2001
From: Merov Linden <merov@lindenlab.com>
Date: Tue, 7 Apr 2015 15:22:32 -0700
Subject: DD-382 : Set count_on_hand correctly when creating or assigning a
 listing

---
 indra/newview/llinventoryfunctions.cpp   | 55 +++++++++++++++++---------------
 indra/newview/llinventoryfunctions.h     |  2 +-
 indra/newview/llmarketplacefunctions.cpp | 16 ++++++++--
 3 files changed, 44 insertions(+), 29 deletions(-)

diff --git a/indra/newview/llinventoryfunctions.cpp b/indra/newview/llinventoryfunctions.cpp
index 1a7b804d44..aeee3738f9 100755
--- a/indra/newview/llinventoryfunctions.cpp
+++ b/indra/newview/llinventoryfunctions.cpp
@@ -1014,7 +1014,7 @@ LLUUID nested_parent_id(LLUUID cur_uuid, S32 depth)
     return cur_uuid;
 }
 
-S32 compute_stock_count(LLUUID cat_uuid)
+S32 compute_stock_count(LLUUID cat_uuid, bool force_count /* false */)
 {
     // Handle the case of the folder being a stock folder immediately
     LLViewerInventoryCategory* cat = gInventory.getCategory(cat_uuid);
@@ -1033,36 +1033,41 @@ S32 compute_stock_count(LLUUID cat_uuid)
         return item_array->size();
     }
 
-    // Grab marketplace data for this folder
-    S32 depth = depth_nesting_in_marketplace(cat_uuid);
-    LLUUID listing_uuid = nested_parent_id(cat_uuid, depth);
-    if (!LLMarketplaceData::instance().isListed(listing_uuid))
+    // When force_count is true, we do not do any verification of the marketplace status and simply compute
+    // the stock amount based on the descendent hierarchy. This is used specifically when creating a listing.
+    if (!force_count)
     {
-        // If not listed, the notion of stock is meaningless so it won't be computed for any level
-        return -1;
-    }
-
-    LLUUID version_folder_uuid = LLMarketplaceData::instance().getVersionFolder(listing_uuid);
-    // Handle the case of the first 2 levels : listing and version folders
-    if (depth == 1)
-    {
-        if (version_folder_uuid.notNull())
+        // Grab marketplace data for this folder
+        S32 depth = depth_nesting_in_marketplace(cat_uuid);
+        LLUUID listing_uuid = nested_parent_id(cat_uuid, depth);
+        if (!!LLMarketplaceData::instance().isListed(listing_uuid))
         {
-            // If there is a version folder, the stock value for the listing is the version folder stock
-            return compute_stock_count(version_folder_uuid);
+            // If not listed, the notion of stock is meaningless so it won't be computed for any level
+            return -1;
         }
-        else
+
+        LLUUID version_folder_uuid = LLMarketplaceData::instance().getVersionFolder(listing_uuid);
+        // Handle the case of the first 2 levels : listing and version folders
+        if (depth == 1)
         {
-            // If there's no version folder associated, the notion of stock count has no meaning
-            return -1;
+            if (version_folder_uuid.notNull())
+            {
+                // If there is a version folder, the stock value for the listing is the version folder stock
+                return compute_stock_count(version_folder_uuid);
+            }
+            else
+            {
+                // If there's no version folder associated, the notion of stock count has no meaning
+                return -1;
+            }
         }
-    }
-    else if (depth == 2)
-    {
-        if (version_folder_uuid.notNull() && (version_folder_uuid != cat_uuid))
+        else if (depth == 2)
         {
-            // If there is a version folder but we're not it, our stock count is meaningless
-            return -1;
+            if (version_folder_uuid.notNull() && (version_folder_uuid != cat_uuid))
+            {
+                // If there is a version folder but we're not it, our stock count is meaningless
+                return -1;
+            }
         }
     }
     
diff --git a/indra/newview/llinventoryfunctions.h b/indra/newview/llinventoryfunctions.h
index 86124e1dad..4f4a64a7f9 100755
--- a/indra/newview/llinventoryfunctions.h
+++ b/indra/newview/llinventoryfunctions.h
@@ -83,7 +83,7 @@ bool move_folder_to_marketplacelistings(LLInventoryCategory* inv_cat, const LLUU
 bool validate_marketplacelistings(LLInventoryCategory* inv_cat, validation_callback_t cb = NULL, bool fix_hierarchy = true, S32 depth = -1);
 S32  depth_nesting_in_marketplace(LLUUID cur_uuid);
 LLUUID nested_parent_id(LLUUID cur_uuid, S32 depth);
-S32 compute_stock_count(LLUUID cat_uuid);
+S32 compute_stock_count(LLUUID cat_uuid, bool force_count = false);
 
 /**                    Miscellaneous global functions
  **                                                                            **
diff --git a/indra/newview/llmarketplacefunctions.cpp b/indra/newview/llmarketplacefunctions.cpp
index 6ba98ff00e..d634a252d9 100755
--- a/indra/newview/llmarketplacefunctions.cpp
+++ b/indra/newview/llmarketplacefunctions.cpp
@@ -1274,8 +1274,13 @@ void LLMarketplaceData::createSLMListing(const LLUUID& folder_id)
     LLViewerInventoryCategory* category = gInventory.getCategory(folder_id);
 
     // Get the version folder: if there is only one subfolder, we will set it as a version folder immediately
+    S32 count = -1;
     LLUUID version_id = getVersionFolderIfUnique(folder_id);
-    
+    if (version_id.notNull())
+    {
+        count = compute_stock_count(version_id, true);
+    }
+
     // Build the json message
     Json::Value root;
     Json::FastWriter writer;
@@ -1283,7 +1288,7 @@ void LLMarketplaceData::createSLMListing(const LLUUID& folder_id)
     root["listing"]["name"] = category->getName();
     root["listing"]["inventory_info"]["listing_folder_id"] = folder_id.asString();
     root["listing"]["inventory_info"]["version_folder_id"] = version_id.asString();
-    root["listing"]["inventory_info"]["count_on_hand"] = -1;
+    root["listing"]["inventory_info"]["count_on_hand"] = count;
     
     std::string json_str = writer.write(root);
     
@@ -1343,7 +1348,12 @@ void LLMarketplaceData::associateSLMListing(const LLUUID& folder_id, S32 listing
 	headers["Content-Type"] = "application/json";
     
     // Get the version folder: if there is only one subfolder, we will set it as a version folder immediately
+    S32 count = -1;
     LLUUID version_id = getVersionFolderIfUnique(folder_id);
+    if (version_id.notNull())
+    {
+        count = compute_stock_count(version_id, true);
+    }
 
     Json::Value root;
     Json::FastWriter writer;
@@ -1352,7 +1362,7 @@ void LLMarketplaceData::associateSLMListing(const LLUUID& folder_id, S32 listing
     root["listing"]["id"] = listing_id;
     root["listing"]["inventory_info"]["listing_folder_id"] = folder_id.asString();
     root["listing"]["inventory_info"]["version_folder_id"] = version_id.asString();
-    root["listing"]["inventory_info"]["count_on_hand"] = -1;
+    root["listing"]["inventory_info"]["count_on_hand"] = count;
     
     std::string json_str = writer.write(root);
     
-- 
cgit v1.2.3