From e906dd3d28a3cb4dfada36daccfd8900f0e844b5 Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Fri, 5 Mar 2010 22:29:51 +0000
Subject: add initial UserGrid service classes as per diva's direction this
 will initially store home location data instead of the presence service
 compiles but not enough to actually test yet

---
 OpenSim/Data/IUserGridData.cs                      |  50 ++++++++
 OpenSim/Data/MySQL/MySQLGenericTableHandler.cs     |   3 +-
 OpenSim/Data/MySQL/MySQLUserGridData.cs            |  64 ++++++++++
 .../UserGrid/LocalUserGridServiceConnector.cs      | 139 +++++++++++++++++++++
 .../UserGrid/UserGridServiceConnector.cs           |  38 ++++++
 OpenSim/Services/Interfaces/IUserGridService.cs    |  75 +++++++++++
 .../Services/UserAccountService/UserGridService.cs |  76 +++++++++++
 .../UserAccountService/UserGridServiceBase.cs      |  82 ++++++++++++
 8 files changed, 525 insertions(+), 2 deletions(-)
 create mode 100644 OpenSim/Data/IUserGridData.cs
 create mode 100644 OpenSim/Data/MySQL/MySQLUserGridData.cs
 create mode 100644 OpenSim/Region/CoreModules/ServiceConnectorsOut/UserGrid/LocalUserGridServiceConnector.cs
 create mode 100644 OpenSim/Services/Connectors/UserGrid/UserGridServiceConnector.cs
 create mode 100644 OpenSim/Services/Interfaces/IUserGridService.cs
 create mode 100644 OpenSim/Services/UserAccountService/UserGridService.cs
 create mode 100644 OpenSim/Services/UserAccountService/UserGridServiceBase.cs

(limited to 'OpenSim')

diff --git a/OpenSim/Data/IUserGridData.cs b/OpenSim/Data/IUserGridData.cs
new file mode 100644
index 0000000..6f7467e
--- /dev/null
+++ b/OpenSim/Data/IUserGridData.cs
@@ -0,0 +1,50 @@
+/*
+ * 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 System;
+using System.Collections.Generic;
+using OpenMetaverse;
+using OpenSim.Framework;
+
+namespace OpenSim.Data
+{
+    // This MUST be a ref type!
+    public class UserGridData
+    {
+        public string UserID;
+        public Dictionary<string, string> Data;
+    }
+
+    /// <summary>
+    /// An interface for connecting to the user grid datastore
+    /// </summary>
+    public interface IUserGridData 
+    {
+        UserGridData GetUserGridData(string userID);        
+        bool StoreUserGridData(UserGridData data);
+    }
+}
\ No newline at end of file
diff --git a/OpenSim/Data/MySQL/MySQLGenericTableHandler.cs b/OpenSim/Data/MySQL/MySQLGenericTableHandler.cs
index b170dde..756b42d 100644
--- a/OpenSim/Data/MySQL/MySQLGenericTableHandler.cs
+++ b/OpenSim/Data/MySQL/MySQLGenericTableHandler.cs
@@ -197,8 +197,7 @@ namespace OpenSim.Data.MySQL
         public virtual T[] Get(string where)
         {
             using (MySqlCommand cmd = new MySqlCommand())
-            {
-            
+            {            
                 string query = String.Format("select * from {0} where {1}",
                                              m_Realm, where);
                 
diff --git a/OpenSim/Data/MySQL/MySQLUserGridData.cs b/OpenSim/Data/MySQL/MySQLUserGridData.cs
new file mode 100644
index 0000000..7209b18
--- /dev/null
+++ b/OpenSim/Data/MySQL/MySQLUserGridData.cs
@@ -0,0 +1,64 @@
+/*
+ * 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 System;
+using System.Collections.Generic;
+using System.Data;
+using System.Reflection;
+using System.Threading;
+using log4net;
+using OpenMetaverse;
+using OpenSim.Framework;
+using MySql.Data.MySqlClient;
+
+namespace OpenSim.Data.MySQL
+{
+    /// <summary>
+    /// A MySQL Interface for user grid data
+    /// </summary>
+    public class MySQLUserGridData : MySQLGenericTableHandler<UserGridData>, IUserGridData
+    {
+//        private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
+
+        public MySQLUserGridData(string connectionString, string realm) : base(connectionString, realm, "UserGrid") {}
+
+        public UserGridData GetUserGridData(string userID)
+        {
+            UserGridData[] ret = Get("UserID", userID);
+
+            if (ret.Length == 0)
+                return null;
+
+            return ret[0];
+        }        
+
+        public bool StoreUserGridData(UserGridData data)
+        {
+            return Store(data);
+        }
+    }
+}
\ No newline at end of file
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/UserGrid/LocalUserGridServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/UserGrid/LocalUserGridServiceConnector.cs
new file mode 100644
index 0000000..f4309fe
--- /dev/null
+++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/UserGrid/LocalUserGridServiceConnector.cs
@@ -0,0 +1,139 @@
+/*
+ * 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 System;
+using System.Collections.Generic;
+using System.Reflection;
+using log4net;
+using Nini.Config;
+using OpenSim.Region.Framework.Interfaces;
+using OpenSim.Region.Framework.Scenes;
+using OpenSim.Server.Base;
+using OpenSim.Services.Interfaces;
+
+using OpenMetaverse;
+
+namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.UserGrid
+{
+    public class LocalUserGridServicesConnector : ISharedRegionModule, IUserGridService
+    {
+        private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
+
+        private IUserGridService m_service;
+
+        private bool m_Enabled = false;
+
+        public Type ReplaceableInterface 
+        {
+            get { return null; }
+        }
+
+        public string Name
+        {
+            get { return "LocalUserGridServicesConnector"; }
+        }
+
+        public void Initialise(IConfigSource source)
+        {
+            IConfig moduleConfig = source.Configs["Modules"];
+            if (moduleConfig != null)
+            {
+                string name = moduleConfig.GetString("UserGridServices", "");
+                if (name == Name)
+                {
+                    IConfig userConfig = source.Configs["UserGridService"];
+                    if (userConfig == null)
+                    {
+                        m_log.Error("[LOCAL USER GRID SERVICE CONNECTOR]: UserGridService missing from ini files");
+                        return;
+                    }
+
+                    string serviceDll = userConfig.GetString("LocalServiceModule", String.Empty);
+
+                    if (serviceDll == String.Empty)
+                    {
+                        m_log.Error("[LOCAL USER GRID SERVICE CONNECTOR]: No LocalServiceModule named in section UserGridService");
+                        return;
+                    }
+
+                    Object[] args = new Object[] { source };
+                    m_service = ServerUtils.LoadPlugin<IUserGridService>(serviceDll, args);
+
+                    if (m_service == null)
+                    {
+                        m_log.Error("[LOCAL USER GRID SERVICE CONNECTOR]: Can't load UserGrid service");
+                        return;
+                    }
+                    m_Enabled = true;
+                    m_log.Info("[LOCAL USER GRID SERVICE CONNECTOR]: Local UserGrid connector enabled");
+                }
+            }
+        }
+
+        public void PostInitialise()
+        {
+            if (!m_Enabled)
+                return;
+        }
+
+        public void Close()
+        {
+            if (!m_Enabled)
+                return;
+        }
+
+        public void AddRegion(Scene scene)
+        {
+            if (!m_Enabled)
+                return;
+
+            scene.RegisterModuleInterface<IUserGridService>(m_service);
+        }
+
+        public void RemoveRegion(Scene scene)
+        {
+            if (!m_Enabled)
+                return;
+        }
+
+        public void RegionLoaded(Scene scene)
+        {
+            if (!m_Enabled)
+                return;
+        }
+
+        public UserGridInfo GetUserGridInfo(string userID)
+        {
+            return m_service.GetUserGridInfo(userID);
+        }
+        
+        public bool StoreUserGridInfo(UserGridInfo info)
+        {
+            return m_service.StoreUserGridInfo(info);
+        }
+    }
+}
\ No newline at end of file
diff --git a/OpenSim/Services/Connectors/UserGrid/UserGridServiceConnector.cs b/OpenSim/Services/Connectors/UserGrid/UserGridServiceConnector.cs
new file mode 100644
index 0000000..3aa8940
--- /dev/null
+++ b/OpenSim/Services/Connectors/UserGrid/UserGridServiceConnector.cs
@@ -0,0 +1,38 @@
+/*
+ * 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 System;
+
+namespace OpenSim.Services.Connectors
+{     
+    public class UserGridServiceConnector
+    {       
+        public UserGridServiceConnector()
+        {
+        }
+    }
+}
diff --git a/OpenSim/Services/Interfaces/IUserGridService.cs b/OpenSim/Services/Interfaces/IUserGridService.cs
new file mode 100644
index 0000000..50134e0
--- /dev/null
+++ b/OpenSim/Services/Interfaces/IUserGridService.cs
@@ -0,0 +1,75 @@
+/*
+ * 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 System;
+using System.Collections.Generic;
+using OpenMetaverse;
+
+namespace OpenSim.Services.Interfaces
+{
+    /// <summary>
+    /// Records user information specific to a grid but which is not part of a user's account.
+    /// </summary>
+    public class UserGridInfo
+    {
+        public string UserID;
+        public UUID HomeRegionID;
+        public Vector3 HomePosition;
+        public Vector3 HomeLookAt;
+
+        public UserGridInfo() {}
+        
+        public UserGridInfo(Dictionary<string, object> kvp)
+        {
+            if (kvp.ContainsKey("UserID"))
+                UserID = kvp["UserID"].ToString();
+            if (kvp.ContainsKey("HomeRegionID"))
+                UUID.TryParse(kvp["HomeRegionID"].ToString(), out HomeRegionID);
+            if (kvp.ContainsKey("HomePosition"))
+                Vector3.TryParse(kvp["HomePosition"].ToString(), out HomePosition);
+            if (kvp.ContainsKey("HomeLookAt"))
+                Vector3.TryParse(kvp["HomeLookAt"].ToString(), out HomeLookAt);
+        }
+
+        public Dictionary<string, object> ToKeyValuePairs()
+        {
+            Dictionary<string, object> result = new Dictionary<string, object>();
+            result["UserID"] = UserID;
+            result["HomeRegionID"] = HomeRegionID.ToString();
+            result["HomePosition"] = HomePosition.ToString();
+            result["HomeLookAt"] = HomeLookAt.ToString();
+
+            return result;
+        }
+    }
+    
+    public interface IUserGridService
+    {
+        UserGridInfo GetUserGridInfo(string userID);
+        bool StoreUserGridInfo(UserGridInfo info);
+    }
+}
\ No newline at end of file
diff --git a/OpenSim/Services/UserAccountService/UserGridService.cs b/OpenSim/Services/UserAccountService/UserGridService.cs
new file mode 100644
index 0000000..2d28b33
--- /dev/null
+++ b/OpenSim/Services/UserAccountService/UserGridService.cs
@@ -0,0 +1,76 @@
+/*
+ * 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 System;
+using System.Collections.Generic;
+using System.Reflection;
+using Nini.Config;
+using OpenSim.Data;
+using OpenSim.Services.Interfaces;
+using OpenSim.Framework.Console;
+using GridRegion = OpenSim.Services.Interfaces.GridRegion;
+
+using OpenMetaverse;
+using log4net;
+
+namespace OpenSim.Services.UserAccountService
+{
+    public class UserGridService : UserGridServiceBase, IUserGridService
+    {
+        private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
+
+        public UserGridService(IConfigSource config) : base(config) 
+        {
+            m_log.Debug("[USER GRID SERVICE]: Starting user grid service");
+        }
+
+        public UserGridInfo GetUserGridInfo(string userID)
+        {
+            UserGridData d = m_Database.GetUserGridData(userID);
+            
+            UserGridInfo info = new UserGridInfo();
+            info.UserID = d.UserID;
+            info.HomeRegionID = new UUID(d.Data["HomeRegionID"]);
+            info.HomePosition = Vector3.Parse(d.Data["HomePosition"]);
+            info.HomeLookAt = Vector3.Parse(d.Data["HomeLookAt"]);
+
+            return info;            
+        }
+        
+        public bool StoreUserGridInfo(UserGridInfo info)
+        {
+            UserGridData d = new UserGridData();
+
+            d.Data["UserID"] = info.UserID;
+            d.Data["HomeRegionID"] = info.HomeRegionID.ToString();
+            d.Data["HomePosition"] = info.HomePosition.ToString();
+            d.Data["HomeLookAt"] = info.HomeLookAt.ToString();
+
+            return m_Database.StoreUserGridData(d);
+        }
+    }
+}
\ No newline at end of file
diff --git a/OpenSim/Services/UserAccountService/UserGridServiceBase.cs b/OpenSim/Services/UserAccountService/UserGridServiceBase.cs
new file mode 100644
index 0000000..80aaa49
--- /dev/null
+++ b/OpenSim/Services/UserAccountService/UserGridServiceBase.cs
@@ -0,0 +1,82 @@
+/*
+ * 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 System;
+using System.Reflection;
+using Nini.Config;
+using OpenSim.Framework;
+using OpenSim.Data;
+using OpenSim.Services.Interfaces;
+using OpenSim.Services.Base;
+
+namespace OpenSim.Services.UserAccountService
+{
+    public class UserGridServiceBase : ServiceBase
+    {
+        protected IUserGridData m_Database = null;
+
+        public UserGridServiceBase(IConfigSource config) : base(config)
+        {
+            string dllName = String.Empty;
+            string connString = String.Empty;
+            string realm = "UserGrid";
+
+            //
+            // Try reading the [DatabaseService] section, if it exists
+            //
+            IConfig dbConfig = config.Configs["DatabaseService"];
+            if (dbConfig != null)
+            {
+                if (dllName == String.Empty)
+                    dllName = dbConfig.GetString("StorageProvider", String.Empty);
+                if (connString == String.Empty)
+                    connString = dbConfig.GetString("ConnectionString", String.Empty);
+            }
+
+            //
+            // [PresenceService] section overrides [DatabaseService], if it exists
+            //
+            IConfig presenceConfig = config.Configs["PresenceService"];
+            if (presenceConfig != null)
+            {
+                dllName = presenceConfig.GetString("StorageProvider", dllName);
+                connString = presenceConfig.GetString("ConnectionString", connString);
+                realm = presenceConfig.GetString("Realm", realm);
+            }
+            
+            //
+            // We tried, but this doesn't exist. We can't proceed.
+            //
+            if (dllName.Equals(String.Empty))
+                throw new Exception("No StorageProvider configured");
+
+            m_Database = LoadPlugin<IUserGridData>(dllName, new Object[] { connString, realm });
+            if (m_Database == null)
+                throw new Exception("Could not find a storage interface in the given module " + dllName);
+        }
+    }
+}
\ No newline at end of file
-- 
cgit v1.1


From 60553e62a3f576b8bf6ab88a83b2d4550bd69d2b Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Fri, 5 Mar 2010 23:18:47 +0000
Subject: refactor: begin to move attachments code into a region module

---
 .../Avatar/Attachments/AttachmentsModule.cs        | 141 +++++++++++++++++++++
 .../Framework/Interfaces/IAttachmentsModule.cs     |  49 +++++++
 OpenSim/Region/Framework/Scenes/Scene.Inventory.cs |  15 ---
 OpenSim/Region/Framework/Scenes/Scene.cs           |   8 +-
 OpenSim/Region/Framework/Scenes/SceneGraph.cs      |  86 +------------
 .../Shared/Api/Implementation/LSL_Api.cs           |   8 +-
 6 files changed, 205 insertions(+), 102 deletions(-)
 create mode 100644 OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs
 create mode 100644 OpenSim/Region/Framework/Interfaces/IAttachmentsModule.cs

(limited to 'OpenSim')

diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs
new file mode 100644
index 0000000..103a813
--- /dev/null
+++ b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs
@@ -0,0 +1,141 @@
+/*
+ * 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 System.Reflection;
+using log4net;
+using Nini.Config;
+using OpenMetaverse;
+using OpenSim.Framework;
+using OpenSim.Region.Framework;
+using OpenSim.Region.Framework.Interfaces;
+using OpenSim.Region.Framework.Scenes;
+
+namespace OpenSim.Region.CoreModules.Avatar.Attachments
+{        
+    public class AttachmentsModule : IAttachmentsModule, IRegionModule
+    {
+        private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
+        
+        protected Scene m_scene = null;
+
+        public void Initialise(Scene scene, IConfigSource source)
+        {
+            scene.RegisterModuleInterface<IAttachmentsModule>(this);
+            m_scene = scene;
+        }
+
+        public void PostInitialise()
+        {
+        }
+
+        public void Close()
+        {
+        }
+
+        public string Name
+        {
+            get { return "Attachments Module"; }
+        }
+
+        public bool IsSharedModule
+        {
+            get { return false; }
+        }
+
+        public bool AttachObject(
+            IClientAPI remoteClient, uint objectLocalID, uint AttachmentPt, Quaternion rot, Vector3 attachPos, bool silent)
+        {
+            SceneObjectGroup group = m_scene.GetGroupByPrim(objectLocalID);
+            if (group != null)
+            {
+                if (m_scene.Permissions.CanTakeObject(group.UUID, remoteClient.AgentId))
+                {
+                    // If the attachment point isn't the same as the one previously used
+                    // set it's offset position = 0 so that it appears on the attachment point
+                    // and not in a weird location somewhere unknown.
+                    if (AttachmentPt != 0 && AttachmentPt != (uint)group.GetAttachmentPoint())
+                    {
+                        attachPos = Vector3.Zero;
+                    }
+
+                    // AttachmentPt 0 means the client chose to 'wear' the attachment.
+                    if (AttachmentPt == 0)
+                    {
+                        // Check object for stored attachment point
+                        AttachmentPt = (uint)group.GetAttachmentPoint();
+                    }
+
+                    // if we still didn't find a suitable attachment point.......
+                    if (AttachmentPt == 0)
+                    {
+                        // Stick it on left hand with Zero Offset from the attachment point.
+                        AttachmentPt = (uint)AttachmentPoint.LeftHand;
+                        attachPos = Vector3.Zero;
+                    }
+
+                    group.SetAttachmentPoint((byte)AttachmentPt);
+                    group.AbsolutePosition = attachPos;
+
+                    // Saves and gets itemID
+                    UUID itemId;
+
+                    if (group.GetFromItemID() == UUID.Zero)
+                    {
+                        m_scene.attachObjectAssetStore(remoteClient, group, remoteClient.AgentId, out itemId);
+                    }
+                    else
+                    {
+                        itemId = group.GetFromItemID();
+                    }
+
+                    m_scene.AttachObject(remoteClient, AttachmentPt, itemId, group);
+
+                    group.AttachToAgent(remoteClient.AgentId, AttachmentPt, attachPos, silent);
+                    
+                    // In case it is later dropped again, don't let
+                    // it get cleaned up
+                    group.RootPart.RemFlag(PrimFlags.TemporaryOnRez);
+                    group.HasGroupChanged = false;
+                }
+                else
+                {
+                    remoteClient.SendAgentAlertMessage(
+                        "You don't have sufficient permissions to attach this object", false);
+                    
+                    return false;
+                }
+            }
+            else
+            {
+                m_log.DebugFormat("[SCENE GRAPH]: AttachObject found no such scene object {0}", objectLocalID);
+                return false;
+            }
+
+            return true;
+        }        
+    }
+}
\ No newline at end of file
diff --git a/OpenSim/Region/Framework/Interfaces/IAttachmentsModule.cs b/OpenSim/Region/Framework/Interfaces/IAttachmentsModule.cs
new file mode 100644
index 0000000..c965bcf
--- /dev/null
+++ b/OpenSim/Region/Framework/Interfaces/IAttachmentsModule.cs
@@ -0,0 +1,49 @@
+/*
+ * 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 OpenSim 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 System;
+using OpenMetaverse;
+using OpenSim.Framework;
+
+namespace OpenSim.Region.Framework.Interfaces
+{        
+    public interface IAttachmentsModule
+    {
+        /// <summary>
+        /// Attach an object to an avatar.
+        /// </summary>
+        /// <param name="controllingClient"></param>
+        /// <param name="localID"></param>
+        /// <param name="attachPoint"></param>
+        /// <param name="rot"></param>
+        /// <param name="pos"></param>
+        /// <param name="silent"></param>
+        /// <returns>true if the object was successfully attached, false otherwise</returns>        
+        bool AttachObject(
+            IClientAPI controllingClient, uint localID, uint attachPoint, Quaternion rot, Vector3 pos, bool silent);
+    }
+}
\ 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 5f3cd8c..474fba9 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
@@ -1903,21 +1903,6 @@ namespace OpenSim.Region.Framework.Scenes
         }
 
         /// <summary>
-        /// Attach an object.
-        /// </summary>
-        /// <param name="controllingClient"></param>
-        /// <param name="localID"></param>
-        /// <param name="attachPoint"></param>
-        /// <param name="rot"></param>
-        /// <param name="pos"></param>
-        /// <param name="silent"></param>
-        /// <returns>true if the object was successfully attached, false otherwise</returns>
-        public bool AttachObject(IClientAPI controllingClient, uint localID, uint attachPoint, Quaternion rot, Vector3 pos, bool silent)
-        {
-            return m_sceneGraph.AttachObject(controllingClient, localID, attachPoint, rot, pos, silent);
-        }
-
-        /// <summary>
         /// This registers the item as attached in a user's inventory
         /// </summary>
         /// <param name="remoteClient"></param>
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index a880fe7..c83132f 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -307,6 +307,7 @@ namespace OpenSim.Region.Framework.Scenes
         
         protected IXMLRPC m_xmlrpcModule;
         protected IWorldComm m_worldCommModule;
+        public IAttachmentsModule AttachmentsModule { get; set; }
         protected IAvatarFactory m_AvatarFactory;
         public IAvatarFactory AvatarFactory
         {
@@ -1215,6 +1216,7 @@ namespace OpenSim.Region.Framework.Scenes
             m_worldCommModule = RequestModuleInterface<IWorldComm>();
             XferManager = RequestModuleInterface<IXfer>();
             m_AvatarFactory = RequestModuleInterface<IAvatarFactory>();
+            AttachmentsModule = RequestModuleInterface<IAttachmentsModule>();
             m_serialiser = RequestModuleInterface<IRegionSerialiserModule>();
             m_dialogModule = RequestModuleInterface<IDialogModule>();
             m_capsModule = RequestModuleInterface<ICapabilitiesModule>();
@@ -2405,9 +2407,11 @@ namespace OpenSim.Region.Framework.Scenes
                     //grp.SetFromAssetID(grp.RootPart.LastOwnerID);
                     m_log.DebugFormat(
                         "[ATTACHMENT]: Attach to avatar {0} at position {1}", sp.UUID, grp.AbsolutePosition);
+
+                    if (AttachmentsModule != null)
+                        AttachmentsModule.AttachObject(
+                            sp.ControllingClient, grp.LocalId, (uint)0, grp.GroupRotation, grp.AbsolutePosition, false);
                     
-                    AttachObject(
-                        sp.ControllingClient, grp.LocalId, (uint)0, grp.GroupRotation, grp.AbsolutePosition, false);
                     RootPrim.RemFlag(PrimFlags.TemporaryOnRez);
                     grp.SendGroupFullUpdate();
                 }
diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
index 22613e9..48744d7 100644
--- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
@@ -504,7 +504,7 @@ namespace OpenSim.Region.Framework.Scenes
                 return;
 
             // Calls attach with a Zero position
-            if (AttachObject(remoteClient, objectLocalID, AttachmentPt, rot, Vector3.Zero, false))
+            if (m_parentScene.AttachmentsModule.AttachObject(remoteClient, objectLocalID, AttachmentPt, rot, Vector3.Zero, false))
             {
                 m_parentScene.SendAttachEvent(objectLocalID, part.ParentGroup.GetFromItemID(), remoteClient.AgentId);
     
@@ -547,8 +547,10 @@ namespace OpenSim.Region.Framework.Scenes
                     if (AttachmentPt != 0 && AttachmentPt != objatt.GetAttachmentPoint())
                         tainted = true;
 
-                    AttachObject(remoteClient, objatt.LocalId, AttachmentPt, Quaternion.Identity, objatt.AbsolutePosition, false);
+                    m_parentScene.AttachmentsModule.AttachObject(
+                        remoteClient, objatt.LocalId, AttachmentPt, Quaternion.Identity, objatt.AbsolutePosition, false);
                     //objatt.ScheduleGroupForFullUpdate();
+                    
                     if (tainted)
                         objatt.HasGroupChanged = true;
 
@@ -605,86 +607,6 @@ namespace OpenSim.Region.Framework.Scenes
             }
         }
 
-        /// <summary>
-        /// Attach a scene object to an avatar.
-        /// </summary>
-        /// <param name="remoteClient"></param>
-        /// <param name="objectLocalID"></param>
-        /// <param name="AttachmentPt"></param>
-        /// <param name="rot"></param>
-        /// <param name="attachPos"></param>
-        /// <param name="silent"></param>
-        /// <returns>true if the attachment was successful, false otherwise</returns>
-        protected internal bool AttachObject(
-            IClientAPI remoteClient, uint objectLocalID, uint AttachmentPt, Quaternion rot, Vector3 attachPos, bool silent)
-        {
-            SceneObjectGroup group = GetGroupByPrim(objectLocalID);
-            if (group != null)
-            {
-                if (m_parentScene.Permissions.CanTakeObject(group.UUID, remoteClient.AgentId))
-                {
-                    // If the attachment point isn't the same as the one previously used
-                    // set it's offset position = 0 so that it appears on the attachment point
-                    // and not in a weird location somewhere unknown.
-                    if (AttachmentPt != 0 && AttachmentPt != (uint)group.GetAttachmentPoint())
-                    {
-                        attachPos = Vector3.Zero;
-                    }
-
-                    // AttachmentPt 0 means the client chose to 'wear' the attachment.
-                    if (AttachmentPt == 0)
-                    {
-                        // Check object for stored attachment point
-                        AttachmentPt = (uint)group.GetAttachmentPoint();
-                    }
-
-                    // if we still didn't find a suitable attachment point.......
-                    if (AttachmentPt == 0)
-                    {
-                        // Stick it on left hand with Zero Offset from the attachment point.
-                        AttachmentPt = (uint)AttachmentPoint.LeftHand;
-                        attachPos = Vector3.Zero;
-                    }
-
-                    group.SetAttachmentPoint((byte)AttachmentPt);
-                    group.AbsolutePosition = attachPos;
-
-                    // Saves and gets itemID
-                    UUID itemId;
-
-                    if (group.GetFromItemID() == UUID.Zero)
-                    {
-                        m_parentScene.attachObjectAssetStore(remoteClient, group, remoteClient.AgentId, out itemId);
-                    }
-                    else
-                    {
-                        itemId = group.GetFromItemID();
-                    }
-
-                    m_parentScene.AttachObject(remoteClient, AttachmentPt, itemId, group);
-
-                    group.AttachToAgent(remoteClient.AgentId, AttachmentPt, attachPos, silent);
-                    // In case it is later dropped again, don't let
-                    // it get cleaned up
-                    //
-                    group.RootPart.RemFlag(PrimFlags.TemporaryOnRez);
-                    group.HasGroupChanged = false;
-                }
-                else
-                {
-                    remoteClient.SendAgentAlertMessage("You don't have sufficient permissions to attach this object", false);
-                    return false;
-                }
-            }
-            else
-            {
-                m_log.DebugFormat("[SCENE GRAPH]: AttachObject found no such scene object {0}", objectLocalID);
-                return false;
-            }
-
-            return true;
-        }
-
         protected internal ScenePresence CreateAndAddChildScenePresence(IClientAPI client, AvatarAppearance appearance)
         {
             ScenePresence newAvatar = null;
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
index 0134b03..0eee147 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
@@ -2896,9 +2896,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
 
                 ScenePresence presence = World.GetScenePresence(m_host.OwnerID);
 
-                m_ScriptEngine.World.AttachObject(presence.ControllingClient,
-                        grp.LocalId, (uint)attachment, Quaternion.Identity,
-                        Vector3.Zero, false);
+                IAttachmentsModule attachmentsModule = m_ScriptEngine.World.AttachmentsModule;
+                if (attachmentsModule != null)
+                    attachmentsModule.AttachObject(
+                        presence.ControllingClient, grp.LocalId, 
+                        (uint)attachment, Quaternion.Identity, Vector3.Zero, false);
             }
         }
 
-- 
cgit v1.1


From b72c2dc6e88fa2ea6bb97e0b32d0cdbb2ea78c4a Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Fri, 5 Mar 2010 23:29:24 +0000
Subject: refactor: move user inventory side of RezSingleAttachment to module

---
 .../Avatar/Attachments/AttachmentsModule.cs        | 30 ++++++++++++++++++++++
 .../Framework/Interfaces/IAttachmentsModule.cs     | 12 +++++++++
 OpenSim/Region/Framework/Scenes/Scene.Inventory.cs | 30 +---------------------
 3 files changed, 43 insertions(+), 29 deletions(-)

(limited to 'OpenSim')

diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs
index 103a813..0ea1f63 100644
--- a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs
@@ -137,5 +137,35 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
 
             return true;
         }        
+
+        /// <summary>
+        /// Update the user inventory to reflect an attachment
+        /// </summary>
+        /// <param name="att"></param>
+        /// <param name="remoteClient"></param>
+        /// <param name="itemID"></param>
+        /// <param name="AttachmentPt"></param>
+        /// <returns></returns>
+        public UUID SetAttachmentInventoryStatus(
+            SceneObjectGroup att, IClientAPI remoteClient, UUID itemID, uint AttachmentPt)
+        {
+            m_log.DebugFormat(
+                "[USER INVENTORY]: Updating inventory of {0} to show attachment of {1} (item ID {2})", 
+                remoteClient.Name, att.Name, itemID);
+            
+            if (!att.IsDeleted)
+                AttachmentPt = att.RootPart.AttachmentPoint;
+
+            ScenePresence presence;
+            if (m_scene.TryGetAvatar(remoteClient.AgentId, out presence))
+            {
+                InventoryItemBase item = new InventoryItemBase(itemID, remoteClient.AgentId);
+                item = m_scene.InventoryService.GetItem(item);
+
+                presence.Appearance.SetAttachment((int)AttachmentPt, itemID, item.AssetID /*att.UUID*/);
+            }
+            
+            return att.UUID;
+        }
     }
 }
\ No newline at end of file
diff --git a/OpenSim/Region/Framework/Interfaces/IAttachmentsModule.cs b/OpenSim/Region/Framework/Interfaces/IAttachmentsModule.cs
index c965bcf..5e5df4b 100644
--- a/OpenSim/Region/Framework/Interfaces/IAttachmentsModule.cs
+++ b/OpenSim/Region/Framework/Interfaces/IAttachmentsModule.cs
@@ -28,6 +28,7 @@
 using System;
 using OpenMetaverse;
 using OpenSim.Framework;
+using OpenSim.Region.Framework.Scenes;
 
 namespace OpenSim.Region.Framework.Interfaces
 {        
@@ -45,5 +46,16 @@ namespace OpenSim.Region.Framework.Interfaces
         /// <returns>true if the object was successfully attached, false otherwise</returns>        
         bool AttachObject(
             IClientAPI controllingClient, uint localID, uint attachPoint, Quaternion rot, Vector3 pos, bool silent);
+
+        /// <summary>
+        /// Update the user inventory to the attachment of an item
+        /// </summary>
+        /// <param name="att"></param>
+        /// <param name="remoteClient"></param>
+        /// <param name="itemID"></param>
+        /// <param name="AttachmentPt"></param>
+        /// <returns></returns>        
+        UUID SetAttachmentInventoryStatus(
+            SceneObjectGroup att, IClientAPI remoteClient, UUID itemID, uint AttachmentPt);
     }
 }
\ 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 474fba9..6a5dc56 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
@@ -1862,35 +1862,7 @@ namespace OpenSim.Region.Framework.Scenes
                 return UUID.Zero;
             }
 
-            return RezSingleAttachment(att, remoteClient, itemID, AttachmentPt);
-        }
-
-        /// <summary>
-        /// Update the user inventory to reflect an attachment
-        /// </summary>
-        /// <param name="att"></param>
-        /// <param name="remoteClient"></param>
-        /// <param name="itemID"></param>
-        /// <param name="AttachmentPt"></param>
-        /// <returns></returns>
-        public UUID RezSingleAttachment(SceneObjectGroup att, IClientAPI remoteClient, UUID itemID, uint AttachmentPt)
-        {
-            m_log.DebugFormat(
-                "[USER INVENTORY]: Updating inventory of {0} to show attachment of {1} (item ID {2})", 
-                remoteClient.Name, att.Name, itemID);
-            
-            if (!att.IsDeleted)
-                AttachmentPt = att.RootPart.AttachmentPoint;
-
-            ScenePresence presence;
-            if (TryGetAvatar(remoteClient.AgentId, out presence))
-            {
-                InventoryItemBase item = new InventoryItemBase(itemID, remoteClient.AgentId);
-                item = InventoryService.GetItem(item);
-
-                presence.Appearance.SetAttachment((int)AttachmentPt, itemID, item.AssetID /*att.UUID*/);
-            }
-            return att.UUID;
+            return AttachmentsModule.SetAttachmentInventoryStatus(att, remoteClient, itemID, AttachmentPt);
         }
 
         public void RezMultipleAttachments(IClientAPI remoteClient, RezMultipleAttachmentsFromInvPacket.HeaderDataBlock header,
-- 
cgit v1.1


From 71797af540bfa1ccb1ccfe856b42350844531607 Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Fri, 5 Mar 2010 23:35:49 +0000
Subject: refactor: move another AttachObject method

---
 .../Avatar/Attachments/AttachmentsModule.cs        | 47 +++++++++++++++++++++-
 OpenSim/Region/Framework/Scenes/Scene.Inventory.cs | 44 --------------------
 2 files changed, 46 insertions(+), 45 deletions(-)

(limited to 'OpenSim')

diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs
index 0ea1f63..530a21c 100644
--- a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs
@@ -112,7 +112,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
                         itemId = group.GetFromItemID();
                     }
 
-                    m_scene.AttachObject(remoteClient, AttachmentPt, itemId, group);
+                    SetAttachmentInventoryStatus(remoteClient, AttachmentPt, itemId, group);
 
                     group.AttachToAgent(remoteClient.AgentId, AttachmentPt, attachPos, silent);
                     
@@ -167,5 +167,50 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
             
             return att.UUID;
         }
+
+        /// <summary>
+        /// Update the user inventory to reflect an attachment
+        /// </summary>
+        /// <param name="remoteClient"></param>
+        /// <param name="AttachmentPt"></param>
+        /// <param name="itemID"></param>
+        /// <param name="att"></param>
+        public void SetAttachmentInventoryStatus(
+            IClientAPI remoteClient, uint AttachmentPt, UUID itemID, SceneObjectGroup att)
+        {
+//            m_log.DebugFormat(
+//                "[USER INVENTORY]: Updating attachment {0} for {1} at {2} using item ID {3}", 
+//                att.Name, remoteClient.Name, AttachmentPt, itemID);
+            
+            if (UUID.Zero == itemID)
+            {
+                m_log.Error("[SCENE INVENTORY]: Unable to save attachment. Error inventory item ID.");
+                return;
+            }
+
+            if (0 == AttachmentPt)
+            {
+                m_log.Error("[SCENE INVENTORY]: Unable to save attachment. Error attachment point.");
+                return;
+            }
+
+            if (null == att.RootPart)
+            {
+                m_log.Error("[SCENE INVENTORY]: Unable to save attachment for a prim without the rootpart!");
+                return;
+            }
+
+            ScenePresence presence;
+            if (m_scene.TryGetAvatar(remoteClient.AgentId, out presence))
+            {
+                // XXYY!!
+                InventoryItemBase item = new InventoryItemBase(itemID, remoteClient.AgentId);
+                item = m_scene.InventoryService.GetItem(item);
+                presence.Appearance.SetAttachment((int)AttachmentPt, itemID, item.AssetID /* att.UUID */);
+
+                if (m_scene.AvatarFactory != null)
+                    m_scene.AvatarFactory.UpdateDatabase(remoteClient.AgentId, presence.Appearance);
+            }
+        }        
     }
 }
\ 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 6a5dc56..bd3b433 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
@@ -1874,50 +1874,6 @@ namespace OpenSim.Region.Framework.Scenes
             }
         }
 
-        /// <summary>
-        /// This registers the item as attached in a user's inventory
-        /// </summary>
-        /// <param name="remoteClient"></param>
-        /// <param name="AttachmentPt"></param>
-        /// <param name="itemID"></param>
-        /// <param name="att"></param>
-        public void AttachObject(IClientAPI remoteClient, uint AttachmentPt, UUID itemID, SceneObjectGroup att)
-        {
-//            m_log.DebugFormat(
-//                "[USER INVENTORY]: Updating attachment {0} for {1} at {2} using item ID {3}", 
-//                att.Name, remoteClient.Name, AttachmentPt, itemID);
-            
-            if (UUID.Zero == itemID)
-            {
-                m_log.Error("[SCENE INVENTORY]: Unable to save attachment. Error inventory item ID.");
-                return;
-            }
-
-            if (0 == AttachmentPt)
-            {
-                m_log.Error("[SCENE INVENTORY]: Unable to save attachment. Error attachment point.");
-                return;
-            }
-
-            if (null == att.RootPart)
-            {
-                m_log.Error("[SCENE INVENTORY]: Unable to save attachment for a prim without the rootpart!");
-                return;
-            }
-
-            ScenePresence presence;
-            if (TryGetAvatar(remoteClient.AgentId, out presence))
-            {
-                // XXYY!!
-                InventoryItemBase item = new InventoryItemBase(itemID, remoteClient.AgentId);
-                item = InventoryService.GetItem(item);
-                presence.Appearance.SetAttachment((int)AttachmentPt, itemID, item.AssetID /* att.UUID */);
-
-                if (m_AvatarFactory != null)
-                    m_AvatarFactory.UpdateDatabase(remoteClient.AgentId, presence.Appearance);
-            }
-        }
-
         public void DetachSingleAttachmentToGround(UUID itemID, IClientAPI remoteClient)
         {
             SceneObjectPart part = GetSceneObjectPart(itemID);
-- 
cgit v1.1


From 395f343498bc429c0360201991147c6e089b0730 Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Sat, 6 Mar 2010 00:07:47 +0000
Subject: refactor: Move DetachSingleAttachmentToInv to region module need to
 rationalize method names later

---
 .../Avatar/Attachments/AttachmentsModule.cs        | 71 +++++++++++++++++-----
 .../Framework/Interfaces/IAttachmentsModule.cs     | 11 ++++
 OpenSim/Region/Framework/Scenes/Scene.Inventory.cs | 20 +-----
 OpenSim/Region/Framework/Scenes/Scene.cs           | 18 +++---
 OpenSim/Region/Framework/Scenes/SceneGraph.cs      | 35 +----------
 .../Shared/Api/Implementation/LSL_Api.cs           |  5 +-
 6 files changed, 82 insertions(+), 78 deletions(-)

(limited to 'OpenSim')

diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs
index 530a21c..d458364 100644
--- a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs
@@ -25,6 +25,7 @@
  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
+using System.Collections.Generic;
 using System.Reflection;
 using log4net;
 using Nini.Config;
@@ -131,26 +132,18 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
             }
             else
             {
-                m_log.DebugFormat("[SCENE GRAPH]: AttachObject found no such scene object {0}", objectLocalID);
+                m_log.DebugFormat("[ATTACHMENTS MODULE]: AttachObject found no such scene object {0}", objectLocalID);
                 return false;
             }
 
             return true;
-        }        
-
-        /// <summary>
-        /// Update the user inventory to reflect an attachment
-        /// </summary>
-        /// <param name="att"></param>
-        /// <param name="remoteClient"></param>
-        /// <param name="itemID"></param>
-        /// <param name="AttachmentPt"></param>
-        /// <returns></returns>
+        }
+        
         public UUID SetAttachmentInventoryStatus(
             SceneObjectGroup att, IClientAPI remoteClient, UUID itemID, uint AttachmentPt)
         {
             m_log.DebugFormat(
-                "[USER INVENTORY]: Updating inventory of {0} to show attachment of {1} (item ID {2})", 
+                "[ATTACHMENTS MODULEY]: Updating inventory of {0} to show attachment of {1} (item ID {2})", 
                 remoteClient.Name, att.Name, itemID);
             
             if (!att.IsDeleted)
@@ -184,19 +177,19 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
             
             if (UUID.Zero == itemID)
             {
-                m_log.Error("[SCENE INVENTORY]: Unable to save attachment. Error inventory item ID.");
+                m_log.Error("[ATTACHMENTS MODULE]: Unable to save attachment. Error inventory item ID.");
                 return;
             }
 
             if (0 == AttachmentPt)
             {
-                m_log.Error("[SCENE INVENTORY]: Unable to save attachment. Error attachment point.");
+                m_log.Error("[ATTACHMENTS MODULE]: Unable to save attachment. Error attachment point.");
                 return;
             }
 
             if (null == att.RootPart)
             {
-                m_log.Error("[SCENE INVENTORY]: Unable to save attachment for a prim without the rootpart!");
+                m_log.Error("[ATTACHMENTS MODULE]: Unable to save attachment for a prim without the rootpart!");
                 return;
             }
 
@@ -212,5 +205,53 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
                     m_scene.AvatarFactory.UpdateDatabase(remoteClient.AgentId, presence.Appearance);
             }
         }        
+
+        public void ShowDetachInUserInventory(UUID itemID, IClientAPI remoteClient)
+        {
+            ScenePresence presence;
+            if (m_scene.TryGetAvatar(remoteClient.AgentId, out presence))
+            {
+                presence.Appearance.DetachAttachment(itemID);
+
+                // Save avatar attachment information
+                if (m_scene.AvatarFactory != null)
+                {
+                    m_log.Debug("[ATTACHMENTS MODULE]: Saving avatar attachment. AgentID: " + remoteClient.AgentId + ", ItemID: " + itemID);
+                    m_scene.AvatarFactory.UpdateDatabase(remoteClient.AgentId, presence.Appearance);
+                }
+            }
+
+            DetachSingleAttachmentToInv(itemID, remoteClient);
+        }        
+
+        // What makes this method odd and unique is it tries to detach using an UUID....     Yay for standards.
+        // To LocalId or UUID, *THAT* is the question. How now Brown UUID??
+        protected void DetachSingleAttachmentToInv(UUID itemID, IClientAPI remoteClient)
+        {
+            if (itemID == UUID.Zero) // If this happened, someone made a mistake....
+                return;
+
+            // We can NOT use the dictionries here, as we are looking
+            // for an entity by the fromAssetID, which is NOT the prim UUID
+            List<EntityBase> detachEntities = m_scene.GetEntities();
+            SceneObjectGroup group;
+
+            foreach (EntityBase entity in detachEntities)
+            {
+                if (entity is SceneObjectGroup)
+                {
+                    group = (SceneObjectGroup)entity;
+                    if (group.GetFromItemID() == itemID)
+                    {
+                        m_scene.EventManager.TriggerOnAttach(group.LocalId, itemID, UUID.Zero);
+                        group.DetachToInventoryPrep();
+                        m_log.Debug("[ATTACHMENTS MODULE]: Saving attachpoint: " + ((uint)group.GetAttachmentPoint()).ToString());
+                        m_scene.UpdateKnownItem(remoteClient, group,group.GetFromItemID(), group.OwnerID);
+                        m_scene.DeleteSceneObject(group, false);
+                        return;
+                    }
+                }
+            }
+        }        
     }
 }
\ No newline at end of file
diff --git a/OpenSim/Region/Framework/Interfaces/IAttachmentsModule.cs b/OpenSim/Region/Framework/Interfaces/IAttachmentsModule.cs
index 5e5df4b..367ff3d 100644
--- a/OpenSim/Region/Framework/Interfaces/IAttachmentsModule.cs
+++ b/OpenSim/Region/Framework/Interfaces/IAttachmentsModule.cs
@@ -57,5 +57,16 @@ namespace OpenSim.Region.Framework.Interfaces
         /// <returns></returns>        
         UUID SetAttachmentInventoryStatus(
             SceneObjectGroup att, IClientAPI remoteClient, UUID itemID, uint AttachmentPt);
+
+        /// <summary>
+        /// Update the user inventory to show a detach.
+        /// </summary>
+        /// <param name="itemID">
+        /// A <see cref="UUID"/>
+        /// </param>
+        /// <param name="remoteClient">
+        /// A <see cref="IClientAPI"/>
+        /// </param>
+        void ShowDetachInUserInventory(UUID itemID, IClientAPI remoteClient);
     }
 }
\ 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 bd3b433..dad0efd 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
@@ -1858,7 +1858,7 @@ namespace OpenSim.Region.Framework.Scenes
 
             if (att == null)
             {
-                DetachSingleAttachmentToInv(itemID, remoteClient);
+                AttachmentsModule.ShowDetachInUserInventory(itemID, remoteClient);
                 return UUID.Zero;
             }
 
@@ -1904,24 +1904,6 @@ namespace OpenSim.Region.Framework.Scenes
             SendAttachEvent(part.ParentGroup.LocalId, itemID, UUID.Zero);
         }
 
-        public void DetachSingleAttachmentToInv(UUID itemID, IClientAPI remoteClient)
-        {
-            ScenePresence presence;
-            if (TryGetAvatar(remoteClient.AgentId, out presence))
-            {
-                presence.Appearance.DetachAttachment(itemID);
-
-                // Save avatar attachment information
-                if (m_AvatarFactory != null)
-                {
-                    m_log.Info("[SCENE]: Saving avatar attachment. AgentID: " + remoteClient.AgentId + ", ItemID: " + itemID);
-                    m_AvatarFactory.UpdateDatabase(remoteClient.AgentId, presence.Appearance);
-                }
-            }
-
-            m_sceneGraph.DetachSingleAttachmentToInv(itemID, remoteClient);
-        }
-
         public void GetScriptRunning(IClientAPI controllingClient, UUID objectID, UUID itemID)
         {
             EventManager.TriggerGetScriptRunning(controllingClient, objectID, itemID);
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index c83132f..7c0375e 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -2646,10 +2646,12 @@ namespace OpenSim.Region.Framework.Scenes
         public virtual void SubscribeToClientAttachmentEvents(IClientAPI client)
         {
             client.OnRezSingleAttachmentFromInv += RezSingleAttachment;
-            client.OnRezMultipleAttachmentsFromInv += RezMultipleAttachments;
-            client.OnDetachAttachmentIntoInv += DetachSingleAttachmentToInv;
+            client.OnRezMultipleAttachmentsFromInv += RezMultipleAttachments;            
             client.OnObjectAttach += m_sceneGraph.AttachObject;
             client.OnObjectDetach += m_sceneGraph.DetachObject;
+
+            if (AttachmentsModule != null)
+                client.OnDetachAttachmentIntoInv += AttachmentsModule.ShowDetachInUserInventory;
         }
 
         public virtual void SubscribeToClientTeleportEvents(IClientAPI client)
@@ -2696,8 +2698,7 @@ namespace OpenSim.Region.Framework.Scenes
         }
 
         protected virtual void UnsubscribeToClientEvents(IClientAPI client)
-        {
-            
+        {            
         }
 
         /// <summary>
@@ -2719,7 +2720,6 @@ namespace OpenSim.Region.Framework.Scenes
 
             UnSubscribeToClientNetworkEvents(client);
 
-
             // EventManager.TriggerOnNewClient(client);
         }
 
@@ -2799,12 +2799,14 @@ namespace OpenSim.Region.Framework.Scenes
         }
 
         public virtual void UnSubscribeToClientAttachmentEvents(IClientAPI client)
-        {
-            client.OnRezSingleAttachmentFromInv -= RezSingleAttachment;
+        {            
             client.OnRezMultipleAttachmentsFromInv -= RezMultipleAttachments;
-            client.OnDetachAttachmentIntoInv -= DetachSingleAttachmentToInv;
+            client.OnRezSingleAttachmentFromInv -= RezSingleAttachment;            
             client.OnObjectAttach -= m_sceneGraph.AttachObject;
             client.OnObjectDetach -= m_sceneGraph.DetachObject;
+
+            if (AttachmentsModule != null)               
+                client.OnDetachAttachmentIntoInv -= AttachmentsModule.ShowDetachInUserInventory;
         }
 
         public virtual void UnSubscribeToClientTeleportEvents(IClientAPI client)
diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
index 48744d7..380722d 100644
--- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
@@ -452,7 +452,7 @@ namespace OpenSim.Region.Framework.Scenes
             if (group != null)
             {
                 //group.DetachToGround();
-                m_parentScene.DetachSingleAttachmentToInv(group.GetFromItemID(), remoteClient);
+                m_parentScene.AttachmentsModule.ShowDetachInUserInventory(group.GetFromItemID(), remoteClient);
             }
         }
 
@@ -574,39 +574,6 @@ namespace OpenSim.Region.Framework.Scenes
             return null;
         }
 
-        // What makes this method odd and unique is it tries to detach using an UUID....     Yay for standards.
-        // To LocalId or UUID, *THAT* is the question. How now Brown UUID??
-        public void DetachSingleAttachmentToInv(UUID itemID, IClientAPI remoteClient)
-        {
-            if (itemID == UUID.Zero) // If this happened, someone made a mistake....
-                return;
-
-            // We can NOT use the dictionries here, as we are looking
-            // for an entity by the fromAssetID, which is NOT the prim UUID
-            //
-            List<EntityBase> detachEntities = GetEntities();
-            SceneObjectGroup group;
-
-            foreach (EntityBase entity in detachEntities)
-            {
-                if (entity is SceneObjectGroup)
-                {
-                    group = (SceneObjectGroup)entity;
-                    if (group.GetFromItemID() == itemID)
-                    {
-                        m_parentScene.SendAttachEvent(group.LocalId, itemID, UUID.Zero);
-                        group.DetachToInventoryPrep();
-                        m_log.Debug("[DETACH]: Saving attachpoint: " +
-                                ((uint)group.GetAttachmentPoint()).ToString());
-                        m_parentScene.UpdateKnownItem(remoteClient, group,
-                                group.GetFromItemID(), group.OwnerID);
-                        m_parentScene.DeleteSceneObject(group, false);
-                        return;
-                    }
-                }
-            }
-        }
-
         protected internal ScenePresence CreateAndAddChildScenePresence(IClientAPI client, AvatarAppearance appearance)
         {
             ScenePresence newAvatar = null;
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
index 0eee147..8217248 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
@@ -2931,8 +2931,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
 
                 ScenePresence presence = World.GetScenePresence(m_host.OwnerID);
 
-                m_ScriptEngine.World.DetachSingleAttachmentToInv(itemID,
-                        presence.ControllingClient);
+                IAttachmentsModule attachmentsModule = m_ScriptEngine.World.AttachmentsModule;
+                if (attachmentsModule != null)
+                    attachmentsModule.ShowDetachInUserInventory(itemID, presence.ControllingClient);
             }
         }
 
-- 
cgit v1.1