diff --git a/OpenSim/Region/Framework/Interfaces/IVoiceModule.cs b/OpenSim/Region/Framework/Interfaces/IVoiceModule.cs
new file mode 100644
index 0000000000..2e555fa092
--- /dev/null
+++ b/OpenSim/Region/Framework/Interfaces/IVoiceModule.cs
@@ -0,0 +1,45 @@
+/*
+ * 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.IO;
+using OpenMetaverse;
+
+namespace OpenSim.Region.Framework.Interfaces
+{
+ public interface IVoiceModule
+ {
+
+ ///
+ /// Set the SIP url to be used by a parcel, this will allow manual setting of a SIP address
+ /// for a particular piece of land, allowing region owners to use preconfigured SIP conference channels.
+ /// This is used by osSetParcelSIPAddress
+ ///
+ void setLandSIPAddress(string SIPAddress,UUID GlobalID);
+
+ }
+}
diff --git a/OpenSim/Region/OptionalModules/Avatar/Voice/FreeSwitchVoice/FreeSwitchVoiceModule.cs b/OpenSim/Region/OptionalModules/Avatar/Voice/FreeSwitchVoice/FreeSwitchVoiceModule.cs
index 65c5274a57..6b30959239 100644
--- a/OpenSim/Region/OptionalModules/Avatar/Voice/FreeSwitchVoice/FreeSwitchVoiceModule.cs
+++ b/OpenSim/Region/OptionalModules/Avatar/Voice/FreeSwitchVoice/FreeSwitchVoiceModule.cs
@@ -53,7 +53,7 @@ using System.Text.RegularExpressions;
namespace OpenSim.Region.OptionalModules.Avatar.Voice.FreeSwitchVoice
{
- public class FreeSwitchVoiceModule : IRegionModule
+ public class FreeSwitchVoiceModule : IRegionModule, IVoiceModule
{
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
@@ -101,13 +101,16 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.FreeSwitchVoice
private FreeSwitchDialplan m_FreeSwitchDialplan;
private readonly Dictionary m_UUIDName = new Dictionary();
+ private Dictionary m_ParcelAddress = new Dictionary();
+
+ private Scene m_scene;
private IConfig m_config;
public void Initialise(Scene scene, IConfigSource config)
{
-
+ m_scene = scene;
m_config = config.Configs["FreeSwitchVoice"];
if (null == m_config)
@@ -230,6 +233,8 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.FreeSwitchVoice
{
OnRegisterCaps(scene, agentID, caps);
};
+
+
try
{
@@ -255,6 +260,13 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.FreeSwitchVoice
public void PostInitialise()
{
+ if(m_pluginEnabled)
+ {
+ m_log.Info("[FreeSwitchVoice] registering IVoiceModule with the scene");
+
+ // register the voice interface for this module, so the script engine can call us
+ m_scene.RegisterModuleInterface(this);
+ }
}
public void Close()
@@ -270,7 +282,27 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.FreeSwitchVoice
{
get { return true; }
}
-
+
+ //
+ // implementation of IVoiceModule, called by osSetParcelSIPAddress script function
+ //
+ public void setLandSIPAddress(string SIPAddress,UUID GlobalID)
+ {
+ m_log.DebugFormat("[FreeSwitchVoice]: setLandSIPAddress parcel id {0}: setting sip address {1}",
+ GlobalID, SIPAddress);
+
+ lock (m_ParcelAddress)
+ {
+ if (m_ParcelAddress.ContainsKey(GlobalID.ToString()))
+ {
+ m_ParcelAddress[GlobalID.ToString()] = SIPAddress;
+ }
+ else
+ {
+ m_ParcelAddress.Add(GlobalID.ToString(), SIPAddress);
+ }
+ }
+ }
//
// OnRegisterCaps is invoked via the scene.EventManager
@@ -776,6 +808,16 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.FreeSwitchVoice
// Create parcel voice channel. If no parcel exists, then the voice channel ID is the same
// as the directory ID. Otherwise, it reflects the parcel's ID.
+
+ lock (m_ParcelAddress)
+ {
+ if (m_ParcelAddress.ContainsKey( land.GlobalID.ToString() ))
+ {
+ m_log.DebugFormat("[FreeSwitchVoice]: parcel id {0}: using sip address {1}",
+ land.GlobalID, m_ParcelAddress[land.GlobalID.ToString()]);
+ return m_ParcelAddress[land.GlobalID.ToString()];
+ }
+ }
if (land.LocalID != 1 && (land.Flags & (uint)ParcelFlags.UseEstateVoiceChan) == 0)
{
@@ -797,6 +839,13 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.FreeSwitchVoice
// the personal speech indicators as well unless some siren14-3d codec magic happens. we dont have siren143d so we'll settle for the personal speech indicator.
channelUri = String.Format("sip:conf-{0}@{1}", "x" + Convert.ToBase64String(encoding.GetBytes(landUUID)), m_freeSwitchRealm);
+ lock (m_ParcelAddress)
+ {
+ if (!m_ParcelAddress.ContainsKey(land.GlobalID.ToString()))
+ {
+ m_ParcelAddress.Add(land.GlobalID.ToString(),channelUri);
+ }
+ }
return channelUri;
}
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
index 726b37a077..ccdd4c50a9 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
@@ -1164,6 +1164,35 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
land.SetMediaUrl(url);
}
+
+ public void osSetParcelSIPAddress(string SIPAddress)
+ {
+ // What actually is the difference to the LL function?
+ //
+ CheckThreatLevel(ThreatLevel.VeryLow, "osSetParcelMediaURL");
+
+ m_host.AddScriptLPS(1);
+
+
+ ILandObject land
+ = World.LandChannel.GetLandObject(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y);
+
+ if (land.landData.OwnerID != m_host.ObjectOwner)
+ {
+ OSSLError("osSetParcelSIPAddress: Sorry, you need to own the land to use this function");
+ return;
+ }
+
+ // get the voice module
+ IVoiceModule voiceModule = World.RequestModuleInterface();
+
+ if (voiceModule != null)
+ voiceModule.setLandSIPAddress(SIPAddress,land.landData.GlobalID);
+ else
+ OSSLError("osSetParcelSIPAddress: No voice module enabled for this land");
+
+
+ }
public string osGetScriptEngineName()
{
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs
index 49aa45a017..d8d3c31dd4 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs
@@ -75,6 +75,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces
bool osConsoleCommand(string Command);
void osSetParcelMediaURL(string url);
void osSetPrimFloatOnWater(int floatYN);
+ void osSetParcelSIPAddress(string SIPAddress);
// Avatar Info Commands
string osGetAgentIP(string agent);
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs
index 8f52d99418..d0df3902ad 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs
@@ -183,6 +183,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
{
m_OSSL_Functions.osSetParcelMediaURL(url);
}
+
+ public void osSetParcelSIPAddress(string SIPAddress)
+ {
+ m_OSSL_Functions.osSetParcelSIPAddress(SIPAddress);
+ }
public void osSetPrimFloatOnWater(int floatYN)
{