From b1ab680a66a3a6bdcf4976a342cc28412f6e2b2d Mon Sep 17 00:00:00 2001
From: Charles Krinke
Date: Thu, 3 Jul 2008 20:58:29 +0000
Subject: Mantis#1658. Thank you, Melanie for a patch that: Adds IEmailModule
 and a module skelaton

---
 .../Region/Environment/Interfaces/IEmailModule.cs  | 48 ++++++++++++
 .../Modules/Scripting/EMailModules/EmailModule.cs  | 90 ++++++++++++++++++++++
 .../Shared/Api/Implementation/LSL_Api.cs           | 27 ++++++-
 3 files changed, 163 insertions(+), 2 deletions(-)
 create mode 100644 OpenSim/Region/Environment/Interfaces/IEmailModule.cs
 create mode 100644 OpenSim/Region/Environment/Modules/Scripting/EMailModules/EmailModule.cs

diff --git a/OpenSim/Region/Environment/Interfaces/IEmailModule.cs b/OpenSim/Region/Environment/Interfaces/IEmailModule.cs
new file mode 100644
index 0000000..aae5d9c
--- /dev/null
+++ b/OpenSim/Region/Environment/Interfaces/IEmailModule.cs
@@ -0,0 +1,48 @@
+/*
+ * 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 OpenSim.Framework;
+using libsecondlife;
+
+namespace OpenSim.Region.Environment.Interfaces
+{
+	public class Email
+	{
+		public string time;
+		public string sender;
+		public string subject;
+		public string message;
+		public int numLeft;
+	}
+
+    public interface IEmailModule : IRegionModule
+    {
+		void SendEmail(LLUUID objectID, string address, string subject, string body);
+		Email GetNextEmail(LLUUID objectID, string sender, string subject);
+    }
+}
diff --git a/OpenSim/Region/Environment/Modules/Scripting/EMailModules/EmailModule.cs b/OpenSim/Region/Environment/Modules/Scripting/EMailModules/EmailModule.cs
new file mode 100644
index 0000000..5d33b04
--- /dev/null
+++ b/OpenSim/Region/Environment/Modules/Scripting/EMailModules/EmailModule.cs
@@ -0,0 +1,90 @@
+using System;
+using System.Reflection;
+using System.Collections.Generic;
+using libsecondlife;
+using OpenSim.Framework;
+using OpenSim.Region.Environment.Interfaces;
+using OpenSim.Region.Environment.Scenes;
+using log4net;
+using Nini.Config;
+
+namespace OpenSim.Region.Environment.Modules.Scripting.EmailModules
+{
+    public class EmailModule : IEmailModule
+    {
+        //
+        // Log
+        //
+        private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
+
+        //
+        // Module vars
+        //
+        private IConfigSource m_Config;
+
+        // Scenes by Region Handle
+        private Dictionary<ulong, Scene> m_Scenes =
+                new Dictionary<ulong, Scene>();
+
+		private bool m_Enabled = false;
+
+        public void Initialise(Scene scene, IConfigSource config)
+        {
+            m_Config = config;
+
+            IConfig startupConfig = m_Config.Configs["Startup"];
+
+			m_Enabled = (startupConfig.GetString("emailmodule",
+					"DefaultEmailModule") == "DefaultEmailModule");
+
+            // It's a go!
+            if (m_Enabled)
+            {
+                lock (m_Scenes)
+                {
+                    // Claim the interface slot
+                    scene.RegisterModuleInterface<IEmailModule>(this);
+
+                    // Add to scene list
+                    if (m_Scenes.ContainsKey(scene.RegionInfo.RegionHandle))
+                    {
+                        m_Scenes[scene.RegionInfo.RegionHandle] = scene;
+                    }
+                    else
+                    {
+                        m_Scenes.Add(scene.RegionInfo.RegionHandle, scene);
+                    }
+                }
+
+                m_log.Info("[EMAIL] Activated DefaultEmailModule");
+            }
+        }
+
+        public void PostInitialise()
+        {
+        }
+
+        public void Close()
+        {
+        }
+
+        public string Name
+        {
+            get { return "DefaultEmailModule"; }
+        }
+
+        public bool IsSharedModule
+        {
+            get { return true; }
+        }
+
+        public void SendEmail(LLUUID objectID, string address, string subject, string body)
+		{
+		}
+
+		public Email GetNextEmail(LLUUID objectID, string sender, string subject)
+		{
+			return null;
+		}
+	}
+}
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
index 1579233..7887515 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
@@ -2042,13 +2042,36 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
         public void llEmail(string address, string subject, string message)
         {
             m_host.AddScriptLPS(1);
-            NotImplemented("llEmail");
+            IEmailModule emailModule = m_ScriptEngine.World.RequestModuleInterface<IEmailModule>();
+            if(emailModule == null)
+                return;
+
+            emailModule.SendEmail(m_host.UUID, address, subject, message);
         }
 
         public void llGetNextEmail(string address, string subject)
         {
             m_host.AddScriptLPS(1);
-            NotImplemented("llGetNextEmail");
+            IEmailModule emailModule = m_ScriptEngine.World.RequestModuleInterface<IEmailModule>();
+            if(emailModule == null)
+                return;
+            Email email;
+
+            email = emailModule.GetNextEmail(m_host.UUID, address, subject);
+
+            if(email == null)
+                return;
+
+            m_ScriptEngine.PostObjectEvent(m_host.LocalId,
+                    new EventParams("email",
+                    new Object[] {
+                        new LSL_Types.LSLString(email.time),
+                        new LSL_Types.LSLString(email.sender),
+                        new LSL_Types.LSLString(email.subject),
+                        new LSL_Types.LSLString(email.message),
+                        new LSL_Types.LSLInteger(email.numLeft)},
+                    new DetectParams[0]));
+
         }
 
         public string llGetKey()
-- 
cgit v1.1