mirror of
https://github.com/opensim/opensim.git
synced 2026-08-10 11:33:28 +08:00
Merge branch 'master' of ssh://opensimulator.org/var/git/opensim
This commit is contained in:
@@ -30,6 +30,7 @@ using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using System.Text;
|
||||
using System.Text.RegularExpressions;
|
||||
@@ -808,16 +809,28 @@ namespace OpenSim
|
||||
break;
|
||||
|
||||
case "modules":
|
||||
SceneManager.ForEachScene(
|
||||
delegate(Scene scene) {
|
||||
MainConsole.Instance.Output("Loaded region modules in" + scene.RegionInfo.RegionName + " are:");
|
||||
foreach (IRegionModuleBase module in scene.RegionModules.Values)
|
||||
SceneManager.ForEachSelectedScene(
|
||||
scene =>
|
||||
{
|
||||
Type type = module.GetType().GetInterface("ISharedRegionModule");
|
||||
string module_type = type != null ? "Shared" : "Non-Shared";
|
||||
MainConsole.Instance.OutputFormat("New Region Module ({0}): {1}", module_type, module.Name);
|
||||
MainConsole.Instance.OutputFormat("Loaded region modules in {0} are:", scene.Name);
|
||||
|
||||
List<IRegionModuleBase> sharedModules = new List<IRegionModuleBase>();
|
||||
List<IRegionModuleBase> nonSharedModules = new List<IRegionModuleBase>();
|
||||
|
||||
foreach (IRegionModuleBase module in scene.RegionModules.Values)
|
||||
{
|
||||
if (module.GetType().GetInterface("ISharedRegionModule") != null)
|
||||
nonSharedModules.Add(module);
|
||||
else
|
||||
sharedModules.Add(module);
|
||||
}
|
||||
|
||||
foreach (IRegionModuleBase module in sharedModules.OrderBy(m => m.Name))
|
||||
MainConsole.Instance.OutputFormat("New Region Module (Shared): {0}", module.Name);
|
||||
|
||||
foreach (IRegionModuleBase module in sharedModules.OrderBy(m => m.Name))
|
||||
MainConsole.Instance.OutputFormat("New Region Module (Non-Shared): {0}", module.Name);
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
MainConsole.Instance.Output("");
|
||||
|
||||
@@ -668,7 +668,7 @@ namespace OpenSim
|
||||
// listenIP = IPAddress.Parse("0.0.0.0");
|
||||
|
||||
uint port = (uint) regionInfo.InternalEndPoint.Port;
|
||||
IClientNetworkServer clientNetworkServer;
|
||||
|
||||
if (m_autoCreateClientStack)
|
||||
{
|
||||
clientNetworkServers = m_clientStackManager.CreateServers(
|
||||
|
||||
@@ -117,20 +117,21 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp
|
||||
/// </summary>
|
||||
private Dictionary<string, UrlData> m_UrlMap = new Dictionary<string, UrlData>();
|
||||
|
||||
/// <summary>
|
||||
/// Maximum number of external urls that can be set up by this module.
|
||||
/// </summary>
|
||||
private int m_TotalUrls = 100;
|
||||
|
||||
private uint https_port = 0;
|
||||
private uint m_HttpsPort = 0;
|
||||
private IHttpServer m_HttpServer = null;
|
||||
private IHttpServer m_HttpsServer = null;
|
||||
|
||||
private string m_ExternalHostNameForLSL = "";
|
||||
public string ExternalHostNameForLSL
|
||||
{
|
||||
get { return m_ExternalHostNameForLSL; }
|
||||
}
|
||||
public string ExternalHostNameForLSL { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// The default maximum number of urls
|
||||
/// </summary>
|
||||
public const int DefaultTotalUrls = 100;
|
||||
|
||||
/// <summary>
|
||||
/// Maximum number of external urls that can be set up by this module.
|
||||
/// </summary>
|
||||
public int TotalUrls { get; set; }
|
||||
|
||||
public Type ReplaceableInterface
|
||||
{
|
||||
@@ -144,16 +145,27 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp
|
||||
|
||||
public void Initialise(IConfigSource config)
|
||||
{
|
||||
m_ExternalHostNameForLSL = config.Configs["Network"].GetString("ExternalHostNameForLSL", System.Environment.MachineName);
|
||||
bool ssl_enabled = config.Configs["Network"].GetBoolean("https_listener",false);
|
||||
IConfig networkConfig = config.Configs["Network"];
|
||||
|
||||
if (ssl_enabled)
|
||||
https_port = (uint) config.Configs["Network"].GetInt("https_port",0);
|
||||
if (networkConfig != null)
|
||||
{
|
||||
ExternalHostNameForLSL = config.Configs["Network"].GetString("ExternalHostNameForLSL", null);
|
||||
|
||||
bool ssl_enabled = config.Configs["Network"].GetBoolean("https_listener", false);
|
||||
|
||||
if (ssl_enabled)
|
||||
m_HttpsPort = (uint)config.Configs["Network"].GetInt("https_port", (int)m_HttpsPort);
|
||||
}
|
||||
|
||||
if (ExternalHostNameForLSL == null)
|
||||
ExternalHostNameForLSL = System.Environment.MachineName;
|
||||
|
||||
IConfig llFunctionsConfig = config.Configs["LL-Functions"];
|
||||
|
||||
if (llFunctionsConfig != null)
|
||||
m_TotalUrls = llFunctionsConfig.GetInt("max_external_urls_per_simulator", m_TotalUrls);
|
||||
TotalUrls = llFunctionsConfig.GetInt("max_external_urls_per_simulator", DefaultTotalUrls);
|
||||
else
|
||||
TotalUrls = DefaultTotalUrls;
|
||||
}
|
||||
|
||||
public void PostInitialise()
|
||||
@@ -169,9 +181,9 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp
|
||||
m_HttpServer = MainServer.Instance;
|
||||
//
|
||||
// We can use the https if it is enabled
|
||||
if (https_port > 0)
|
||||
if (m_HttpsPort > 0)
|
||||
{
|
||||
m_HttpsServer = MainServer.GetHttpServer(https_port);
|
||||
m_HttpsServer = MainServer.GetHttpServer(m_HttpsPort);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -204,12 +216,12 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp
|
||||
|
||||
lock (m_UrlMap)
|
||||
{
|
||||
if (m_UrlMap.Count >= m_TotalUrls)
|
||||
if (m_UrlMap.Count >= TotalUrls)
|
||||
{
|
||||
engine.PostScriptEvent(itemID, "http_request", new Object[] { urlcode.ToString(), "URL_REQUEST_DENIED", "" });
|
||||
return urlcode;
|
||||
}
|
||||
string url = "http://" + m_ExternalHostNameForLSL + ":" + m_HttpServer.Port.ToString() + "/lslhttp/" + urlcode.ToString() + "/";
|
||||
string url = "http://" + ExternalHostNameForLSL + ":" + m_HttpServer.Port.ToString() + "/lslhttp/" + urlcode.ToString() + "/";
|
||||
|
||||
UrlData urlData = new UrlData();
|
||||
urlData.hostID = host.UUID;
|
||||
@@ -249,12 +261,12 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp
|
||||
|
||||
lock (m_UrlMap)
|
||||
{
|
||||
if (m_UrlMap.Count >= m_TotalUrls)
|
||||
if (m_UrlMap.Count >= TotalUrls)
|
||||
{
|
||||
engine.PostScriptEvent(itemID, "http_request", new Object[] { urlcode.ToString(), "URL_REQUEST_DENIED", "" });
|
||||
return urlcode;
|
||||
}
|
||||
string url = "https://" + m_ExternalHostNameForLSL + ":" + m_HttpsServer.Port.ToString() + "/lslhttps/" + urlcode.ToString() + "/";
|
||||
string url = "https://" + ExternalHostNameForLSL + ":" + m_HttpsServer.Port.ToString() + "/lslhttps/" + urlcode.ToString() + "/";
|
||||
|
||||
UrlData urlData = new UrlData();
|
||||
urlData.hostID = host.UUID;
|
||||
@@ -377,7 +389,7 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp
|
||||
public int GetFreeUrls()
|
||||
{
|
||||
lock (m_UrlMap)
|
||||
return m_TotalUrls - m_UrlMap.Count;
|
||||
return TotalUrls - m_UrlMap.Count;
|
||||
}
|
||||
|
||||
public void ScriptRemoved(UUID itemID)
|
||||
@@ -579,9 +591,9 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp
|
||||
string url;
|
||||
|
||||
if (is_ssl)
|
||||
url = "https://" + m_ExternalHostNameForLSL + ":" + m_HttpsServer.Port.ToString() + uri_tmp;
|
||||
url = "https://" + ExternalHostNameForLSL + ":" + m_HttpsServer.Port.ToString() + uri_tmp;
|
||||
else
|
||||
url = "http://" + m_ExternalHostNameForLSL + ":" + m_HttpServer.Port.ToString() + uri_tmp;
|
||||
url = "http://" + ExternalHostNameForLSL + ":" + m_HttpServer.Port.ToString() + uri_tmp;
|
||||
|
||||
// Avoid a race - the request URL may have been released via llRequestUrl() whilst this
|
||||
// request was being processed.
|
||||
|
||||
@@ -838,13 +838,17 @@ namespace OpenSim.Region.CoreModules.Scripting.VectorRender
|
||||
try
|
||||
{
|
||||
WebRequest request = HttpWebRequest.Create(url);
|
||||
//Ckrinke: Comment out for now as 'str' is unused. Bring it back into play later when it is used.
|
||||
//Ckrinke Stream str = null;
|
||||
HttpWebResponse response = (HttpWebResponse)(request).GetResponse();
|
||||
if (response.StatusCode == HttpStatusCode.OK)
|
||||
|
||||
using (HttpWebResponse response = (HttpWebResponse)(request).GetResponse())
|
||||
{
|
||||
Bitmap image = new Bitmap(response.GetResponseStream());
|
||||
return image;
|
||||
if (response.StatusCode == HttpStatusCode.OK)
|
||||
{
|
||||
using (Stream s = response.GetResponseStream())
|
||||
{
|
||||
Bitmap image = new Bitmap(s);
|
||||
return image;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
catch { }
|
||||
|
||||
@@ -868,20 +868,22 @@ namespace OpenSim.Region.CoreModules.World.WorldMap
|
||||
}
|
||||
|
||||
string response_mapItems_reply = null;
|
||||
{ // get the response
|
||||
StreamReader sr = null;
|
||||
{
|
||||
try
|
||||
{
|
||||
WebResponse webResponse = mapitemsrequest.GetResponse();
|
||||
if (webResponse != null)
|
||||
using (WebResponse webResponse = mapitemsrequest.GetResponse())
|
||||
{
|
||||
sr = new StreamReader(webResponse.GetResponseStream());
|
||||
response_mapItems_reply = sr.ReadToEnd().Trim();
|
||||
}
|
||||
else
|
||||
{
|
||||
return new OSDMap();
|
||||
}
|
||||
if (webResponse != null)
|
||||
{
|
||||
using (Stream s = webResponse.GetResponseStream())
|
||||
using (StreamReader sr = new StreamReader(s))
|
||||
response_mapItems_reply = sr.ReadToEnd().Trim();
|
||||
}
|
||||
else
|
||||
{
|
||||
return new OSDMap();
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (WebException)
|
||||
{
|
||||
@@ -908,11 +910,6 @@ namespace OpenSim.Region.CoreModules.World.WorldMap
|
||||
|
||||
return responseMap;
|
||||
}
|
||||
finally
|
||||
{
|
||||
if (sr != null)
|
||||
sr.Close();
|
||||
}
|
||||
|
||||
OSD rezResponse = null;
|
||||
try
|
||||
@@ -926,6 +923,7 @@ namespace OpenSim.Region.CoreModules.World.WorldMap
|
||||
{
|
||||
m_log.InfoFormat("[WORLD MAP]: exception on parse of RequestMapItems reply from {0}: {1}", httpserver, ex.Message);
|
||||
responseMap["connect"] = OSD.FromBoolean(false);
|
||||
|
||||
lock (m_blacklistedregions)
|
||||
{
|
||||
if (!m_blacklistedregions.ContainsKey(regionhandle))
|
||||
|
||||
@@ -52,7 +52,18 @@ namespace OpenSim.Region.Framework.Interfaces
|
||||
string GetXMLState(UUID itemID);
|
||||
bool SetXMLState(UUID itemID, string xml);
|
||||
|
||||
/// <summary>
|
||||
/// Post a script event to a single script.
|
||||
/// </summary>
|
||||
/// <returns>true if the post suceeded, false if it did not</returns>
|
||||
/// <param name='itemID'>The item ID of the script.</param>
|
||||
/// <param name='name'>The name of the event.</param>
|
||||
/// <param name='args'>
|
||||
/// The arguments of the event. These are in the order in which they appear.
|
||||
/// e.g. for http_request this will be an object array of key request_id, string method, string body
|
||||
/// </param>
|
||||
bool PostScriptEvent(UUID itemID, string name, Object[] args);
|
||||
|
||||
bool PostObjectEvent(UUID itemID, string name, Object[] args);
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -331,35 +331,30 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
|
||||
public void SendCommandToPluginModules(string[] cmdparams)
|
||||
{
|
||||
ForEachCurrentScene(delegate(Scene scene) { scene.SendCommandToPlugins(cmdparams); });
|
||||
ForEachSelectedScene(delegate(Scene scene) { scene.SendCommandToPlugins(cmdparams); });
|
||||
}
|
||||
|
||||
public void SetBypassPermissionsOnCurrentScene(bool bypassPermissions)
|
||||
{
|
||||
ForEachCurrentScene(delegate(Scene scene) { scene.Permissions.SetBypassPermissions(bypassPermissions); });
|
||||
ForEachSelectedScene(delegate(Scene scene) { scene.Permissions.SetBypassPermissions(bypassPermissions); });
|
||||
}
|
||||
|
||||
private void ForEachCurrentScene(Action<Scene> func)
|
||||
public void ForEachSelectedScene(Action<Scene> func)
|
||||
{
|
||||
if (CurrentScene == null)
|
||||
{
|
||||
lock (m_localScenes)
|
||||
m_localScenes.ForEach(func);
|
||||
}
|
||||
ForEachScene(func);
|
||||
else
|
||||
{
|
||||
func(CurrentScene);
|
||||
}
|
||||
}
|
||||
|
||||
public void RestartCurrentScene()
|
||||
{
|
||||
ForEachCurrentScene(delegate(Scene scene) { scene.RestartNow(); });
|
||||
ForEachSelectedScene(delegate(Scene scene) { scene.RestartNow(); });
|
||||
}
|
||||
|
||||
public void BackupCurrentScene()
|
||||
{
|
||||
ForEachCurrentScene(delegate(Scene scene) { scene.Backup(true); });
|
||||
ForEachSelectedScene(delegate(Scene scene) { scene.Backup(true); });
|
||||
}
|
||||
|
||||
public bool TrySetCurrentScene(string regionName)
|
||||
@@ -490,7 +485,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
/// <param name="name">Name of avatar to debug</param>
|
||||
public void SetDebugPacketLevelOnCurrentScene(int newDebug, string name)
|
||||
{
|
||||
ForEachCurrentScene(scene =>
|
||||
ForEachSelectedScene(scene =>
|
||||
scene.ForEachScenePresence(sp =>
|
||||
{
|
||||
if (name == null || sp.Name == name)
|
||||
@@ -509,7 +504,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
{
|
||||
List<ScenePresence> avatars = new List<ScenePresence>();
|
||||
|
||||
ForEachCurrentScene(
|
||||
ForEachSelectedScene(
|
||||
delegate(Scene scene)
|
||||
{
|
||||
scene.ForEachRootScenePresence(delegate(ScenePresence scenePresence)
|
||||
@@ -526,7 +521,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
{
|
||||
List<ScenePresence> presences = new List<ScenePresence>();
|
||||
|
||||
ForEachCurrentScene(delegate(Scene scene)
|
||||
ForEachSelectedScene(delegate(Scene scene)
|
||||
{
|
||||
scene.ForEachScenePresence(delegate(ScenePresence sp)
|
||||
{
|
||||
@@ -555,12 +550,12 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
|
||||
public void ForceCurrentSceneClientUpdate()
|
||||
{
|
||||
ForEachCurrentScene(delegate(Scene scene) { scene.ForceClientUpdate(); });
|
||||
ForEachSelectedScene(delegate(Scene scene) { scene.ForceClientUpdate(); });
|
||||
}
|
||||
|
||||
public void HandleEditCommandOnCurrentScene(string[] cmdparams)
|
||||
{
|
||||
ForEachCurrentScene(delegate(Scene scene) { scene.HandleEditCommand(cmdparams); });
|
||||
ForEachSelectedScene(delegate(Scene scene) { scene.HandleEditCommand(cmdparams); });
|
||||
}
|
||||
|
||||
public bool TryGetScenePresence(UUID avatarId, out ScenePresence avatar)
|
||||
|
||||
@@ -551,13 +551,20 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.FreeSwitchVoice
|
||||
reqStream.Close();
|
||||
}
|
||||
|
||||
HttpWebResponse fwdrsp = (HttpWebResponse)forwardreq.GetResponse();
|
||||
Encoding encoding = Util.UTF8;
|
||||
StreamReader fwdresponsestream = new StreamReader(fwdrsp.GetResponseStream(), encoding);
|
||||
fwdresponsestr = fwdresponsestream.ReadToEnd();
|
||||
fwdresponsecontenttype = fwdrsp.ContentType;
|
||||
fwdresponsecode = (int)fwdrsp.StatusCode;
|
||||
fwdresponsestream.Close();
|
||||
using (HttpWebResponse fwdrsp = (HttpWebResponse)forwardreq.GetResponse())
|
||||
{
|
||||
Encoding encoding = Util.UTF8;
|
||||
|
||||
using (Stream s = fwdrsp.GetResponseStream())
|
||||
{
|
||||
using (StreamReader fwdresponsestream = new StreamReader(s))
|
||||
{
|
||||
fwdresponsestr = fwdresponsestream.ReadToEnd();
|
||||
fwdresponsecontenttype = fwdrsp.ContentType;
|
||||
fwdresponsecode = (int)fwdrsp.StatusCode;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
response["content_type"] = fwdresponsecontenttype;
|
||||
response["str_response_string"] = fwdresponsestr;
|
||||
|
||||
@@ -1116,18 +1116,16 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.VivoxVoice
|
||||
// Otherwise prepare the request
|
||||
m_log.DebugFormat("[VivoxVoice] Sending request <{0}>", requrl);
|
||||
|
||||
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(requrl);
|
||||
HttpWebResponse rsp = null;
|
||||
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(requrl);
|
||||
|
||||
// We are sending just parameters, no content
|
||||
req.ContentLength = 0;
|
||||
|
||||
// Send request and retrieve the response
|
||||
rsp = (HttpWebResponse)req.GetResponse();
|
||||
|
||||
XmlTextReader rdr = new XmlTextReader(rsp.GetResponseStream());
|
||||
doc.Load(rdr);
|
||||
rdr.Close();
|
||||
using (HttpWebResponse rsp = (HttpWebResponse)req.GetResponse())
|
||||
using (Stream s = rsp.GetResponseStream())
|
||||
using (XmlTextReader rdr = new XmlTextReader(s))
|
||||
doc.Load(rdr);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
|
||||
@@ -1146,28 +1146,38 @@ namespace Nwc.XmlRpc
|
||||
request.AllowWriteStreamBuffering = true;
|
||||
request.KeepAlive = !_disableKeepAlive;
|
||||
|
||||
Stream stream = request.GetRequestStream();
|
||||
XmlTextWriter xml = new XmlTextWriter(stream, Encoding.ASCII);
|
||||
_serializer.Serialize(xml, this);
|
||||
xml.Flush();
|
||||
xml.Close();
|
||||
using (Stream stream = request.GetRequestStream())
|
||||
{
|
||||
using (XmlTextWriter xml = new XmlTextWriter(stream, Encoding.ASCII))
|
||||
{
|
||||
_serializer.Serialize(xml, this);
|
||||
xml.Flush();
|
||||
}
|
||||
}
|
||||
|
||||
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
|
||||
StreamReader input = new StreamReader(response.GetResponseStream());
|
||||
|
||||
string inputXml = input.ReadToEnd();
|
||||
XmlRpcResponse resp;
|
||||
try
|
||||
|
||||
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
|
||||
{
|
||||
resp = (XmlRpcResponse)_deserializer.Deserialize(inputXml);
|
||||
using (Stream s = response.GetResponseStream())
|
||||
{
|
||||
using (StreamReader input = new StreamReader(s))
|
||||
{
|
||||
string inputXml = input.ReadToEnd();
|
||||
|
||||
try
|
||||
{
|
||||
resp = (XmlRpcResponse)_deserializer.Deserialize(inputXml);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
RequestResponse = inputXml;
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
RequestResponse = inputXml;
|
||||
throw e;
|
||||
}
|
||||
input.Close();
|
||||
response.Close();
|
||||
|
||||
return resp;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -33,6 +33,11 @@ using Nini.Config;
|
||||
using OpenSim.Region.Framework.Interfaces;
|
||||
using OpenSim.Region.Framework.Scenes;
|
||||
|
||||
// You will need to uncomment this line if you are adding a region module to some other assembly which does not already
|
||||
// specify its assembly. Otherwise, the region modules in the assembly will not be picked up when OpenSimulator scans
|
||||
// the available DLLs
|
||||
//[assembly: Addin("MyModule", "1.0")]
|
||||
|
||||
namespace OpenSim.Region.OptionalModules.Example.BareBonesNonShared
|
||||
{
|
||||
/// <summary>
|
||||
|
||||
@@ -33,6 +33,11 @@ using Nini.Config;
|
||||
using OpenSim.Region.Framework.Interfaces;
|
||||
using OpenSim.Region.Framework.Scenes;
|
||||
|
||||
// You will need to uncomment this line if you are adding a region module to some other assembly which does not already
|
||||
// specify its assembly. Otherwise, the region modules in the assembly will not be picked up when OpenSimulator scans
|
||||
// the available DLLs
|
||||
//[assembly: Addin("MyModule", "1.0")]
|
||||
|
||||
namespace OpenSim.Region.OptionalModules.Example.BareBonesShared
|
||||
{
|
||||
/// <summary>
|
||||
|
||||
@@ -204,7 +204,7 @@ public sealed class BSCharacter : BSPhysObject
|
||||
// move. Thus, the velocity cannot be forced to zero. The problem is that small velocity
|
||||
// errors can creap in and the avatar will slowly float off in some direction.
|
||||
// So, the problem is that, when an avatar is standing, we cannot tell creaping error
|
||||
// from real pushing.OMV.Vector3.Zero;
|
||||
// from real pushing.
|
||||
// The code below keeps setting the velocity to zero hoping the world will keep pushing.
|
||||
|
||||
_velocityMotor.Step(timeStep);
|
||||
@@ -254,9 +254,11 @@ public sealed class BSCharacter : BSPhysObject
|
||||
}
|
||||
|
||||
// If falling, we keep the world's downward vector no matter what the other axis specify.
|
||||
// The check for _velocity.Z < 0 makes jumping work (temporary upward force).
|
||||
if (!Flying && !IsColliding)
|
||||
{
|
||||
stepVelocity.Z = _velocity.Z;
|
||||
if (_velocity.Z < 0)
|
||||
stepVelocity.Z = _velocity.Z;
|
||||
// DetailLog("{0},BSCharacter.MoveMotor,taint,overrideStepZWithWorldZ,stepVel={1}", LocalID, stepVelocity);
|
||||
}
|
||||
|
||||
@@ -512,7 +514,7 @@ public sealed class BSCharacter : BSPhysObject
|
||||
// just assign to "Position" because of potential call loops.
|
||||
PhysicsScene.TaintedObject(inTaintTime, "BSCharacter.PositionSanityCheck", delegate()
|
||||
{
|
||||
DetailLog("{0},BSCharacter.PositionSanityCheck,taint,pos={1},orient={2}", LocalID, _position, _orientation);
|
||||
DetailLog("{0},BSCharacter.PositionSanityCheck,taint,pos={1},orient={2}", LocalID, _position, _orientation);
|
||||
ForcePosition = _position;
|
||||
});
|
||||
ret = true;
|
||||
@@ -572,7 +574,7 @@ public sealed class BSCharacter : BSPhysObject
|
||||
m_targetVelocity = value;
|
||||
OMV.Vector3 targetVel = value;
|
||||
if (_setAlwaysRun)
|
||||
targetVel *= BSParam.AvatarAlwaysRunFactor;
|
||||
targetVel *= new OMV.Vector3(BSParam.AvatarAlwaysRunFactor, BSParam.AvatarAlwaysRunFactor, 0f);
|
||||
|
||||
PhysicsScene.TaintedObject("BSCharacter.setTargetVelocity", delegate()
|
||||
{
|
||||
|
||||
@@ -470,7 +470,7 @@ public class BSPrim : BSPhysObject
|
||||
// Note that this does not change _mass!
|
||||
public override void UpdatePhysicalMassProperties(float physMass, bool inWorld)
|
||||
{
|
||||
if (PhysBody.HasPhysicalBody)
|
||||
if (PhysBody.HasPhysicalBody && PhysShape.HasPhysicalShape)
|
||||
{
|
||||
if (IsStatic)
|
||||
{
|
||||
|
||||
@@ -1,5 +1,12 @@
|
||||
CURRENT PRIORITIES
|
||||
=================================================
|
||||
Use the HACD convex hull routine in Bullet rather than the C# version.
|
||||
Speed up hullifying large meshes.
|
||||
Enable vehicle border crossings (at least as poorly as ODE)
|
||||
Terrain skirts
|
||||
Avatar created in previous region and not new region when crossing border
|
||||
Vehicle recreated in new sim at small Z value (offset from root value?) (DONE)
|
||||
Lock axis
|
||||
Deleting a linkset while standing on the root will leave the physical shape of the root behind.
|
||||
Not sure if it is because standing on it. Done with large prim linksets.
|
||||
Vehicle angular vertical attraction
|
||||
@@ -7,16 +14,11 @@ vehicle angular banking
|
||||
Center-of-gravity
|
||||
Vehicle angular deflection
|
||||
Preferred orientation angular correction fix
|
||||
Enable vehicle border crossings (at least as poorly as ODE)
|
||||
Terrain skirts
|
||||
Avatar created in previous region and not new region when crossing border
|
||||
Vehicle recreated in new sim at small Z value (offset from root value?) (DONE)
|
||||
when should angular and linear motor targets be zeroed? when selected?
|
||||
Need a vehicle.clear()? Or an 'else' in prestep if not physical.
|
||||
Teravus llMoveToTarget script debug
|
||||
Mixing of hover, buoyancy/gravity, moveToTarget, into one force
|
||||
Setting hover height to zero disables hover even if hover flags are on (from SL wiki)
|
||||
Nebadon vehicles turning funny in arena
|
||||
limitMotorUp calibration (more down?)
|
||||
llRotLookAt
|
||||
llLookAt
|
||||
@@ -66,6 +68,8 @@ Vehicle attributes are not restored when a vehicle is rezzed on region creation
|
||||
|
||||
GENERAL TODO LIST:
|
||||
=================================================
|
||||
Resitution of a prim works on another prim but not on terrain.
|
||||
The dropped prim doesn't bounce properly on the terrain.
|
||||
Add a sanity check for PIDTarget location.
|
||||
Level-of-detail for mesh creation. Prims with circular interiors require lod of 32.
|
||||
Is much saved with lower LODs? At the moment, all set to 32.
|
||||
@@ -163,7 +167,6 @@ Create tests for different interface components
|
||||
Have test objects/scripts measure themselves and turn color if correct/bad
|
||||
Test functions in SL and calibrate correctness there
|
||||
Create auto rezzer and tracker to run through the tests
|
||||
Use the HACD convex hull routine in Bullet rather than the C# version.
|
||||
Do we need to do convex hulls all the time? Can complex meshes be left meshes?
|
||||
There is some problem with meshes and collisions
|
||||
Hulls are not as detailed as meshes. Hulled vehicles insides are different shape.
|
||||
@@ -334,4 +337,5 @@ Child movement in linkset (don't rebuild linkset) (DONE 20130122))
|
||||
Avatar standing on a moving object should start to move with the object. (DONE 20130125)
|
||||
Angular motion around Z moves the vehicle in world Z and not vehicle Z in ODE.
|
||||
Verify that angular motion specified around Z moves in the vehicle coordinates.
|
||||
DONE 20130120: BulletSim properly applies force in vehicle relative coordinates.
|
||||
DONE 20130120: BulletSim properly applies force in vehicle relative coordinates.
|
||||
Nebadon vehicles turning funny in arena (DONE)
|
||||
@@ -9423,6 +9423,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||
return UUID.Zero.ToString();
|
||||
}
|
||||
}
|
||||
|
||||
public LSL_String llRequestURL()
|
||||
{
|
||||
m_host.AddScriptLPS(1);
|
||||
|
||||
@@ -443,7 +443,6 @@ default
|
||||
string itemName = "TestNoStop";
|
||||
|
||||
SceneObjectPart partWhereRezzed = CreateScript(script, itemName, userId);
|
||||
TaskInventoryItem rezzedItem = partWhereRezzed.Inventory.GetInventoryItem(itemName);
|
||||
|
||||
// Wait for the script to start the event before we try stopping it.
|
||||
m_chatEvent.WaitOne(60000);
|
||||
|
||||
250
OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiHttpTests.cs
Normal file
250
OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiHttpTests.cs
Normal file
@@ -0,0 +1,250 @@
|
||||
/*
|
||||
* 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.IO;
|
||||
using System.Net;
|
||||
using System.Reflection;
|
||||
using System.Text;
|
||||
using log4net;
|
||||
using Nini.Config;
|
||||
using NUnit.Framework;
|
||||
using OpenMetaverse;
|
||||
using OpenSim.Framework;
|
||||
using OpenSim.Framework.Servers;
|
||||
using OpenSim.Framework.Servers.HttpServer;
|
||||
using OpenSim.Region.CoreModules.Scripting.LSLHttp;
|
||||
using OpenSim.Region.Framework.Scenes;
|
||||
using OpenSim.Region.ScriptEngine.Shared;
|
||||
using OpenSim.Region.ScriptEngine.Shared.Api;
|
||||
using OpenSim.Region.ScriptEngine.Shared.ScriptBase;
|
||||
using OpenSim.Services.Interfaces;
|
||||
using OpenSim.Tests.Common;
|
||||
using OpenSim.Tests.Common.Mock;
|
||||
|
||||
namespace OpenSim.Region.ScriptEngine.Shared.Tests
|
||||
{
|
||||
/// <summary>
|
||||
/// Tests for HTTP related functions in LSL
|
||||
/// </summary>
|
||||
[TestFixture]
|
||||
public class LSL_ApiHttpTests : OpenSimTestCase
|
||||
{
|
||||
private Scene m_scene;
|
||||
private MockScriptEngine m_engine;
|
||||
private UrlModule m_urlModule;
|
||||
|
||||
private TaskInventoryItem m_scriptItem;
|
||||
private LSL_Api m_lslApi;
|
||||
|
||||
[TestFixtureSetUp]
|
||||
public void TestFixtureSetUp()
|
||||
{
|
||||
// Don't allow tests to be bamboozled by asynchronous events. Execute everything on the same thread.
|
||||
Util.FireAndForgetMethod = FireAndForgetMethod.RegressionTest;
|
||||
}
|
||||
|
||||
[TestFixtureTearDown]
|
||||
public void TestFixureTearDown()
|
||||
{
|
||||
// We must set this back afterwards, otherwise later tests will fail since they're expecting multiple
|
||||
// threads. Possibly, later tests should be rewritten so none of them require async stuff (which regression
|
||||
// tests really shouldn't).
|
||||
Util.FireAndForgetMethod = Util.DefaultFireAndForgetMethod;
|
||||
}
|
||||
|
||||
[SetUp]
|
||||
public override void SetUp()
|
||||
{
|
||||
base.SetUp();
|
||||
|
||||
// This is an unfortunate bit of clean up we have to do because MainServer manages things through static
|
||||
// variables and the VM is not restarted between tests.
|
||||
uint port = 9999;
|
||||
MainServer.RemoveHttpServer(port);
|
||||
|
||||
BaseHttpServer server = new BaseHttpServer(port, false, 0, "");
|
||||
MainServer.AddHttpServer(server);
|
||||
MainServer.Instance = server;
|
||||
|
||||
server.Start();
|
||||
|
||||
m_engine = new MockScriptEngine();
|
||||
m_urlModule = new UrlModule();
|
||||
|
||||
m_scene = new SceneHelpers().SetupScene();
|
||||
SceneHelpers.SetupSceneModules(m_scene, new IniConfigSource(), m_engine, m_urlModule);
|
||||
|
||||
SceneObjectGroup so = SceneHelpers.AddSceneObject(m_scene);
|
||||
m_scriptItem = TaskInventoryHelpers.AddScript(m_scene, so.RootPart);
|
||||
|
||||
// This is disconnected from the actual script - the mock engine does not set up any LSL_Api atm.
|
||||
// Possibly this could be done and we could obtain it directly from the MockScriptEngine.
|
||||
m_lslApi = new LSL_Api();
|
||||
m_lslApi.Initialize(m_engine, so.RootPart, m_scriptItem, null);
|
||||
}
|
||||
|
||||
[TearDown]
|
||||
public void TearDown()
|
||||
{
|
||||
MainServer.Instance.Stop();
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TestLlReleaseUrl()
|
||||
{
|
||||
TestHelpers.InMethod();
|
||||
|
||||
m_lslApi.llRequestURL();
|
||||
string returnedUri = m_engine.PostedEvents[m_scriptItem.ItemID][0].Params[2].ToString();
|
||||
|
||||
{
|
||||
// Check that the initial number of URLs is correct
|
||||
Assert.That(m_lslApi.llGetFreeURLs().value, Is.EqualTo(m_urlModule.TotalUrls - 1));
|
||||
}
|
||||
|
||||
{
|
||||
// Check releasing a non-url
|
||||
m_lslApi.llReleaseURL("GARBAGE");
|
||||
Assert.That(m_lslApi.llGetFreeURLs().value, Is.EqualTo(m_urlModule.TotalUrls - 1));
|
||||
}
|
||||
|
||||
{
|
||||
// Check releasing a non-existing url
|
||||
m_lslApi.llReleaseURL("http://example.com");
|
||||
Assert.That(m_lslApi.llGetFreeURLs().value, Is.EqualTo(m_urlModule.TotalUrls - 1));
|
||||
}
|
||||
|
||||
{
|
||||
// Check URL release
|
||||
m_lslApi.llReleaseURL(returnedUri);
|
||||
Assert.That(m_lslApi.llGetFreeURLs().value, Is.EqualTo(m_urlModule.TotalUrls));
|
||||
|
||||
HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(returnedUri);
|
||||
|
||||
bool gotExpectedException = false;
|
||||
|
||||
try
|
||||
{
|
||||
using (HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse())
|
||||
{}
|
||||
}
|
||||
catch (WebException e)
|
||||
{
|
||||
using (HttpWebResponse response = (HttpWebResponse)e.Response)
|
||||
gotExpectedException = response.StatusCode == HttpStatusCode.NotFound;
|
||||
}
|
||||
|
||||
Assert.That(gotExpectedException, Is.True);
|
||||
}
|
||||
|
||||
{
|
||||
// Check releasing the same URL again
|
||||
m_lslApi.llReleaseURL(returnedUri);
|
||||
Assert.That(m_lslApi.llGetFreeURLs().value, Is.EqualTo(m_urlModule.TotalUrls));
|
||||
}
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TestLlRequestUrl()
|
||||
{
|
||||
TestHelpers.InMethod();
|
||||
|
||||
string requestId = m_lslApi.llRequestURL();
|
||||
Assert.That(requestId, Is.Not.EqualTo(UUID.Zero.ToString()));
|
||||
string returnedUri;
|
||||
|
||||
{
|
||||
// Check that URL is correctly set up
|
||||
Assert.That(m_lslApi.llGetFreeURLs().value, Is.EqualTo(m_urlModule.TotalUrls - 1));
|
||||
|
||||
Assert.That(m_engine.PostedEvents.ContainsKey(m_scriptItem.ItemID));
|
||||
|
||||
List<EventParams> events = m_engine.PostedEvents[m_scriptItem.ItemID];
|
||||
Assert.That(events.Count, Is.EqualTo(1));
|
||||
EventParams eventParams = events[0];
|
||||
Assert.That(eventParams.EventName, Is.EqualTo("http_request"));
|
||||
|
||||
UUID returnKey;
|
||||
string rawReturnKey = eventParams.Params[0].ToString();
|
||||
string method = eventParams.Params[1].ToString();
|
||||
returnedUri = eventParams.Params[2].ToString();
|
||||
|
||||
Assert.That(UUID.TryParse(rawReturnKey, out returnKey), Is.True);
|
||||
Assert.That(method, Is.EqualTo(ScriptBaseClass.URL_REQUEST_GRANTED));
|
||||
Assert.That(Uri.IsWellFormedUriString(returnedUri, UriKind.Absolute), Is.True);
|
||||
}
|
||||
|
||||
{
|
||||
// Check that request to URL works.
|
||||
string testResponse = "Hello World";
|
||||
|
||||
m_engine.ClearPostedEvents();
|
||||
m_engine.PostEventHook
|
||||
+= (itemId, evp) => m_lslApi.llHTTPResponse(evp.Params[0].ToString(), 200, testResponse);
|
||||
|
||||
// Console.WriteLine("Trying {0}", returnedUri);
|
||||
HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(returnedUri);
|
||||
|
||||
AssertHttpResponse(returnedUri, testResponse);
|
||||
|
||||
Assert.That(m_engine.PostedEvents.ContainsKey(m_scriptItem.ItemID));
|
||||
|
||||
List<EventParams> events = m_engine.PostedEvents[m_scriptItem.ItemID];
|
||||
Assert.That(events.Count, Is.EqualTo(1));
|
||||
EventParams eventParams = events[0];
|
||||
Assert.That(eventParams.EventName, Is.EqualTo("http_request"));
|
||||
|
||||
UUID returnKey;
|
||||
string rawReturnKey = eventParams.Params[0].ToString();
|
||||
string method = eventParams.Params[1].ToString();
|
||||
string body = eventParams.Params[2].ToString();
|
||||
|
||||
Assert.That(UUID.TryParse(rawReturnKey, out returnKey), Is.True);
|
||||
Assert.That(method, Is.EqualTo("GET"));
|
||||
Assert.That(body, Is.EqualTo(""));
|
||||
}
|
||||
}
|
||||
|
||||
private void AssertHttpResponse(string uri, string expectedResponse)
|
||||
{
|
||||
HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(uri);
|
||||
|
||||
using (HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse())
|
||||
{
|
||||
using (Stream stream = webResponse.GetResponseStream())
|
||||
{
|
||||
using (StreamReader reader = new StreamReader(stream))
|
||||
{
|
||||
Assert.That(reader.ReadToEnd(), Is.EqualTo(expectedResponse));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -222,7 +222,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
|
||||
// Store an avatar with a different height from default in a notecard.
|
||||
UUID userId = TestHelpers.ParseTail(0x1);
|
||||
float firstHeight = 1.9f;
|
||||
float secondHeight = 2.1f;
|
||||
// float secondHeight = 2.1f;
|
||||
string firstAppearanceNcName = "appearanceNc1";
|
||||
string secondAppearanceNcName = "appearanceNc2";
|
||||
|
||||
|
||||
Reference in New Issue
Block a user