From e89f0b3f71dc8bd439fcfc23d12b305369eac36b Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Fri, 13 Aug 2010 22:29:42 +0100
Subject: refactor: move Scene.PerformObjectBuy into BuySellModule

---
 .../World/Objects/BuySell/BuySellModule.cs         | 169 ++++++++++++++++++++-
 .../Region/Framework/Interfaces/IBuySellModule.cs  |  47 ++++++
 .../Region/Framework/Interfaces/ICloudModule.cs    |   3 +-
 OpenSim/Region/Framework/Scenes/Scene.Inventory.cs |   2 +-
 OpenSim/Region/Framework/Scenes/Scene.cs           | 159 -------------------
 .../World/MoneyModule/SampleMoneyModule.cs         |  15 +-
 6 files changed, 222 insertions(+), 173 deletions(-)
 create mode 100644 OpenSim/Region/Framework/Interfaces/IBuySellModule.cs

(limited to 'OpenSim/Region')

diff --git a/OpenSim/Region/CoreModules/World/Objects/BuySell/BuySellModule.cs b/OpenSim/Region/CoreModules/World/Objects/BuySell/BuySellModule.cs
index 326eea9..b0ddd8f 100644
--- a/OpenSim/Region/CoreModules/World/Objects/BuySell/BuySellModule.cs
+++ b/OpenSim/Region/CoreModules/World/Objects/BuySell/BuySellModule.cs
@@ -37,15 +37,17 @@ using OpenSim.Framework;
 using OpenSim.Region.Framework;
 using OpenSim.Region.Framework.Interfaces;
 using OpenSim.Region.Framework.Scenes;
+using OpenSim.Region.Framework.Scenes.Serialization;
 
 namespace OpenSim.Region.CoreModules.World.Objects.BuySell
 {
     [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "BuySellModule")]
-    public class BuySellModule : INonSharedRegionModule
+    public class BuySellModule : IBuySellModule, INonSharedRegionModule
     {
         private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
         
         protected Scene m_scene = null;
+        protected IDialogModule m_dialogModule;
         
         public string Name { get { return "Object BuySell Module"; } }        
         public Type ReplaceableInterface { get { return null; } }        
@@ -55,6 +57,7 @@ namespace OpenSim.Region.CoreModules.World.Objects.BuySell
         public void AddRegion(Scene scene)
         {
             m_scene = scene;
+            m_scene.RegisterModuleInterface<IBuySellModule>(this);
             m_scene.EventManager.OnNewClient += SubscribeToClientEvents;
         }
         
@@ -63,7 +66,10 @@ namespace OpenSim.Region.CoreModules.World.Objects.BuySell
             m_scene.EventManager.OnNewClient -= SubscribeToClientEvents;
         }
         
-        public void RegionLoaded(Scene scene) {}
+        public void RegionLoaded(Scene scene) 
+        {
+            m_dialogModule = scene.RequestModuleInterface<IDialogModule>();
+        }
         
         public void Close() 
         {
@@ -93,6 +99,165 @@ namespace OpenSim.Region.CoreModules.World.Objects.BuySell
             part.ParentGroup.HasGroupChanged = true;
 
             part.GetProperties(client);
+        }         
+
+        public bool BuyObject(IClientAPI remoteClient, UUID categoryID, uint localID, byte saleType)
+        {
+            SceneObjectPart part = m_scene.GetSceneObjectPart(localID);
+
+            if (part == null)
+                return false;
+
+            if (part.ParentGroup == null)
+                return false;
+
+            SceneObjectGroup group = part.ParentGroup;
+
+            switch (saleType)
+            {
+            case 1: // Sell as original (in-place sale)
+                uint effectivePerms = group.GetEffectivePermissions();
+
+                if ((effectivePerms & (uint)PermissionMask.Transfer) == 0)
+                {
+                    if (m_dialogModule != null)
+                        m_dialogModule.SendAlertToUser(remoteClient, "This item doesn't appear to be for sale");
+                    return false;
+                }
+
+                group.SetOwnerId(remoteClient.AgentId);
+                group.SetRootPartOwner(part, remoteClient.AgentId, remoteClient.ActiveGroupId);
+
+                List<SceneObjectPart> partList = new List<SceneObjectPart>(group.Children.Values);
+
+                if (m_scene.Permissions.PropagatePermissions())
+                {
+                    foreach (SceneObjectPart child in partList)
+                    {
+                        child.Inventory.ChangeInventoryOwner(remoteClient.AgentId);
+                        child.TriggerScriptChangedEvent(Changed.OWNER);
+                        child.ApplyNextOwnerPermissions();
+                    }
+                }
+
+                part.ObjectSaleType = 0;
+                part.SalePrice = 10;
+
+                group.HasGroupChanged = true;
+                part.GetProperties(remoteClient);
+                part.TriggerScriptChangedEvent(Changed.OWNER);
+                group.ResumeScripts();
+                part.ScheduleFullUpdate();
+
+                break;
+
+            case 2: // Sell a copy
+                Vector3 inventoryStoredPosition = new Vector3
+                       (((group.AbsolutePosition.X > (int)Constants.RegionSize)
+                             ? 250
+                             : group.AbsolutePosition.X)
+                        ,
+                        (group.AbsolutePosition.X > (int)Constants.RegionSize)
+                            ? 250
+                            : group.AbsolutePosition.X,
+                        group.AbsolutePosition.Z);
+
+                Vector3 originalPosition = group.AbsolutePosition;
+
+                group.AbsolutePosition = inventoryStoredPosition;
+
+                string sceneObjectXml = SceneObjectSerializer.ToOriginalXmlFormat(group);
+                group.AbsolutePosition = originalPosition;
+
+                uint perms = group.GetEffectivePermissions();
+
+                if ((perms & (uint)PermissionMask.Transfer) == 0)
+                {
+                    if (m_dialogModule != null)
+                        m_dialogModule.SendAlertToUser(remoteClient, "This item doesn't appear to be for sale");
+                    return false;
+                }
+
+                AssetBase asset = m_scene.CreateAsset(
+                    group.GetPartName(localID),
+                    group.GetPartDescription(localID),
+                    (sbyte)AssetType.Object,
+                    Utils.StringToBytes(sceneObjectXml),
+                    group.OwnerID);
+                m_scene.AssetService.Store(asset);
+
+                InventoryItemBase item = new InventoryItemBase();
+                item.CreatorId = part.CreatorID.ToString();
+
+                item.ID = UUID.Random();
+                item.Owner = remoteClient.AgentId;
+                item.AssetID = asset.FullID;
+                item.Description = asset.Description;
+                item.Name = asset.Name;
+                item.AssetType = asset.Type;
+                item.InvType = (int)InventoryType.Object;
+                item.Folder = categoryID;
+
+                uint nextPerms=(perms & 7) << 13;
+                if ((nextPerms & (uint)PermissionMask.Copy) == 0)
+                    perms &= ~(uint)PermissionMask.Copy;
+                if ((nextPerms & (uint)PermissionMask.Transfer) == 0)
+                    perms &= ~(uint)PermissionMask.Transfer;
+                if ((nextPerms & (uint)PermissionMask.Modify) == 0)
+                    perms &= ~(uint)PermissionMask.Modify;
+
+                item.BasePermissions = perms & part.NextOwnerMask;
+                item.CurrentPermissions = perms & part.NextOwnerMask;
+                item.NextPermissions = part.NextOwnerMask;
+                item.EveryOnePermissions = part.EveryoneMask &
+                                           part.NextOwnerMask;
+                item.GroupPermissions = part.GroupMask &
+                                           part.NextOwnerMask;
+                item.CurrentPermissions |= 16; // Slam!
+                item.CreationDate = Util.UnixTimeSinceEpoch();
+
+                if (m_scene.InventoryService.AddItem(item))
+                {
+                    remoteClient.SendInventoryItemCreateUpdate(item, 0);
+                }
+                else
+                {
+                    if (m_dialogModule != null)   
+                        m_dialogModule.SendAlertToUser(remoteClient, "Cannot buy now. Your inventory is unavailable");
+                    return false;
+                }
+                break;
+
+            case 3: // Sell contents
+                List<UUID> invList = part.Inventory.GetInventoryList();
+
+                bool okToSell = true;
+
+                foreach (UUID invID in invList)
+                {
+                    TaskInventoryItem item1 = part.Inventory.GetInventoryItem(invID);
+                    if ((item1.CurrentPermissions &
+                            (uint)PermissionMask.Transfer) == 0)
+                    {
+                        okToSell = false;
+                        break;
+                    }
+                }
+
+                if (!okToSell)
+                {
+                    if (m_dialogModule != null)
+                        m_dialogModule.SendAlertToUser(
+                            remoteClient, "This item's inventory doesn't appear to be for sale");
+                    return false;
+                }
+
+                if (invList.Count > 0)
+                    m_scene.MoveTaskInventoryItems(remoteClient.AgentId, part.Name, part, invList);
+                break;
+            }
+
+            return true;
         }        
     }
 }
\ No newline at end of file
diff --git a/OpenSim/Region/Framework/Interfaces/IBuySellModule.cs b/OpenSim/Region/Framework/Interfaces/IBuySellModule.cs
new file mode 100644
index 0000000..0132bae
--- /dev/null
+++ b/OpenSim/Region/Framework/Interfaces/IBuySellModule.cs
@@ -0,0 +1,47 @@
+/*
+ * Copyright (c) Contributors, http://opensimulator.org/
+ * See CONTRIBUTORS.TXT for a full list of copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in the
+ *       documentation and/or other materials provided with the distribution.
+ *     * Neither the name of the OpenSimulator Project nor the
+ *       names of its contributors may be used to endorse or promote products
+ *       derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+using OpenMetaverse;
+using OpenSim.Framework;
+
+namespace OpenSim.Region.Framework.Interfaces
+{
+    public interface IBuySellModule
+    { 
+        /// <summary>
+        /// Try to buy an object
+        /// </summary>
+        /// <param name="remoteClient"></param>
+        /// <param name="categoryID"></param>
+        /// <param name="localID"></param>
+        /// <param name="saleType"></param>
+        /// <returns>
+        /// True on a successful purchase, false on failure
+        /// </returns>
+        bool BuyObject(IClientAPI remoteClient, UUID categoryID, uint localID, byte saleType);
+    }
+}
\ No newline at end of file
diff --git a/OpenSim/Region/Framework/Interfaces/ICloudModule.cs b/OpenSim/Region/Framework/Interfaces/ICloudModule.cs
index f8a5bad..7296ac3 100644
--- a/OpenSim/Region/Framework/Interfaces/ICloudModule.cs
+++ b/OpenSim/Region/Framework/Interfaces/ICloudModule.cs
@@ -25,7 +25,6 @@
  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-
 namespace OpenSim.Region.Framework.Interfaces
 {
     public interface ICloudModule : IRegionModule
@@ -35,4 +34,4 @@ namespace OpenSim.Region.Framework.Interfaces
         /// </summary>
         float CloudCover(int x, int y, int z);
     }
-}
+}
\ No newline at end of file
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
index 01edf51..4f5a65e 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
@@ -670,7 +670,7 @@ namespace OpenSim.Region.Framework.Scenes
         /// <summary>
         /// Create a new asset data structure.
         /// </summary>
-        private AssetBase CreateAsset(string name, string description, sbyte assetType, byte[] data, UUID creatorID)
+        public AssetBase CreateAsset(string name, string description, sbyte assetType, byte[] data, UUID creatorID)
         {
             AssetBase asset = new AssetBase(UUID.Random(), name, assetType, creatorID.ToString());
             asset.Description = description;
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index b6def14..5f6748e 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -4486,165 +4486,6 @@ namespace OpenSim.Region.Framework.Scenes
             return inv.NeedSceneCacheClear(agentID, this);
         }
 
-        public bool PerformObjectBuy(IClientAPI remoteClient, UUID categoryID,
-                uint localID, byte saleType)
-        {
-            SceneObjectPart part = GetSceneObjectPart(localID);
-
-            if (part == null)
-                return false;
-
-            if (part.ParentGroup == null)
-                return false;
-
-            SceneObjectGroup group = part.ParentGroup;
-
-            switch (saleType)
-            {
-            case 1: // Sell as original (in-place sale)
-                uint effectivePerms=group.GetEffectivePermissions();
-
-                if ((effectivePerms & (uint)PermissionMask.Transfer) == 0)
-                {
-                    m_dialogModule.SendAlertToUser(remoteClient, "This item doesn't appear to be for sale");
-                    return false;
-                }
-
-                group.SetOwnerId(remoteClient.AgentId);
-                group.SetRootPartOwner(part, remoteClient.AgentId,
-                        remoteClient.ActiveGroupId);
-
-                List<SceneObjectPart> partList =
-                    new List<SceneObjectPart>(group.Children.Values);
-
-                if (Permissions.PropagatePermissions())
-                {
-                    foreach (SceneObjectPart child in partList)
-                    {
-                        child.Inventory.ChangeInventoryOwner(remoteClient.AgentId);
-                        child.TriggerScriptChangedEvent(Changed.OWNER);
-                        child.ApplyNextOwnerPermissions();
-                    }
-                }
-
-                part.ObjectSaleType = 0;
-                part.SalePrice = 10;
-
-                group.HasGroupChanged = true;
-                part.GetProperties(remoteClient);
-                part.TriggerScriptChangedEvent(Changed.OWNER);
-                group.ResumeScripts();
-                part.ScheduleFullUpdate();
-
-                break;
-
-            case 2: // Sell a copy
-
-
-                Vector3 inventoryStoredPosition = new Vector3
-                       (((group.AbsolutePosition.X > (int)Constants.RegionSize)
-                             ? 250
-                             : group.AbsolutePosition.X)
-                        ,
-                        (group.AbsolutePosition.X > (int)Constants.RegionSize)
-                            ? 250
-                            : group.AbsolutePosition.X,
-                        group.AbsolutePosition.Z);
-
-                Vector3 originalPosition = group.AbsolutePosition;
-
-                group.AbsolutePosition = inventoryStoredPosition;
-
-                string sceneObjectXml = SceneObjectSerializer.ToOriginalXmlFormat(group);
-                group.AbsolutePosition = originalPosition;
-
-                uint perms=group.GetEffectivePermissions();
-
-                if ((perms & (uint)PermissionMask.Transfer) == 0)
-                {
-                    m_dialogModule.SendAlertToUser(remoteClient, "This item doesn't appear to be for sale");
-                    return false;
-                }
-
-                AssetBase asset = CreateAsset(
-                    group.GetPartName(localID),
-                    group.GetPartDescription(localID),
-                    (sbyte)AssetType.Object,
-                    Utils.StringToBytes(sceneObjectXml),
-                    group.OwnerID);
-                AssetService.Store(asset);
-
-                InventoryItemBase item = new InventoryItemBase();
-                item.CreatorId = part.CreatorID.ToString();
-
-                item.ID = UUID.Random();
-                item.Owner = remoteClient.AgentId;
-                item.AssetID = asset.FullID;
-                item.Description = asset.Description;
-                item.Name = asset.Name;
-                item.AssetType = asset.Type;
-                item.InvType = (int)InventoryType.Object;
-                item.Folder = categoryID;
-
-                uint nextPerms=(perms & 7) << 13;
-                if ((nextPerms & (uint)PermissionMask.Copy) == 0)
-                    perms &= ~(uint)PermissionMask.Copy;
-                if ((nextPerms & (uint)PermissionMask.Transfer) == 0)
-                    perms &= ~(uint)PermissionMask.Transfer;
-                if ((nextPerms & (uint)PermissionMask.Modify) == 0)
-                    perms &= ~(uint)PermissionMask.Modify;
-
-                item.BasePermissions = perms & part.NextOwnerMask;
-                item.CurrentPermissions = perms & part.NextOwnerMask;
-                item.NextPermissions = part.NextOwnerMask;
-                item.EveryOnePermissions = part.EveryoneMask &
-                                           part.NextOwnerMask;
-                item.GroupPermissions = part.GroupMask &
-                                           part.NextOwnerMask;
-                item.CurrentPermissions |= 16; // Slam!
-                item.CreationDate = Util.UnixTimeSinceEpoch();
-
-                if (InventoryService.AddItem(item))
-                    remoteClient.SendInventoryItemCreateUpdate(item, 0);
-                else
-                {
-                    m_dialogModule.SendAlertToUser(remoteClient, "Cannot buy now. Your inventory is unavailable");
-                    return false;
-                }
-                break;
-
-            case 3: // Sell contents
-                List<UUID> invList = part.Inventory.GetInventoryList();
-
-                bool okToSell = true;
-
-                foreach (UUID invID in invList)
-                {
-                    TaskInventoryItem item1 = part.Inventory.GetInventoryItem(invID);
-                    if ((item1.CurrentPermissions &
-                            (uint)PermissionMask.Transfer) == 0)
-                    {
-                        okToSell = false;
-                        break;
-                    }
-                }
-
-                if (!okToSell)
-                {
-                    m_dialogModule.SendAlertToUser(
-                        remoteClient, "This item's inventory doesn't appear to be for sale");
-                    return false;
-                }
-
-                if (invList.Count > 0)
-                    MoveTaskInventoryItems(remoteClient.AgentId, part.Name,
-                            part, invList);
-                break;
-            }
-
-            return true;
-        }
-
         public void CleanTempObjects()
         {
             List<EntityBase> objs = GetEntities();
diff --git a/OpenSim/Region/OptionalModules/World/MoneyModule/SampleMoneyModule.cs b/OpenSim/Region/OptionalModules/World/MoneyModule/SampleMoneyModule.cs
index 69ab33d..61cbb90 100644
--- a/OpenSim/Region/OptionalModules/World/MoneyModule/SampleMoneyModule.cs
+++ b/OpenSim/Region/OptionalModules/World/MoneyModule/SampleMoneyModule.cs
@@ -72,8 +72,6 @@ namespace OpenSim.Region.OptionalModules.World.MoneyModule
 
         private IConfigSource m_gConfig;
 
-
-
         /// <summary>
         /// Region UUIDS indexed by AgentID
         /// </summary>
@@ -267,13 +265,11 @@ namespace OpenSim.Region.OptionalModules.World.MoneyModule
                 PriceGroupCreate = startupConfig.GetInt("PriceGroupCreate", -1);
                 m_sellEnabled = startupConfig.GetBoolean("SellEnabled", false);
             }
-
         }
 
         private void GetClientFunds(IClientAPI client)
         {
             CheckExistAndRefreshFunds(client.AgentId);
-
         }
 
         /// <summary>
@@ -815,7 +811,10 @@ namespace OpenSim.Region.OptionalModules.World.MoneyModule
                 remoteClient.SendAgentAlertMessage("Unable to buy now. The object was not found.", false);
                 return;
             }
-            s.PerformObjectBuy(remoteClient, categoryID, localID, saleType);
+            
+            IBuySellModule module = s.RequestModuleInterface<IBuySellModule>();
+            if (module != null)
+                module.BuyObject(remoteClient, categoryID, localID, saleType);
         }
     }
 
@@ -825,7 +824,5 @@ namespace OpenSim.Region.OptionalModules.World.MoneyModule
         RegionMoneyRequest = 1,
         Gift = 2,
         Purchase = 3
-    }
-
-  
-}
+    }  
+}
\ No newline at end of file
-- 
cgit v1.1