Ver Fonte

commit what i did so far for core mutes module, befere i lose it

UbitUmarov há 6 anos atrás
pai
commit
d32debe618

+ 44 - 0
OpenSim/Data/IMuteListData.cs

@@ -0,0 +1,44 @@
+/*
+ * 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
+{
+     /// <summary>
+    /// An interface for connecting to the Mute List datastore
+    /// </summary>
+    public interface IMuteListData
+    {
+        bool Store(MuteData data);
+        MuteData[] Get(UUID agentID);
+        bool Delete(UUID agentID, UUID muteID, string muteName);
+    }
+}

+ 67 - 0
OpenSim/Data/MySQL/MySQLMuteListData.cs

@@ -0,0 +1,67 @@
+/*
+ * 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;
+using System.Collections.Generic;
+using System.Data;
+using OpenMetaverse;
+using OpenSim.Framework;
+using MySql.Data.MySqlClient;
+
+namespace OpenSim.Data.MySQL
+{
+    public class MySqlMuteListData : MySQLGenericTableHandler<MuteData>, IMuteListData
+    {
+        public MySqlMuteListData(string connectionString)
+                : base(connectionString, "MuteList", "MuteListStore")
+        {
+        }
+
+        public MuteData[] Get(UUID agentID)
+        {
+            MuteData[] data = base.Get("AgentID", agentID.ToString());
+            return data;
+        }
+
+        public bool Delete(UUID agentID, UUID muteID, string muteName)
+        {
+            string cmnd ="delete from MuteList where AgentID = ?AgentID and MuteID = ?MuteID and MuteName = ?MuteName";
+
+            using (MySqlCommand cmd = new MySqlCommand(cmnd))
+            {
+                cmd.Parameters.AddWithValue("?AgentID", agentID.ToString());
+                cmd.Parameters.AddWithValue("?MuteID", muteID.ToString());
+                cmd.Parameters.AddWithValue("?MuteName", muteName);
+
+                if (ExecuteNonQuery(cmd) > 0)
+                    return true;
+                return false;
+            }
+        }
+    }
+}

+ 16 - 0
OpenSim/Data/MySQL/Resources/MuteListStore.migrations

@@ -0,0 +1,16 @@
+:VERSION 1
+
+BEGIN;
+
+CREATE TABLE `MuteList` (
+  `AgentID` char(36) NOT NULL,
+  `MuteID` char(36) NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000',
+  `MuteName` varchar(64) NOT NULL DEFAULT '',
+  `MuteType` int(11) NOT NULL DEFAULT '1',
+  `MuteFlags` int(11) NOT NULL DEFAULT '0',
+  `Stamp` int(11) NOT NULL,
+  UNIQUE KEY `AgentID_2` (`AgentID`,`MuteID`,`MuteName`),
+  KEY `AgentID` (`AgentID`)
+);
+
+COMMIT;

+ 70 - 65
OpenSim/Region/CoreModules/Avatar/InstantMessage/MuteListModuleTst.cs

@@ -37,23 +37,21 @@ using OpenSim.Framework.Client;
 using OpenSim.Region.Framework.Interfaces;
 using OpenSim.Region.Framework.Scenes;
 using Mono.Addins;
-using OpenSim.Data;
-using OpenSim.Data.MySQL;
-using MySql.Data.MySqlClient;
-using System.Security.Cryptography;
+
+using OpenSim.Server.Base;
+using OpenSim.Services.Interfaces;
 
 namespace OpenSim.Region.CoreModules.Avatar.InstantMessage
 {
     [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "MuteListModuleTst")]
-    public class MuteModuleTst : ISharedRegionModule
+    public class MuteListModuleTst : ISharedRegionModule
     {
         private static readonly ILog m_log = LogManager.GetLogger(
                 MethodBase.GetCurrentMethod().DeclaringType);
 
         protected bool m_Enabled = false;
         protected List<Scene> m_SceneList = new List<Scene>();
-        protected MuteTableHandler m_MuteTable;
-        protected string m_DatabaseConnect;
+        protected IMuteListService m_service = null;
 
         public void Initialise(IConfigSource config)
         {
@@ -64,37 +62,11 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage
             if (cnf.GetString("MuteListModule", "None") != "MuteListModuleTst")
                 return;
 
-            m_DatabaseConnect = cnf.GetString("MuteDatabaseConnect", String.Empty);
-            if (m_DatabaseConnect == String.Empty)
-            {
-                m_log.Debug("[MuteModuleTst]: MuteDatabaseConnect missing or empty");
-                return;
-            }
-           
-            try
-            {
-                m_MuteTable = new MuteTableHandler(m_DatabaseConnect, "XMute", String.Empty);
-            }
-            catch
-            {
-                m_log.Error("[MuteListModuleTst]: Failed to open/create database table");
-                return;
-            }
-
             m_Enabled = true;
         }
 
         public void AddRegion(Scene scene)
         {
-            if (!m_Enabled)
-                return;
-
-            lock (m_SceneList)
-            {
-                m_SceneList.Add(scene);
-
-                scene.EventManager.OnNewClient += OnNewClient;
-            }
         }
 
         public void RegionLoaded(Scene scene)
@@ -104,17 +76,37 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage
 
             IXfer xfer = scene.RequestModuleInterface<IXfer>();
             if (xfer == null)
-                m_log.ErrorFormat("[MuteListModuleTst]: Xfer not availble in region {0}", scene.Name);
+            {
+                m_log.ErrorFormat("[MuteListModuleTst]: Xfer not availble in region {0}. Module Disabled", scene.Name);
+                m_Enabled = false;
+                return;
+            }
+
+            IMuteListService srv = scene.RequestModuleInterface<IMuteListService>();
+            if(srv == null)
+            {
+                m_log.ErrorFormat("[MuteListModuleTst]: MuteListService not availble in region {0}. Module Disabled", scene.Name);
+                m_Enabled = false;
+                return;
+            }
+            lock (m_SceneList)
+            {
+                if(m_service == null)
+                    m_service = srv;
+                m_SceneList.Add(scene);
+                scene.EventManager.OnNewClient += OnNewClient;
+            }
         }
 
         public void RemoveRegion(Scene scene)
         {
-            if (!m_Enabled)
-                return;
-
             lock (m_SceneList)
             {
-                m_SceneList.Remove(scene);
+                if(m_SceneList.Contains(scene))
+                {
+                    m_SceneList.Remove(scene);
+                    scene.EventManager.OnNewClient -= OnNewClient;
+                }
             }
         }
 
@@ -123,7 +115,7 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage
             if (!m_Enabled)
                 return;
 
-            m_log.Debug("[MuteListModuleTst]: Mute list enabled");
+            m_log.Debug("[MuteListModuleTst]: enabled");
         }
 
         public string Name
@@ -149,6 +141,15 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage
 
         private void OnMuteListRequest(IClientAPI client, uint crc)
         {
+            if (!m_Enabled)
+            {
+                if(crc == 0)
+                    client.SendEmpytMuteList();
+                else
+                    client.SendUseCachedMuteList();
+                return;
+            }
+
             IXfer xfer = client.Scene.RequestModuleInterface<IXfer>();
             if (xfer == null)
             {
@@ -159,8 +160,8 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage
                 return;
             }
 
-            MuteData[] data = m_MuteTable.Get("AgentID", client.AgentId.ToString());
-            if (data == null || data.Length == 0)
+            Byte[] data = m_service.MuteListRequest(client.AgentId, crc);
+            if (data == null)
             {
                 if(crc == 0)
                     client.SendEmpytMuteList();
@@ -169,20 +170,13 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage
                 return;
             }
 
-            StringBuilder sb = new StringBuilder(16384);
-
-            foreach (MuteData d in data)
-                sb.AppendFormat("{0} {1} {2}|{3}\n",
-                        d.MuteType,
-                        d.MuteID.ToString(),
-                        d.MuteName,
-                        d.MuteFlags);
-
-            Byte[] filedata = Util.UTF8.GetBytes(sb.ToString());
-
-            uint dataCrc = Crc32.Compute(filedata);
+            if (data.Length == 0)
+            {
+                client.SendEmpytMuteList();
+                return;
+            }
 
-            if (dataCrc == crc)
+            if (data.Length == 1)
             {
                 if(crc == 0)
                     client.SendEmpytMuteList();
@@ -191,33 +185,44 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage
                 return;
             }
 
-            string filename = "mutes"+client.AgentId.ToString();
-            xfer.AddNewFile(filename, filedata);
+            string filename = "mutes" + client.AgentId.ToString();
+            xfer.AddNewFile(filename, data);
             client.SendMuteListUpdate(filename);
         }
 
         private void OnUpdateMuteListEntry(IClientAPI client, UUID muteID, string muteName, int muteType, uint muteFlags)
         {
-            MuteData mute = new MuteData();
+            if (!m_Enabled)
+                return;
+
+            UUID agentID = client.AgentId;
+            if(muteType == 1) // agent
+            {
+                if(agentID == muteID)
+                    return;
+                if(m_SceneList[0].Permissions.IsAdministrator(muteID))
+                {
+                    OnMuteListRequest(client, 0);
+                    return;
+                }
+            }
 
-            mute.AgentID = client.AgentId;
+            MuteData mute = new MuteData();
+            mute.AgentID = agentID;
             mute.MuteID = muteID;
             mute.MuteName = muteName;
             mute.MuteType = muteType;
             mute.MuteFlags = (int)muteFlags;
             mute.Stamp = Util.UnixTimeSinceEpoch();
 
-            m_MuteTable.Store(mute);
+            m_service.UpdateMute(mute);
         }
 
         private void OnRemoveMuteListEntry(IClientAPI client, UUID muteID, string muteName)
         {
-            m_MuteTable.Delete(new string[] { "AgentID",
-                                              "MuteID",
-                                              "MuteName" },
-                               new string[] { client.AgentId.ToString(),
-                                              muteID.ToString(),
-                                              muteName });
+            if (!m_Enabled)
+                return;
+            m_service.RemoveMute(client.AgentId, muteID, muteName);
         }
     }
 }

+ 1 - 4
OpenSim/Region/CoreModules/Avatar/InstantMessage/XMuteModule.cs

@@ -32,15 +32,12 @@ using log4net;
 using Nini.Config;
 using OpenMetaverse;
 using OpenSim.Framework;
-using OpenSim.Framework.Servers;
-using OpenSim.Framework.Client;
 using OpenSim.Region.Framework.Interfaces;
 using OpenSim.Region.Framework.Scenes;
 using Mono.Addins;
-using OpenSim.Data;
 using OpenSim.Data.MySQL;
 using MySql.Data.MySqlClient;
-using System.Security.Cryptography;
+
 
 namespace OpenSim.Region.CoreModules.Avatar.InstantMessage
 {

+ 180 - 0
OpenSim/Region/CoreModules/ServiceConnectorsOut/MuteList/LocalMuteListServiceConnector.cs

@@ -0,0 +1,180 @@
+/*
+ * 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 log4net;
+using Mono.Addins;
+using Nini.Config;
+using System;
+using System.Collections.Generic;
+using System.Reflection;
+using OpenSim.Framework;
+using OpenSim.Server.Base;
+using OpenSim.Region.Framework.Interfaces;
+using OpenSim.Region.Framework.Scenes;
+using OpenSim.Services.Interfaces;
+using OpenMetaverse;
+
+namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Land
+{
+    [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "LocalMuteListServicesConnector")]
+    public class LocalMuteListServicesConnector : ISharedRegionModule, IMuteListService
+    {
+        private static readonly ILog m_log =
+                LogManager.GetLogger(
+                MethodBase.GetCurrentMethod().DeclaringType);
+
+        private List<Scene> m_Scenes = new List<Scene>();
+        protected IMuteListService m_service = null;
+
+        private bool m_Enabled = false;
+
+         #region ISharedRegionModule
+
+        public Type ReplaceableInterface
+        {
+            get { return null; }
+        }
+
+        public string Name
+        {
+            get { return "LocalMuteListServicesConnector"; }
+        }
+
+        public void Initialise(IConfigSource source)
+        {
+            IConfig moduleConfig = source.Configs["Modules"];
+
+            if (moduleConfig == null)
+                return;
+
+            string name = moduleConfig.GetString("MuteListService", "");
+            if(name != Name)
+                return;
+
+            IConfig userConfig = source.Configs["MuteListService"];
+            if (userConfig == null)
+            {
+                m_log.Error("[MuteList LOCALCONNECTOR]: MuteListService missing from configuration");
+                return;
+            }
+
+            string serviceDll = userConfig.GetString("LocalServiceModule",
+                    String.Empty);
+
+            if (serviceDll == String.Empty)
+            {
+                m_log.Error("[MuteList LOCALCONNECTOR]: No LocalServiceModule named in section MuteListService");
+                return;
+            }
+
+            Object[] args = new Object[] { source };
+            try
+            {
+                m_service = ServerUtils.LoadPlugin<IMuteListService>(serviceDll, args);
+            }
+            catch
+            {
+                m_log.Error("[MuteList LOCALCONNECTOR]: Failed to load mute service");
+            return;
+            }
+
+            if (m_service == null)
+            {
+                m_log.Error("[MuteList LOCALCONNECTOR]: Can't load MuteList service");
+                return;
+            }
+
+            m_Enabled = true;
+            m_log.Info("[MuteList LOCALCONNECTOR]: enabled");
+        }
+
+        public void Close()
+        {
+        }
+
+        public void AddRegion(Scene scene)
+        {
+            if (!m_Enabled)
+                return;
+
+            lock(m_Scenes)
+            {
+                m_Scenes.Add(scene);
+                scene.RegisterModuleInterface<IMuteListService>(this);
+            }
+        }
+
+        public void RegionLoaded(Scene scene)
+        {
+        }
+
+        public void PostInitialise()
+        {
+        }
+
+        public void RemoveRegion(Scene scene)
+        {
+            if (!m_Enabled)
+                return;
+
+            lock(m_Scenes)
+            {
+                if (m_Scenes.Contains(scene))
+                {
+                    m_Scenes.Remove(scene);
+                    scene.UnregisterModuleInterface<IMuteListService>(this);
+                }
+            }
+        }
+
+        #endregion ISharedRegionModule
+
+        #region IMuteListService
+        public Byte[] MuteListRequest(UUID agentID, uint crc)
+        {
+            if (!m_Enabled)
+                return null;
+            return m_service.MuteListRequest(agentID, crc);
+        }
+
+        public bool UpdateMute(MuteData mute)
+        {
+            if (!m_Enabled)
+                return false;
+            return m_service.UpdateMute(mute);
+        }
+
+        public bool RemoveMute(UUID agentID, UUID muteID, string muteName)
+        {
+            if (!m_Enabled)
+                return false;
+            return m_service.RemoveMute(agentID, muteID, muteName);
+        }
+
+        #endregion IMuteListService
+    }
+}

+ 41 - 0
OpenSim/Services/Interfaces/IMuteLIstService.cs

@@ -0,0 +1,41 @@
+/*
+ * 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 OpenSim.Framework;
+using OpenMetaverse;
+
+namespace OpenSim.Services.Interfaces
+{
+    public interface  IMuteListService
+    {
+        Byte[] MuteListRequest(UUID agent, uint crc);
+        bool UpdateMute(MuteData mute);
+        bool RemoveMute(UUID agentID, UUID muteID, string muteName);
+    }
+}

+ 127 - 0
OpenSim/Services/MuteListService/MuteListService.cs

@@ -0,0 +1,127 @@
+/*
+ * 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.Text;
+using OpenMetaverse;
+using log4net;
+using Nini.Config;
+using OpenSim.Services.Base;
+using OpenSim.Services.Interfaces;
+using OpenSim.Data;
+using OpenSim.Framework;
+
+namespace OpenSim.Services.EstateService
+{
+    public class MuteListService : ServiceBase, IMuteListService
+    {
+//        private static readonly ILog m_log =
+//                LogManager.GetLogger(
+//                MethodBase.GetCurrentMethod().DeclaringType);
+
+        protected IMuteListData m_database;
+
+        public MuteListService(IConfigSource config)
+            : base(config)
+        {
+            string dllName = String.Empty;
+            string connString = String.Empty;
+
+            // Try reading the [DatabaseService] section, if it exists
+            IConfig dbConfig = config.Configs["DatabaseService"];
+            if (dbConfig != null)
+            {
+                dllName = dbConfig.GetString("StorageProvider", String.Empty);
+                connString = dbConfig.GetString("ConnectionString", String.Empty);
+                connString = dbConfig.GetString("MuteConnectionString", connString);
+            }
+
+            // Try reading the [MuteListStore] section, if it exists
+            IConfig muteConfig = config.Configs["MuteListStore"];
+            if (muteConfig != null)
+            {
+                dllName = muteConfig.GetString("StorageProvider", dllName);
+                connString = muteConfig.GetString("ConnectionString", connString);
+            }
+
+            // We tried, but this doesn't exist. We can't proceed
+            if (dllName == String.Empty)
+                throw new Exception("No StorageProvider configured");
+
+            m_database = LoadPlugin<IMuteListData>(dllName, new Object[] { connString });
+            if (m_database == null)
+                throw new Exception("Could not find a storage interface in the given module");
+        }
+
+        public Byte[] MuteListRequest(UUID agentID, uint crc)
+        {
+            if(m_database == null)
+                return null;
+
+            MuteData[] data = m_database.Get(agentID);
+            if (data == null || data.Length == 0)
+                return new Byte[0];
+
+            StringBuilder sb = new StringBuilder(16384);
+            foreach (MuteData d in data)
+                sb.AppendFormat("{0} {1} {2}|{3}\n",
+                        d.MuteType,
+                        d.MuteID.ToString(),
+                        d.MuteName,
+                        d.MuteFlags);
+
+            Byte[] filedata = Util.UTF8.GetBytes(sb.ToString());
+
+            uint dataCrc = Crc32.Compute(filedata);
+
+            if (dataCrc == crc)
+            {
+                if(crc == 0)
+                     return new Byte[0];
+
+                Byte[] ret = new Byte[1] {1};
+                return ret;
+            }
+
+            return filedata;
+        }
+
+        public bool UpdateMute(MuteData mute)
+        {
+            if(m_database == null)
+                return false;
+            return m_database.Store(mute);
+        }
+
+        public bool RemoveMute(UUID agentID, UUID muteID, string muteName)
+        {
+            if(m_database == null)
+                return false;
+            return m_database.Delete(agentID, muteID, muteName);
+        }
+    }
+}